diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cb3554617b..ebf8f9dde0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -76,11 +76,11 @@ jobs: nvm use - name: Install dependencies - working-directory: ./scanners + working-directory: tests/integration run: | npm ci - name: Test Node.js Scanner Test Helpers - working-directory: ./scanners + working-directory: tests/integration run: | npm run test:helpers k8s-setup: diff --git a/.templates/new-scanner/integration-tests/new-scanner.test.js b/.templates/new-scanner/integration-tests/new-scanner.test.js index 5ce632204d..4136ea1e92 100644 --- a/.templates/new-scanner/integration-tests/new-scanner.test.js +++ b/.templates/new-scanner/integration-tests/new-scanner.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/amass/integration-tests/amass.test.js b/scanners/amass/integration-tests/amass.test.js index 625471c59b..ce59c17276 100644 --- a/scanners/amass/integration-tests/amass.test.js +++ b/scanners/amass/integration-tests/amass.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); test( diff --git a/scanners/cmseek/integration-tests/cmseek.test.js b/scanners/cmseek/integration-tests/cmseek.test.js index 5e1c4556d7..7e26f54f47 100644 --- a/scanners/cmseek/integration-tests/cmseek.test.js +++ b/scanners/cmseek/integration-tests/cmseek.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/doggo/integration-tests/doggo.test.js b/scanners/doggo/integration-tests/doggo.test.js index 5f006cbf8c..2ebcf17b0d 100644 --- a/scanners/doggo/integration-tests/doggo.test.js +++ b/scanners/doggo/integration-tests/doggo.test.js @@ -2,9 +2,8 @@ // // SPDX-License-Identifier: Apache-2.0 -const { - scan -} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); + jest.retryTimes(3); diff --git a/scanners/ffuf/integration-tests/ffuf.test.js b/scanners/ffuf/integration-tests/ffuf.test.js index 5fbfc9dda9..9669de6358 100644 --- a/scanners/ffuf/integration-tests/ffuf.test.js +++ b/scanners/ffuf/integration-tests/ffuf.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/git-repo-scanner/integration-tests/git-repo-scanner.test.js b/scanners/git-repo-scanner/integration-tests/git-repo-scanner.test.js index 8034aba803..86f86aba00 100644 --- a/scanners/git-repo-scanner/integration-tests/git-repo-scanner.test.js +++ b/scanners/git-repo-scanner/integration-tests/git-repo-scanner.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/gitleaks/integration-tests/gitleaks.test.js b/scanners/gitleaks/integration-tests/gitleaks.test.js index b5023dac22..69826aac94 100644 --- a/scanners/gitleaks/integration-tests/gitleaks.test.js +++ b/scanners/gitleaks/integration-tests/gitleaks.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(0); diff --git a/scanners/helpers.js b/scanners/helpers.js deleted file mode 100644 index 5eabca031c..0000000000 --- a/scanners/helpers.js +++ /dev/null @@ -1,302 +0,0 @@ -// SPDX-FileCopyrightText: the secureCodeBox authors -// -// SPDX-License-Identifier: Apache-2.0 - -const k8s = require("@kubernetes/client-node"); - -const kc = new k8s.KubeConfig(); -kc.loadFromDefault(); - -let k8sCRDApi, k8sBatchApi, k8sPodsApi; - -function getKubernetesAPIs() { - if (!k8sCRDApi) { - k8sCRDApi = kc.makeApiClient(k8s.CustomObjectsApi); - } - if (!k8sBatchApi) { - k8sBatchApi = kc.makeApiClient(k8s.BatchV1Api); - } - if (!k8sPodsApi) { - k8sPodsApi = kc.makeApiClient(k8s.CoreV1Api); - } - - return { k8sCRDApi, k8sBatchApi, k8sPodsApi }; -} -let namespace = "integration-tests"; - -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms * 1000)); - -async function deleteScan(name, k8sApis = getKubernetesAPIs()) { - await k8sApis.k8sCRDApi.deleteNamespacedCustomObject( - "execution.securecodebox.io", - "v1", - namespace, - "scans", - name, - {} - ); -} - -async function getScan(name, k8sApis = getKubernetesAPIs()) { - const { body: scan } = await k8sApis.k8sCRDApi.getNamespacedCustomObjectStatus( - "execution.securecodebox.io", - "v1", - namespace, - "scans", - name - ); - return scan; -} - -async function displayAllLogsForJob(jobName, k8sApis = getKubernetesAPIs()) { - console.log(`Listing logs for Job '${jobName}':`); - const { - body: { items: pods }, - } = await k8sApis.k8sPodsApi.listNamespacedPod( - namespace, - true, - undefined, - undefined, - undefined, - `job-name=${jobName}` - ); - - if (pods.length === 0) { - console.log(`No Pods found for Job '${jobName}'`); - } - - for (const pod of pods) { - console.log( - `Listing logs for Job '${jobName}' > Pod '${pod.metadata.name}':` - ); - - for (const container of pod.spec.containers) { - try { - const response = await k8sApis.k8sPodsApi.readNamespacedPodLog( - pod.metadata.name, - namespace, - container.name - ); - console.log(`Container ${container.name}:`); - console.log(response.body); - } catch (exception) { - console.error( - `Failed to display logs of container ${container.name}: ${exception.body.message}` - ); - } - } - } -} - -async function logJobs(k8sApis = getKubernetesAPIs()) { - try { - const { body: jobs } = await k8sApis.k8sBatchApi.listNamespacedJob(namespace); - - console.log("Logging spec & status of jobs in namespace"); - - for (const job of jobs.items) { - console.log(`Job: '${job.metadata.name}' Spec:`); - console.log(JSON.stringify(job.spec, null, 2)); - console.log(`Job: '${job.metadata.name}' Status:`); - console.log(JSON.stringify(job.status, null, 2)); - - await displayAllLogsForJob(job.metadata.name, k8sApis); - } - } catch (error) { - console.error("Failed to list Jobs"); - console.error(error); - } -} - -async function disasterRecovery(scanName, k8sApis) { - const scan = await getScan(scanName, k8sApis); - console.error("Last Scan State:"); - console.dir(scan); - await logJobs(k8sApis); -} - -/** - * - * @param {string} name name of the scan. Actual name will be suffixed with a random number to avoid conflicts - * @param {string} scanType type of the scan. Must match the name of a ScanType CRD - * @param {string[]} parameters cli argument to be passed to the scanner - * @param {number} timeout in seconds - * @param {object[]} volumes definitions for kubernetes volumes that should be used. Optional, useful for initContainers (see below) - * @param {object[]} volumeMounts definitions for kubernetes volume mounts that should be used. Optional, useful for initContainers (see below) - * @param {object[]} initContainers definitions for initContainers that should be added to the scan job to provision files for the scanner. Optional. - * @param {CRDApi} CRDApi kubernetes api client for CRDs. Optional, will be created if not provided. - * @param {BatchApi} BatchApi kubernetes api client for BatchV1Api. Optional, will be created if not provided. - * @param {PodsApi} PodsApi kubernetes api client for CoreV1Api. Optional, will be created if not provided. - * @returns {scan.findings} returns findings { categories, severities, count } - */ -async function scan(name, scanType, parameters = [], timeout = 180, volumes = [], volumeMounts = [], - initContainers = [], k8sApis = getKubernetesAPIs()) { - namespace = "integration-tests" - const scanDefinition = { - apiVersion: "execution.securecodebox.io/v1", - kind: "Scan", - metadata: { - // Use `generateName` instead of name to generate a random suffix and avoid name clashes - generateName: `${name}-`, - }, - spec: { - scanType, - parameters, - volumes, - volumeMounts, - initContainers, - }, - }; - const { body } = await k8sApis.k8sCRDApi.createNamespacedCustomObject( - "execution.securecodebox.io", - "v1", - namespace, - "scans", - scanDefinition - ); - - const actualName = body.metadata.name; - - for (let i = 0; i < timeout; i++) { - await sleep(1); - const { status } = await getScan(actualName, k8sApis); - - if (status && status.state === "Done") { - // Wait a couple seconds to give kubernetes more time to update the fields - await sleep(2); - const { status } = await getScan(actualName, k8sApis); - await deleteScan(actualName, k8sApis); - return status.findings; - } else if (status && status.state === "Errored") { - console.error("Scan Errored"); - await disasterRecovery(actualName, k8sApis); - - throw new Error( - `Scan failed with description "${status.errorDescription}"` - ); - } - } - console.error("Scan Timed out!"); - await disasterRecovery(actualName, k8sApis); - - throw new Error("timed out while waiting for scan results"); -} - -/** - * - * @param {string} name name of the scan. Actual name will be sufixed with a random number to avoid conflicts - * @param {string} scanType type of the scan. Must match the name of a ScanType CRD - * @param {string[]} parameters cli argument to be passed to the scanner - * @param {string} nameCascade name of cascading scan - * @param {object} matchLabels set invasive and intensive of cascading scan - * @param {number} timeout in seconds - * @param {CRDApi} CRDApi kubernetes api client for CRDs. Optional, will be created if not provided. - * @param {BatchApi} BatchApi kubernetes api client for BatchV1Api. Optional, will be created if not provided. - * @param {PodsApi} PodsApi kubernetes api client for CoreV1Api. Optional, will be created if not provided. - * - * @returns {scan.findings} returns findings { categories, severities, count } - */ -async function cascadingScan(name, scanType, parameters = [], { nameCascade, matchLabels }, timeout = 180, k8sApis = getKubernetesAPIs()) { - const scanDefinition = { - apiVersion: "execution.securecodebox.io/v1", - kind: "Scan", - metadata: { - // Use `generateName` instead of name to generate a random suffix and avoid name clashes - generateName: `${name}-`, - }, - spec: { - scanType, - parameters, - cascades: { - matchLabels, - } - }, - }; - - const { body } = await k8sApis.k8sCRDApi.createNamespacedCustomObject( - "execution.securecodebox.io", - "v1", - namespace, - "scans", - scanDefinition - ); - - const actualName = body.metadata.name; - - for (let i = 0; i < timeout; i++) { - await sleep(1); - const { status } = await getScan(actualName, k8sApis); - - if (status && status.state === "Done") { - // Wait a couple seconds to give kubernetes more time to update the fields - await sleep(5); - console.log("First Scan finished") - console.log(`First Scan Status: ${JSON.stringify(status, undefined, 2)}`) - - break; - } else if (status && status.state === "Errored") { - console.error("Scan Errored"); - await disasterRecovery(actualName, k8sApis); - throw new Error( - `Initial Scan failed with description "${status.errorDescription}"` - ); - } - - if (i === (timeout - 1)) { - throw new Error( - `Initial Scan timed out failed` - ); - } - } - - const { body: scans } = await k8sApis.k8sCRDApi.listNamespacedCustomObject( - "execution.securecodebox.io", - "v1", - namespace, - "scans" - ); - - let cascadedScan = null; - - for (const scan of scans.items) { - if (scan.metadata.annotations && scan.metadata.annotations["cascading.securecodebox.io/chain"] === nameCascade) { - cascadedScan = scan; - break; - } - } - - if (cascadedScan === null) { - console.warn(`Didn't find matching cascaded scan in available scans: ${JSON.stringify(scans.items, undefined, 2)}`) - throw new Error(`Didn't find cascaded Scan for ${nameCascade}`) - } - const actualNameCascade = cascadedScan.metadata.name; - - for (let j = 0; j < timeout; j++) { - await sleep(1) - const { status: statusCascade } = await getScan(actualNameCascade, k8sApis); - - if (statusCascade && statusCascade.state === "Done") { - await sleep(2); - const { status: statusCascade } = await getScan(actualNameCascade, k8sApis); - - await deleteScan(actualName, k8sApis); - await deleteScan(actualNameCascade, k8sApis); - return statusCascade.findings; - } else if (statusCascade && statusCascade.state === "Errored") { - console.error("Scan Errored"); - await disasterRecovery(actualName, k8sApis); - await disasterRecovery(actualNameCascade, k8sApis); - throw new Error( - `Cascade Scan failed with description "${statusCascade.errorDescription}"` - ); - } - } - console.error("Cascade Scan Timed out!"); - await disasterRecovery(actualName, k8sApis); - await disasterRecovery(actualNameCascade, k8sApis); - - throw new Error("timed out while waiting for scan results"); -} - -module.exports.scan = scan; -module.exports.cascadingScan = cascadingScan; diff --git a/scanners/kube-hunter/integration-tests/kube-hunter.test.js b/scanners/kube-hunter/integration-tests/kube-hunter.test.js index 99b252fbf3..cfa1931c8d 100644 --- a/scanners/kube-hunter/integration-tests/kube-hunter.test.js +++ b/scanners/kube-hunter/integration-tests/kube-hunter.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/kubeaudit/integration-tests/kubeaudit.test.js b/scanners/kubeaudit/integration-tests/kubeaudit.test.js index 7689f164a7..5833cd55cc 100644 --- a/scanners/kubeaudit/integration-tests/kubeaudit.test.js +++ b/scanners/kubeaudit/integration-tests/kubeaudit.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/ncrack/integration-tests/ncrack.test.js b/scanners/ncrack/integration-tests/ncrack.test.js index 85221405a6..34a5c73021 100644 --- a/scanners/ncrack/integration-tests/ncrack.test.js +++ b/scanners/ncrack/integration-tests/ncrack.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/nikto/integration-tests/nikto.test.js b/scanners/nikto/integration-tests/nikto.test.js index 206e2f4f54..065fd38f14 100644 --- a/scanners/nikto/integration-tests/nikto.test.js +++ b/scanners/nikto/integration-tests/nikto.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/nmap/integration-tests/nmap.test.js b/scanners/nmap/integration-tests/nmap.test.js index 69eab84af5..9ab07ecb7c 100644 --- a/scanners/nmap/integration-tests/nmap.test.js +++ b/scanners/nmap/integration-tests/nmap.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/nuclei/integration-tests/nuclei.test.js b/scanners/nuclei/integration-tests/nuclei.test.js index 4c6d34a778..df145cbbc5 100644 --- a/scanners/nuclei/integration-tests/nuclei.test.js +++ b/scanners/nuclei/integration-tests/nuclei.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/package.json b/scanners/package.json index ea8eb7c231..46d00d9f37 100644 --- a/scanners/package.json +++ b/scanners/package.json @@ -10,8 +10,7 @@ "main": "index.js", "scripts": { "test:unit": "jest --verbose --testPathIgnorePatterns /integration-tests/ --ci --colors --coverage --passWithNoTests", - "test:integration": "jest --verbose --ci --colors --coverage --passWithNoTests", - "test:helpers": "jest helpers.test.js --verbose --ci --colors --coverage --passWithNoTests" + "test:integration": "jest --verbose --ci --colors --coverage --passWithNoTests" }, "keywords": [ "secureCodeBox", diff --git a/scanners/screenshooter/integration-tests/screenshooter.test.js b/scanners/screenshooter/integration-tests/screenshooter.test.js index b73626015e..7110fde2bf 100644 --- a/scanners/screenshooter/integration-tests/screenshooter.test.js +++ b/scanners/screenshooter/integration-tests/screenshooter.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); test( "make screenshot of nginx demo target", diff --git a/scanners/semgrep/integration-tests/semgrep.test.js b/scanners/semgrep/integration-tests/semgrep.test.js index fd9401ed2f..e5420cf448 100644 --- a/scanners/semgrep/integration-tests/semgrep.test.js +++ b/scanners/semgrep/integration-tests/semgrep.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(0); diff --git a/scanners/ssh-audit/integration-tests/ssh-audit.test.js b/scanners/ssh-audit/integration-tests/ssh-audit.test.js index 4bb665c7d3..01ecdb5849 100644 --- a/scanners/ssh-audit/integration-tests/ssh-audit.test.js +++ b/scanners/ssh-audit/integration-tests/ssh-audit.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const { scan } = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(1); diff --git a/scanners/ssh-scan/integration-tests/ssh-scan.test.js b/scanners/ssh-scan/integration-tests/ssh-scan.test.js index 46c27d3301..44ca972eda 100644 --- a/scanners/ssh-scan/integration-tests/ssh-scan.test.js +++ b/scanners/ssh-scan/integration-tests/ssh-scan.test.js @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // todo: Integrate into github ci pipeline -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/sslyze/integration-tests/sslyze.test.js b/scanners/sslyze/integration-tests/sslyze.test.js index ad80fdcc3c..8e23ecd937 100644 --- a/scanners/sslyze/integration-tests/sslyze.test.js +++ b/scanners/sslyze/integration-tests/sslyze.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/trivy-sbom/integration-tests/trivy-sbom.test.js b/scanners/trivy-sbom/integration-tests/trivy-sbom.test.js index 2d79c876e2..a8cd3a7deb 100644 --- a/scanners/trivy-sbom/integration-tests/trivy-sbom.test.js +++ b/scanners/trivy-sbom/integration-tests/trivy-sbom.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/trivy/integration-tests/trivy.test.js b/scanners/trivy/integration-tests/trivy.test.js index 61bf5bb91f..adfe998298 100644 --- a/scanners/trivy/integration-tests/trivy.test.js +++ b/scanners/trivy/integration-tests/trivy.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/typo3scan/integration-tests/typo3scan.test.js b/scanners/typo3scan/integration-tests/typo3scan.test.js index f947cdffed..94bc2a2d32 100644 --- a/scanners/typo3scan/integration-tests/typo3scan.test.js +++ b/scanners/typo3scan/integration-tests/typo3scan.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/whatweb/integration-tests/whatweb.test.js b/scanners/whatweb/integration-tests/whatweb.test.js index 3a81723f4f..f6961983f8 100644 --- a/scanners/whatweb/integration-tests/whatweb.test.js +++ b/scanners/whatweb/integration-tests/whatweb.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/wpscan/integration-tests/wpscan.test.js b/scanners/wpscan/integration-tests/wpscan.test.js index 5625cae134..6ffda8a3da 100644 --- a/scanners/wpscan/integration-tests/wpscan.test.js +++ b/scanners/wpscan/integration-tests/wpscan.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/zap-advanced/integration-tests/zap-advanced.test.js b/scanners/zap-advanced/integration-tests/zap-advanced.test.js index 10afc66db4..796a11d215 100644 --- a/scanners/zap-advanced/integration-tests/zap-advanced.test.js +++ b/scanners/zap-advanced/integration-tests/zap-advanced.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); jest.retryTimes(3); diff --git a/scanners/zap/integration-tests/zap.test.js b/scanners/zap/integration-tests/zap.test.js index 7b444c847f..196a924135 100644 --- a/scanners/zap/integration-tests/zap.test.js +++ b/scanners/zap/integration-tests/zap.test.js @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: Apache-2.0 -const {scan} = require("../../helpers"); +const { scan } = require("../../../tests/integration/helpers.js"); test.concurrent( "zap automation scan without config against 'bodgeit' should only find couple findings", diff --git a/scanners/__snapshots__/helpers.test.js.snap b/tests/integration/__snapshots__/helpers.test.js.snap similarity index 100% rename from scanners/__snapshots__/helpers.test.js.snap rename to tests/integration/__snapshots__/helpers.test.js.snap diff --git a/scanners/__snapshots__/helpers.test.js.snap.license b/tests/integration/__snapshots__/helpers.test.js.snap.license similarity index 100% rename from scanners/__snapshots__/helpers.test.js.snap.license rename to tests/integration/__snapshots__/helpers.test.js.snap.license diff --git a/scanners/__testFiles__/mockCascadingListNamespacedCustomObject.json b/tests/integration/__testFiles__/mockCascadingListNamespacedCustomObject.json similarity index 100% rename from scanners/__testFiles__/mockCascadingListNamespacedCustomObject.json rename to tests/integration/__testFiles__/mockCascadingListNamespacedCustomObject.json diff --git a/scanners/__testFiles__/mockCascadingListNamespacedCustomObject.json.license b/tests/integration/__testFiles__/mockCascadingListNamespacedCustomObject.json.license similarity index 100% rename from scanners/__testFiles__/mockCascadingListNamespacedCustomObject.json.license rename to tests/integration/__testFiles__/mockCascadingListNamespacedCustomObject.json.license diff --git a/scanners/__testFiles__/mockCascadingScanCreationResponse.json b/tests/integration/__testFiles__/mockCascadingScanCreationResponse.json similarity index 100% rename from scanners/__testFiles__/mockCascadingScanCreationResponse.json rename to tests/integration/__testFiles__/mockCascadingScanCreationResponse.json diff --git a/scanners/__testFiles__/mockCascadingScanCreationResponse.json.license b/tests/integration/__testFiles__/mockCascadingScanCreationResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockCascadingScanCreationResponse.json.license rename to tests/integration/__testFiles__/mockCascadingScanCreationResponse.json.license diff --git a/scanners/__testFiles__/mockCascadingScanStatusResponse.json b/tests/integration/__testFiles__/mockCascadingScanStatusResponse.json similarity index 100% rename from scanners/__testFiles__/mockCascadingScanStatusResponse.json rename to tests/integration/__testFiles__/mockCascadingScanStatusResponse.json diff --git a/scanners/__testFiles__/mockCascadingScanStatusResponse.json.license b/tests/integration/__testFiles__/mockCascadingScanStatusResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockCascadingScanStatusResponse.json.license rename to tests/integration/__testFiles__/mockCascadingScanStatusResponse.json.license diff --git a/scanners/__testFiles__/mockCascadingScanStatusResponse_Errored.json b/tests/integration/__testFiles__/mockCascadingScanStatusResponse_Errored.json similarity index 100% rename from scanners/__testFiles__/mockCascadingScanStatusResponse_Errored.json rename to tests/integration/__testFiles__/mockCascadingScanStatusResponse_Errored.json diff --git a/scanners/__testFiles__/mockCascadingScanStatusResponse_Errored.json.license b/tests/integration/__testFiles__/mockCascadingScanStatusResponse_Errored.json.license similarity index 100% rename from scanners/__testFiles__/mockCascadingScanStatusResponse_Errored.json.license rename to tests/integration/__testFiles__/mockCascadingScanStatusResponse_Errored.json.license diff --git a/scanners/__testFiles__/mockListNamespacedJobResponse.json b/tests/integration/__testFiles__/mockListNamespacedJobResponse.json similarity index 100% rename from scanners/__testFiles__/mockListNamespacedJobResponse.json rename to tests/integration/__testFiles__/mockListNamespacedJobResponse.json diff --git a/scanners/__testFiles__/mockListNamespacedJobResponse.json.license b/tests/integration/__testFiles__/mockListNamespacedJobResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockListNamespacedJobResponse.json.license rename to tests/integration/__testFiles__/mockListNamespacedJobResponse.json.license diff --git a/scanners/__testFiles__/mockListNamespacedPodResponse.json b/tests/integration/__testFiles__/mockListNamespacedPodResponse.json similarity index 100% rename from scanners/__testFiles__/mockListNamespacedPodResponse.json rename to tests/integration/__testFiles__/mockListNamespacedPodResponse.json diff --git a/scanners/__testFiles__/mockListNamespacedPodResponse.json.license b/tests/integration/__testFiles__/mockListNamespacedPodResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockListNamespacedPodResponse.json.license rename to tests/integration/__testFiles__/mockListNamespacedPodResponse.json.license diff --git a/scanners/__testFiles__/mockReadNamespacedPodLogResponse.json b/tests/integration/__testFiles__/mockReadNamespacedPodLogResponse.json similarity index 100% rename from scanners/__testFiles__/mockReadNamespacedPodLogResponse.json rename to tests/integration/__testFiles__/mockReadNamespacedPodLogResponse.json diff --git a/scanners/__testFiles__/mockReadNamespacedPodLogResponse.json.license b/tests/integration/__testFiles__/mockReadNamespacedPodLogResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockReadNamespacedPodLogResponse.json.license rename to tests/integration/__testFiles__/mockReadNamespacedPodLogResponse.json.license diff --git a/scanners/__testFiles__/mockScanCreationResponse.json b/tests/integration/__testFiles__/mockScanCreationResponse.json similarity index 100% rename from scanners/__testFiles__/mockScanCreationResponse.json rename to tests/integration/__testFiles__/mockScanCreationResponse.json diff --git a/scanners/__testFiles__/mockScanCreationResponse.json.license b/tests/integration/__testFiles__/mockScanCreationResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockScanCreationResponse.json.license rename to tests/integration/__testFiles__/mockScanCreationResponse.json.license diff --git a/scanners/__testFiles__/mockScanStatusResponse.json b/tests/integration/__testFiles__/mockScanStatusResponse.json similarity index 100% rename from scanners/__testFiles__/mockScanStatusResponse.json rename to tests/integration/__testFiles__/mockScanStatusResponse.json diff --git a/scanners/__testFiles__/mockScanStatusResponse.json.license b/tests/integration/__testFiles__/mockScanStatusResponse.json.license similarity index 100% rename from scanners/__testFiles__/mockScanStatusResponse.json.license rename to tests/integration/__testFiles__/mockScanStatusResponse.json.license diff --git a/scanners/__testFiles__/mockScanStatusResponse_Errored.json b/tests/integration/__testFiles__/mockScanStatusResponse_Errored.json similarity index 100% rename from scanners/__testFiles__/mockScanStatusResponse_Errored.json rename to tests/integration/__testFiles__/mockScanStatusResponse_Errored.json diff --git a/scanners/__testFiles__/mockScanStatusResponse_Errored.json.license b/tests/integration/__testFiles__/mockScanStatusResponse_Errored.json.license similarity index 100% rename from scanners/__testFiles__/mockScanStatusResponse_Errored.json.license rename to tests/integration/__testFiles__/mockScanStatusResponse_Errored.json.license diff --git a/tests/integration/helpers.js b/tests/integration/helpers.js index 9087741e8f..5eabca031c 100644 --- a/tests/integration/helpers.js +++ b/tests/integration/helpers.js @@ -7,16 +7,27 @@ const k8s = require("@kubernetes/client-node"); const kc = new k8s.KubeConfig(); kc.loadFromDefault(); -const k8sCRDApi = kc.makeApiClient(k8s.CustomObjectsApi); -const k8sBatchApi = kc.makeApiClient(k8s.BatchV1Api); -const k8sPodsApi = kc.makeApiClient(k8s.CoreV1Api); +let k8sCRDApi, k8sBatchApi, k8sPodsApi; +function getKubernetesAPIs() { + if (!k8sCRDApi) { + k8sCRDApi = kc.makeApiClient(k8s.CustomObjectsApi); + } + if (!k8sBatchApi) { + k8sBatchApi = kc.makeApiClient(k8s.BatchV1Api); + } + if (!k8sPodsApi) { + k8sPodsApi = kc.makeApiClient(k8s.CoreV1Api); + } + + return { k8sCRDApi, k8sBatchApi, k8sPodsApi }; +} let namespace = "integration-tests"; const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms * 1000)); -async function deleteScan(name) { - await k8sCRDApi.deleteNamespacedCustomObject( +async function deleteScan(name, k8sApis = getKubernetesAPIs()) { + await k8sApis.k8sCRDApi.deleteNamespacedCustomObject( "execution.securecodebox.io", "v1", namespace, @@ -26,8 +37,8 @@ async function deleteScan(name) { ); } -async function getScan(name) { - const { body: scan } = await k8sCRDApi.getNamespacedCustomObjectStatus( +async function getScan(name, k8sApis = getKubernetesAPIs()) { + const { body: scan } = await k8sApis.k8sCRDApi.getNamespacedCustomObjectStatus( "execution.securecodebox.io", "v1", namespace, @@ -37,11 +48,11 @@ async function getScan(name) { return scan; } -async function displayAllLogsForJob(jobName) { +async function displayAllLogsForJob(jobName, k8sApis = getKubernetesAPIs()) { console.log(`Listing logs for Job '${jobName}':`); const { body: { items: pods }, - } = await k8sPodsApi.listNamespacedPod( + } = await k8sApis.k8sPodsApi.listNamespacedPod( namespace, true, undefined, @@ -61,7 +72,7 @@ async function displayAllLogsForJob(jobName) { for (const container of pod.spec.containers) { try { - const response = await k8sPodsApi.readNamespacedPodLog( + const response = await k8sApis.k8sPodsApi.readNamespacedPodLog( pod.metadata.name, namespace, container.name @@ -77,9 +88,9 @@ async function displayAllLogsForJob(jobName) { } } -async function logJobs() { +async function logJobs(k8sApis = getKubernetesAPIs()) { try { - const { body: jobs } = await k8sBatchApi.listNamespacedJob(namespace); + const { body: jobs } = await k8sApis.k8sBatchApi.listNamespacedJob(namespace); console.log("Logging spec & status of jobs in namespace"); @@ -89,7 +100,7 @@ async function logJobs() { console.log(`Job: '${job.metadata.name}' Status:`); console.log(JSON.stringify(job.status, null, 2)); - await displayAllLogsForJob(job.metadata.name); + await displayAllLogsForJob(job.metadata.name, k8sApis); } } catch (error) { console.error("Failed to list Jobs"); @@ -97,11 +108,11 @@ async function logJobs() { } } -async function disasterRecovery(scanName) { - const scan = await getScan(scanName); +async function disasterRecovery(scanName, k8sApis) { + const scan = await getScan(scanName, k8sApis); console.error("Last Scan State:"); console.dir(scan); - await logJobs(); + await logJobs(k8sApis); } /** @@ -113,10 +124,14 @@ async function disasterRecovery(scanName) { * @param {object[]} volumes definitions for kubernetes volumes that should be used. Optional, useful for initContainers (see below) * @param {object[]} volumeMounts definitions for kubernetes volume mounts that should be used. Optional, useful for initContainers (see below) * @param {object[]} initContainers definitions for initContainers that should be added to the scan job to provision files for the scanner. Optional. + * @param {CRDApi} CRDApi kubernetes api client for CRDs. Optional, will be created if not provided. + * @param {BatchApi} BatchApi kubernetes api client for BatchV1Api. Optional, will be created if not provided. + * @param {PodsApi} PodsApi kubernetes api client for CoreV1Api. Optional, will be created if not provided. * @returns {scan.findings} returns findings { categories, severities, count } */ -async function scan(name, scanType, parameters = [], timeout = 180, volumes = [], volumeMounts = [], initContainers = []) { - namespace ="integration-tests" +async function scan(name, scanType, parameters = [], timeout = 180, volumes = [], volumeMounts = [], + initContainers = [], k8sApis = getKubernetesAPIs()) { + namespace = "integration-tests" const scanDefinition = { apiVersion: "execution.securecodebox.io/v1", kind: "Scan", @@ -132,8 +147,7 @@ async function scan(name, scanType, parameters = [], timeout = 180, volumes = [] initContainers, }, }; - - const { body } = await k8sCRDApi.createNamespacedCustomObject( + const { body } = await k8sApis.k8sCRDApi.createNamespacedCustomObject( "execution.securecodebox.io", "v1", namespace, @@ -145,17 +159,17 @@ async function scan(name, scanType, parameters = [], timeout = 180, volumes = [] for (let i = 0; i < timeout; i++) { await sleep(1); - const { status } = await getScan(actualName); + const { status } = await getScan(actualName, k8sApis); if (status && status.state === "Done") { // Wait a couple seconds to give kubernetes more time to update the fields await sleep(2); - const { status } = await getScan(actualName); - await deleteScan(actualName); + const { status } = await getScan(actualName, k8sApis); + await deleteScan(actualName, k8sApis); return status.findings; } else if (status && status.state === "Errored") { console.error("Scan Errored"); - await disasterRecovery(actualName); + await disasterRecovery(actualName, k8sApis); throw new Error( `Scan failed with description "${status.errorDescription}"` @@ -163,7 +177,7 @@ async function scan(name, scanType, parameters = [], timeout = 180, volumes = [] } } console.error("Scan Timed out!"); - await disasterRecovery(actualName); + await disasterRecovery(actualName, k8sApis); throw new Error("timed out while waiting for scan results"); } @@ -176,9 +190,13 @@ async function scan(name, scanType, parameters = [], timeout = 180, volumes = [] * @param {string} nameCascade name of cascading scan * @param {object} matchLabels set invasive and intensive of cascading scan * @param {number} timeout in seconds + * @param {CRDApi} CRDApi kubernetes api client for CRDs. Optional, will be created if not provided. + * @param {BatchApi} BatchApi kubernetes api client for BatchV1Api. Optional, will be created if not provided. + * @param {PodsApi} PodsApi kubernetes api client for CoreV1Api. Optional, will be created if not provided. + * * @returns {scan.findings} returns findings { categories, severities, count } */ -async function cascadingScan(name, scanType, parameters = [], { nameCascade, matchLabels }, timeout = 180) { +async function cascadingScan(name, scanType, parameters = [], { nameCascade, matchLabels }, timeout = 180, k8sApis = getKubernetesAPIs()) { const scanDefinition = { apiVersion: "execution.securecodebox.io/v1", kind: "Scan", @@ -194,8 +212,8 @@ async function cascadingScan(name, scanType, parameters = [], { nameCascade, mat } }, }; - - const { body } = await k8sCRDApi.createNamespacedCustomObject( + + const { body } = await k8sApis.k8sCRDApi.createNamespacedCustomObject( "execution.securecodebox.io", "v1", namespace, @@ -207,7 +225,7 @@ async function cascadingScan(name, scanType, parameters = [], { nameCascade, mat for (let i = 0; i < timeout; i++) { await sleep(1); - const { status } = await getScan(actualName); + const { status } = await getScan(actualName, k8sApis); if (status && status.state === "Done") { // Wait a couple seconds to give kubernetes more time to update the fields @@ -218,7 +236,7 @@ async function cascadingScan(name, scanType, parameters = [], { nameCascade, mat break; } else if (status && status.state === "Errored") { console.error("Scan Errored"); - await disasterRecovery(actualName); + await disasterRecovery(actualName, k8sApis); throw new Error( `Initial Scan failed with description "${status.errorDescription}"` ); @@ -231,7 +249,7 @@ async function cascadingScan(name, scanType, parameters = [], { nameCascade, mat } } - const { body: scans } = await k8sCRDApi.listNamespacedCustomObject( + const { body: scans } = await k8sApis.k8sCRDApi.listNamespacedCustomObject( "execution.securecodebox.io", "v1", namespace, @@ -255,27 +273,27 @@ async function cascadingScan(name, scanType, parameters = [], { nameCascade, mat for (let j = 0; j < timeout; j++) { await sleep(1) - const { status: statusCascade } = await getScan(actualNameCascade); + const { status: statusCascade } = await getScan(actualNameCascade, k8sApis); if (statusCascade && statusCascade.state === "Done") { await sleep(2); - const { status: statusCascade } = await getScan(actualNameCascade); + const { status: statusCascade } = await getScan(actualNameCascade, k8sApis); - await deleteScan(actualName); - await deleteScan(actualNameCascade); + await deleteScan(actualName, k8sApis); + await deleteScan(actualNameCascade, k8sApis); return statusCascade.findings; } else if (statusCascade && statusCascade.state === "Errored") { console.error("Scan Errored"); - await disasterRecovery(actualName); - await disasterRecovery(actualNameCascade); + await disasterRecovery(actualName, k8sApis); + await disasterRecovery(actualNameCascade, k8sApis); throw new Error( `Cascade Scan failed with description "${statusCascade.errorDescription}"` ); } } console.error("Cascade Scan Timed out!"); - await disasterRecovery(actualName); - await disasterRecovery(actualNameCascade); + await disasterRecovery(actualName, k8sApis); + await disasterRecovery(actualNameCascade, k8sApis); throw new Error("timed out while waiting for scan results"); } diff --git a/scanners/helpers.test.js b/tests/integration/helpers.test.js similarity index 100% rename from scanners/helpers.test.js rename to tests/integration/helpers.test.js diff --git a/tests/integration/package-lock.json b/tests/integration/package-lock.json index a36827b323..aa8d0d1bef 100644 --- a/tests/integration/package-lock.json +++ b/tests/integration/package-lock.json @@ -14,10 +14,27 @@ "ts-jest": "^29.0.5" }, "devDependencies": { + "@kubernetes/client-node": "^0.19.0", + "@securecodebox/parser-sdk-nodejs": "file:../../parser-sdk/nodejs", "jest": "^29.3.1", "prettier": "^2.2.1" } }, + "../../parser-sdk/nodejs": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@kubernetes/client-node": "^0.19.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^2.1.0", + "axios": "^1.6.0", + "jsonpointer": "^5.0.1", + "uuid": "^9.0.0", + "ws": "^8.13.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -968,6 +985,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.19.0.tgz", "integrity": "sha512-WTOjGuFQ8yeW3+qD6JrAYhpwpoQbe9R8cA/61WCyFrNawSTUgLstHu7EsZRYEs39er3jDn3wCEaczz+VOFlc2Q==", + "dev": true, "dependencies": { "@types/js-yaml": "^4.0.1", "@types/node": "^20.1.1", @@ -996,6 +1014,10 @@ "semver": "bin/semver.js" } }, + "node_modules/@securecodebox/parser-sdk-nodejs": { + "resolved": "../../parser-sdk/nodejs", + "link": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1057,7 +1079,8 @@ "node_modules/@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true }, "node_modules/@types/graceful-fs": { "version": "4.1.6", @@ -1100,7 +1123,8 @@ "node_modules/@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true }, "node_modules/@types/node": { "version": "20.8.10", @@ -1119,6 +1143,7 @@ "version": "2.48.8", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dev": true, "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -1134,12 +1159,14 @@ "node_modules/@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true }, "node_modules/@types/ws": { "version": "8.5.5", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1161,6 +1188,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1223,12 +1251,14 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -1237,6 +1267,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, "engines": { "node": ">=0.8" } @@ -1244,12 +1275,14 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, "engines": { "node": "*" } @@ -1257,7 +1290,8 @@ "node_modules/aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true }, "node_modules/babel-jest": { "version": "29.6.1", @@ -1354,6 +1388,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -1437,6 +1472,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1479,7 +1515,8 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "node_modules/chalk": { "version": "4.1.2", @@ -1508,6 +1545,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { "node": ">=10" } @@ -1578,6 +1616,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1598,7 +1637,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1617,6 +1657,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -1657,6 +1698,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -1681,6 +1723,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1792,12 +1835,14 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" ] @@ -1805,7 +1850,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -1847,6 +1893,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, "engines": { "node": "*" } @@ -1855,6 +1902,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -1868,6 +1916,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -1879,6 +1928,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1889,7 +1939,8 @@ "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -1953,6 +2004,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -1993,6 +2045,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, "engines": { "node": ">=4" } @@ -2002,6 +2055,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -2038,6 +2092,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -2150,7 +2205,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2161,6 +2217,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, "peerDependencies": { "ws": "*" } @@ -2168,7 +2225,8 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -2793,6 +2851,7 @@ "version": "4.15.5", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", + "dev": true, "optional": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -2807,6 +2866,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -2817,7 +2877,8 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/jsesc": { "version": "2.5.2", @@ -2838,17 +2899,20 @@ "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -2865,6 +2929,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "dev": true, "engines": { "node": ">=12.0.0" } @@ -2873,6 +2938,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -2976,6 +3042,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -2984,6 +3051,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -3014,6 +3082,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3022,6 +3091,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -3034,6 +3104,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -3044,12 +3115,14 @@ "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -3100,6 +3173,7 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, "engines": { "node": "*" } @@ -3108,6 +3182,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, "optional": true, "engines": { "node": ">= 6" @@ -3117,6 +3192,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "dev": true, "optional": true, "engines": { "node": "^10.13.0 || >=12.0.0" @@ -3148,6 +3224,7 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.3.tgz", "integrity": "sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==", + "dev": true, "optional": true, "dependencies": { "jose": "^4.14.4", @@ -3163,6 +3240,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "optional": true, "dependencies": { "yallist": "^4.0.0" @@ -3175,6 +3253,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, "optional": true }, "node_modules/p-limit": { @@ -3273,7 +3352,8 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -3364,12 +3444,14 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, "engines": { "node": ">=6" } @@ -3393,6 +3475,7 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -3407,6 +3490,7 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -3437,6 +3521,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -3500,12 +3585,14 @@ "node_modules/rfc4648": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", - "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==", + "dev": true }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -3524,7 +3611,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/semver": { "version": "6.3.1", @@ -3597,6 +3685,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -3632,6 +3721,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "dev": true, "engines": { "node": ">= 0.10.0" } @@ -3740,7 +3830,8 @@ "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", @@ -3783,6 +3874,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -3866,12 +3958,14 @@ "node_modules/tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -3882,7 +3976,8 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true }, "node_modules/type-detect": { "version": "4.0.8", @@ -3954,6 +4049,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -3963,6 +4059,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, "bin": { "uuid": "bin/uuid" } @@ -3989,6 +4086,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -4057,6 +4155,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, "engines": { "node": ">=10.0.0" }, @@ -4848,6 +4947,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.19.0.tgz", "integrity": "sha512-WTOjGuFQ8yeW3+qD6JrAYhpwpoQbe9R8cA/61WCyFrNawSTUgLstHu7EsZRYEs39er3jDn3wCEaczz+VOFlc2Q==", + "dev": true, "requires": { "@types/js-yaml": "^4.0.1", "@types/node": "^20.1.1", @@ -4871,6 +4971,19 @@ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==" }, + "@securecodebox/parser-sdk-nodejs": { + "version": "file:../../parser-sdk/nodejs", + "requires": { + "@kubernetes/client-node": "^0.19.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^2.1.0", + "axios": "^1.6.0", + "jsonpointer": "^5.0.1", + "uuid": "^9.0.0", + "ws": "^8.13.0" + } + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4932,7 +5045,8 @@ "@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true }, "@types/graceful-fs": { "version": "4.1.6", @@ -4975,7 +5089,8 @@ "@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true }, "@types/node": { "version": "20.8.10", @@ -4994,6 +5109,7 @@ "version": "2.48.8", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dev": true, "requires": { "@types/caseless": "*", "@types/node": "*", @@ -5009,12 +5125,14 @@ "@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true }, "@types/ws": { "version": "8.5.5", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, "requires": { "@types/node": "*" } @@ -5036,6 +5154,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5076,12 +5195,14 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -5089,22 +5210,26 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true }, "aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true }, "babel-jest": { "version": "29.6.1", @@ -5180,6 +5305,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -5236,7 +5362,8 @@ "byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==" + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true }, "callsites": { "version": "3.1.0", @@ -5256,7 +5383,8 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "chalk": { "version": "4.1.2", @@ -5275,7 +5403,8 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true }, "ci-info": { "version": "3.8.0", @@ -5324,6 +5453,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -5341,7 +5471,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "cross-spawn": { "version": "7.0.3", @@ -5357,6 +5488,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5382,7 +5514,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true }, "detect-newline": { "version": "3.1.0", @@ -5398,6 +5531,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -5478,17 +5612,20 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -5523,12 +5660,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -5539,6 +5678,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "requires": { "minipass": "^3.0.0" }, @@ -5547,6 +5687,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -5554,7 +5695,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -5598,6 +5740,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5628,12 +5771,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -5661,6 +5806,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -5736,7 +5882,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -5747,12 +5894,14 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, "requires": {} }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -6226,6 +6375,7 @@ "version": "4.15.5", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", + "dev": true, "optional": true }, "js-tokens": { @@ -6237,6 +6387,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "requires": { "argparse": "^2.0.1" } @@ -6244,7 +6395,8 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "jsesc": { "version": "2.5.2", @@ -6259,17 +6411,20 @@ "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "json5": { "version": "2.2.3", @@ -6279,12 +6434,14 @@ "jsonpath-plus": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "dev": true }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -6366,12 +6523,14 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "requires": { "mime-db": "1.52.0" } @@ -6392,12 +6551,14 @@ "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6407,6 +6568,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6414,14 +6576,16 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "ms": { "version": "2.1.2", @@ -6459,18 +6623,21 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, "optional": true }, "oidc-token-hash": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "dev": true, "optional": true }, "once": { @@ -6493,6 +6660,7 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.3.tgz", "integrity": "sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==", + "dev": true, "optional": true, "requires": { "jose": "^4.14.4", @@ -6505,6 +6673,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "optional": true, "requires": { "yallist": "^4.0.0" @@ -6514,6 +6683,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, "optional": true } } @@ -6583,7 +6753,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "picocolors": { "version": "1.0.0", @@ -6643,12 +6814,14 @@ "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true }, "pure-rand": { "version": "6.0.2", @@ -6658,7 +6831,8 @@ "qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true }, "react-is": { "version": "18.2.0", @@ -6669,6 +6843,7 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -6696,6 +6871,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -6740,17 +6916,20 @@ "rfc4648": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", - "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==", + "dev": true }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "6.3.1", @@ -6808,6 +6987,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -6831,7 +7011,8 @@ "stream-buffers": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "dev": true }, "string-length": { "version": "4.0.2", @@ -6904,7 +7085,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -6940,6 +7122,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -6986,12 +7169,14 @@ "tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -6999,7 +7184,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true }, "type-detect": { "version": "4.0.8", @@ -7035,6 +7221,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -7042,7 +7229,8 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true }, "v8-to-istanbul": { "version": "9.1.0", @@ -7065,6 +7253,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -7115,6 +7304,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, "requires": {} }, "y18n": { diff --git a/tests/integration/package.json b/tests/integration/package.json index 6fca900703..e80b8c38fc 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -5,14 +5,18 @@ "main": "helpers", "scripts": { "test:unit": "jest --verbose --testPathIgnorePatterns /integration-tests/ --ci --colors --coverage --passWithNoTests", - "test:integration": "jest --verbose --ci --colors --coverage --passWithNoTests" + "test:integration": "jest --verbose --ci --colors --coverage --passWithNoTests", + "test:helpers": "jest helpers.test.js --verbose --ci --colors --coverage --passWithNoTests" + }, "keywords": [], "author": "iteratec GmbH", "license": "Apache-2.0", "devDependencies": { "jest": "^29.3.1", - "prettier": "^2.2.1" + "prettier": "^2.2.1", + "@kubernetes/client-node": "^0.19.0", + "@securecodebox/parser-sdk-nodejs": "file:../../parser-sdk/nodejs" }, "dependencies": { "@kubernetes/client-node": "^0.19.0",