diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index b7c859f..a5b7775 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,4 +1,4 @@ -name: "Pull Request Labeler" +name: 'Pull Request Labeler' on: - pull_request diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fcc72b9..8a42ae6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: env: - NODE_VERSION: 20 + NODE_VERSION: 22 FORCE_COLOR: 1 NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2eef43a..3b30eca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: strategy: matrix: - node-version: [ 18.x, 20.x ] + node-version: [ 20.x, 22.x ] steps: - name: Checkout code diff --git a/.gitignore b/.gitignore index de2a160..c9f1ca4 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,8 @@ typings/ .nyc_output .yarn + +# some test relevant files +coverage +*.home +*.backup diff --git a/.mocharc.json b/.mocharc.json index c8aaa4a..613185c 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,10 +1,7 @@ { "extension": ["ts"], "spec": "test/**/*.spec.ts", - "node-option": [ - "experimental-specifier-resolution=node", - "loader=ts-node/esm" - ], + "node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"], "require": ["ts-node/register"], "recursive": true } diff --git a/.releaserc.yaml b/.releaserc.yaml index 1fb512f..a6db91e 100644 --- a/.releaserc.yaml +++ b/.releaserc.yaml @@ -1,4 +1,4 @@ -branches: [ 'master' ] +branches: ['master'] repositoryUrl: 'git@github.com:holomekc/bosch-smart-home-bridge.git' tagFormat: ${version} plugins: diff --git a/.run/Tests E2E Template.run.xml b/.run/Tests E2E Template.run.xml index 0e268e8..60492bf 100644 --- a/.run/Tests E2E Template.run.xml +++ b/.run/Tests E2E Template.run.xml @@ -9,6 +9,7 @@ + bdd --grep e2e --exit diff --git a/.run/Tests.run.xml b/.run/Tests.run.xml index c3b7d51..d44aa80 100644 --- a/.run/Tests.run.xml +++ b/.run/Tests.run.xml @@ -5,6 +5,9 @@ $PROJECT_DIR$/node_modules/mocha $PROJECT_DIR$ true + + + bdd --grep should --exit DIRECTORY diff --git a/.yarnrc.yml b/.yarnrc.yml index 4ce3048..5cb9d1a 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -2,10 +2,10 @@ cacheFolder: ./.yarn/cache enableGlobalCache: false -httpProxy: "${http_proxy:-}" +httpProxy: '${http_proxy:-}' -httpsProxy: "${https_proxy:-}" +httpsProxy: '${https_proxy:-}' nodeLinker: node-modules -npmAuthToken: "${NPM_TOKEN:-}" +npmAuthToken: '${NPM_TOKEN:-}' diff --git a/README.md b/README.md index 6a245cf..122d4fe 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,8 @@ Allows communication to Bosch Smart Home Controller (BSHC) ## Getting started -You need to create a new instance of BoschSmartHomeBridge (BSHB). Therefore, you need to use BoschSmartHomeBridgeBuilder. +You need to create a new instance of BoschSmartHomeBridge (BSHB). Therefore, you need to use +BoschSmartHomeBridgeBuilder. The builder will force you to set every mandatory properties: - host name / ip address of BSHC @@ -28,10 +29,10 @@ The builder will force you to set every mandatory properties: ```typescript const certificate = BshbUtils.generateClientCertificate(); const bshb = BoschSmartHomeBridgeBuilder.builder() - .withHost('192.168.0.10') - .withClientCert(certificate.cert) - .withClientPrivateKey(certificate.private) - .build(); + .withHost('192.168.0.10') + .withClientCert(certificate.cert) + .withClientPrivateKey(certificate.private) + .build(); ``` ## Pairing @@ -62,28 +63,108 @@ If you are interested in updates from bshc you can use long polling. Therefore, ```typescript bshb - .getBshcClient() - .subscribe() - .subscribe(response => { - bshb - .getBshcClient() - .longPolling(response.parsedResponse.result) - .subscribe(info => { - // do something with the information - // also you need to call longPolling again after connection close - }); - }); + .getBshcClient() + .subscribe() + .subscribe(response => { + bshb + .getBshcClient() + .longPolling(response.parsedResponse.result) + .subscribe(info => { + // do something with the information + // also you need to call longPolling again after connection close + }); + }); ``` Do not forget to unsubscribe. E.g. in error case or on application end. ```typescript bshb - .getBshcClient() - .unsubscribe(response.parsedResponse.result) - .subscribe(() => {}); + .getBshcClient() + .unsubscribe(response.parsedResponse.result) + .subscribe(() => { + }); ``` +## Backup & Restore + +With this new feature provided by bosch you can automate the backup process. + +Example can be found in the e2e test of the test folder. + +The workflow is: + +1. Create a backup + ```typescript + bshb.getBshcClient().createBackup('SystemPassword', 'encryptionPassword') + ``` +2. Wait for backup status READY + ```typescript + bshb.getBshcClient().getBackupStatus() + ``` +3. Download backup file + ```typescript + bshb.getBshcClient().getBackup() + ``` +4. Upload restore file + ```typescript + bshb.getBshcClient().uploadRestoreFile(binaryData) + ``` +5. Wait for restore status BACKUP_UPLOADED + ```typescript + bshb.getBshcClient().getRestoreStatus() + ``` +6. Press pairing button on controller. Once for Controller II and 3s for Controller I +7. Wait for restore status RESTORE_AUTHORIZED + ```typescript + bshb.getBshcClient().getRestoreStatus() + ``` +8. Start restore process + ```typescript + bshb.getBshcClient().startRestoreProcess('encryptionPassword') + ``` +9. Wait for restore status RESTORED. The status might be in RESTORING for a while, + and due to the restart the controller might not be available for some time as well. + ```typescript + bshb.getBshcClient().getRestoreStatus() + ``` +10. Check partner restore status (Only possible if status is in RESTORED*) + ```typescript + bshb.getBshcClient().getPartnerRestoreStatus() + ``` +11. Complete the process or cancel the process (except if in RESTORING) via + ```typescript + bshb.getBshcClient().deleteRestoreFile() + bshb.getBshcClient().deleteBackup() + ``` + +See api documentation for further details. + +Uploading incomplete files might end up in a timeout, where the Controller appears to be stuck +in RESTORING. If this is the case wait until the controller is changing the status to ERROR, +and then restart the controller. During my tests without the restart the complete backup +and restore feature is not working properly anymore. + ## Examples You can find an example in test directory. Npm arguments must be set manually. + +## Disclaimer + +By using this software, you acknowledge and accept the following terms: + +1. **Bosch Smart Home Controller**: + + The use of this software with the Bosch Smart Home Controller I and II is at your own risk. The developer is not + liable for any damage to the hardware, including but not limited to physical damage, malfunction, or failure of the + Bosch Smart Home Controller. Users are advised to handle the devices with care and follow all manufacturer guidelines + and recommendations. + +2. **Data Loss**: + + While efforts have been made to ensure the reliability of the backup and restore functionality, the developer cannot + guarantee the safety of your data. By using the backup and restore features, you understand and accept that there is + a risk of data loss. This may include, but is not limited to, loss of settings, configurations, or other user data + stored on the Bosch Smart Home Controller. It is strongly recommended that users perform regular backups and store + them in a secure location. The developer shall not be held responsible for any data loss or corruption arising from + the use of these features. diff --git a/package.json b/package.json index d88d707..6b3a4d3 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.4.2", "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "scripts": { "postinstall": "husky && node disable-publish-semantic-release-github.js", "prepack": "pinst --disable", @@ -13,7 +14,8 @@ "lint": "eslint --max-warnings 0 .", "lint:fix": "eslint --max-warnings 0 --fix .", "prettier": "prettier --write .", - "test": "cross-env TS_NODE_PROJECT='./tsconfig.spec.json' nyc mocha --grep should --exit", + "test": "cross-env TS_NODE_PROJECT='./tsconfig.spec.json' c8 mocha --grep should --exit", + "test:watch": "cross-env TS_NODE_PROJECT='./tsconfig.spec.json' c8 mocha --grep should", "release": "semantic-release" }, "keywords": [ @@ -55,6 +57,7 @@ "@types/uuid": "10.0.0", "@typescript-eslint/eslint-plugin": "8.19.0", "@typescript-eslint/parser": "8.19.0", + "c8": "10.1.3", "chai": "5.1.2", "conventional-changelog-conventionalcommits": "8.0.0", "cross-env": "7.0.3", @@ -66,7 +69,6 @@ "express": "4.21.2", "husky": "9.1.7", "mocha": "11.0.1", - "nyc": "17.1.0", "pinst": "3.0.0", "prettier": "3.4.2", "prettier-eslint": "16.3.0", diff --git a/src/api/abstract-bshc-client.ts b/src/api/abstract-bshc-client.ts index 3b0919b..f56a221 100644 --- a/src/api/abstract-bshc-client.ts +++ b/src/api/abstract-bshc-client.ts @@ -10,6 +10,8 @@ import { BshbCallOptions } from '../bshb-call-options'; import { BshbUtils } from '../bshb-utils'; import * as util from 'util'; import * as http from 'http'; +import { Buffer } from 'node:buffer'; +import { BinaryResponse } from '../model/binary-response'; /** * This class provides a simple call for all defined clients @@ -22,6 +24,8 @@ export abstract class AbstractBshcClient { private static DEFAULT_TIMEOUT = 5000; + private static CONTENT_DISPOSITION_FILE_NAME_REGEX = /filename="([^"]+)"/; + /** * Needed parameters for a {@link AbstractBshcClient} * @@ -59,6 +63,7 @@ export abstract class AbstractBshcClient { options?: { certificateStorage?: CertificateStorage; systemPassword?: string; + isBinaryResponse?: boolean; bshbCallOptions?: BshbCallOptions; } ): Observable> { @@ -84,9 +89,19 @@ export abstract class AbstractBshcClient { requestOptions.headers = {}; } - requestOptions.headers['Content-Type'] = 'application/json'; - requestOptions.headers['Accept'] = 'application/json'; - requestOptions.headers['api-version'] = '3.12'; + if (data instanceof Buffer) { + requestOptions.headers['Content-Type'] = 'application/octet-stream'; + } else { + requestOptions.headers['Content-Type'] = 'application/json'; + requestOptions.headers['Accept'] = 'application/json'; + requestOptions.headers['api-version'] = '3.12'; + } + + const isBinaryResponse = options?.isBinaryResponse || false; + + if (isBinaryResponse) { + requestOptions.headers['Accept'] = 'application/octet-stream'; + } if (options && options.bshbCallOptions && options.bshbCallOptions) { Object.keys(options.bshbCallOptions).forEach(key => { @@ -103,44 +118,49 @@ export abstract class AbstractBshcClient { requestOptions.headers['Systempassword'] = Buffer.from(options.systemPassword).toString('base64'); } - let postData: string | undefined = undefined; + let postData: string | Buffer | undefined = undefined; if (data) { if (typeof data === 'string') { postData = data; + } else if (data instanceof Buffer) { + postData = data; } else { postData = JSON.stringify(data); } requestOptions.headers['Content-Length'] = postData.length; } - this.logger.debug( - ` + return new Observable>(observer => { + this.logger.debug( + ` Request: (${requestOptions.method}) ${requestOptions.hostname}:${requestOptions.port}${requestOptions.path} Headers: ${util.inspect(requestOptions.headers, { colors: true })} Body: ${util.inspect(data, { colors: true, depth: 10 })} ` - ); - - return new Observable>(observer => { + ); const req = https.request(requestOptions, res => { const chunks: any[] = []; res - .on('data', data => { - chunks.push(data); + .on('data', chunk => { + chunks.push(chunk); }) .on('end', () => { - let dataString = undefined; + let data: any = undefined; if (chunks.length > 0) { - const data = Buffer.concat(chunks); - dataString = data.toString('utf-8'); + const dataBuffer = Buffer.concat(chunks); + if (isBinaryResponse) { + data = dataBuffer; + } else { + data = dataBuffer.toString('utf-8'); + } } try { if (res.statusCode && res.statusCode >= 300) { - this.logResponse(requestOptions, res, dataString); + this.logResponse(requestOptions, res, data); this.handleError( observer, @@ -149,8 +169,16 @@ ${util.inspect(data, { colors: true, depth: 10 })} ); } else { let parsedData = undefined; - if (dataString) { - parsedData = JSON.parse(dataString); + if (data) { + if (isBinaryResponse) { + parsedData = { + data: data, + contentDisposition: res.headers['content-disposition'], + fileName: this.extractFileName(res.headers['content-disposition']), + } as BinaryResponse; + } else { + parsedData = JSON.parse(data); + } } this.logResponse(requestOptions, res, parsedData); @@ -158,7 +186,7 @@ ${util.inspect(data, { colors: true, depth: 10 })} observer.next(new BshbResponse(res, parsedData)); } } catch (e) { - this.logResponse(requestOptions, res, dataString); + this.logResponse(requestOptions, res, data); observer.error(new BshbError('error during parsing response from BSHC', BshbErrorType.PARSING, e)); } finally { observer.complete(); @@ -215,4 +243,12 @@ Content: ${typeof data === 'object' ? util.inspect(data, { colors: true }) : data} `); } + + private extractFileName(contentDisposition: string | undefined) { + if (contentDisposition) { + const match = contentDisposition.match(AbstractBshcClient.CONTENT_DISPOSITION_FILE_NAME_REGEX); + return match ? match[1] : undefined; + } + return undefined; + } } diff --git a/src/api/bshc-client.ts b/src/api/bshc-client.ts index 361c248..17bb4dc 100644 --- a/src/api/bshc-client.ts +++ b/src/api/bshc-client.ts @@ -10,6 +10,7 @@ import { BshbCallOptions } from '../bshb-call-options'; import { PollingResponse } from '../model/polling-response'; import { BshbError } from '../error/bshb-error'; import { BshbErrorType } from '../error/bshb-error-type'; +import { BinaryResponse } from '../model/binary-response'; /** * This client contains some basic calls which are available to contact Bosch Smart Home Controller (BSHC) @@ -46,6 +47,7 @@ export class BshcClient extends AbstractBshcClient { private getOptions(bshbCallOptions?: BshbCallOptions): { certificateStorage?: CertificateStorage; systemPassword?: string; + isBinaryResponse?: boolean; bshbCallOptions?: BshbCallOptions; } { if (bshbCallOptions) { @@ -1081,6 +1083,180 @@ export class BshcClient extends AbstractBshcClient { ); } + /** + * Get the status of backup. So far the values I could see are: + * NONE, IN_PROGRESS, READY and ERROR. + * + * @param bshbCallOptions + * additional options for http call + */ + public getBackupStatus(bshbCallOptions?: BshbCallOptions): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'GET', + `/${BshcClient.PATH_PREFIX}/system/backup/status`, + null, + bshbCallOptions + ); + } + + /** + * Create the backup on the bshc. This is only possible if the client is not a restricted client, which is the + * default behavior of this extension when creating a client. The client type can only be adjusted in the bosch + * app so far. If a backup is created it can be downloaded via getBackup. You cannot create another backup until + * you deleted the existing backup. + * @param systemPassword + * This call requires the system password of the bshc. + * @param encryptionPassword + * password used to encrypt the backup. If not specified the systemPassword is used. + * @param bshbCallOptions + * additional options for http call + */ + public createBackup( + systemPassword: string, + encryptionPassword?: string, + bshbCallOptions?: BshbCallOptions + ): Observable> { + let password = systemPassword; + if (encryptionPassword) { + password = encryptionPassword; + } + + return this.privilegedCall( + BshcClient.COMMON_PORT, + 'PUT', + `/${BshcClient.PATH_PREFIX}/system/backup`, + systemPassword, + { + encryptionPassword: password, + }, + bshbCallOptions + ); + } + + /** + * Get the backup file as byte array. Furthermore, the result also includes some information like the filename. + * This method cannot be called in case the backup status is IN_PROGRESS. + * @param bshbCallOptions + * additional options for http call + */ + public getBackup(bshbCallOptions?: BshbCallOptions): Observable> { + const options = this.getOptions(bshbCallOptions); + options.isBinaryResponse = true; + return this.simpleCall(BshcClient.COMMON_PORT, 'GET', `/${BshcClient.PATH_PREFIX}/system/backup`, null, options); + } + + /** + * Delete the backup file + * @param bshbCallOptions + * additional options for http call + */ + public deleteBackup(bshbCallOptions?: BshbCallOptions): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'DELETE', + `/${BshcClient.PATH_PREFIX}/system/backup`, + null, + bshbCallOptions + ); + } + + /** + * Get the status of restore. So far the values I could see are: + * NONE, BACKUP_UPLOADED, RESTORE_AUTHORIZED, VALIDATING, RESTORING, RESTORED, RESTORED_OTHER_SHC, ERROR. + * + * @param bshbCallOptions + * additional options for http call + */ + public getRestoreStatus(bshbCallOptions?: BshbCallOptions): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'GET', + `/${BshcClient.PATH_PREFIX}/system/restore/status`, + null, + bshbCallOptions + ); + } + + /** + * Upload a restore file specified as a buffer to bshc of a previous backup file. + * The restore process is not started by this call. + * + * @param data + * restore file buffer data + * @param bshbCallOptions + * additional options for http call + */ + public uploadRestoreFile( + data: Buffer, + bshbCallOptions?: BshbCallOptions + ): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'POST', + `/${BshcClient.PATH_PREFIX}/system/restore`, + data, + bshbCallOptions + ); + } + + /** + * Delete the restore file + * + * @param bshbCallOptions + * additional options for http call + */ + public deleteRestoreFile(bshbCallOptions?: BshbCallOptions): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'DELETE', + `/${BshcClient.PATH_PREFIX}/system/restore`, + null, + bshbCallOptions + ); + } + + /** + * Start the restore process + * + * @param encryptionPassword + * password to with which the backup file was created before + * @param bshbCallOptions + * additional options for http call + */ + public startRestoreProcess( + encryptionPassword: string, + bshbCallOptions?: BshbCallOptions + ): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'PUT', + `/${BshcClient.PATH_PREFIX}/system/restore`, + { + encryptionPassword: encryptionPassword, + }, + bshbCallOptions + ); + } + + /** + * Get the status of the partner restore. This allows to see, which partner integrations could be restored or not. + * This call is only allowed after a successful restoring process or in other words when the restore status is + * RESTORED or RESTORED_OTHER_SHC + * + * @param bshbCallOptions + * additional options for http call + */ + public getPartnerRestoreStatus(bshbCallOptions?: BshbCallOptions): Observable> { + return this.call( + BshcClient.COMMON_PORT, + 'GET', + `/${BshcClient.PATH_PREFIX}/system/restore/partners`, + null, + bshbCallOptions + ); + } + /** * Not defined call to BSHC in case something is missing here * @param port @@ -1104,4 +1280,31 @@ export class BshcClient extends AbstractBshcClient { const options = this.getOptions(bshbCallOptions); return this.simpleCall(port, method, path, data, options); } + + /** + * Not defined privileged call to BSHC in case something is missing here. Privileged calls requires the + * systemPassword, which is included the request header. Only use if it is really necessary. + * @param port + * port to use + * @param method + * HTTP method to use + * @param path + * url path to use + * @param data + * data to send. Will be converted to json. It must contain @type otherwise BSHC will not understand the request. + * @param bshbCallOptions + * define custom headers, etc. Some values may be overwritten. E.g. host + */ + public privilegedCall( + port: number, + method: string, + path: string, + systemPassword: string, + data?: any, + bshbCallOptions?: BshbCallOptions + ): Observable> { + const options = this.getOptions(bshbCallOptions); + options.systemPassword = systemPassword; + return this.simpleCall(port, method, path, data, options); + } } diff --git a/src/index.ts b/src/index.ts index 632f15b..ffaeae2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,4 +13,5 @@ export * from './error/bshb-error-type'; export * from './model/bosch-client-data'; export * from './model/polling-response'; export * from './model/polling-response-error'; +export * from './model/binary-response'; export * from './logger'; diff --git a/src/model/binary-response.ts b/src/model/binary-response.ts new file mode 100644 index 0000000..02f22f4 --- /dev/null +++ b/src/model/binary-response.ts @@ -0,0 +1,14 @@ +export interface BinaryResponse { + /** + * The full content-disposition of the response if available + */ + contentDisposition?: string; + /** + * The file name extracted from the content-disposition if possible + */ + fileName?: string; + /** + * The binary data. + */ + data: Buffer; +} diff --git a/test/bosch-smart-home-bridge.e2e.ts b/test/bosch-smart-home-bridge.e2e.ts index e008fbe..35081d7 100644 --- a/test/bosch-smart-home-bridge.e2e.ts +++ b/test/bosch-smart-home-bridge.e2e.ts @@ -1,6 +1,9 @@ import { BoschSmartHomeBridge, BoschSmartHomeBridgeBuilder, BshbUtils } from '../src'; import { expect } from 'chai'; import { DefaultTestLogger } from './bshc-mock'; +import { first, from, Observable, switchMap, timer } from 'rxjs'; +import { promises as fs } from 'fs'; +import { map } from 'rxjs/operators'; const host: string = process.env.BSHC_HOST!; const identifier: string = process.env.BSHC_IDENTIFIER!; @@ -9,6 +12,14 @@ const clientCert: string = '-----BEGIN CERTIFICATE-----\n' + process.env.BSHC_CE const clientPrivateKey: string = '-----BEGIN RSA PRIVATE KEY-----\n' + process.env.BSHC_PRIV! + '\n-----END RSA PRIVATE KEY-----'; +const pollUntil = (pollInterval: number, responsePredicate: (res: T) => boolean) => { + return (source$: Observable) => + timer(0, pollInterval).pipe( + switchMap(() => source$), + first(responsePredicate) + ); +}; + describe('BshbUtils', () => { let bshb: BoschSmartHomeBridge; before(() => { @@ -38,4 +49,50 @@ describe('BshbUtils', () => { }, }); }); + + it('e2e create backup and upload it', done => { + let response: any; + bshb + .getBshcClient() + .createBackup(password) + .pipe( + switchMap(_ => { + return bshb + .getBshcClient() + .getBackupStatus() + .pipe(pollUntil(2_000, res => res.parsedResponse.state === 'READY')); + }), + switchMap(_ => { + return bshb.getBshcClient().getBackup(); + }), + switchMap(response => { + const file = `./${response.parsedResponse.fileName}`; + return from(fs.writeFile(file, response.parsedResponse.data)).pipe(map(_ => file)); + }), + switchMap(file => { + return from(fs.readFile(file)); + }), + switchMap(data => { + return bshb.getBshcClient().uploadRestoreFile(data); + }), + switchMap(_ => { + return bshb + .getBshcClient() + .getRestoreStatus() + .pipe(pollUntil(2_000, res => res.parsedResponse.state === 'BACKUP_UPLOADED')); + }) + ) + .subscribe({ + next: _ => { + // nothing as it seems + }, + error: error => { + expect.fail(error, 'Expected that get status returns a result'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); }); diff --git a/test/bosch-smart-home-bridge.spec.ts b/test/bosch-smart-home-bridge.spec.ts index 63b364d..ec9b9e9 100644 --- a/test/bosch-smart-home-bridge.spec.ts +++ b/test/bosch-smart-home-bridge.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { BoschSmartHomeBridge, BoschSmartHomeBridgeBuilder, BshbUtils } from '../src'; +import { BinaryResponse, BoschSmartHomeBridge, BoschSmartHomeBridgeBuilder, BshbResponse, BshbUtils } from '../src'; import { DefaultTestLogger, resetBshcAdminRouter, resetBshcRouter } from './bshc-mock'; import { Router } from 'express'; @@ -102,4 +102,380 @@ describe('BoschSmartHomeBridge', () => { }, }); }); + + it('should not allow backup download if it does not exists', done => { + bshc.get('/smarthome/system/backup', (req, res) => { + res.statusCode = 412; + res.end(); + }); + + bshb + .getBshcClient() + .getBackup() + .subscribe({ + next: _ => expect.fail('Expected that backup retrieval is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should allow backup download', done => { + bshc.get('/smarthome/system/backup', (req, res) => { + res.statusCode = 200; + const byteData = Buffer.from('Test', 'utf-8'); + res.set('Content-Type', 'application/octet-stream'); + res.set('content-disposition', 'attachment; filename="shc-20250105.home"'); + res.send(byteData); + }); + + let response: BinaryResponse; + bshb + .getBshcClient() + .getBackup() + .subscribe({ + next: value => (response = value.parsedResponse), + error: error => { + expect.fail(error, 'Expected that backup creation is allowed'); + }, + complete: () => { + expect(response).to.be.not.null; + expect(response.fileName).to.be.equal('shc-20250105.home'); + expect(response.contentDisposition).to.be.equal('attachment; filename="shc-20250105.home"'); + expect(response.data.toString('utf-8')).to.be.equal('Test'); + done(); + }, + }); + }); + + it('should not allow backup creation if it already exists', done => { + bshc.put('/smarthome/system/backup', (req, res) => { + res.statusCode = 405; + res.end(); + }); + + bshb + .getBshcClient() + .createBackup('Test') + .subscribe({ + next: _ => expect.fail('Expected that backup creation is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should allow backup creation with systempassword', done => { + bshc.put('/smarthome/system/backup', (req, res) => { + expect(req.body.encryptionPassword).to.be.equal('Test'); + expect(req.headers.systempassword).to.be.equal(Buffer.from('Test').toString('base64')); + res.statusCode = 201; + res.end(); + }); + + let response: any; + bshb + .getBshcClient() + .createBackup('Test') + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that backup creation is allowed'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should allow backup creation with custom password', done => { + bshc.put('/smarthome/system/backup', (req, res) => { + expect(req.body.encryptionPassword).to.be.equal('Encrypt'); + expect(req.headers.systempassword).to.be.equal(Buffer.from('Test').toString('base64')); + res.statusCode = 201; + res.end(); + }); + + let response: any; + bshb + .getBshcClient() + .createBackup('Test', 'Encrypt') + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that backup creation is allowed'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should not allow backup deletion if it does not exist', done => { + bshc.delete('/smarthome/system/backup', (req, res) => { + res.statusCode = 403; + res.end(); + }); + + bshb + .getBshcClient() + .deleteBackup() + .subscribe({ + next: _ => expect.fail('Expected that backup deletion is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should allow backup deletion if it exists', done => { + bshc.delete('/smarthome/system/backup', (req, res) => { + res.statusCode = 201; + res.end(); + }); + + let response: any; + bshb + .getBshcClient() + .deleteBackup() + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that backup deletion is allowed'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should get backup status', done => { + bshc.get('/smarthome/system/backup/status', (req, res) => { + res.statusCode = 200; + res.json({ + '@type': 'BackupStatus', + state: 'NONE', + statuscode: 200, + isDeleted: false, + }); + }); + + let response: BshbResponse; + bshb + .getBshcClient() + .getBackupStatus() + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that backup status retrieval works'); + }, + complete: () => { + expect(response).to.be.not.null; + expect(response.parsedResponse).to.be.not.null; + done(); + }, + }); + }); + + it('should upload restore file', done => { + bshc.post('/smarthome/system/restore', (req, res) => { + expect(req.body.toString('utf-8')).to.be.equal('Test'); + res.statusCode = 200; + res.end(); + }); + + let response: BshbResponse; + bshb + .getBshcClient() + .uploadRestoreFile(Buffer.from('Test', 'utf-8')) + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that backup status retrieval works'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should not allow upload restore file if it already exists', done => { + bshc.post('/smarthome/system/restore', (req, res) => { + res.statusCode = 412; + res.end(); + }); + + bshb + .getBshcClient() + .uploadRestoreFile(Buffer.from('Test', 'utf-8')) + .subscribe({ + next: _ => expect.fail('Expected that restore file upload is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should trigger restore', done => { + bshc.put('/smarthome/system/restore', (req, res) => { + expect(req.body.encryptionPassword).to.be.equal('Test'); + res.statusCode = 200; + res.end(); + }); + + let response: BshbResponse; + bshb + .getBshcClient() + .startRestoreProcess('Test') + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that restore trigger works'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should not trigger restore without confirmation', done => { + bshc.put('/smarthome/system/restore', (req, res) => { + res.statusCode = 412; + res.end(); + }); + + bshb + .getBshcClient() + .startRestoreProcess('Test') + .subscribe({ + next: _ => expect.fail('Expected that restore file upload is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should not allow restore file deletion if it does not exist', done => { + bshc.delete('/smarthome/system/restore', (req, res) => { + res.statusCode = 403; + res.end(); + }); + + bshb + .getBshcClient() + .deleteRestoreFile() + .subscribe({ + next: _ => expect.fail('Expected that restore file deletion is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); + + it('should allow restore deletion if it exists', done => { + bshc.delete('/smarthome/system/restore', (req, res) => { + res.statusCode = 201; + res.end(); + }); + + let response: any; + bshb + .getBshcClient() + .deleteRestoreFile() + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that restore file deletion is allowed'); + }, + complete: () => { + expect(response).to.be.not.null; + done(); + }, + }); + }); + + it('should get restore status', done => { + bshc.get('/smarthome/system/restore/status', (req, res) => { + res.statusCode = 200; + res.json({ + '@type': 'RestoreStatus', + state: 'NONE', + statuscode: 200, + isDeleted: false, + }); + }); + + let response: BshbResponse; + bshb + .getBshcClient() + .getRestoreStatus() + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that restore status retrieval works'); + }, + complete: () => { + expect(response).to.be.not.null; + expect(response.parsedResponse).to.be.not.null; + done(); + }, + }); + }); + + it('should get partner restore status', done => { + bshc.get('/smarthome/system/restore/partners', (req, res) => { + res.statusCode = 200; + res.json([ + { + serviceId: 'camera', + restored: true, + }, + ]); + }); + + let response: BshbResponse; + bshb + .getBshcClient() + .getPartnerRestoreStatus() + .subscribe({ + next: value => (response = value), + error: error => { + expect.fail(error, 'Expected that partner restore status retrieval works'); + }, + complete: () => { + expect(response).to.be.not.null; + expect(response.parsedResponse).to.be.not.null; + done(); + }, + }); + }); + + it('should not get partner restore status if not restored', done => { + bshc.get('/smarthome/system/restore/partners', (req, res) => { + res.statusCode = 403; + res.end(); + }); + + bshb + .getBshcClient() + .getPartnerRestoreStatus() + .subscribe({ + next: _ => expect.fail('Expected that partner restore status retrieval is not possible'), + error: err => { + expect(err).to.be.not.null; + done(); + }, + }); + }); }); diff --git a/test/bshc-mock.ts b/test/bshc-mock.ts index a946bb7..77ab919 100644 --- a/test/bshc-mock.ts +++ b/test/bshc-mock.ts @@ -17,13 +17,21 @@ export const resetBshcAdminRouter = () => { }; const bshcAdmin = express(); -bshc.use(bodyParser.json()); +const conditionalBodyParser = (req: any, res: any, next: any) => { + if (req.headers['content-type'] === 'application/octet-stream') { + express.raw({ type: 'application/octet-stream' })(req, res, next); + } else { + bodyParser.json()(req, res, next); + } +}; + +bshc.use(conditionalBodyParser); bshc.use((req, res, next) => { bshcRouter(req, res, next); next(); }); -bshcAdmin.use(bodyParser.json()); +bshcAdmin.use(conditionalBodyParser); bshcAdmin.use((req, res, next) => { bshcAdminRouter(req, res, next); next(); diff --git a/tsconfig.json b/tsconfig.json index 60ce806..636f956 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,13 @@ { - "extends": "./node_modules/@tsconfig/node20/tsconfig.json", + "extends": "./node_modules/@tsconfig/node22/tsconfig.json", "compilerOptions": { "declaration": true, - "typeRoots": ["node_modules/@types"] + "typeRoots": [ + "node_modules/@types" + ], + "moduleResolution": "Bundler" }, - "include": ["src/**/*"] + "include": [ + "src/**/*" + ] } diff --git a/yarn.lock b/yarn.lock index 33d4178..4b8b4da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,17 +5,7 @@ __metadata: version: 8 cacheKey: 10c0 -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.22.13": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" dependencies: @@ -25,102 +15,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/compat-data@npm:7.25.2" - checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 - languageName: node - linkType: hard - -"@babel/core@npm:^7.23.9": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/generator@npm:7.25.0" - dependencies: - "@babel/types": "npm:^7.25.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" - dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-identifier@npm:7.24.7" @@ -128,23 +22,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 10c0/73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" - dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/b7fe007fc4194268abf70aa3810365085e290e6528dcb9fbbf7a765d43c74b6369ce0f99c5ccd2d44c413853099daa449c9a0123f0b212ac8d18643f2e8174b8 - languageName: node - linkType: hard - "@babel/highlight@npm:^7.24.7": version: 7.24.7 resolution: "@babel/highlight@npm:7.24.7" @@ -157,51 +34,10 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/parser@npm:7.25.3" - dependencies: - "@babel/types": "npm:^7.25.2" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": - version: 7.25.3 - resolution: "@babel/traverse@npm:7.25.3" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.2" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/4c8a1966fa90b53a783a4afd2fcdaa6ab1a912e6621dca9fcc6633e80ccb9491620e88caf73b537da4e16cefd537b548c87d7087868d5b0066414dea375c0e9b - languageName: node - linkType: hard - -"@babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/types@npm:7.25.2" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 +"@bcoe/v8-coverage@npm:^1.0.1": + version: 1.0.1 + resolution: "@bcoe/v8-coverage@npm:1.0.1" + checksum: 10c0/8a5df36b79715f54f419052966dfd7900eef13dadc31cc9214bd69b8b3eabdc5a3013612453edf547fa35cbeb5fd57a12e7910a75a845aac410d81d08511944a languageName: node linkType: hard @@ -598,19 +434,6 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: "npm:^5.3.1" - find-up: "npm:^4.1.0" - get-package-type: "npm:^0.1.0" - js-yaml: "npm:^3.13.1" - resolve-from: "npm:^5.0.0" - checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 - languageName: node - linkType: hard - "@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" @@ -627,17 +450,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb - languageName: node - linkType: hard - "@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" @@ -645,13 +457,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" @@ -669,7 +474,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.12": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -1448,6 +1253,13 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -1962,15 +1774,6 @@ __metadata: languageName: node linkType: hard -"append-transform@npm:^2.0.0": - version: 2.0.0 - resolution: "append-transform@npm:2.0.0" - dependencies: - default-require-extensions: "npm:^3.0.0" - checksum: 10c0/f1505e4f4597f4eb7b3df8da898e431fc25d6cdc6c78d01c700a4fab38d835e7cbac693eade8df7b0a0944dc52a35f92b1771e440af59f1b1f8a1dadaba7d17b - languageName: node - linkType: hard - "aproba@npm:^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -1978,7 +1781,7 @@ __metadata: languageName: node linkType: hard -"archy@npm:^1.0.0, archy@npm:~1.0.0": +"archy@npm:~1.0.0": version: 1.0.0 resolution: "archy@npm:1.0.0" checksum: 10c0/200c849dd1c304ea9914827b0555e7e1e90982302d574153e28637db1a663c53de62bad96df42d50e8ce7fc18d05e3437d9aa8c4b383803763755f0956c7d308 @@ -1992,15 +1795,6 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -2114,6 +1908,7 @@ __metadata: "@types/uuid": "npm:10.0.0" "@typescript-eslint/eslint-plugin": "npm:8.19.0" "@typescript-eslint/parser": "npm:8.19.0" + c8: "npm:10.1.3" chai: "npm:5.1.2" conventional-changelog-conventionalcommits: "npm:8.0.0" cross-env: "npm:7.0.3" @@ -2125,7 +1920,6 @@ __metadata: express: "npm:4.21.2" husky: "npm:9.1.7" mocha: "npm:11.0.1" - nyc: "npm:17.1.0" pinst: "npm:3.0.0" prettier: "npm:3.4.2" prettier-eslint: "npm:16.3.0" @@ -2183,20 +1977,6 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.23.1": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" - dependencies: - caniuse-lite: "npm:^1.0.30001646" - electron-to-chromium: "npm:^1.5.4" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" - bin: - browserslist: cli.js - checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 - languageName: node - linkType: hard - "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -2204,6 +1984,32 @@ __metadata: languageName: node linkType: hard +"c8@npm:10.1.3": + version: 10.1.3 + resolution: "c8@npm:10.1.3" + dependencies: + "@bcoe/v8-coverage": "npm:^1.0.1" + "@istanbuljs/schema": "npm:^0.1.3" + find-up: "npm:^5.0.0" + foreground-child: "npm:^3.1.1" + istanbul-lib-coverage: "npm:^3.2.0" + istanbul-lib-report: "npm:^3.0.1" + istanbul-reports: "npm:^3.1.6" + test-exclude: "npm:^7.0.1" + v8-to-istanbul: "npm:^9.0.0" + yargs: "npm:^17.7.2" + yargs-parser: "npm:^21.1.1" + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true + bin: + c8: bin/c8.js + checksum: 10c0/1265ddbcb0e624fe200978e9263faf948cb9694ce8e6b858adbb14f1186de2e6c451aa4aabb821e9eb7f1972859e14691eaf2ff12ad96be7a3fc0e39946fc569 + languageName: node + linkType: hard + "cacache@npm:^18.0.0, cacache@npm:^18.0.3": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -2224,18 +2030,6 @@ __metadata: languageName: node linkType: hard -"caching-transform@npm:^4.0.0": - version: 4.0.0 - resolution: "caching-transform@npm:4.0.0" - dependencies: - hasha: "npm:^5.0.0" - make-dir: "npm:^3.0.0" - package-hash: "npm:^4.0.0" - write-file-atomic: "npm:^3.0.0" - checksum: 10c0/7b33669dadfad292636578087a1aa7bcf9fbd60d6cbc67e8f288e3667397193c00bdac35bb84d34bd44fa9209405791fd3ab101c2126109e6eaaef1b899da759 - languageName: node - linkType: hard - "call-bind-apply-helpers@npm:^1.0.1": version: 1.0.1 resolution: "call-bind-apply-helpers@npm:1.0.1" @@ -2263,13 +2057,6 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 - languageName: node - linkType: hard - "camelcase@npm:^6.0.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" @@ -2277,13 +2064,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001651 - resolution: "caniuse-lite@npm:1.0.30001651" - checksum: 10c0/7821278952a6dbd17358e5d08083d258f092e2a530f5bc1840657cb140fbbc5ec44293bc888258c44a18a9570cde149ed05819ac8320b9710cf22f699891e6ad - languageName: node - linkType: hard - "chai@npm:5.1.2": version: 5.1.2 resolution: "chai@npm:5.1.2" @@ -2449,17 +2229,6 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^6.0.0": - version: 6.0.0 - resolution: "cliui@npm:6.0.0" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^6.2.0" - checksum: 10c0/35229b1bb48647e882104cac374c9a18e34bbf0bace0e2cf03000326b6ca3050d6b59545d91e17bfe3705f4a0e2988787aa5cde6331bf5cbbf0164732cef6492 - languageName: node - linkType: hard - "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -2535,13 +2304,6 @@ __metadata: languageName: node linkType: hard -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - "compare-func@npm:^2.0.0": version: 2.0.0 resolution: "compare-func@npm:2.0.0" @@ -2675,13 +2437,6 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -2832,7 +2587,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5": version: 4.3.6 resolution: "debug@npm:4.3.6" dependencies: @@ -2844,13 +2599,6 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 - languageName: node - linkType: hard - "decamelize@npm:^4.0.0": version: 4.0.0 resolution: "decamelize@npm:4.0.0" @@ -2879,15 +2627,6 @@ __metadata: languageName: node linkType: hard -"default-require-extensions@npm:^3.0.0": - version: 3.0.1 - resolution: "default-require-extensions@npm:3.0.1" - dependencies: - strip-bom: "npm:^4.0.0" - checksum: 10c0/5ca376cb527d9474336ad76dd302d06367a7163379dda26558258de26f85861e696d0b7bb19ee3c6b8456bb7c95cdc0e4e4d45c2aa487e61b2d3b60d80c10648 - languageName: node - linkType: hard - "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -2991,13 +2730,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.5 - resolution: "electron-to-chromium@npm:1.5.5" - checksum: 10c0/6e5e12f729a74a78d9a7386ea32039262cb8a2f4611ab346da1f162c270d0569194c72169042080a1017220835ed30ee2d77ca5ba13c1acaa5fa0d373fbc0ad5 - languageName: node - linkType: hard - "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -3105,14 +2837,7 @@ __metadata: languageName: node linkType: hard -"es6-error@npm:^4.0.1": - version: 4.1.1 - resolution: "es6-error@npm:4.1.1" - checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": +"escalade@npm:^3.1.1": version: 3.1.2 resolution: "escalade@npm:3.1.2" checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 @@ -3371,16 +3096,6 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - "esquery@npm:^1.4.0, esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" @@ -3644,17 +3359,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.2.0": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^3.0.2" - pkg-dir: "npm:^4.1.0" - checksum: 10c0/92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 - languageName: node - linkType: hard - "find-up-simple@npm:^1.0.0": version: 1.0.0 resolution: "find-up-simple@npm:1.0.0" @@ -3671,16 +3375,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 - languageName: node - linkType: hard - "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -3749,17 +3443,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^2.0.0": - version: 2.0.0 - resolution: "foreground-child@npm:2.0.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/6719982783a448162f9a01500757fb2053bc5dcd4d67c7cd30739b38ccc01b39f84e408c30989d1d8774519c021c0498e2450ab127690fb09d7f2568fd94ffcc - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.0": +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.1.1": version: 3.3.0 resolution: "foreground-child@npm:3.3.0" dependencies: @@ -3793,13 +3477,6 @@ __metadata: languageName: node linkType: hard -"fromentries@npm:^1.2.0": - version: 1.3.2 - resolution: "fromentries@npm:1.3.2" - checksum: 10c0/63938819a86e39f490b0caa1f6b38b8ad04f41ccd2a1c144eb48a21f76e4dbc074bc62e97abb053c7c1f541ecc70cf0b8aaa98eed3fe02206db9b6f9bb9a6a47 - languageName: node - linkType: hard - "fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -3869,14 +3546,7 @@ __metadata: languageName: node linkType: hard -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": +"get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde @@ -3901,13 +3571,6 @@ __metadata: languageName: node linkType: hard -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be - languageName: node - linkType: hard - "get-proto@npm:^1.0.0": version: 1.0.1 resolution: "get-proto@npm:1.0.1" @@ -3994,7 +3657,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.2, glob@npm:^10.4.5": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1, glob@npm:^10.4.2, glob@npm:^10.4.5": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -4026,7 +3689,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -4049,13 +3712,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -4114,7 +3770,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -4176,16 +3832,6 @@ __metadata: languageName: node linkType: hard -"hasha@npm:^5.0.0": - version: 5.2.2 - resolution: "hasha@npm:5.2.2" - dependencies: - is-stream: "npm:^2.0.0" - type-fest: "npm:^0.8.0" - checksum: 10c0/9d10d4e665a37beea6e18ba3a0c0399a05b26e505c5ff2fe9115b64fedb3ca95f68c89cf15b08ee4d09fd3064b5e1bfc8e8247353c7aa6b7388471d0f86dca74 - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -4619,13 +4265,6 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec - languageName: node - linkType: hard - "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -4640,13 +4279,6 @@ __metadata: languageName: node linkType: hard -"is-windows@npm:^1.0.2": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5 - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -4688,43 +4320,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-hook@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-hook@npm:3.0.0" - dependencies: - append-transform: "npm:^2.0.0" - checksum: 10c0/0029bdbc4ae82c2a5a0b48a2f4ba074de72601a5d27505493c9be83d4c7952039ad787d2f6d1321710b75a05059c4335a0eb7c8857ca82e7e6d19f8d88d03b46 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.2": - version: 6.0.3 - resolution: "istanbul-lib-instrument@npm:6.0.3" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 - languageName: node - linkType: hard - -"istanbul-lib-processinfo@npm:^2.0.2": - version: 2.0.3 - resolution: "istanbul-lib-processinfo@npm:2.0.3" - dependencies: - archy: "npm:^1.0.0" - cross-spawn: "npm:^7.0.3" - istanbul-lib-coverage: "npm:^3.2.0" - p-map: "npm:^3.0.0" - rimraf: "npm:^3.0.0" - uuid: "npm:^8.3.2" - checksum: 10c0/ffd0f9b1c8e266e980580f83e65397caeace3958e4b4326b4479dcb0e41a450698387b96b4d4823e63b7c4a403f72e6e30d9e788ddcf153edb422a9d6f64a998 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" dependencies: @@ -4735,18 +4331,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.0.2": +"istanbul-reports@npm:^3.1.6": version: 3.1.7 resolution: "istanbul-reports@npm:3.1.7" dependencies: @@ -4805,18 +4390,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -4835,15 +4408,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -4900,15 +4464,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -5138,15 +4693,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: "npm:^4.1.0" - checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 - languageName: node - linkType: hard - "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -5193,13 +4739,6 @@ __metadata: languageName: node linkType: hard -"lodash.flattendeep@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flattendeep@npm:4.4.0" - checksum: 10c0/83cb80754b921fb4ed2c222b91a82b2524f3bdc60c3ae91e00688bd4bf1bcc28b8a2cc250e11fdc1b6da3a2de09e57008e13f15a209cafdd4f9163d047f97544 - languageName: node - linkType: hard - "lodash.get@npm:^4.4.2": version: 4.4.2 resolution: "lodash.get@npm:4.4.2" @@ -5332,24 +4871,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -5543,7 +5064,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -5820,22 +5341,6 @@ __metadata: languageName: node linkType: hard -"node-preload@npm:^0.2.1": - version: 0.2.1 - resolution: "node-preload@npm:0.2.1" - dependencies: - process-on-spawn: "npm:^1.0.0" - checksum: 10c0/7ae3def896626701e2a27b0c8119e0234089db4317b8c16bb8c44bee9abb82c0e38d57e6317d480970f5a2510e44185af81d3ea85be1a78311701f66f912e9e4 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 - languageName: node - linkType: hard - "nopt@npm:^7.0.0, nopt@npm:^7.2.1": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -6067,43 +5572,6 @@ __metadata: languageName: node linkType: hard -"nyc@npm:17.1.0": - version: 17.1.0 - resolution: "nyc@npm:17.1.0" - dependencies: - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - caching-transform: "npm:^4.0.0" - convert-source-map: "npm:^1.7.0" - decamelize: "npm:^1.2.0" - find-cache-dir: "npm:^3.2.0" - find-up: "npm:^4.1.0" - foreground-child: "npm:^3.3.0" - get-package-type: "npm:^0.1.0" - glob: "npm:^7.1.6" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-hook: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.2" - istanbul-lib-processinfo: "npm:^2.0.2" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.0.2" - make-dir: "npm:^3.0.0" - node-preload: "npm:^0.2.1" - p-map: "npm:^3.0.0" - process-on-spawn: "npm:^1.0.0" - resolve-from: "npm:^5.0.0" - rimraf: "npm:^3.0.0" - signal-exit: "npm:^3.0.2" - spawn-wrap: "npm:^2.0.0" - test-exclude: "npm:^6.0.0" - yargs: "npm:^15.0.2" - bin: - nyc: bin/nyc.js - checksum: 10c0/653497bf11c53c70d821c18a2bfb7dba310b297b8bc83e5392e560c3d60d4dc9836b6c44f060065dfa99f7dacfd49147f8f60b160dfbe3f722517d4e7e236db2 - languageName: node - linkType: hard - "object-assign@npm:^4.0.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -6200,15 +5668,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 - languageName: node - linkType: hard - "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -6236,15 +5695,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: "npm:^2.2.0" - checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 - languageName: node - linkType: hard - "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -6263,15 +5713,6 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^3.0.0": - version: 3.0.0 - resolution: "p-map@npm:3.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/297930737e52412ad9f5787c52774ad6496fad9a8be5f047e75fd0a3dc61930d8f7a9b2bbe1c4d1404e54324228a4f69721da2538208dadaa4ef4c81773c9f20 - languageName: node - linkType: hard - "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -6302,25 +5743,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f - languageName: node - linkType: hard - -"package-hash@npm:^4.0.0": - version: 4.0.0 - resolution: "package-hash@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.15" - hasha: "npm:^5.0.0" - lodash.flattendeep: "npm:^4.4.0" - release-zalgo: "npm:^1.0.0" - checksum: 10c0/2108b685fd5b2a32323aeed5caf2afef8c5fcf680527b09c7e2eaa05cf04b09a7c586860319097fc589ad028a3d94b2da68e8ab1935249aa95e8162ffd622729 - languageName: node - linkType: hard - "package-json-from-dist@npm:^1.0.0": version: 1.0.0 resolution: "package-json-from-dist@npm:1.0.0" @@ -6555,7 +5977,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": +"picocolors@npm:^1.0.0": version: 1.0.1 resolution: "picocolors@npm:1.0.1" checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 @@ -6595,15 +6017,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: "npm:^4.0.0" - checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 - languageName: node - linkType: hard - "postcss-selector-parser@npm:^6.0.10": version: 6.1.1 resolution: "postcss-selector-parser@npm:6.1.1" @@ -6710,15 +6123,6 @@ __metadata: languageName: node linkType: hard -"process-on-spawn@npm:^1.0.0": - version: 1.0.0 - resolution: "process-on-spawn@npm:1.0.0" - dependencies: - fromentries: "npm:^1.2.0" - checksum: 10c0/8abd43199b17e61740faec4523fbebb2b2ec990ae096d3051096788128364beb09472decef78dbad70a267e207345aa3a4b595364fefd89e954a509177bdc02b - languageName: node - linkType: hard - "proggy@npm:^2.0.0": version: 2.0.0 resolution: "proggy@npm:2.0.0" @@ -6959,15 +6363,6 @@ __metadata: languageName: node linkType: hard -"release-zalgo@npm:^1.0.0": - version: 1.0.0 - resolution: "release-zalgo@npm:1.0.0" - dependencies: - es6-error: "npm:^4.0.1" - checksum: 10c0/9e161feb073f9e3aa714bb077d67592c34ee578f5b9cff8e2d492423fe2002d5b1e6d11ffcd5c564b9a0ee9435f25569567b658a82b9af931e7ac1313925628a - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -6982,13 +6377,6 @@ __metadata: languageName: node linkType: hard -"require-main-filename@npm:^2.0.0": - version: 2.0.0 - resolution: "require-main-filename@npm:2.0.0" - checksum: 10c0/db91467d9ead311b4111cbd73a4e67fa7820daed2989a32f7023785a2659008c6d119752d9c4ac011ae07e537eb86523adff99804c5fdb39cd3a017f9b401bb6 - languageName: node - linkType: hard - "require-relative@npm:^0.8.7": version: 0.8.7 resolution: "require-relative@npm:0.8.7" @@ -7036,7 +6424,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -7171,15 +6559,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - "semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": version: 7.6.3 resolution: "semver@npm:7.6.3" @@ -7231,13 +6610,6 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 - languageName: node - linkType: hard - "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -7309,7 +6681,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": +"signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -7427,20 +6799,6 @@ __metadata: languageName: node linkType: hard -"spawn-wrap@npm:^2.0.0": - version: 2.0.0 - resolution: "spawn-wrap@npm:2.0.0" - dependencies: - foreground-child: "npm:^2.0.0" - is-windows: "npm:^1.0.2" - make-dir: "npm:^3.0.0" - rimraf: "npm:^3.0.0" - signal-exit: "npm:^3.0.2" - which: "npm:^2.0.1" - checksum: 10c0/0d30001391eedbd588722be74506d3e60582557e754fe3deb3f84f2c84ddca0d72d8132f16502cf312bacb8952cc7abe833d6f45b4e80c8baea3fa56c5554d3d - languageName: node - linkType: hard - "spdx-correct@npm:^3.0.0": version: 3.2.0 resolution: "spdx-correct@npm:3.2.0" @@ -7508,13 +6866,6 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - "ssri@npm:^10.0.0, ssri@npm:^10.0.6": version: 10.0.6 resolution: "ssri@npm:10.0.6" @@ -7606,13 +6957,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef - languageName: node - linkType: hard - "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -7752,14 +7096,14 @@ __metadata: languageName: node linkType: hard -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" dependencies: "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + glob: "npm:^10.4.1" + minimatch: "npm:^9.0.4" + checksum: 10c0/6d67b9af4336a2e12b26a68c83308c7863534c65f27ed4ff7068a56f5a58f7ac703e8fc80f698a19bb154fd8f705cdf7ec347d9512b2c522c737269507e7b263 languageName: node linkType: hard @@ -7835,13 +7179,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -7967,13 +7304,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.8.0": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 - languageName: node - linkType: hard - "type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" @@ -8012,15 +7342,6 @@ __metadata: languageName: node linkType: hard -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 - languageName: node - linkType: hard - "typescript@npm:5.7.2": version: 5.7.2 resolution: "typescript@npm:5.7.2" @@ -8146,20 +7467,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" - dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/a7452de47785842736fb71547651c5bbe5b4dc1e3722ccf48a704b7b34e4dcf633991eaa8e4a6a517ffb738b3252eede3773bef673ef9021baa26b056d63a5b9 - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -8199,15 +7506,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -8215,6 +7513,17 @@ __metadata: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.0": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -8263,13 +7572,6 @@ __metadata: languageName: node linkType: hard -"which-module@npm:^2.0.0": - version: 2.0.1 - resolution: "which-module@npm:2.0.1" - checksum: 10c0/087038e7992649eaffa6c7a4f3158d5b53b14cf5b6c1f0e043dccfacb1ba179d12f17545d5b85ebd94a42ce280a6fe65d0cbcab70f4fc6daad1dfae85e0e6a3e - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -8324,17 +7626,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c - languageName: node - linkType: hard - "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -8353,18 +7644,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: "npm:^0.1.4" - is-typedarray: "npm:^1.0.0" - signal-exit: "npm:^3.0.2" - typedarray-to-buffer: "npm:^3.1.5" - checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e - languageName: node - linkType: hard - "write-file-atomic@npm:^5.0.0, write-file-atomic@npm:^5.0.1": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" @@ -8382,13 +7661,6 @@ __metadata: languageName: node linkType: hard -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 10c0/308a2efd7cc296ab2c0f3b9284fd4827be01cfeb647b3ba18230e3a416eb1bc887ac050de9f8c4fd9e7856b2e8246e05d190b53c96c5ad8d8cb56dffb6f81024 - languageName: node - linkType: hard - "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -8396,13 +7668,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -8410,16 +7675,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^18.1.2": - version: 18.1.3 - resolution: "yargs-parser@npm:18.1.3" - dependencies: - camelcase: "npm:^5.0.0" - decamelize: "npm:^1.2.0" - checksum: 10c0/25df918833592a83f52e7e4f91ba7d7bfaa2b891ebf7fe901923c2ee797534f23a176913ff6ff7ebbc1cc1725a044cc6a6539fed8bfd4e13b5b16376875f9499 - languageName: node - linkType: hard - "yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -8446,25 +7701,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.0.2": - version: 15.4.1 - resolution: "yargs@npm:15.4.1" - dependencies: - cliui: "npm:^6.0.0" - decamelize: "npm:^1.2.0" - find-up: "npm:^4.1.0" - get-caller-file: "npm:^2.0.1" - require-directory: "npm:^2.1.1" - require-main-filename: "npm:^2.0.0" - set-blocking: "npm:^2.0.0" - string-width: "npm:^4.2.0" - which-module: "npm:^2.0.0" - y18n: "npm:^4.0.0" - yargs-parser: "npm:^18.1.2" - checksum: 10c0/f1ca680c974333a5822732825cca7e95306c5a1e7750eb7b973ce6dc4f97a6b0a8837203c8b194f461969bfe1fb1176d1d423036635285f6010b392fa498ab2d - languageName: node - linkType: hard - "yargs@npm:^16.0.0, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" @@ -8480,7 +7716,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.5.1": +"yargs@npm:^17.0.0, yargs@npm:^17.5.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: