diff --git a/README.md b/README.md index 1982397..82b04b1 100644 --- a/README.md +++ b/README.md @@ -9,29 +9,204 @@ runs tests using Node and UVU Configured for Node 14+ . To update, change base tsconfig from "extends": "@tsconfig/node14/tsconfig.json", update "engines" section in package.json, and update .node-version file -# Running -Use `yarn run all` . It will configure and run all the build steps +# Usage -## Setup +## Configuration Setup + +## Configuration Setup + +To set up the `applause.json` config file for the WebdriverIO tests, follow these steps: + +1. Create a new file named `applause.json` in the root directory of your project. + +2. Open the `applause.json` file and add the following JSON structure: + +```json +{ + "apiKey": "API_KEY", + "productId": 0, + "applauseTestCycleId": 0, + "testRailOptions": { + "projectId": 0, + "suiteId": 0, + "planName": "Example Plan Name", + "runName": "Example Run Name" + } +} +``` + +The `apiKey` and `productId` settings are required for execution. The `testRailOptions` and `applauseTestCycleId` settings are optional. + +3. Save the `applause.json` file. + +Now, when you run your WebdriverIO tests, they will be configured to use the settings specified in the `applause.json` file. + +## Applause Automation Reporting + +To use the `ApplauseRunService` and `ApplauseResultService` in a WebdriverIO configuration file, follow these steps: + +1. Install the `wdio-applause-reporter` package as a dev dependency by running the command: `npm install wdio-applause-reporter --save-dev`. + +2. Import the `ApplauseRunService` and `ApplauseResultService` classes in your WebdriverIO configuration file: + +```javascript +import { ApplauseRunService, ApplauseResultService } frpom 'wdio-applause-reporter'; +``` + +3. Add the `ApplauseRunService` and `ApplauseResultService` to the `services` array in your WebdriverIO configuration file: + +```javascript +exports.config = { + // ... other configuration options + + services: [ + // ... other services + [ApplauseRunService, {}], + [ApplauseResultService, {}] + ], + + // ... other configuration options +}; +``` + +4. Run your WebdriverIO tests as usual. The `ApplauseRunService` will handle setting up the Applause TestRun the `ApplauseResultService` will handle the reporting. + +## Applause Platform Reporting + +To use the `ApplausePlatformReporter` in the reporter section of a WebdriverIO configuration file, follow these steps: + +1. Install the `wdio-applause-reporter` package as a dev dependency by running the command: `npm install wdio-applause-reporter --save-dev`. -`yarn install` +2. Import the `ApplausePlatformReporter` class in your WebdriverIO configuration file: -### build +```javascript +import { ApplausePlatformReporter } from 'wdio-applause-reporter'; +``` -`yarn build` +3. Add the `ApplausePlatformReporter` to the `reporters` array in your WebdriverIO configuration file: -### test +```javascript +exports.config = { + // ... other configuration options -`yarn test` + reporters: [ + // ... other reporters + [ApplausePlatformReporter, {}] + ], -### clean + // ... other configuration options +}; +``` -`yarn clean` +4. Run your WebdriverIO tests as usual. The `ApplausePlatformReporter` will handle reporting to the Applause Platform. -### lint +## Winston Logger Configurations + +To insert a custom Winston logger into the `ApplausePlatformReporter`, `ApplauseRunService`, and `ApplauseResultService`, you can follow these steps: + +1. Create a custom Winston logger configuration in your WebdriverIO configuration file. You can use the `winston` package to create and configure your logger. Here's an example: + +```javascript +import winston from 'winston'; + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.simple(), + transports: [ + new winston.transports.Console() + ] +}); +``` + +2. Pass the custom logger to the respective services and reporter by adding the `logger` option to their configuration. Here's an example: + +```javascript +exports.config = { + // ... other configuration options + + services: [ + // ... other services + [ApplauseRunService, { + logger: logger + }], + [ApplauseResultService, { + logger: logger + }] + ], + + reporters: [ + // ... other reporters + [ApplausePlatformReporter, { + logger: logger + }] + ], + + // ... other configuration options +}; +``` + +By providing the `logger` option with your custom logger, you can integrate it into the `ApplausePlatformReporter`, `ApplauseRunService`, and `ApplauseResultService` for logging purposes. + +To insert a custom Winston logger into the `ApplausePlatformReporter`, `ApplauseRunService`, and `ApplauseResultService`, you can follow these steps: + +1. Create a custom Winston logger configuration in your WebdriverIO configuration file. You can use the `winston` package to create and configure your logger. Here's an example: + +```javascript +import winston from 'winston'; + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.simple(), + transports: [ + new winston.transports.Console(), + new ApplauseTransport(), + ] +}); +``` + +2. Pass the custom logger to the respective services and reporter by adding the `logger` option to their configuration. Here's an example: + +```javascript +exports.config = { + // ... other configuration options + + services: [ + // ... other services + [ApplauseRunService, { + logger: logger + }], + [ApplauseResultService, { + logger: logger + }] + ], + + reporters: [ + // ... other reporters + [ApplausePlatformReporter, { + logger: logger + }] + ], + + // ... other configuration options +}; +``` + +By providing the `logger` option with your custom logger, you can integrate it into the `ApplausePlatformReporter`, `ApplauseRunService`, and `ApplauseResultService` for logging purposes. + + +# Developing +Use `yarn run all` . It will configure and run all the build steps + +## Setup -`yarn lint` +To set up the project, follow these steps: -## Publishing +1. Clone the repository to your local machine. +2. Navigate to the project directory: `/Users/rconner/src/wdio-applause-reporter/`. +3. Install the project dependencies by running the command: `yarn install`. +4. Build the project by running: `yarn build`. +5. Run the tests using: `yarn test`. +6. Clean the project by running: `yarn clean`. +7. Lint the code with: `yarn lint`. -`yarn publish` +Make sure you have Node.js 14+ installed and configured before proceeding with these steps. diff --git a/dist/index.cjs b/dist/index.cjs index 0c68afb..508bdd1 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -3,54 +3,259 @@ var WDIOReporter = require('@wdio/reporter'); var applauseReporterCommon = require('applause-reporter-common'); -class ApplauseWdioReporter extends WDIOReporter { +class ApplauseRunService { reporter; - constructor(options) { - super({ stdout: true, ...options }); - const config = applauseReporterCommon.loadConfig({ - properties: options, - }); - // Setup the initial maps - this.reporter = new applauseReporterCommon.ApplauseReporter(config); + logger; + // @ts-ignore + constructor(serviceOptions) { + this.logger = + serviceOptions['logger'] || applauseReporterCommon.constructDefaultLogger(); + this.reporter = new applauseReporterCommon.ApplauseReporter(applauseReporterCommon.loadConfig(serviceOptions), this.logger); + } + // @ts-ignore + async onPrepare() { + const testRunId = await this.reporter.runnerStart(); + process.env['APPLAUSE_RUN_ID'] = `${testRunId}`; } - onRunnerStart() { - this.reporter.runnerStart(); + // @ts-ignore + async onComplete() { + await this.reporter.runnerEnd(); } - onTestStart(testStats) { - this.reporter.startTestCase(testStats.uid, testStats.fullTitle, { +} +class ApplauseResultService { + reporter; + logger; + activeTest; + // @ts-ignore + constructor(serviceOptions) { + this.logger = + serviceOptions['logger'] || applauseReporterCommon.constructDefaultLogger(); + this.reporter = new applauseReporterCommon.ApplauseReporter(applauseReporterCommon.loadConfig(serviceOptions), this.logger); + } + /** + * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for + * execution of Cucumber tests. + * + * @param test The test object + */ + async beforeTest(test) { + const title = this.lookupTitle(test); + this.logger.info('Starting test: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { providerSessionIds: [browser.sessionId], }); } - onTestPass(test) { - this.reporter.submitTestCaseResult(test.uid, applauseReporterCommon.TestResultStatus.PASSED, { - providerSessionGuids: [browser.sessionId], + /** + * The beforeScenario hook is called before each scenario in a Cucumber test. + * + * @param world The cucumber world object + */ + async beforeScenario(world) { + const title = this.lookupTitle(world); + this.logger.info('Starting Scenario: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { + providerSessionIds: [browser.sessionId], }); } - onTestFail(test) { - this.reporter.submitTestCaseResult(test.uid, applauseReporterCommon.TestResultStatus.FAILED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + async afterCommand(commandName, args, result) { + if (!this.activeTest) { + return; + } + if (commandName.startsWith('saveScreenshot')) { + const screenshotName = args[0].split('/').pop() || 'screenshot.png'; + this.logger.debug('Capturing screenshot'); + await this.reporter.attachTestCaseAsset(this.activeTest, screenshotName, browser.sessionId, applauseReporterCommon.AssetType.SCREENSHOT, Buffer.from(result, 'base64')); + } + } + /** + * The afterTest hook is called after each test in a Mocha or Jasmine test. + * + * @param test The test object + * @param _context The context object + * @param result The result object + */ + async afterTest(test, _context, result) { + this.activeTest = undefined; + const title = this.lookupTitle(test); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } + else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult(title, result.passed ? applauseReporterCommon.TestResultStatus.PASSED : applauseReporterCommon.TestResultStatus.FAILED, { + failureReason: result.exception, }); } - onTestRetry(test) { - this.reporter.submitTestCaseResult(test.uid, applauseReporterCommon.TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + /** + * The afterScenario hook is called after each scenario in a Cucumber test. + * + * @param world The cucumber world object + * @param result The result object + */ + async afterScenario(world, result) { + this.activeTest = undefined; + const title = this.lookupTitle(world); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } + else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult(title, result.passed ? applauseReporterCommon.TestResultStatus.PASSED : applauseReporterCommon.TestResultStatus.FAILED, { + failureReason: result.exception, }); } - onTestSkip(test) { - this.reporter.submitTestCaseResult(test.uid, applauseReporterCommon.TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + /** + * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some + * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property. + * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''. + * + * @param test The test or world object + * @returns The title of the test + */ + lookupTitle(test) { + if (test.fullName) { + return test.fullName; + } + if (test.fullTitle) { + return test.fullTitle; + } + if (!!test.parent && !!test.title) { + return test.parent + ' ' + test.title; + } + if (!!test.pickle && !!test.pickle.name) { + return test.pickle.name; + } + return ''; + } + /** + * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed, + * the failure screenshot will be attached to the test case. + * + * @param resultId The result ID of the test case + * @param passed Whether the test case passed + */ + async captureAssets(resultId, passed) { + const assetsToUpload = []; + try { + if (!passed) { + const screenshot = Buffer.from(await browser.takeScreenshot(), 'base64'); + assetsToUpload.push([ + 'failure_screenshot.png', + applauseReporterCommon.AssetType.FAILURE_SCREENSHOT, + screenshot, + ]); + } + assetsToUpload.push([ + 'page_source.html', + applauseReporterCommon.AssetType.PAGE_SOURCE, + Buffer.from(await browser.getPageSource()), + ]); + assetsToUpload.push([ + 'console_log.txt', + applauseReporterCommon.AssetType.CONSOLE_LOG, + Buffer.from(applauseReporterCommon.APPLAUSE_LOG_RECORDS.getLogs().join('\n')), + ]); + await Promise.allSettled(assetsToUpload.map(([name, type, data]) => this.reporter.attachTestCaseAsset(resultId, name, browser.sessionId, type, data))); + } + catch (e) { + this.logger.error('Error capturing assets'); + this.logger.error(e); + } + } +} +class ApplausePlatformWdioReporter extends WDIOReporter { + publciApi; + config; + inflightCalls = []; + logger; + constructor(options) { + super({ stdout: true, ...options }); + this.config = applauseReporterCommon.loadConfig({ + properties: options, }); + this.logger = + options.logger || applauseReporterCommon.constructDefaultLogger(); + // Setup the initial maps + this.publciApi = new applauseReporterCommon.PublicApi(this.config, this.logger); + } + onTestPass(test) { + const applauseTestCaseId = applauseReporterCommon.parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: applauseReporterCommon.TestRunAutoResultStatus.PASSED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } + } + onTestFail(test) { + const applauseTestCaseId = applauseReporterCommon.parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: applauseReporterCommon.TestRunAutoResultStatus.FAILED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } + } + onTestSkip(test) { + const applauseTestCaseId = applauseReporterCommon.parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: applauseReporterCommon.TestRunAutoResultStatus.SKIPPED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } } async onRunnerEnd() { - await this.reporter.runnerEnd(); + void (await Promise.all(this.inflightCalls)); } get isSynchronised() { - return this.reporter.isSynchronized(); + return this.publciApi.getCallsInFlight === 0; } } -exports.ApplauseWdioReporter = ApplauseWdioReporter; +exports.ApplausePlatformWdioReporter = ApplausePlatformWdioReporter; +exports.ApplauseResultService = ApplauseResultService; +exports.ApplauseRunService = ApplauseRunService; //# sourceMappingURL=index.cjs.map diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 226637f..45f58ba 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport {\n ApplauseReporter,\n ApplauseConfig,\n TestResultStatus,\n loadConfig,\n} from 'applause-reporter-common';\nimport { Browser } from 'webdriverio';\n\ndeclare let browser: Browser;\n\nexport class ApplauseWdioReporter extends WDIOReporter {\n private reporter: ApplauseReporter;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n const config = loadConfig({\n properties: options,\n });\n // Setup the initial maps\n this.reporter = new ApplauseReporter(config);\n }\n\n onRunnerStart() {\n this.reporter.runnerStart();\n }\n\n onTestStart(testStats: TestStats): void {\n this.reporter.startTestCase(testStats.uid, testStats.fullTitle, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n onTestPass(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.PASSED, {\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestFail(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.FAILED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestRetry(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestSkip(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n async onRunnerEnd(): Promise {\n await this.reporter.runnerEnd();\n }\n\n get isSynchronised(): boolean {\n return this.reporter.isSynchronized();\n }\n}\n\nexport { ApplauseConfig };\n"],"names":["loadConfig","ApplauseReporter","TestResultStatus"],"mappings":";;;;;AAWM,MAAO,oBAAqB,SAAQ,YAAY,CAAA;AAC5C,IAAA,QAAQ,CAAmB;AAEnC,IAAA,WAAA,CAAY,OAAgC,EAAA;QAC1C,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACpC,MAAM,MAAM,GAAGA,iCAAU,CAAC;AACxB,YAAA,UAAU,EAAE,OAAO;AACpB,SAAA,CAAC,CAAC;;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAIC,uCAAgB,CAAC,MAAM,CAAC,CAAC;KAC9C;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;AAED,IAAA,WAAW,CAAC,SAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE;AAC9D,YAAA,kBAAkB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AACxC,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAEC,uCAAgB,CAAC,MAAM,EAAE;AACpE,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAEA,uCAAgB,CAAC,MAAM,EAAE;AACpE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,IAAe,EAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAEA,uCAAgB,CAAC,OAAO,EAAE;AACrE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAEA,uCAAgB,CAAC,OAAO,EAAE;AACrE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;KACjC;AAED,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;KACvC;AACF;;;;"} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport { Services, Frameworks } from '@wdio/types';\nimport {\n APPLAUSE_LOG_RECORDS,\n ApplauseReporter,\n AssetType,\n loadConfig,\n TestResultStatus,\n constructDefaultLogger,\n PublicApi,\n ApplauseConfig,\n parseTestCaseName,\n TestRunAutoResultStatus,\n} from 'applause-reporter-common';\nimport * as winston from 'winston';\n\nexport class ApplauseRunService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n // @ts-ignore\n async onPrepare() {\n const testRunId = await this.reporter.runnerStart();\n process.env['APPLAUSE_RUN_ID'] = `${testRunId}`;\n }\n\n // @ts-ignore\n async onComplete() {\n await this.reporter.runnerEnd();\n }\n}\nexport class ApplauseResultService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n activeTest?: string;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n /**\n * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for\n * execution of Cucumber tests.\n *\n * @param test The test object\n */\n async beforeTest(test: Frameworks.Test) {\n const title = this.lookupTitle(test);\n this.logger.info('Starting test: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n /**\n * The beforeScenario hook is called before each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n */\n async beforeScenario(world: Frameworks.World) {\n const title = this.lookupTitle(world);\n this.logger.info('Starting Scenario: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n async afterCommand(\n commandName: string,\n args: any[],\n result: any\n ): Promise {\n if (!this.activeTest) {\n return;\n }\n if (commandName.startsWith('saveScreenshot')) {\n const screenshotName =\n (args[0] as string).split('/').pop() || 'screenshot.png';\n this.logger.debug('Capturing screenshot');\n await this.reporter.attachTestCaseAsset(\n this.activeTest,\n screenshotName,\n browser.sessionId,\n AssetType.SCREENSHOT,\n Buffer.from(result as string, 'base64')\n );\n }\n }\n\n /**\n * The afterTest hook is called after each test in a Mocha or Jasmine test.\n *\n * @param test The test object\n * @param _context The context object\n * @param result The result object\n */\n async afterTest(\n test: Frameworks.Test,\n _context: any,\n result: Frameworks.TestResult\n ) {\n this.activeTest = undefined;\n const title = this.lookupTitle(test);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * The afterScenario hook is called after each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n * @param result The result object\n */\n async afterScenario(world: Frameworks.World, result: Frameworks.TestResult) {\n this.activeTest = undefined;\n const title = this.lookupTitle(world);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some\n * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property.\n * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''.\n *\n * @param test The test or world object\n * @returns The title of the test\n */\n private lookupTitle(\n test: Partial\n ): string {\n if (test.fullName) {\n return test.fullName;\n }\n if (test.fullTitle) {\n return test.fullTitle;\n }\n if (!!test.parent && !!test.title) {\n return test.parent + ' ' + test.title;\n }\n if (!!test.pickle && !!test.pickle.name) {\n return test.pickle.name;\n }\n return '';\n }\n\n /**\n * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed,\n * the failure screenshot will be attached to the test case.\n *\n * @param resultId The result ID of the test case\n * @param passed Whether the test case passed\n */\n private async captureAssets(\n resultId: string,\n passed: boolean\n ): Promise {\n const assetsToUpload: [string, AssetType, Buffer][] = [];\n try {\n if (!passed) {\n const screenshot = Buffer.from(\n await browser.takeScreenshot(),\n 'base64'\n );\n assetsToUpload.push([\n 'failure_screenshot.png',\n AssetType.FAILURE_SCREENSHOT,\n screenshot,\n ]);\n }\n assetsToUpload.push([\n 'page_source.html',\n AssetType.PAGE_SOURCE,\n Buffer.from(await browser.getPageSource()),\n ]);\n assetsToUpload.push([\n 'console_log.txt',\n AssetType.CONSOLE_LOG,\n Buffer.from(APPLAUSE_LOG_RECORDS.getLogs().join('\\n')),\n ]);\n\n await Promise.allSettled(\n assetsToUpload.map(([name, type, data]) =>\n this.reporter.attachTestCaseAsset(\n resultId,\n name,\n browser.sessionId,\n type,\n data\n )\n )\n );\n } catch (e) {\n this.logger.error('Error capturing assets');\n this.logger.error(e);\n }\n }\n}\n\nexport class ApplausePlatformWdioReporter extends WDIOReporter {\n private publciApi: PublicApi;\n private config: ApplauseConfig;\n private inflightCalls: Promise[] = [];\n private logger: winston.Logger;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n this.config = loadConfig({\n properties: options,\n });\n this.logger =\n (options.logger as winston.Logger) || constructDefaultLogger();\n // Setup the initial maps\n this.publciApi = new PublicApi(this.config, this.logger);\n }\n\n onTestPass(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.PASSED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestFail(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.FAILED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestSkip(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.SKIPPED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n async onRunnerEnd(): Promise {\n void (await Promise.all(this.inflightCalls));\n }\n\n get isSynchronised(): boolean {\n return this.publciApi.getCallsInFlight === 0;\n }\n}\n"],"names":["constructDefaultLogger","ApplauseReporter","loadConfig","AssetType","TestResultStatus","APPLAUSE_LOG_RECORDS","PublicApi","parseTestCaseName","TestRunAutoResultStatus"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 5bfd818..0ea9c33 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,18 +1,80 @@ import WDIOReporter, { TestStats } from '@wdio/reporter'; -import { ApplauseConfig } from 'applause-reporter-common'; -export { ApplauseConfig } from 'applause-reporter-common'; +import { Services, Frameworks } from '@wdio/types'; +import { ApplauseReporter, ApplauseConfig } from 'applause-reporter-common'; +import * as winston from 'winston'; -declare class ApplauseWdioReporter extends WDIOReporter { - private reporter; - constructor(options: Partial); - onRunnerStart(): void; - onTestStart(testStats: TestStats): void; +declare class ApplauseRunService implements Services.ServiceInstance { + reporter: ApplauseReporter; + logger: winston.Logger; + constructor(serviceOptions: Services.ServiceOption); + onPrepare(): Promise; + onComplete(): Promise; +} +declare class ApplauseResultService implements Services.ServiceInstance { + reporter: ApplauseReporter; + logger: winston.Logger; + activeTest?: string; + constructor(serviceOptions: Services.ServiceOption); + /** + * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for + * execution of Cucumber tests. + * + * @param test The test object + */ + beforeTest(test: Frameworks.Test): Promise; + /** + * The beforeScenario hook is called before each scenario in a Cucumber test. + * + * @param world The cucumber world object + */ + beforeScenario(world: Frameworks.World): Promise; + afterCommand(commandName: string, args: any[], result: any): Promise; + /** + * The afterTest hook is called after each test in a Mocha or Jasmine test. + * + * @param test The test object + * @param _context The context object + * @param result The result object + */ + afterTest(test: Frameworks.Test, _context: any, result: Frameworks.TestResult): Promise; + /** + * The afterScenario hook is called after each scenario in a Cucumber test. + * + * @param world The cucumber world object + * @param result The result object + */ + afterScenario(world: Frameworks.World, result: Frameworks.TestResult): Promise; + /** + * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some + * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property. + * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''. + * + * @param test The test or world object + * @returns The title of the test + */ + private lookupTitle; + /** + * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed, + * the failure screenshot will be attached to the test case. + * + * @param resultId The result ID of the test case + * @param passed Whether the test case passed + */ + private captureAssets; +} +declare class ApplausePlatformWdioReporter extends WDIOReporter { + private publciApi; + private config; + private inflightCalls; + private logger; + constructor(options: Partial); onTestPass(test: TestStats): void; onTestFail(test: TestStats): void; - onTestRetry(test: TestStats): void; onTestSkip(test: TestStats): void; onRunnerEnd(): Promise; get isSynchronised(): boolean; } -export { ApplauseWdioReporter }; +export { ApplausePlatformWdioReporter, ApplauseResultService, ApplauseRunService }; diff --git a/dist/index.min.js b/dist/index.min.js index 33c4d4a..53eb007 100644 --- a/dist/index.min.js +++ b/dist/index.min.js @@ -1,2 +1,2 @@ -!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports,require("@wdio/reporter"),require("applause-reporter-common")):"function"==typeof define&&define.amd?define(["exports","@wdio/reporter","applause-reporter-common"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self)["wdio-applause-reporter"]={},e.WDIOReporter,e.applauseReporterCommon)}(this,(function(e,s,r){"use strict";e.ApplauseWdioReporter=class extends s{reporter;constructor(e){super({stdout:!0,...e});const s=r.loadConfig({properties:e});this.reporter=new r.ApplauseReporter(s)}onRunnerStart(){this.reporter.runnerStart()}onTestStart(e){this.reporter.startTestCase(e.uid,e.fullTitle,{providerSessionIds:[browser.sessionId]})}onTestPass(e){this.reporter.submitTestCaseResult(e.uid,r.TestResultStatus.PASSED,{providerSessionGuids:[browser.sessionId]})}onTestFail(e){this.reporter.submitTestCaseResult(e.uid,r.TestResultStatus.FAILED,{failureReason:e.error?.message,providerSessionGuids:[browser.sessionId]})}onTestRetry(e){this.reporter.submitTestCaseResult(e.uid,r.TestResultStatus.SKIPPED,{failureReason:e.error?.message,providerSessionGuids:[browser.sessionId]})}onTestSkip(e){this.reporter.submitTestCaseResult(e.uid,r.TestResultStatus.SKIPPED,{failureReason:e.error?.message,providerSessionGuids:[browser.sessionId]})}async onRunnerEnd(){await this.reporter.runnerEnd()}get isSynchronised(){return this.reporter.isSynchronized()}}})); +!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports,require("@wdio/reporter"),require("applause-reporter-common")):"function"==typeof define&&define.amd?define(["exports","@wdio/reporter","applause-reporter-common"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self)["wdio-applause-reporter"]={},e.WDIOReporter,e.applauseReporterCommon)}(this,(function(e,s,t){"use strict";e.ApplausePlatformWdioReporter=class extends s{publciApi;config;inflightCalls=[];logger;constructor(e){super({stdout:!0,...e}),this.config=t.loadConfig({properties:e}),this.logger=e.logger||t.constructDefaultLogger(),this.publciApi=new t.PublicApi(this.config,this.logger)}onTestPass(e){const s=t.parseTestCaseName(e.fullTitle).applauseTestCaseId;if(void 0!==s){this.logger.info(`Test ${e.fullTitle}(${s}) passed`);const r=browser.capabilities;this.inflightCalls.push(this.publciApi.submitResult(Number(s),{testCycleId:this.config.applauseTestCycleId,status:t.TestRunAutoResultStatus.PASSED,sessionDetailsJson:{value:{deviceName:r["appium:deviceName"],orientation:r["appium:orientation"],platformName:r.platformName,platformVersion:r["appium:platformVersion"],browserName:r.browserName,browserVersion:r.browserVersion}}}))}}onTestFail(e){const s=t.parseTestCaseName(e.fullTitle).applauseTestCaseId;if(void 0!==s){this.logger.info(`Test ${e.fullTitle}(${s}) failed`);const r=browser.capabilities;this.inflightCalls.push(this.publciApi.submitResult(Number(s),{testCycleId:this.config.applauseTestCycleId,status:t.TestRunAutoResultStatus.FAILED,sessionDetailsJson:{value:{deviceName:r["appium:deviceName"],orientation:r["appium:orientation"],platformName:r.platformName,platformVersion:r["appium:platformVersion"],browserName:r.browserName,browserVersion:r.browserVersion}}}))}}onTestSkip(e){const s=t.parseTestCaseName(e.fullTitle).applauseTestCaseId;if(void 0!==s){this.logger.info(`Test ${e.fullTitle}(${s}) skipped`);const r=browser.capabilities;this.inflightCalls.push(this.publciApi.submitResult(Number(s),{testCycleId:this.config.applauseTestCycleId,status:t.TestRunAutoResultStatus.SKIPPED,sessionDetailsJson:{value:{deviceName:r["appium:deviceName"],orientation:r["appium:orientation"],platformName:r.platformName,platformVersion:r["appium:platformVersion"],browserName:r.browserName,browserVersion:r.browserVersion}}}))}}async onRunnerEnd(){await Promise.all(this.inflightCalls)}get isSynchronised(){return 0===this.publciApi.getCallsInFlight}},e.ApplauseResultService=class{reporter;logger;activeTest;constructor(e){this.logger=e.logger||t.constructDefaultLogger(),this.reporter=new t.ApplauseReporter(t.loadConfig(e),this.logger)}async beforeTest(e){const s=this.lookupTitle(e);this.logger.info("Starting test: "+s),this.activeTest=s,await this.reporter.startTestCase(s,s,{providerSessionIds:[browser.sessionId]})}async beforeScenario(e){const s=this.lookupTitle(e);this.logger.info("Starting Scenario: "+s),this.activeTest=s,await this.reporter.startTestCase(s,s,{providerSessionIds:[browser.sessionId]})}async afterCommand(e,s,r){if(this.activeTest&&e.startsWith("saveScreenshot")){const e=s[0].split("/").pop()||"screenshot.png";this.logger.debug("Capturing screenshot"),await this.reporter.attachTestCaseAsset(this.activeTest,e,browser.sessionId,t.AssetType.SCREENSHOT,Buffer.from(r,"base64"))}}async afterTest(e,s,r){this.activeTest=void 0;const i=this.lookupTitle(e);r.passed?this.logger.info("Test Passed: "+i):this.logger.error("Test Failed: "+i),await this.captureAssets(i,r.passed),await this.reporter.submitTestCaseResult(i,r.passed?t.TestResultStatus.PASSED:t.TestResultStatus.FAILED,{failureReason:r.exception})}async afterScenario(e,s){this.activeTest=void 0;const r=this.lookupTitle(e);s.passed?this.logger.info("Test Passed: "+r):this.logger.error("Test Failed: "+r),await this.captureAssets(r,s.passed),await this.reporter.submitTestCaseResult(r,s.passed?t.TestResultStatus.PASSED:t.TestResultStatus.FAILED,{failureReason:s.exception})}lookupTitle(e){return e.fullName?e.fullName:e.fullTitle?e.fullTitle:e.parent&&e.title?e.parent+" "+e.title:e.pickle&&e.pickle.name?e.pickle.name:""}async captureAssets(e,s){const r=[];try{if(!s){const e=Buffer.from(await browser.takeScreenshot(),"base64");r.push(["failure_screenshot.png",t.AssetType.FAILURE_SCREENSHOT,e])}r.push(["page_source.html",t.AssetType.PAGE_SOURCE,Buffer.from(await browser.getPageSource())]),r.push(["console_log.txt",t.AssetType.CONSOLE_LOG,Buffer.from(t.APPLAUSE_LOG_RECORDS.getLogs().join("\n"))]),await Promise.allSettled(r.map((([s,t,r])=>this.reporter.attachTestCaseAsset(e,s,browser.sessionId,t,r))))}catch(e){this.logger.error("Error capturing assets"),this.logger.error(e)}}},e.ApplauseRunService=class{reporter;logger;constructor(e){this.logger=e.logger||t.constructDefaultLogger(),this.reporter=new t.ApplauseReporter(t.loadConfig(e),this.logger)}async onPrepare(){const e=await this.reporter.runnerStart();process.env.APPLAUSE_RUN_ID=`${e}`}async onComplete(){await this.reporter.runnerEnd()}}})); //# sourceMappingURL=index.min.js.map diff --git a/dist/index.min.js.map b/dist/index.min.js.map index 2dc2ed4..bbb41b5 100644 --- a/dist/index.min.js.map +++ b/dist/index.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.min.js","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport {\n ApplauseReporter,\n ApplauseConfig,\n TestResultStatus,\n loadConfig,\n} from 'applause-reporter-common';\nimport { Browser } from 'webdriverio';\n\ndeclare let browser: Browser;\n\nexport class ApplauseWdioReporter extends WDIOReporter {\n private reporter: ApplauseReporter;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n const config = loadConfig({\n properties: options,\n });\n // Setup the initial maps\n this.reporter = new ApplauseReporter(config);\n }\n\n onRunnerStart() {\n this.reporter.runnerStart();\n }\n\n onTestStart(testStats: TestStats): void {\n this.reporter.startTestCase(testStats.uid, testStats.fullTitle, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n onTestPass(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.PASSED, {\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestFail(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.FAILED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestRetry(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestSkip(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n async onRunnerEnd(): Promise {\n await this.reporter.runnerEnd();\n }\n\n get isSynchronised(): boolean {\n return this.reporter.isSynchronized();\n }\n}\n\nexport { ApplauseConfig };\n"],"names":["WDIOReporter","reporter","constructor","options","super","stdout","config","loadConfig","properties","this","ApplauseReporter","onRunnerStart","runnerStart","onTestStart","testStats","startTestCase","uid","fullTitle","providerSessionIds","browser","sessionId","onTestPass","test","submitTestCaseResult","TestResultStatus","PASSED","providerSessionGuids","onTestFail","FAILED","failureReason","error","message","onTestRetry","SKIPPED","onTestSkip","onRunnerEnd","runnerEnd","isSynchronised","isSynchronized"],"mappings":"8aAWM,cAAoCA,EAChCC,SAER,WAAAC,CAAYC,GACVC,MAAM,CAAEC,QAAQ,KAASF,IACzB,MAAMG,EAASC,EAAAA,WAAW,CACxBC,WAAYL,IAGdM,KAAKR,SAAW,IAAIS,EAAgBA,iBAACJ,EACtC,CAED,aAAAK,GACEF,KAAKR,SAASW,aACf,CAED,WAAAC,CAAYC,GACVL,KAAKR,SAASc,cAAcD,EAAUE,IAAKF,EAAUG,UAAW,CAC9DC,mBAAoB,CAACC,QAAQC,YAEhC,CAED,UAAAC,CAAWC,GACTb,KAAKR,SAASsB,qBAAqBD,EAAKN,IAAKQ,EAAgBA,iBAACC,OAAQ,CACpEC,qBAAsB,CAACP,QAAQC,YAElC,CAED,UAAAO,CAAWL,GACTb,KAAKR,SAASsB,qBAAqBD,EAAKN,IAAKQ,EAAgBA,iBAACI,OAAQ,CACpEC,cAAeP,EAAKQ,OAAOC,QAC3BL,qBAAsB,CAACP,QAAQC,YAElC,CAED,WAAAY,CAAYV,GACVb,KAAKR,SAASsB,qBAAqBD,EAAKN,IAAKQ,EAAgBA,iBAACS,QAAS,CACrEJ,cAAeP,EAAKQ,OAAOC,QAC3BL,qBAAsB,CAACP,QAAQC,YAElC,CAED,UAAAc,CAAWZ,GACTb,KAAKR,SAASsB,qBAAqBD,EAAKN,IAAKQ,EAAgBA,iBAACS,QAAS,CACrEJ,cAAeP,EAAKQ,OAAOC,QAC3BL,qBAAsB,CAACP,QAAQC,YAElC,CAED,iBAAMe,SACE1B,KAAKR,SAASmC,WACrB,CAED,kBAAIC,GACF,OAAO5B,KAAKR,SAASqC,gBACtB"} \ No newline at end of file +{"version":3,"file":"index.min.js","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport { Services, Frameworks } from '@wdio/types';\nimport {\n APPLAUSE_LOG_RECORDS,\n ApplauseReporter,\n AssetType,\n loadConfig,\n TestResultStatus,\n constructDefaultLogger,\n PublicApi,\n ApplauseConfig,\n parseTestCaseName,\n TestRunAutoResultStatus,\n} from 'applause-reporter-common';\nimport * as winston from 'winston';\n\nexport class ApplauseRunService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n // @ts-ignore\n async onPrepare() {\n const testRunId = await this.reporter.runnerStart();\n process.env['APPLAUSE_RUN_ID'] = `${testRunId}`;\n }\n\n // @ts-ignore\n async onComplete() {\n await this.reporter.runnerEnd();\n }\n}\nexport class ApplauseResultService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n activeTest?: string;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n /**\n * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for\n * execution of Cucumber tests.\n *\n * @param test The test object\n */\n async beforeTest(test: Frameworks.Test) {\n const title = this.lookupTitle(test);\n this.logger.info('Starting test: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n /**\n * The beforeScenario hook is called before each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n */\n async beforeScenario(world: Frameworks.World) {\n const title = this.lookupTitle(world);\n this.logger.info('Starting Scenario: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n async afterCommand(\n commandName: string,\n args: any[],\n result: any\n ): Promise {\n if (!this.activeTest) {\n return;\n }\n if (commandName.startsWith('saveScreenshot')) {\n const screenshotName =\n (args[0] as string).split('/').pop() || 'screenshot.png';\n this.logger.debug('Capturing screenshot');\n await this.reporter.attachTestCaseAsset(\n this.activeTest,\n screenshotName,\n browser.sessionId,\n AssetType.SCREENSHOT,\n Buffer.from(result as string, 'base64')\n );\n }\n }\n\n /**\n * The afterTest hook is called after each test in a Mocha or Jasmine test.\n *\n * @param test The test object\n * @param _context The context object\n * @param result The result object\n */\n async afterTest(\n test: Frameworks.Test,\n _context: any,\n result: Frameworks.TestResult\n ) {\n this.activeTest = undefined;\n const title = this.lookupTitle(test);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * The afterScenario hook is called after each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n * @param result The result object\n */\n async afterScenario(world: Frameworks.World, result: Frameworks.TestResult) {\n this.activeTest = undefined;\n const title = this.lookupTitle(world);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some\n * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property.\n * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''.\n *\n * @param test The test or world object\n * @returns The title of the test\n */\n private lookupTitle(\n test: Partial\n ): string {\n if (test.fullName) {\n return test.fullName;\n }\n if (test.fullTitle) {\n return test.fullTitle;\n }\n if (!!test.parent && !!test.title) {\n return test.parent + ' ' + test.title;\n }\n if (!!test.pickle && !!test.pickle.name) {\n return test.pickle.name;\n }\n return '';\n }\n\n /**\n * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed,\n * the failure screenshot will be attached to the test case.\n *\n * @param resultId The result ID of the test case\n * @param passed Whether the test case passed\n */\n private async captureAssets(\n resultId: string,\n passed: boolean\n ): Promise {\n const assetsToUpload: [string, AssetType, Buffer][] = [];\n try {\n if (!passed) {\n const screenshot = Buffer.from(\n await browser.takeScreenshot(),\n 'base64'\n );\n assetsToUpload.push([\n 'failure_screenshot.png',\n AssetType.FAILURE_SCREENSHOT,\n screenshot,\n ]);\n }\n assetsToUpload.push([\n 'page_source.html',\n AssetType.PAGE_SOURCE,\n Buffer.from(await browser.getPageSource()),\n ]);\n assetsToUpload.push([\n 'console_log.txt',\n AssetType.CONSOLE_LOG,\n Buffer.from(APPLAUSE_LOG_RECORDS.getLogs().join('\\n')),\n ]);\n\n await Promise.allSettled(\n assetsToUpload.map(([name, type, data]) =>\n this.reporter.attachTestCaseAsset(\n resultId,\n name,\n browser.sessionId,\n type,\n data\n )\n )\n );\n } catch (e) {\n this.logger.error('Error capturing assets');\n this.logger.error(e);\n }\n }\n}\n\nexport class ApplausePlatformWdioReporter extends WDIOReporter {\n private publciApi: PublicApi;\n private config: ApplauseConfig;\n private inflightCalls: Promise[] = [];\n private logger: winston.Logger;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n this.config = loadConfig({\n properties: options,\n });\n this.logger =\n (options.logger as winston.Logger) || constructDefaultLogger();\n // Setup the initial maps\n this.publciApi = new PublicApi(this.config, this.logger);\n }\n\n onTestPass(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.PASSED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestFail(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.FAILED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestSkip(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.SKIPPED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n async onRunnerEnd(): Promise {\n void (await Promise.all(this.inflightCalls));\n }\n\n get isSynchronised(): boolean {\n return this.publciApi.getCallsInFlight === 0;\n }\n}\n"],"names":["WDIOReporter","publciApi","config","inflightCalls","logger","constructor","options","super","stdout","this","loadConfig","properties","constructDefaultLogger","PublicApi","onTestPass","test","applauseTestCaseId","parseTestCaseName","fullTitle","undefined","info","caps","browser","capabilities","push","submitResult","Number","testCycleId","applauseTestCycleId","status","TestRunAutoResultStatus","PASSED","sessionDetailsJson","value","deviceName","orientation","platformName","platformVersion","browserName","browserVersion","onTestFail","FAILED","onTestSkip","SKIPPED","onRunnerEnd","Promise","all","isSynchronised","getCallsInFlight","reporter","activeTest","serviceOptions","ApplauseReporter","beforeTest","title","lookupTitle","startTestCase","providerSessionIds","sessionId","beforeScenario","world","afterCommand","commandName","args","result","startsWith","screenshotName","split","pop","debug","attachTestCaseAsset","AssetType","SCREENSHOT","Buffer","from","afterTest","_context","passed","error","captureAssets","submitTestCaseResult","TestResultStatus","failureReason","exception","afterScenario","fullName","parent","pickle","name","resultId","assetsToUpload","screenshot","takeScreenshot","FAILURE_SCREENSHOT","PAGE_SOURCE","getPageSource","CONSOLE_LOG","APPLAUSE_LOG_RECORDS","getLogs","join","allSettled","map","type","data","e","onPrepare","testRunId","runnerStart","process","env","onComplete","runnerEnd"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 3d6b4f7..bb71955 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1,54 +1,257 @@ import WDIOReporter from '@wdio/reporter'; -import { loadConfig, ApplauseReporter, TestResultStatus } from 'applause-reporter-common'; +import { constructDefaultLogger, ApplauseReporter, loadConfig, AssetType, TestResultStatus, APPLAUSE_LOG_RECORDS, PublicApi, parseTestCaseName, TestRunAutoResultStatus } from 'applause-reporter-common'; -class ApplauseWdioReporter extends WDIOReporter { +class ApplauseRunService { reporter; - constructor(options) { - super({ stdout: true, ...options }); - const config = loadConfig({ - properties: options, - }); - // Setup the initial maps - this.reporter = new ApplauseReporter(config); + logger; + // @ts-ignore + constructor(serviceOptions) { + this.logger = + serviceOptions['logger'] || constructDefaultLogger(); + this.reporter = new ApplauseReporter(loadConfig(serviceOptions), this.logger); + } + // @ts-ignore + async onPrepare() { + const testRunId = await this.reporter.runnerStart(); + process.env['APPLAUSE_RUN_ID'] = `${testRunId}`; } - onRunnerStart() { - this.reporter.runnerStart(); + // @ts-ignore + async onComplete() { + await this.reporter.runnerEnd(); } - onTestStart(testStats) { - this.reporter.startTestCase(testStats.uid, testStats.fullTitle, { +} +class ApplauseResultService { + reporter; + logger; + activeTest; + // @ts-ignore + constructor(serviceOptions) { + this.logger = + serviceOptions['logger'] || constructDefaultLogger(); + this.reporter = new ApplauseReporter(loadConfig(serviceOptions), this.logger); + } + /** + * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for + * execution of Cucumber tests. + * + * @param test The test object + */ + async beforeTest(test) { + const title = this.lookupTitle(test); + this.logger.info('Starting test: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { providerSessionIds: [browser.sessionId], }); } - onTestPass(test) { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.PASSED, { - providerSessionGuids: [browser.sessionId], + /** + * The beforeScenario hook is called before each scenario in a Cucumber test. + * + * @param world The cucumber world object + */ + async beforeScenario(world) { + const title = this.lookupTitle(world); + this.logger.info('Starting Scenario: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { + providerSessionIds: [browser.sessionId], }); } - onTestFail(test) { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.FAILED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + async afterCommand(commandName, args, result) { + if (!this.activeTest) { + return; + } + if (commandName.startsWith('saveScreenshot')) { + const screenshotName = args[0].split('/').pop() || 'screenshot.png'; + this.logger.debug('Capturing screenshot'); + await this.reporter.attachTestCaseAsset(this.activeTest, screenshotName, browser.sessionId, AssetType.SCREENSHOT, Buffer.from(result, 'base64')); + } + } + /** + * The afterTest hook is called after each test in a Mocha or Jasmine test. + * + * @param test The test object + * @param _context The context object + * @param result The result object + */ + async afterTest(test, _context, result) { + this.activeTest = undefined; + const title = this.lookupTitle(test); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } + else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult(title, result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED, { + failureReason: result.exception, }); } - onTestRetry(test) { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + /** + * The afterScenario hook is called after each scenario in a Cucumber test. + * + * @param world The cucumber world object + * @param result The result object + */ + async afterScenario(world, result) { + this.activeTest = undefined; + const title = this.lookupTitle(world); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } + else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult(title, result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED, { + failureReason: result.exception, }); } - onTestSkip(test) { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + /** + * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some + * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property. + * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''. + * + * @param test The test or world object + * @returns The title of the test + */ + lookupTitle(test) { + if (test.fullName) { + return test.fullName; + } + if (test.fullTitle) { + return test.fullTitle; + } + if (!!test.parent && !!test.title) { + return test.parent + ' ' + test.title; + } + if (!!test.pickle && !!test.pickle.name) { + return test.pickle.name; + } + return ''; + } + /** + * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed, + * the failure screenshot will be attached to the test case. + * + * @param resultId The result ID of the test case + * @param passed Whether the test case passed + */ + async captureAssets(resultId, passed) { + const assetsToUpload = []; + try { + if (!passed) { + const screenshot = Buffer.from(await browser.takeScreenshot(), 'base64'); + assetsToUpload.push([ + 'failure_screenshot.png', + AssetType.FAILURE_SCREENSHOT, + screenshot, + ]); + } + assetsToUpload.push([ + 'page_source.html', + AssetType.PAGE_SOURCE, + Buffer.from(await browser.getPageSource()), + ]); + assetsToUpload.push([ + 'console_log.txt', + AssetType.CONSOLE_LOG, + Buffer.from(APPLAUSE_LOG_RECORDS.getLogs().join('\n')), + ]); + await Promise.allSettled(assetsToUpload.map(([name, type, data]) => this.reporter.attachTestCaseAsset(resultId, name, browser.sessionId, type, data))); + } + catch (e) { + this.logger.error('Error capturing assets'); + this.logger.error(e); + } + } +} +class ApplausePlatformWdioReporter extends WDIOReporter { + publciApi; + config; + inflightCalls = []; + logger; + constructor(options) { + super({ stdout: true, ...options }); + this.config = loadConfig({ + properties: options, }); + this.logger = + options.logger || constructDefaultLogger(); + // Setup the initial maps + this.publciApi = new PublicApi(this.config, this.logger); + } + onTestPass(test) { + const applauseTestCaseId = parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: TestRunAutoResultStatus.PASSED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } + } + onTestFail(test) { + const applauseTestCaseId = parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: TestRunAutoResultStatus.FAILED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } + } + onTestSkip(test) { + const applauseTestCaseId = parseTestCaseName(test.fullTitle).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`); + const caps = browser.capabilities; + this.inflightCalls.push(this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId, + status: TestRunAutoResultStatus.SKIPPED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + })); + } } async onRunnerEnd() { - await this.reporter.runnerEnd(); + void (await Promise.all(this.inflightCalls)); } get isSynchronised() { - return this.reporter.isSynchronized(); + return this.publciApi.getCallsInFlight === 0; } } -export { ApplauseWdioReporter }; +export { ApplausePlatformWdioReporter, ApplauseResultService, ApplauseRunService }; //# sourceMappingURL=index.mjs.map diff --git a/dist/index.mjs.map b/dist/index.mjs.map index c8cdae9..c628e8f 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport {\n ApplauseReporter,\n ApplauseConfig,\n TestResultStatus,\n loadConfig,\n} from 'applause-reporter-common';\nimport { Browser } from 'webdriverio';\n\ndeclare let browser: Browser;\n\nexport class ApplauseWdioReporter extends WDIOReporter {\n private reporter: ApplauseReporter;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n const config = loadConfig({\n properties: options,\n });\n // Setup the initial maps\n this.reporter = new ApplauseReporter(config);\n }\n\n onRunnerStart() {\n this.reporter.runnerStart();\n }\n\n onTestStart(testStats: TestStats): void {\n this.reporter.startTestCase(testStats.uid, testStats.fullTitle, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n onTestPass(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.PASSED, {\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestFail(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.FAILED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestRetry(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n onTestSkip(test: TestStats): void {\n this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, {\n failureReason: test.error?.message,\n providerSessionGuids: [browser.sessionId],\n });\n }\n\n async onRunnerEnd(): Promise {\n await this.reporter.runnerEnd();\n }\n\n get isSynchronised(): boolean {\n return this.reporter.isSynchronized();\n }\n}\n\nexport { ApplauseConfig };\n"],"names":[],"mappings":";;;AAWM,MAAO,oBAAqB,SAAQ,YAAY,CAAA;AAC5C,IAAA,QAAQ,CAAmB;AAEnC,IAAA,WAAA,CAAY,OAAgC,EAAA;QAC1C,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC;AACxB,YAAA,UAAU,EAAE,OAAO;AACpB,SAAA,CAAC,CAAC;;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;KAC9C;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;KAC7B;AAED,IAAA,WAAW,CAAC,SAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE;AAC9D,YAAA,kBAAkB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AACxC,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,MAAM,EAAE;AACpE,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,MAAM,EAAE;AACpE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,IAAe,EAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,OAAO,EAAE;AACrE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,OAAO,EAAE;AACrE,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AAClC,YAAA,oBAAoB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;KACjC;AAED,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;KACvC;AACF;;;;"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import WDIOReporter, { TestStats } from '@wdio/reporter';\nimport { Services, Frameworks } from '@wdio/types';\nimport {\n APPLAUSE_LOG_RECORDS,\n ApplauseReporter,\n AssetType,\n loadConfig,\n TestResultStatus,\n constructDefaultLogger,\n PublicApi,\n ApplauseConfig,\n parseTestCaseName,\n TestRunAutoResultStatus,\n} from 'applause-reporter-common';\nimport * as winston from 'winston';\n\nexport class ApplauseRunService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n // @ts-ignore\n async onPrepare() {\n const testRunId = await this.reporter.runnerStart();\n process.env['APPLAUSE_RUN_ID'] = `${testRunId}`;\n }\n\n // @ts-ignore\n async onComplete() {\n await this.reporter.runnerEnd();\n }\n}\nexport class ApplauseResultService implements Services.ServiceInstance {\n reporter: ApplauseReporter;\n logger: winston.Logger;\n activeTest?: string;\n\n // @ts-ignore\n constructor(serviceOptions: Services.ServiceOption) {\n this.logger =\n (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger();\n this.reporter = new ApplauseReporter(\n loadConfig(serviceOptions),\n this.logger\n );\n }\n\n /**\n * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for\n * execution of Cucumber tests.\n *\n * @param test The test object\n */\n async beforeTest(test: Frameworks.Test) {\n const title = this.lookupTitle(test);\n this.logger.info('Starting test: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n /**\n * The beforeScenario hook is called before each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n */\n async beforeScenario(world: Frameworks.World) {\n const title = this.lookupTitle(world);\n this.logger.info('Starting Scenario: ' + title);\n this.activeTest = title;\n await this.reporter.startTestCase(title, title, {\n providerSessionIds: [browser.sessionId],\n });\n }\n\n async afterCommand(\n commandName: string,\n args: any[],\n result: any\n ): Promise {\n if (!this.activeTest) {\n return;\n }\n if (commandName.startsWith('saveScreenshot')) {\n const screenshotName =\n (args[0] as string).split('/').pop() || 'screenshot.png';\n this.logger.debug('Capturing screenshot');\n await this.reporter.attachTestCaseAsset(\n this.activeTest,\n screenshotName,\n browser.sessionId,\n AssetType.SCREENSHOT,\n Buffer.from(result as string, 'base64')\n );\n }\n }\n\n /**\n * The afterTest hook is called after each test in a Mocha or Jasmine test.\n *\n * @param test The test object\n * @param _context The context object\n * @param result The result object\n */\n async afterTest(\n test: Frameworks.Test,\n _context: any,\n result: Frameworks.TestResult\n ) {\n this.activeTest = undefined;\n const title = this.lookupTitle(test);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * The afterScenario hook is called after each scenario in a Cucumber test.\n *\n * @param world The cucumber world object\n * @param result The result object\n */\n async afterScenario(world: Frameworks.World, result: Frameworks.TestResult) {\n this.activeTest = undefined;\n const title = this.lookupTitle(world);\n if (result.passed) {\n this.logger.info('Test Passed: ' + title);\n } else {\n this.logger.error('Test Failed: ' + title);\n }\n await this.captureAssets(title, result.passed);\n await this.reporter.submitTestCaseResult(\n title,\n result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED,\n {\n failureReason: result.exception,\n }\n );\n }\n\n /**\n * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some\n * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property.\n * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''.\n *\n * @param test The test or world object\n * @returns The title of the test\n */\n private lookupTitle(\n test: Partial\n ): string {\n if (test.fullName) {\n return test.fullName;\n }\n if (test.fullTitle) {\n return test.fullTitle;\n }\n if (!!test.parent && !!test.title) {\n return test.parent + ' ' + test.title;\n }\n if (!!test.pickle && !!test.pickle.name) {\n return test.pickle.name;\n }\n return '';\n }\n\n /**\n * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed,\n * the failure screenshot will be attached to the test case.\n *\n * @param resultId The result ID of the test case\n * @param passed Whether the test case passed\n */\n private async captureAssets(\n resultId: string,\n passed: boolean\n ): Promise {\n const assetsToUpload: [string, AssetType, Buffer][] = [];\n try {\n if (!passed) {\n const screenshot = Buffer.from(\n await browser.takeScreenshot(),\n 'base64'\n );\n assetsToUpload.push([\n 'failure_screenshot.png',\n AssetType.FAILURE_SCREENSHOT,\n screenshot,\n ]);\n }\n assetsToUpload.push([\n 'page_source.html',\n AssetType.PAGE_SOURCE,\n Buffer.from(await browser.getPageSource()),\n ]);\n assetsToUpload.push([\n 'console_log.txt',\n AssetType.CONSOLE_LOG,\n Buffer.from(APPLAUSE_LOG_RECORDS.getLogs().join('\\n')),\n ]);\n\n await Promise.allSettled(\n assetsToUpload.map(([name, type, data]) =>\n this.reporter.attachTestCaseAsset(\n resultId,\n name,\n browser.sessionId,\n type,\n data\n )\n )\n );\n } catch (e) {\n this.logger.error('Error capturing assets');\n this.logger.error(e);\n }\n }\n}\n\nexport class ApplausePlatformWdioReporter extends WDIOReporter {\n private publciApi: PublicApi;\n private config: ApplauseConfig;\n private inflightCalls: Promise[] = [];\n private logger: winston.Logger;\n\n constructor(options: Partial) {\n super({ stdout: true, ...options });\n this.config = loadConfig({\n properties: options,\n });\n this.logger =\n (options.logger as winston.Logger) || constructDefaultLogger();\n // Setup the initial maps\n this.publciApi = new PublicApi(this.config, this.logger);\n }\n\n onTestPass(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.PASSED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestFail(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.FAILED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n onTestSkip(test: TestStats): void {\n const applauseTestCaseId = parseTestCaseName(\n test.fullTitle\n ).applauseTestCaseId;\n if (applauseTestCaseId !== undefined) {\n this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`);\n const caps = browser.capabilities as WebdriverIO.Capabilities;\n this.inflightCalls.push(\n this.publciApi.submitResult(Number(applauseTestCaseId), {\n testCycleId: this.config.applauseTestCycleId!,\n status: TestRunAutoResultStatus.SKIPPED,\n sessionDetailsJson: {\n value: {\n deviceName: caps['appium:deviceName'],\n orientation: caps['appium:orientation'],\n platformName: caps.platformName,\n platformVersion: caps['appium:platformVersion'],\n browserName: caps.browserName,\n browserVersion: caps.browserVersion,\n },\n },\n })\n );\n }\n }\n\n async onRunnerEnd(): Promise {\n void (await Promise.all(this.inflightCalls));\n }\n\n get isSynchronised(): boolean {\n return this.publciApi.getCallsInFlight === 0;\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 1800ecb..420f8ca 100644 --- a/package.json +++ b/package.json @@ -66,10 +66,13 @@ "yarn": "^1.22.19" }, "dependencies": { + "@wdio/globals": "^8.39.1", "@wdio/reporter": "^8.16.3", - "applause-reporter-common": "github:ApplauseOSS/applause-reporter-common#v1.0.0", + "@wdio/types": "^8.39.0", + "applause-reporter-common": "github:ApplauseOSS/applause-reporter-common#v1.1.0", "axios": "^1.5.0", - "webdriverio": "^8.16.6" + "webdriverio": "^8.16.6", + "winston": "^3.13.1" }, "resolutions": { "strip-ansi": "6.0.1", diff --git a/rollup.config.js b/rollup.config.js index 80c52c7..dd084af 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -41,6 +41,6 @@ const options = [ input: "src/index.ts", output: [{ file: "dist/index.d.ts", format: "es" }], plugins: [dts.default()], - }, + }, ] export default options; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 06fd985..c13d65d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,70 +1,342 @@ import WDIOReporter, { TestStats } from '@wdio/reporter'; +import { Services, Frameworks } from '@wdio/types'; import { + APPLAUSE_LOG_RECORDS, ApplauseReporter, - ApplauseConfig, - TestResultStatus, + AssetType, loadConfig, + TestResultStatus, + constructDefaultLogger, + PublicApi, + ApplauseConfig, + parseTestCaseName, + TestRunAutoResultStatus, } from 'applause-reporter-common'; -import { Browser } from 'webdriverio'; +import * as winston from 'winston'; -declare let browser: Browser; +export class ApplauseRunService implements Services.ServiceInstance { + reporter: ApplauseReporter; + logger: winston.Logger; -export class ApplauseWdioReporter extends WDIOReporter { - private reporter: ApplauseReporter; + // @ts-ignore + constructor(serviceOptions: Services.ServiceOption) { + this.logger = + (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger(); + this.reporter = new ApplauseReporter( + loadConfig(serviceOptions), + this.logger + ); + } - constructor(options: Partial) { - super({ stdout: true, ...options }); - const config = loadConfig({ - properties: options, - }); - // Setup the initial maps - this.reporter = new ApplauseReporter(config); + // @ts-ignore + async onPrepare() { + const testRunId = await this.reporter.runnerStart(); + process.env['APPLAUSE_RUN_ID'] = `${testRunId}`; + } + + // @ts-ignore + async onComplete() { + await this.reporter.runnerEnd(); } +} +export class ApplauseResultService implements Services.ServiceInstance { + reporter: ApplauseReporter; + logger: winston.Logger; + activeTest?: string; - onRunnerStart() { - this.reporter.runnerStart(); + // @ts-ignore + constructor(serviceOptions: Services.ServiceOption) { + this.logger = + (serviceOptions['logger'] as winston.Logger) || constructDefaultLogger(); + this.reporter = new ApplauseReporter( + loadConfig(serviceOptions), + this.logger + ); } - onTestStart(testStats: TestStats): void { - this.reporter.startTestCase(testStats.uid, testStats.fullTitle, { + /** + * Before test hook. This is called for tests executed by the Mocha or Jasmine framework. See beforeScenario for + * execution of Cucumber tests. + * + * @param test The test object + */ + async beforeTest(test: Frameworks.Test) { + const title = this.lookupTitle(test); + this.logger.info('Starting test: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { providerSessionIds: [browser.sessionId], }); } - onTestPass(test: TestStats): void { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.PASSED, { - providerSessionGuids: [browser.sessionId], + /** + * The beforeScenario hook is called before each scenario in a Cucumber test. + * + * @param world The cucumber world object + */ + async beforeScenario(world: Frameworks.World) { + const title = this.lookupTitle(world); + this.logger.info('Starting Scenario: ' + title); + this.activeTest = title; + await this.reporter.startTestCase(title, title, { + providerSessionIds: [browser.sessionId], }); } - onTestFail(test: TestStats): void { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.FAILED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], - }); + async afterCommand( + commandName: string, + args: any[], + result: any + ): Promise { + if (!this.activeTest) { + return; + } + if (commandName.startsWith('saveScreenshot')) { + const screenshotName = + (args[0] as string).split('/').pop() || 'screenshot.png'; + this.logger.debug('Capturing screenshot'); + await this.reporter.attachTestCaseAsset( + this.activeTest, + screenshotName, + browser.sessionId, + AssetType.SCREENSHOT, + Buffer.from(result as string, 'base64') + ); + } + } + + /** + * The afterTest hook is called after each test in a Mocha or Jasmine test. + * + * @param test The test object + * @param _context The context object + * @param result The result object + */ + async afterTest( + test: Frameworks.Test, + _context: any, + result: Frameworks.TestResult + ) { + this.activeTest = undefined; + const title = this.lookupTitle(test); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult( + title, + result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED, + { + failureReason: result.exception, + } + ); + } + + /** + * The afterScenario hook is called after each scenario in a Cucumber test. + * + * @param world The cucumber world object + * @param result The result object + */ + async afterScenario(world: Frameworks.World, result: Frameworks.TestResult) { + this.activeTest = undefined; + const title = this.lookupTitle(world); + if (result.passed) { + this.logger.info('Test Passed: ' + title); + } else { + this.logger.error('Test Failed: ' + title); + } + await this.captureAssets(title, result.passed); + await this.reporter.submitTestCaseResult( + title, + result.passed ? TestResultStatus.PASSED : TestResultStatus.FAILED, + { + failureReason: result.exception, + } + ); + } + + /** + * Function to lookup the title from a Test or World object. WebdriverIO is inconsistent with where the title is stored. In some + * cases it is in the `fullName` property, in others it is in the `fullTitle` property, and in others it is in the `title` property. + * For cucumber, it is stored in the `pickle.name` property. If none of these are found, it will return ''. + * + * @param test The test or world object + * @returns The title of the test + */ + private lookupTitle( + test: Partial + ): string { + if (test.fullName) { + return test.fullName; + } + if (test.fullTitle) { + return test.fullTitle; + } + if (!!test.parent && !!test.title) { + return test.parent + ' ' + test.title; + } + if (!!test.pickle && !!test.pickle.name) { + return test.pickle.name; + } + return ''; + } + + /** + * Function to capture assets for a test case. This includes a screenshot, page source, and console log. If the test case failed, + * the failure screenshot will be attached to the test case. + * + * @param resultId The result ID of the test case + * @param passed Whether the test case passed + */ + private async captureAssets( + resultId: string, + passed: boolean + ): Promise { + const assetsToUpload: [string, AssetType, Buffer][] = []; + try { + if (!passed) { + const screenshot = Buffer.from( + await browser.takeScreenshot(), + 'base64' + ); + assetsToUpload.push([ + 'failure_screenshot.png', + AssetType.FAILURE_SCREENSHOT, + screenshot, + ]); + } + assetsToUpload.push([ + 'page_source.html', + AssetType.PAGE_SOURCE, + Buffer.from(await browser.getPageSource()), + ]); + assetsToUpload.push([ + 'console_log.txt', + AssetType.CONSOLE_LOG, + Buffer.from(APPLAUSE_LOG_RECORDS.getLogs().join('\n')), + ]); + + await Promise.allSettled( + assetsToUpload.map(([name, type, data]) => + this.reporter.attachTestCaseAsset( + resultId, + name, + browser.sessionId, + type, + data + ) + ) + ); + } catch (e) { + this.logger.error('Error capturing assets'); + this.logger.error(e); + } } +} + +export class ApplausePlatformWdioReporter extends WDIOReporter { + private publciApi: PublicApi; + private config: ApplauseConfig; + private inflightCalls: Promise[] = []; + private logger: winston.Logger; - onTestRetry(test: TestStats): void { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], + constructor(options: Partial) { + super({ stdout: true, ...options }); + this.config = loadConfig({ + properties: options, }); + this.logger = + (options.logger as winston.Logger) || constructDefaultLogger(); + // Setup the initial maps + this.publciApi = new PublicApi(this.config, this.logger); + } + + onTestPass(test: TestStats): void { + const applauseTestCaseId = parseTestCaseName( + test.fullTitle + ).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) passed`); + const caps = browser.capabilities as WebdriverIO.Capabilities; + this.inflightCalls.push( + this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId!, + status: TestRunAutoResultStatus.PASSED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + }) + ); + } + } + + onTestFail(test: TestStats): void { + const applauseTestCaseId = parseTestCaseName( + test.fullTitle + ).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) failed`); + const caps = browser.capabilities as WebdriverIO.Capabilities; + this.inflightCalls.push( + this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId!, + status: TestRunAutoResultStatus.FAILED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + }) + ); + } } onTestSkip(test: TestStats): void { - this.reporter.submitTestCaseResult(test.uid, TestResultStatus.SKIPPED, { - failureReason: test.error?.message, - providerSessionGuids: [browser.sessionId], - }); + const applauseTestCaseId = parseTestCaseName( + test.fullTitle + ).applauseTestCaseId; + if (applauseTestCaseId !== undefined) { + this.logger.info(`Test ${test.fullTitle}(${applauseTestCaseId}) skipped`); + const caps = browser.capabilities as WebdriverIO.Capabilities; + this.inflightCalls.push( + this.publciApi.submitResult(Number(applauseTestCaseId), { + testCycleId: this.config.applauseTestCycleId!, + status: TestRunAutoResultStatus.SKIPPED, + sessionDetailsJson: { + value: { + deviceName: caps['appium:deviceName'], + orientation: caps['appium:orientation'], + platformName: caps.platformName, + platformVersion: caps['appium:platformVersion'], + browserName: caps.browserName, + browserVersion: caps.browserVersion, + }, + }, + }) + ); + } } async onRunnerEnd(): Promise { - await this.reporter.runnerEnd(); + void (await Promise.all(this.inflightCalls)); } get isSynchronised(): boolean { - return this.reporter.isSynchronized(); + return this.publciApi.getCallsInFlight === 0; } } - -export { ApplauseConfig }; diff --git a/tsconfig.json b/tsconfig.json index 252e790..462b937 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,7 +27,8 @@ "noUnusedParameters": true, "emitDeclarationOnly": true, "allowImportingTsExtensions": true, - "pretty": true + "pretty": true, + "types": ["node", "@wdio/types", "@wdio/globals/types"], }, "include": [ "@types/**/*", diff --git a/yarn.lock b/yarn.lock index 7e150a6..22596b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,75 +18,53 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.24.8": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" - integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" - integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.9" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-module-transforms" "^7.24.9" - "@babel/helpers" "^7.24.8" - "@babel/parser" "^7.24.8" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.9" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.8", "@babel/generator@^7.24.9", "@babel/generator@^7.7.2": - version "7.24.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" - integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.24.9" + "@babel/types" "^7.25.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" - integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.8" + "@babel/compat-data" "^7.25.2" "@babel/helper-validator-option" "^7.24.8" browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" @@ -95,18 +73,17 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" - integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== @@ -119,13 +96,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - "@babel/helper-string-parser@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" @@ -141,13 +111,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== -"@babel/helpers@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" - integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.8" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.24.7": version "7.24.7" @@ -159,10 +129,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" - integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -178,14 +150,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -206,7 +192,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -220,7 +206,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -248,7 +234,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -256,41 +249,38 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== +"@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" - integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.8" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.8" - "@babel/types" "^7.24.8" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.3.3": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" - integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" @@ -301,6 +291,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -308,6 +303,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -606,7 +610,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== @@ -658,27 +662,14 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@promptbook/utils@0.58.0": - version "0.58.0" - resolved "https://registry.yarnpkg.com/@promptbook/utils/-/utils-0.58.0.tgz#f85439d56e5c0593b81a1003c9dd0769f89ba76f" - integrity sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ== +"@promptbook/utils@0.68.0-0": + version "0.68.0-0" + resolved "https://registry.yarnpkg.com/@promptbook/utils/-/utils-0.68.0-0.tgz#c5d1e4c5aac3b487e49313df96946cf22bb7e0f6" + integrity sha512-jn4DxTP5mkH9DPD59XoZJBKcJtQGiY/WL8GbKrhu48zSDsh4jWqYPMs2uVm5wVE0Hc56LPMxmEVYOrGYTchOOg== dependencies: - spacetrim "0.11.36" - -"@puppeteer/browsers@1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.4.6.tgz#1f70fd23d5d2ccce9d29b038e5039d7a1049ca77" - integrity sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ== - dependencies: - debug "4.3.4" - extract-zip "2.0.1" - progress "2.0.3" - proxy-agent "6.3.0" - tar-fs "3.0.4" - unbzip2-stream "1.4.3" - yargs "17.7.1" + spacetrim "0.11.39" -"@puppeteer/browsers@^1.6.0": +"@puppeteer/browsers@1.9.1", "@puppeteer/browsers@^1.6.0": version "1.9.1" resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.9.1.tgz#384ee8b09786f0e8f62b1925e4c492424cb549ee" integrity sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA== @@ -887,12 +878,19 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*", "@types/node@^20.1.0", "@types/node@^20.6.0": - version "20.14.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.12.tgz#129d7c3a822cb49fc7ff661235f19cfefd422b49" - integrity sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ== +"@types/node@*", "@types/node@^22.2.0": + version "22.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" + integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== + dependencies: + undici-types "~6.19.2" + +"@types/node@^20.6.0": + version "20.16.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.2.tgz#9e388f503a5af306e8c63319334887390966a11e" + integrity sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/resolve@1.20.2": version "1.20.2" @@ -909,15 +907,20 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/which@^2.0.1": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.2.tgz#54541d02d6b1daee5ec01ac0d1b37cecf37db1ae" integrity sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw== "@types/ws@^8.5.3": - version "8.5.11" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.11.tgz#90ad17b3df7719ce3e6bc32f83ff954d38656508" - integrity sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w== + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" @@ -927,9 +930,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" @@ -1079,20 +1082,44 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@wdio/config@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@wdio/config/-/config-8.39.0.tgz#3bda79e2f39d66079deb9813147234493468c790" - integrity sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A== +"@vitest/pretty-format@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/snapshot@^2.0.3": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== + dependencies: + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" + +"@wdio/config@8.40.3": + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/config/-/config-8.40.3.tgz#d11944ee3f1b4293b34d2bd5346b5c575f877c4c" + integrity sha512-HIi+JnHEDAExhzGRQuZOXw1HWIpe/bsVFHwNISJhY6wS4Nijaigmegs2p14Rv16ydOF19hGrxdKsl8k5STIP2A== dependencies: "@wdio/logger" "8.38.0" - "@wdio/types" "8.39.0" - "@wdio/utils" "8.39.0" + "@wdio/types" "8.40.3" + "@wdio/utils" "8.40.3" decamelize "^6.0.0" deepmerge-ts "^5.0.0" glob "^10.2.2" import-meta-resolve "^4.0.0" -"@wdio/logger@8.38.0", "@wdio/logger@^8.28.0": +"@wdio/globals@^8.29.3", "@wdio/globals@^8.39.1": + version "8.40.5" + resolved "https://registry.yarnpkg.com/@wdio/globals/-/globals-8.40.5.tgz#874111036bb54b053b6fed9bd3798cecb2977f5f" + integrity sha512-pHWNDhAO25BqfuxXmEwBceUeGzfEjkym9I4EzfUlPpoi39BRasDXbWSpX3us/5snUv5Xk+NWMDv4aTpTxfDQrA== + optionalDependencies: + expect-webdriverio "^4.11.2" + webdriverio "8.40.5" + +"@wdio/logger@8.38.0", "@wdio/logger@^8.28.0", "@wdio/logger@^8.38.0": version "8.38.0" resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-8.38.0.tgz#a96406267e800bef9c58ac95de00f42ab0d3ac5c" integrity sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q== @@ -1102,44 +1129,54 @@ loglevel-plugin-prefix "^0.8.4" strip-ansi "^7.1.0" -"@wdio/protocols@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-8.38.0.tgz#05a3b63cc1318f82b39263e10892d907a7a2f278" - integrity sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA== +"@wdio/logger@^9.0.0": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-9.0.4.tgz#63e901b9f0f29fa1ded5af54006fbd4df2354c33" + integrity sha512-b6gcu0PTVb3fgK4kyAH/k5UUWN5FOUdAfhA4PAY/IZvxZTMFYMqnrZb0WRWWWqL6nu9pcrOVtCOdPBvj0cb+Nw== + dependencies: + chalk "^5.1.2" + loglevel "^1.6.0" + loglevel-plugin-prefix "^0.8.4" + strip-ansi "^7.1.0" -"@wdio/repl@8.24.12": - version "8.24.12" - resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-8.24.12.tgz#b09746ae4f51f7da684312db617e598f2d064d9a" - integrity sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw== +"@wdio/protocols@8.40.3": + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-8.40.3.tgz#cf823f4a571b650750b12b9033b65cf177fdb367" + integrity sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A== + +"@wdio/repl@8.40.3": + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-8.40.3.tgz#897b225b4ea1b961ac014ff0a6cb51c8917bd139" + integrity sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw== dependencies: - "@types/node" "^20.1.0" + "@types/node" "^22.2.0" "@wdio/reporter@^8.16.3": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@wdio/reporter/-/reporter-8.39.0.tgz#e4d16a0b996b3dbeeb8a1f38ef2dfa3d763f3226" - integrity sha512-XahXhmaA1okdwg4/ThHFSqy/41KywxhbtszPcTzyXB+9INaqFNHA1b1vvWs0mrD5+tTtKbg4caTcEHVJU4iv0w== + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/reporter/-/reporter-8.40.3.tgz#59861b38db5e432bba6533851a1597c40a66d5a7" + integrity sha512-icoUnlyIqLKgxB215OPdDTHG+hlu+U+t/sO6S9eI0ZTYBYaDIQBWVCilkUWRvgfcNSiXYo+1VlVt6waIgIHKwQ== dependencies: - "@types/node" "^20.1.0" + "@types/node" "^22.2.0" "@wdio/logger" "8.38.0" - "@wdio/types" "8.39.0" + "@wdio/types" "8.40.3" diff "^5.0.0" object-inspect "^1.12.0" -"@wdio/types@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@wdio/types/-/types-8.39.0.tgz#21032c638ded2dfb72b87114a8086e6777b43aae" - integrity sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q== +"@wdio/types@8.40.3", "@wdio/types@^8.39.0": + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/types/-/types-8.40.3.tgz#14abe6b53a13a7bde028d8f542ec6f40500e03e2" + integrity sha512-zK17uyON3Ise3m+XwiF5VrrdZcXXmvqB8AWXoKe88DiksFUPMVoCOuVL2SSX1KnA2YLlZBA55qcFZT99GORVKQ== dependencies: - "@types/node" "^20.1.0" + "@types/node" "^22.2.0" -"@wdio/utils@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-8.39.0.tgz#527f9d3c168672abf8711f510321b8633c834f6b" - integrity sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q== +"@wdio/utils@8.40.3": + version "8.40.3" + resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-8.40.3.tgz#bbea939a046a9c75bd37ff11eeb9c50652c8de37" + integrity sha512-pv/848KGfPN3YXU4QRfTYGkAu4/lejIfoGzGpvGNDcACiVxgZhyRZkJ2xVaSnGaXzF0R7pMozrkU5/DnEhcxMg== dependencies: "@puppeteer/browsers" "^1.6.0" "@wdio/logger" "8.38.0" - "@wdio/types" "8.39.0" + "@wdio/types" "8.40.3" decamelize "^6.0.0" deepmerge-ts "^5.1.0" edgedriver "^5.5.0" @@ -1151,10 +1188,10 @@ split2 "^4.2.0" wait-port "^1.0.4" -"@zip.js/zip.js@^2.7.44": - version "2.7.47" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.47.tgz#bc3ec3d3b191f2331450242edfa06dfac08082cc" - integrity sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg== +"@zip.js/zip.js@^2.7.48": + version "2.7.52" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.52.tgz#bc11de93b41f09e03155bc178e7f9c2e2612671d" + integrity sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q== abort-controller@^3.0.0: version "3.0.0" @@ -1236,13 +1273,16 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -"applause-reporter-common@github:ApplauseOSS/applause-reporter-common#v1.0.0": - version "0.0.1" - resolved "https://codeload.github.com/ApplauseOSS/applause-reporter-common/tar.gz/69e470273a96638ef332036c56234b386b7b2d11" +"applause-reporter-common@github:ApplauseOSS/applause-reporter-common#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/ApplauseOSS/applause-reporter-common/tar.gz/72a9fdbc601ca4a325df47950eda2889831b20ac" dependencies: axios "^1.6.0" + logform "^2.6.0" mailparser "^3.6.5" validator "^13.11.0" + winston "^3.13.0" + winston-transport "^4.7.0" yarn "^1.22.19" archiver-utils@^5.0.0, archiver-utils@^5.0.2: @@ -1308,9 +1348,9 @@ ast-types@^0.13.4: tslib "^2.0.1" async@^3.2.3, async@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -1318,9 +1358,9 @@ asynckit@^0.4.0: integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.5.0, axios@^1.6.0: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + version "1.7.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" + integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -1366,22 +1406,25 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" @@ -1402,18 +1445,18 @@ bare-events@^2.0.0, bare-events@^2.2.0: integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== bare-fs@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.1.tgz#cdbd63dac7a552dfb2b87d18c822298d1efd213d" - integrity sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.3.tgz#0f66b203a72b9a632e9b5f2b6619d0ca19b758af" + integrity sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw== dependencies: bare-events "^2.0.0" bare-path "^2.0.0" bare-stream "^2.0.0" bare-os@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.0.tgz#5de5e3ba7704f459c9656629edca7cc736e06608" - integrity sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.2.tgz#2de697579bfc7830a2b1892fe09a9cb365ee2352" + integrity sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg== bare-path@^2.0.0, bare-path@^2.1.0: version "2.1.3" @@ -1423,9 +1466,9 @@ bare-path@^2.0.0, bare-path@^2.1.0: bare-os "^2.1.0" bare-stream@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.1.3.tgz#070b69919963a437cc9e20554ede079ce0a129b2" - integrity sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.2.0.tgz#4046dce7567a5a9d2a4d416f6c2c178f6e13361f" + integrity sha512-+o9MG5bPRRBlkVSpfFlMag3n7wMaIZb4YZasU2+/96f+3HTQ4F9DKQeu3K/Sjz1W0umu6xvVq1ON0ipWdMlr3A== dependencies: streamx "^2.18.0" @@ -1462,16 +1505,16 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.23.1: - version "4.23.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" - integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001640" - electron-to-chromium "^1.4.820" - node-releases "^2.0.14" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" update-browserslist-db "^1.1.0" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -1554,10 +1597,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001640: - version "1.0.30001643" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz#9c004caef315de9452ab970c3da71085f8241dbd" - integrity sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg== +caniuse-lite@^1.0.30001646: + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== chalk@^2.4.2: version "2.4.2" @@ -1586,12 +1629,13 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chromium-bidi@0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz#8a67bfdf6bb8804efc22765a82859d20724b46ab" - integrity sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA== +chromium-bidi@0.5.8: + version "0.5.8" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.8.tgz#5053038425c062ed34b9bc973e84e79de0a5cef0" + integrity sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw== dependencies: - mitt "3.0.0" + mitt "3.0.1" + urlpattern-polyfill "10.0.0" ci-info@^3.2.0: version "3.9.0" @@ -1599,9 +1643,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" + integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== cliui@^8.0.1: version "8.0.1" @@ -1622,7 +1666,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1641,11 +1685,35 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1757,9 +1825,9 @@ data-uri-to-buffer@^6.0.2: integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -1831,15 +1899,15 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -devtools-protocol@0.0.1147663: - version "0.0.1147663" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz#4ec5610b39a6250d1f87e6b9c7e16688ed0ac78e" - integrity sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ== +devtools-protocol@0.0.1232444: + version "0.0.1232444" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz#406345a90a871ba852c530d73482275234936eed" + integrity sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg== -devtools-protocol@^0.0.1302984: - version "0.0.1302984" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz#4d8614264105394bfc39dd268121bd549a877f1a" - integrity sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA== +devtools-protocol@^0.0.1342118: + version "0.0.1342118" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz#ea136fc1701572c0830233dcb414dc857e582e0a" + integrity sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w== diff-sequences@^29.6.3: version "29.6.3" @@ -1909,14 +1977,15 @@ edge-paths@^3.0.5: which "^2.0.2" edgedriver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/edgedriver/-/edgedriver-5.6.0.tgz#fea8d7ac9b328753fc250aceaeb6d1fbcf33fb87" - integrity sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/edgedriver/-/edgedriver-5.6.1.tgz#36971f000aee8756c11f3fb1dc5273f109e860d5" + integrity sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA== dependencies: - "@wdio/logger" "^8.28.0" - "@zip.js/zip.js" "^2.7.44" + "@wdio/logger" "^8.38.0" + "@zip.js/zip.js" "^2.7.48" decamelize "^6.0.0" edge-paths "^3.0.5" + fast-xml-parser "^4.4.1" node-fetch "^3.3.2" which "^4.0.0" @@ -1927,10 +1996,10 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.820: - version "1.5.1" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.1.tgz#24640bd4dcfaccb6d82bb4c3f4c7311503241581" - integrity sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w== +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== emittery@^0.13.1: version "0.13.1" @@ -1942,6 +2011,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encoding-japanese@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encoding-japanese/-/encoding-japanese-2.0.0.tgz#fa0226e5469e7b5b69a04fea7d5481bd1fa56936" @@ -1972,9 +2046,9 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" @@ -2197,6 +2271,20 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expect-webdriverio@^4.11.2: + version "4.15.4" + resolved "https://registry.yarnpkg.com/expect-webdriverio/-/expect-webdriverio-4.15.4.tgz#0d0c572e6aa6477c5094b0c689106bc8890d1416" + integrity sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg== + dependencies: + "@vitest/snapshot" "^2.0.3" + expect "^29.7.0" + jest-matcher-utils "^29.7.0" + lodash.isequal "^4.5.0" + optionalDependencies: + "@wdio/globals" "^8.29.3" + "@wdio/logger" "^8.28.0" + webdriverio "^8.29.3" + expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -2260,6 +2348,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -2281,6 +2376,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -2340,15 +2440,20 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.15.6: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -2399,15 +2504,15 @@ function-bind@^1.1.2: integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== geckodriver@^4.3.1: - version "4.4.2" - resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.4.2.tgz#b5b72b3e5deb905947151f214b96f52505c2dd3a" - integrity sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA== + version "4.4.3" + resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.4.3.tgz#0f3ae367e784bb0f37df4088d3d551913df1ffde" + integrity sha512-79rvaq8pvKVUtuM9XBjQApb04kOVkl3TFRX+zTt1wlmL+wqpt85ocWCdqiENU/3zIzg2Me21eClUcnE7F1kL2w== dependencies: - "@wdio/logger" "^8.28.0" - "@zip.js/zip.js" "^2.7.44" + "@wdio/logger" "^9.0.0" + "@zip.js/zip.js" "^2.7.48" decamelize "^6.0.0" http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.4" + https-proxy-agent "^7.0.5" node-fetch "^3.3.2" tar-fs "^3.0.6" which "^4.0.0" @@ -2617,7 +2722,7 @@ http2-wrapper@^2.1.10: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.4, https-proxy-agent@^7.0.5: +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== @@ -2643,9 +2748,9 @@ ieee754@^1.1.13, ieee754@^1.2.1: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immediate@~3.0.5: version "3.0.6" @@ -2686,7 +2791,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2704,6 +2809,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-builtin-module@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" @@ -2712,9 +2822,9 @@ is-builtin-module@^3.2.1: builtin-modules "^3.3.0" is-core-module@^2.13.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" - integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -3296,6 +3406,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + ky@^0.33.0: version "0.33.3" resolved "https://registry.yarnpkg.com/ky/-/ky-0.33.3.tgz#bf1ad322a3f2c3428c13cfa4b3af95e6c4a2f543" @@ -3386,11 +3501,11 @@ linkify-it@5.0.0: uc.micro "^2.0.0" locate-app@^2.1.0: - version "2.4.21" - resolved "https://registry.yarnpkg.com/locate-app/-/locate-app-2.4.21.tgz#e719c19067f6400ea79a9d53965a5acb7ea67471" - integrity sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA== + version "2.4.33" + resolved "https://registry.yarnpkg.com/locate-app/-/locate-app-2.4.33.tgz#61d5007883de4f2529d586ee15d26e1b6a217bd3" + integrity sha512-S6PtV+b4YrCbfgdfzCJhNNl2Oc1tSwvMMygRHfdFq5KWYnSs37rX/hRncyVNpSEQhjwjjTUfviZpM+XQdGNIQA== dependencies: - "@promptbook/utils" "0.58.0" + "@promptbook/utils" "0.68.0-0" type-fest "2.13.0" userhome "1.0.0" @@ -3413,7 +3528,12 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== -lodash.memoize@4.x: +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== @@ -3433,6 +3553,18 @@ lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loglevel-plugin-prefix@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" @@ -3466,11 +3598,11 @@ lru-cache@^7.14.1: integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== magic-string@^0.30.10: - version "0.30.10" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" + "@jridgewell/sourcemap-codec" "^1.5.0" mailparser@^3.6.5: version "3.7.1" @@ -3504,7 +3636,7 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -3527,9 +3659,9 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" @@ -3594,10 +3726,10 @@ minimatch@^9.0.0, minimatch@^9.0.4: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mitt@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" - integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== mkdirp-classic@^0.5.2: version "0.5.3" @@ -3609,6 +3741,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3645,7 +3782,7 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: +node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== @@ -3684,6 +3821,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -3741,7 +3885,7 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.0, pac-proxy-agent@^7.0.1: +pac-proxy-agent@^7.0.1: version "7.0.2" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== @@ -3831,6 +3975,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + peberminta@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" @@ -3912,20 +4061,6 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -proxy-agent@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" - integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - lru-cache "^7.14.1" - pac-proxy-agent "^7.0.0" - proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.1" - proxy-agent@6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.1.tgz#40e7b230552cf44fd23ffaf7c59024b692612687" @@ -3963,17 +4098,17 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -puppeteer-core@^20.9.0: - version "20.9.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz#6f4b420001b64419deab38d398a4d9cd071040e6" - integrity sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg== +puppeteer-core@^21.11.0: + version "21.11.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.11.0.tgz#6c60ec350f1a3a2152179c68166da6edfce18a23" + integrity sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q== dependencies: - "@puppeteer/browsers" "1.4.6" - chromium-bidi "0.4.16" + "@puppeteer/browsers" "1.9.1" + chromium-bidi "0.5.8" cross-fetch "4.0.0" debug "4.3.4" - devtools-protocol "0.0.1147663" - ws "8.13.0" + devtools-protocol "0.0.1232444" + ws "8.16.0" pure-rand@^6.0.0: version "6.1.0" @@ -4025,6 +4160,15 @@ readable-stream@^2.0.5, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^4.0.0: version "4.5.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" @@ -4158,6 +4302,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4175,7 +4324,7 @@ semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -4221,6 +4370,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -4241,7 +4397,7 @@ smob@^1.0.0: resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== -socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: +socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== @@ -4279,10 +4435,10 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spacetrim@0.11.36: - version "0.11.36" - resolved "https://registry.yarnpkg.com/spacetrim/-/spacetrim-0.11.36.tgz#798ac5cdf15fcd38a446e89fc28f95518c9fbb30" - integrity sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw== +spacetrim@0.11.39: + version "0.11.39" + resolved "https://registry.yarnpkg.com/spacetrim/-/spacetrim-0.11.39.tgz#9f606970741512c705fe4969139b0116e239deb3" + integrity sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g== split2@^4.2.0: version "4.2.0" @@ -4299,6 +4455,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -4307,9 +4468,9 @@ stack-utils@^2.0.3: escape-string-regexp "^2.0.0" streamx@^2.15.0, streamx@^2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.18.0.tgz#5bc1a51eb412a667ebfdcd4e6cf6a6fc65721ac7" - integrity sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== + version "2.19.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.19.0.tgz#c66a43ad667539e81967d1bacc68c1575eb9fdde" + integrity sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg== dependencies: fast-fifo "^1.3.2" queue-tick "^1.0.1" @@ -4343,7 +4504,7 @@ string-width@4.2.2, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2. is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string_decoder@^1.3.0: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -4379,6 +4540,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -4443,9 +4609,9 @@ tar-stream@^3.0.0, tar-stream@^3.1.5: streamx "^2.15.0" terser@^5.17.4: - version "5.31.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38" - integrity sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA== + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -4468,6 +4634,11 @@ text-decoder@^1.1.0: dependencies: b4a "^1.6.4" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4478,6 +4649,11 @@ through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + tlds@1.252.0: version "1.252.0" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.252.0.tgz#71d9617f4ef4cc7347843bee72428e71b8b0f419" @@ -4505,25 +4681,30 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-jest@^29.2.3: - version "29.2.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.3.tgz#3d226ac36b8b820151a38f164414f9f6b412131f" - integrity sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ== + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: - bs-logger "0.x" + bs-logger "^0.2.6" ejs "^3.1.10" - fast-json-stable-stringify "2.x" + fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" ts-node@10.9.1: version "10.9.1" @@ -4550,9 +4731,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tsutils@^3.21.0: version "3.21.0" @@ -4611,10 +4792,10 @@ unbzip2-stream@1.4.3: buffer "^5.2.1" through "^2.3.8" -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== universalify@^2.0.0: version "2.0.1" @@ -4636,12 +4817,17 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + userhome@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/userhome/-/userhome-1.0.0.tgz#b6491ff12d21a5e72671df9ccc8717e1c6688c0b" integrity sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4686,40 +4872,40 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== -webdriver@8.39.0: - version "8.39.0" - resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-8.39.0.tgz#ccb5362e53593e23f16a3951d70b7b32a1073fd1" - integrity sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg== +webdriver@8.40.3: + version "8.40.3" + resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-8.40.3.tgz#57c2a072fe4096a8546b7b6768cb0494c2d266cb" + integrity sha512-mc/pxLpgAQphnIaWvix/QXzp9CJpEvIA3YeF9t5plPaTbvbEaCAYYWkTP6e3vYPYWvx57krjGaYkNUnDCBNolA== dependencies: - "@types/node" "^20.1.0" + "@types/node" "^22.2.0" "@types/ws" "^8.5.3" - "@wdio/config" "8.39.0" + "@wdio/config" "8.40.3" "@wdio/logger" "8.38.0" - "@wdio/protocols" "8.38.0" - "@wdio/types" "8.39.0" - "@wdio/utils" "8.39.0" + "@wdio/protocols" "8.40.3" + "@wdio/types" "8.40.3" + "@wdio/utils" "8.40.3" deepmerge-ts "^5.1.0" got "^12.6.1" ky "^0.33.0" ws "^8.8.0" -webdriverio@^8.16.6: - version "8.39.1" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-8.39.1.tgz#605af5a79a7805bd08a36d16d078e618360f8aa9" - integrity sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ== +webdriverio@8.40.5, webdriverio@^8.16.6, webdriverio@^8.29.3: + version "8.40.5" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-8.40.5.tgz#2485bb53a0fe529de6f90a96e94e9084c9d53fd4" + integrity sha512-fKzaAF8lbgVFWIP8i0eGk22MpjactVVTWP8qtUXDob5Kdo8ffrg1lCKP8mcyrz6fiZM1OY1m6dvkbFelf23Nxw== dependencies: - "@types/node" "^20.1.0" - "@wdio/config" "8.39.0" + "@types/node" "^22.2.0" + "@wdio/config" "8.40.3" "@wdio/logger" "8.38.0" - "@wdio/protocols" "8.38.0" - "@wdio/repl" "8.24.12" - "@wdio/types" "8.39.0" - "@wdio/utils" "8.39.0" + "@wdio/protocols" "8.40.3" + "@wdio/repl" "8.40.3" + "@wdio/types" "8.40.3" + "@wdio/utils" "8.40.3" archiver "^7.0.0" aria-query "^5.0.0" css-shorthand-properties "^1.1.1" css-value "^0.0.1" - devtools-protocol "^0.0.1302984" + devtools-protocol "^0.0.1342118" grapheme-splitter "^1.0.2" import-meta-resolve "^4.0.0" is-plain-obj "^4.1.0" @@ -4727,12 +4913,12 @@ webdriverio@^8.16.6: lodash.clonedeep "^4.5.0" lodash.zip "^4.2.0" minimatch "^9.0.0" - puppeteer-core "^20.9.0" + puppeteer-core "^21.11.0" query-selector-shadow-dom "^1.0.0" resq "^1.9.1" rgb2hex "0.2.5" serialize-error "^11.0.1" - webdriver "8.39.0" + webdriver "8.40.3" webidl-conversions@^3.0.0: version "3.0.1" @@ -4761,6 +4947,32 @@ which@^4.0.0: dependencies: isexe "^3.1.1" +winston-transport@^4.7.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== + dependencies: + logform "^2.6.1" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.13.0, winston@^3.13.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" + integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -4788,10 +5000,10 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +ws@8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== ws@^8.8.0: version "8.18.0" @@ -4808,24 +5020,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yargs@17.7.2, yargs@^17.3.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"