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: