diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 89dde7289..1f0352c52 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -44,17 +44,17 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: languages: ${{ matrix.language }} # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/autobuild@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 4dcdd9342..7b95c5405 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -60,6 +60,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v2.2.4 + uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v2.2.4 with: sarif_file: results.sarif diff --git a/.github/workflows/secret-scan.yml b/.github/workflows/secret-scan.yml index 4f9cc153f..6feccab2d 100644 --- a/.github/workflows/secret-scan.yml +++ b/.github/workflows/secret-scan.yml @@ -23,6 +23,6 @@ jobs: with: fetch-depth: 0 - name: Default Secret Scanning - uses: trufflesecurity/trufflehog@735bac03911974e37641f570a5582a9b72f49a44 # main + uses: trufflesecurity/trufflehog@35943b41905eb1195f021955da17c233ed555e24 # main with: extra_args: --debug --no-verification # Warn on potential violations diff --git a/README.md b/README.md index e56e17903..31ab1ec00 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Pepr is on a mission to save Kubernetes from the tyranny of YAML, intimidating g ## Example Pepr Action -This quick sample shows how to react to a ConfigMap being created or updated in the cluster. It adds a label and annotation to the ConfigMap and adds some data to the ConfigMap. It also creates a Validating Webhook to make sure the "pepr" label still exists. Finally, after the ConfigMap is created, it logs a message to the Pepr controller and creates or updates a separate ConfigMap with the [kubernetes-fluent-client](https://github.com/defenseunicorns/kubernetes-fluent-client) using server-side apply. For more details see [actions](./docs/030_user-guide/030_actions.md) section. +This quick sample shows how to react to a ConfigMap being created or updated in the cluster. It adds a label and annotation to the ConfigMap and adds some data to the ConfigMap. It also creates a Validating Webhook to make sure the "pepr" label still exists. Finally, after the ConfigMap is created, it logs a message to the Pepr controller and creates or updates a separate ConfigMap with the [kubernetes-fluent-client](https://github.com/defenseunicorns/kubernetes-fluent-client) using server-side apply. For more details see [actions](./docs/030_user-guide/030_actions/) section. ```ts When(a.ConfigMap) @@ -95,17 +95,23 @@ When(a.ConfigMap) # Create a new Pepr Module npx pepr init -# If you already have a Kind or K3d cluster you want to use, skip this step +# If you already have a K3d cluster you want to use, skip this step npm run k3d-setup -# Start playing with Pepr now -# If using another local K8s distro instead of k3d, run `npx pepr dev --host host.docker.internal` +# Start playing with Pepr now! +# If using Kind, or another local k8s distro instead, +# run `npx pepr dev --host ` npx pepr dev kubectl apply -f capabilities/hello-pepr.samples.yaml -# Be amazed and ⭐️ this repo +# Be amazed and ⭐️ this repo! ``` +> [!TIP] +> Don't use IP as your `--host`, it's not supported. Make sure to check your +> local k8s distro documentation how to reach your localhost, which is where +> `pepr dev` is serving the code from. + https://user-images.githubusercontent.com/882485/230895880-c5623077-f811-4870-bb9f-9bb8e5edc118.mp4 ## Concepts diff --git a/docs/030_user-guide/040_capabilities.md b/docs/030_user-guide/040_capabilities.md index 3ccaccafa..b378bb54d 100644 --- a/docs/030_user-guide/040_capabilities.md +++ b/docs/030_user-guide/040_capabilities.md @@ -1,6 +1,6 @@ # Pepr Capabilities -A capability is set of related [actions](./030_actions.md) that work together to achieve a specific transformation or operation on Kubernetes resources. Capabilities are user-defined and can include one or more actions. They are defined within a Pepr module and can be used in both MutatingWebhookConfigurations and ValidatingWebhookConfigurations. A Capability can have a specific scope, such as mutating or validating, and can be reused in multiple Pepr modules. +A capability is set of related [actions](./030_actions/) that work together to achieve a specific transformation or operation on Kubernetes resources. Capabilities are user-defined and can include one or more actions. They are defined within a Pepr module and can be used in both MutatingWebhookConfigurations and ValidatingWebhookConfigurations. A Capability can have a specific scope, such as mutating or validating, and can be reused in multiple Pepr modules. When you [`npx pepr init`](./010_pepr-cli.md#pepr-init), a `capabilities` directory is created for you. This directory is where you will define your capabilities. You can create as many capabilities as you need, and each capability can contain one or more actions. Pepr also automatically creates a `HelloPepr` capability with a number of example actions to help you get started. diff --git a/docs/030_user-guide/README.md b/docs/030_user-guide/README.md index 93ce27d8a..d4fd17297 100644 --- a/docs/030_user-guide/README.md +++ b/docs/030_user-guide/README.md @@ -10,7 +10,7 @@ You can find the following information in this section: ### [Pepr Modules](020_pepr-modules.md) -### [Pepr Actions](030_actions.md) +### [Pepr Actions](030_actions/) ### [Pepr Capabilities](040_capabilities.md) diff --git a/docs/090_roadmap/README.md b/docs/090_roadmap/README.md index 6659f3d67..fccb78f8d 100644 --- a/docs/090_roadmap/README.md +++ b/docs/090_roadmap/README.md @@ -1,57 +1,68 @@ # Roadmap for Pepr - _2024 Roadmap_ ## Phase 1: Preparation - Testing and Docs - **Q1**: - **Establish Medium for Communication with Community**: - Establish communication channel for community members and contributors. Easy/discoverable "how to contribute" guide. + - Establish communication channel for community members and contributors. Easy/discoverable "how to contribute" guide. - **Site/Documentation**: - Improve information architecture, nail killer use-cases, and make it obvious how to get started and find your way around. + - Improve information architecture, nail killer use-cases, and make it obvious how to get started and find your way around. - **Automated Testing**: - Focus on stories that increase confidence in protection of features and functionality. Simplify hello-pepr and bring e2e test against external repo with examples. Make sure that contributions are well-tested. + - Focus on stories that increase confidence in protection of features and functionality. Simplify hello-pepr and bring e2e test against external repo with examples. Make sure that contributions are well-tested. -## Phase 2: Community Building, Competitive Analysis, and Feature Development +## Phase 2: Community Building, Competitive Analysis, Instrumentation and Feature Development - **Q2**: - **Community Engagement**: - Begin engaging with potential contributors and users through social media, Kubernetes/Cloud Native Computing Foundation (CNCF) meetups, and other channels. Monitor and participate in our Slack channel. + - Begin engaging with potential contributors and users through social media, Kubernetes/Cloud Native Computing Foundation (CNCF) meetups, and other channels. Monitor and participate in our Slack channel. - **Feature Development**: - Based on company feedback, continuously improve and add features. Add feature parity with other tools in the Kubernetes ecosystem where it makes sense. Chip away at the backlog. + - Based on company feedback, continuously improve and add features. Add feature parity with other tools in the Kubernetes ecosystem where it makes sense. Chip away at the backlog. - **Documentation Improvements**: - Continue to improve documentation and add more examples like Doom, find scaling limitations + - Continue to improve documentation and add more examples like Doom, find scaling limitations - **Competitive Analysis**: - Understand the competitive landscape and how/where Pepr can/does differentiate itself. Have it in the docs. + - Understand the competitive landscape and how/where Pepr can/does differentiate itself. Have it in the docs. + - **Instrumentation**: + - Outfit Pepr with the necessary instrumentation to collect metrics and logs. Use this data to make informed about the watch direction. -## Phase 3: Donation, Transition, Move Project, and Stabilization/Improvement of New Features +## Phase 3: Informer Iterations, Watch Analysis, Metric Collection, Development/Stabilization/Improvement of New Features - **Q3**: - - **Donation**: - - Donate the project to the CNCF. - - CNCF Code of conduct - - CNCF IP policy - - CNCF CLA - - Discoverable and simple governance model - - move project to its own organization - - ensure license in Apache 2.0 - - Transfer trademark, logo, domain name, and other assets to CNCF. - - **Community Building**: - Grow the contributor base, establish a governance model, and encourage community-led initiatives. Interact with people in our Slack channel. + - **Informer Iterations**: + - Tune informer based on feedback from UDS Core and delivery so events will be reconciled through eventual consistency. + - [Evaluate](https://github.com/defenseunicorns/pepr/blob/main/adr/0015-kfc-watch-undici.md) other underlying technologies for informer. - **Feature Development**: - Based on community feedback, continuously improve and add features. Rigoursly test and document and review code. + - `.WithNameRegex()/.InNamespaceRegex()` for Kubernetes Controller development against resources that could match a variety of names or namespaces. + - `.WithDeletionTimestamp()` for Kubernetes Controller Development against resources that are pending deletion + - Create a sharded queue that enables the Module Author to define queueing strategies based on `kind`, `kind/namespace`, `kind/namespace/name`, `global`. + - **Community Building**: + - Grow the contributor base, establish a governance model, and encourage community-led initiatives. Look to drive conversation in our Slack Channel. + - Based on community feedback, continuously improve and add features. Rigoursly test and document and review code. - **Project Advocation**: - Publicly advocate for the project and encourage adoption. - - **Submit PR for Sandbox** - - Submit sandbox PR when ready + - Publicly advocate for the project and encourage adoption. + - **Stability**: + - Ensure that the project is stable and reliable. Make sure that the project is well-tested and documented. + - Identify new areas of project improvement and work on them. -## Phase 4: Post Donation +## Phase 4: Feature Development, Stablization, Code and Testing Quality Improvements - **Q4**: - - **Road to GA**: - Right now, Pepr itself is still in its 'development' phase. We are working on some final things before we release the official 1.0 General Availability (GA) release - - **Community Meetings**: - - Monthly community meetings/steering committee meetings/contributor meetings - - **Review Sandbox PR** - - Review PR for sandbox - - **Road to Incubation**: - - to come + - **Features**: + - Improve DevEx overrides in Pepr section of package.json for customized builds of Modules + - `.Finalize()` for Kubernetes Controller Development to controlling downstream resources through finalizers + - Scaffolding to validate images from a registry through cosign/sigstore + - Replace node-fetch with Undici in the KFC project for performance improvements + - **Removal of Circular Dependencies**: + Identify and remove circular dependencies in the codebase. + - **Strong Typings**: + - Identify where we can make Pepr/KFC stronger by adding typings. + - **Work to reduce code complexity** + - Monitor code complexity through eslint, work to drive down complexity + - **Robust E2E Tests in KFC**: + - Create a strong e2e suite in KFC, ensure tests are robust and cover all the features of KFC. + - **Documentation**: + - Ensure that the documentation is up-to-date and accurate. Add more examples and use-cases. + - Onboarding and contribution guides should be clear and easy to follow. + - **Load/Stress Testing**: + - Load test Pepr/KFC to identify bottlenecks and areas of improvement. + - Ensure that Pepr/KFC can handle a large number of resources and events over a sustained period of time (nightly). + diff --git a/docs/120_contribute/README.md b/docs/120_contribute/README.md index 1691acfd4..5274a2096 100644 --- a/docs/120_contribute/README.md +++ b/docs/120_contribute/README.md @@ -60,7 +60,8 @@ Please follow the coding conventions and style used in the project. Use ESLint a ### Run Tests Locally -> ⚠️ **Warning: Be cautious when creating test cases in `journey/`!** +> [!WARNING] +> Be cautious when creating test cases in `journey/`!** > > - Test cases that capture end-to-end/journey behavior are usually stored in [pepr-excellent-examples](https://github.com/defenseunicorns/pepr-excellent-examples) or run as a Github workflow (`.github/workflows`). > - Journey tests established in `journey/` are from an earlier time in project history. @@ -73,6 +74,20 @@ Please follow the coding conventions and style used in the project. Use ESLint a 2. Change to the test module directory: `cd pepr-test-module`. 3. You can now run any of the `npx pepr` commands. +### Running Development Version Locally + +1. Run `npm run build` to build the package. +2. For running modified pepr, you have two options: + - Using `npx ts-node ./src/cli.ts init` to run the modified code directly, without installing it locally. + You'll need to also run `npx link ` inside your pepr module, to link to the + development version of pepr. + - Install the pre-build package with `npm install pepr-0.0.0-development.tgz`. + You'll need to re-run the installation after every build, though. +3. Run `npx pepr dev` inside your module's directory to run the modified version of pepr. + +> [!TIP] +> Make sure to re-run `npm run build` after you modify any of the pepr source files. + ## Contact For any questions or concerns, please open an issue on GitHub or contact the maintainers. diff --git a/journey/pepr-deploy.ts b/journey/pepr-deploy.ts index 8c2fb7e4f..c35acef33 100644 --- a/journey/pepr-deploy.ts +++ b/journey/pepr-deploy.ts @@ -302,7 +302,7 @@ function testStore() { // Should have a key from the joke url and getItem should have worked const key3 = await waitForPeprStoreKey( "pepr-static-test-store", - `hello-pepr-v2-https://icanhazdadjoke.com/`, + `hello-pepr-v2-https://icanhazdadjoke.com`, ); expect(key3).toBeTruthy(); diff --git a/journey/pepr-dev.ts b/journey/pepr-dev.ts index 30b3ac9a2..74f75dd32 100644 --- a/journey/pepr-dev.ts +++ b/journey/pepr-dev.ts @@ -3,17 +3,23 @@ import { afterAll, expect, it } from "@jest/globals"; import { ChildProcessWithoutNullStreams, spawn } from "child_process"; -import { Agent } from "https"; import { fetch } from "kubernetes-fluent-client"; -import { RequestInit } from "node-fetch"; +import { RequestInit, Agent } from "undici"; import { cwd } from "./entrypoint.test"; import { sleep } from "./k8s"; const fetchBaseUrl = "https://localhost:3000"; const fetchOpts: RequestInit = { - agent: new Agent({ - // Avoid tls issues for self-signed certs - rejectUnauthorized: false, + method: "GET", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + dispatcher: new Agent({ + // disable keep-alive https://github.com/nodejs/undici/issues/2522#issuecomment-1859213319 + pipelining: 0, + connect: { + rejectUnauthorized: false, + }, }), }; @@ -78,7 +84,6 @@ export function peprDev() { } else { // Abort all further processing success = true; - // Finish the test done(); } diff --git a/package-lock.json b/package-lock.json index bb556cf56..31a98d38c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "follow-redirects": "1.15.9", "http-status-codes": "^2.3.0", "json-pointer": "^0.6.2", - "kubernetes-fluent-client": "3.3.4", + "kubernetes-fluent-client": "3.3.7", "pino": "9.5.0", "pino-pretty": "13.0.0", "prom-client": "15.1.3", @@ -41,8 +41,8 @@ "husky": "^9.1.6", "jest": "29.7.0", "js-yaml": "^4.1.0", - "nock": "^13.5.4", - "ts-jest": "29.2.5" + "ts-jest": "29.2.5", + "undici": "^7.0.1" }, "engines": { "node": ">=18.0.0" @@ -66,6 +66,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -75,12 +76,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -88,30 +91,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -131,34 +136,38 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -171,33 +180,35 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -207,145 +218,67 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -359,6 +292,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -371,6 +305,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -383,6 +318,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -395,6 +331,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -406,12 +343,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -425,6 +363,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -437,6 +376,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -445,12 +385,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -464,6 +405,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -476,6 +418,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -488,6 +431,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -500,6 +444,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -512,6 +457,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -524,6 +470,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -536,6 +483,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -551,6 +499,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -562,12 +511,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -577,30 +527,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -613,19 +565,20 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -635,13 +588,15 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@commitlint/cli": { "version": "19.6.0", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.6.0.tgz", "integrity": "sha512-v17BgGD9w5KnthaKxXnEg6KLq6DYiAxyiN44TpiRtqyW8NSq+Kx99mkEG8Qo6uu6cI5eMzMojW2muJxjmPnF8w==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/format": "^19.5.0", "@commitlint/lint": "^19.6.0", @@ -663,6 +618,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.6.0.tgz", "integrity": "sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "conventional-changelog-conventionalcommits": "^7.0.2" @@ -676,6 +632,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz", "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "ajv": "^8.11.0" @@ -689,6 +646,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz", "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "lodash.camelcase": "^4.3.0", @@ -706,6 +664,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz", "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } @@ -715,6 +674,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz", "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "chalk": "^5.3.0" @@ -728,6 +688,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.6.0.tgz", "integrity": "sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "semver": "^7.6.0" @@ -741,6 +702,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.6.0.tgz", "integrity": "sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/is-ignored": "^19.6.0", "@commitlint/parse": "^19.5.0", @@ -756,6 +718,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.5.0.tgz", "integrity": "sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/config-validator": "^19.5.0", "@commitlint/execute-rule": "^19.5.0", @@ -777,6 +740,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz", "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } @@ -786,6 +750,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz", "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/types": "^19.5.0", "conventional-changelog-angular": "^7.0.0", @@ -800,6 +765,7 @@ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz", "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==", "dev": true, + "license": "MIT", "dependencies": { "@commitlint/top-level": "^19.5.0", "@commitlint/types": "^19.5.0", @@ -808,85 +774,482 @@ "tinyexec": "^0.3.0" }, "engines": { - "node": ">=v18" + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz", + "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.5.0", + "@commitlint/types": "^19.5.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz", + "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^19.5.0", + "@commitlint/message": "^19.5.0", + "@commitlint/to-lines": "^19.5.0", + "@commitlint/types": "^19.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz", + "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz", + "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz", + "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz", - "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^19.5.0", - "@commitlint/types": "^19.5.0", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, "engines": { - "node": ">=v18" + "node": ">=18" } }, - "node_modules/@commitlint/rules": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz", - "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^19.5.0", - "@commitlint/message": "^19.5.0", - "@commitlint/to-lines": "^19.5.0", - "@commitlint/types": "^19.5.0" - }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": ">=v18" + "node": ">=18" } }, - "node_modules/@commitlint/to-lines": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz", - "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==", - "dev": true, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": ">=v18" + "node": ">=18" } }, - "node_modules/@commitlint/top-level": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz", - "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==", - "dev": true, - "dependencies": { - "find-up": "^7.0.0" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, "engines": { - "node": ">=v18" + "node": ">=18" } }, - "node_modules/@commitlint/types": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz", - "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==", - "dev": true, - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=v18" + "node": ">=18" } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/win32-ia32": { "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "peer": true, "engines": { @@ -894,24 +1257,29 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "license": "MIT", "peer": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -921,6 +1289,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", "peer": true, "dependencies": { "ajv": "^6.12.4", @@ -944,6 +1313,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -960,6 +1330,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -970,12 +1341,14 @@ "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==", + "license": "MIT", "peer": true }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -988,6 +1361,7 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "license": "MIT", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1008,6 +1382,7 @@ "url": "https://opencollective.com/fast-check" } ], + "license": "MIT", "dependencies": { "fast-check": "^3.0.0" }, @@ -1028,13 +1403,15 @@ "node_modules/@glideapps/ts-necessities": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.2.3.tgz", - "integrity": "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==" + "integrity": "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==", + "license": "MIT" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -1049,6 +1426,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -1059,6 +1437,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -1071,6 +1450,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", "peer": true, "engines": { "node": ">=12.22" @@ -1085,6 +1465,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause", "peer": true }, "node_modules/@isaacs/cliui": { @@ -1209,6 +1590,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1225,6 +1607,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1234,6 +1617,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1247,6 +1631,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1260,6 +1645,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1272,6 +1658,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1287,6 +1674,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1299,15 +1687,24 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1317,6 +1714,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -1334,6 +1732,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1349,6 +1748,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1360,29 +1760,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -1430,6 +1813,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1445,6 +1829,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1456,29 +1841,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1494,6 +1862,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1507,6 +1876,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1519,6 +1889,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1536,6 +1907,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1551,6 +1923,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1594,6 +1967,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1609,6 +1983,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1620,29 +1995,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1655,6 +2013,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1669,6 +2028,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1684,6 +2044,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1699,6 +2060,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1725,6 +2087,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1740,6 +2103,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1751,29 +2115,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1791,6 +2138,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1806,6 +2154,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1817,29 +2166,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1854,6 +2186,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1863,6 +2196,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1871,22 +2205,24 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsep-plugin/assignment": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.2.1.tgz", - "integrity": "sha512-gaHqbubTi29aZpVbBlECRpmdia+L5/lh2BwtIJTmtxdbecEyyX/ejAOg7eQDGNvGOUmPY7Z2Yxdy9ioyH/VJeA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", "license": "MIT", "engines": { "node": ">= 10.16.0" @@ -1896,9 +2232,9 @@ } }, "node_modules/@jsep-plugin/regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", - "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", "license": "MIT", "engines": { "node": ">= 10.16.0" @@ -1938,6 +2274,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1951,6 +2288,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "peer": true, "engines": { "node": ">= 8" @@ -1960,6 +2298,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1973,6 +2312,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -1987,12 +2327,14 @@ "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/@npmcli/fs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -2004,6 +2346,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } @@ -2022,6 +2365,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -2033,6 +2377,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -2041,6 +2386,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -2049,6 +2395,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -2065,6 +2412,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^3.0.1" @@ -2077,6 +2425,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -2090,13 +2439,15 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -2106,6 +2457,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -2114,6 +2466,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -2122,6 +2475,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" @@ -2135,6 +2489,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2148,6 +2503,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2157,6 +2513,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -2167,6 +2524,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -2176,6 +2534,7 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2186,15 +2545,17 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", + "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2204,6 +2565,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2213,13 +2575,15 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -2228,10 +2592,11 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", - "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", + "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2244,6 +2609,7 @@ "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.4.tgz", "integrity": "sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2253,6 +2619,7 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2261,19 +2628,22 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2283,6 +2653,7 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -2297,32 +2668,36 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/json-pointer/-/json-pointer-1.0.34.tgz", "integrity": "sha512-JRnWcxzXSaLei98xgw1B7vAeBVOrkyw0+Rt9j1QoJrczE78OpHsyQC8GNbuhw+/2vxxDe58QvWnngS86CoIbRg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", - "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "license": "MIT", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.20.0" } }, "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -2334,6 +2709,7 @@ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2342,6 +2718,7 @@ "version": "2.4.9", "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz", "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -2349,15 +2726,17 @@ } }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", - "dev": true + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ramda": { "version": "0.30.2", "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", "integrity": "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==", + "license": "MIT", "dependencies": { "types-ramda": "^0.30.1" } @@ -2366,13 +2745,15 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -2383,6 +2764,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -2393,7 +2775,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/stream-buffers": { "version": "3.0.7", @@ -2418,12 +2801,13 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -2434,6 +2818,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -2442,12 +2827,14 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", @@ -2481,6 +2868,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", @@ -2509,6 +2897,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/types": "7.18.0", @@ -2526,6 +2915,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "7.18.0", @@ -2553,6 +2943,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "license": "MIT", "peer": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2566,6 +2957,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "@typescript-eslint/types": "7.18.0", @@ -2594,6 +2986,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -2616,6 +3009,7 @@ "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/types": "7.18.0", @@ -2633,12 +3027,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC", "peer": true }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2650,6 +3046,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -2659,9 +3056,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "peer": true, "bin": { "acorn": "bin/acorn" @@ -2674,6 +3072,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -2683,6 +3082,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -2695,6 +3095,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2711,6 +3112,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -2726,6 +3128,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2737,6 +3140,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -2746,6 +3150,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2758,6 +3163,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2769,23 +3175,27 @@ "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==", + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -2795,7 +3205,8 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", @@ -2807,6 +3218,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -2816,6 +3228,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -2837,6 +3250,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2852,6 +3266,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2863,29 +3278,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -2902,6 +3300,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -2918,6 +3317,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2927,6 +3327,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -2942,6 +3343,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -2968,6 +3370,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -2982,7 +3385,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -3001,17 +3405,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bintrees": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -3035,6 +3442,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3042,12 +3450,14 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3056,6 +3466,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -3066,12 +3477,13 @@ "node_modules/browser-or-node": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-3.0.0.tgz", - "integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==" + "integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==", + "license": "MIT" }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -3087,11 +3499,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3105,6 +3518,7 @@ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -3117,6 +3531,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -3139,6 +3554,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -3148,12 +3564,14 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3162,6 +3580,7 @@ "version": "19.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "license": "ISC", "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", @@ -3184,6 +3603,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -3202,12 +3622,14 @@ "node_modules/cacache/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/cacache/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3216,6 +3638,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3234,6 +3657,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3243,14 +3667,15 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", + "version": "1.0.30001686", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", + "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", "dev": true, "funding": [ { @@ -3265,13 +3690,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -3284,6 +3711,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -3308,6 +3736,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -3316,12 +3745,14 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -3336,6 +3767,7 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -3345,32 +3777,38 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/collection-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", - "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==" + "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", + "license": "Apache-2.0" }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -3388,6 +3826,7 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", "peer": true, "engines": { "node": ">=18" @@ -3398,6 +3837,7 @@ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, + "license": "MIT", "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" @@ -3406,12 +3846,14 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -3423,6 +3865,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3432,6 +3875,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -3444,6 +3888,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -3456,6 +3901,7 @@ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, + "license": "MIT", "dependencies": { "is-text-path": "^2.0.0", "JSONStream": "^1.3.5", @@ -3473,12 +3919,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3486,13 +3934,15 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -3515,12 +3965,13 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", - "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz", + "integrity": "sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==", "dev": true, + "license": "MIT", "dependencies": { - "jiti": "^1.19.1" + "jiti": "^1.21.6" }, "engines": { "node": ">=v16" @@ -3536,6 +3987,7 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -3557,6 +4009,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3572,6 +4025,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3583,36 +4037,20 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3627,6 +4065,7 @@ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3638,6 +4077,7 @@ "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", "engines": { "node": "*" } @@ -3646,6 +4086,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3663,6 +4104,7 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -3676,6 +4118,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT", "peer": true }, "node_modules/deepmerge": { @@ -3683,6 +4126,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3691,6 +4135,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3716,6 +4161,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3724,6 +4170,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -3734,6 +4181,7 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3743,6 +4191,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -3751,6 +4200,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "peer": true, "dependencies": { "path-type": "^4.0.0" @@ -3763,6 +4213,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", "peer": true, "dependencies": { "esutils": "^2.0.2" @@ -3776,6 +4227,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -3792,13 +4244,15 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -3810,16 +4264,18 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", - "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", - "dev": true + "version": "1.5.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz", + "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3830,12 +4286,14 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3844,6 +4302,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -3853,6 +4312,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3865,6 +4325,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -3874,6 +4335,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3881,13 +4343,15 @@ "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3896,6 +4360,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -3907,6 +4372,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3916,6 +4382,7 @@ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "hasInstallScript": true, + "license": "MIT", "peer": true, "bin": { "esbuild": "bin/esbuild" @@ -3954,6 +4421,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3961,12 +4429,14 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -3979,6 +4449,8 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -4034,6 +4506,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4050,6 +4523,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4062,6 +4536,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4078,6 +4553,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -4093,6 +4569,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -4103,40 +4580,24 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^6.0.0", @@ -4153,12 +4614,14 @@ "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==", + "license": "MIT", "peer": true }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^5.0.0" @@ -4174,6 +4637,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -4186,6 +4650,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^3.0.2" @@ -4201,6 +4666,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -4210,6 +4676,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "acorn": "^8.9.0", @@ -4228,6 +4695,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4240,6 +4708,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "estraverse": "^5.1.0" @@ -4252,6 +4721,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "estraverse": "^5.2.0" @@ -4264,6 +4734,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=4.0" @@ -4273,6 +4744,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -4282,6 +4754,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4290,6 +4763,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4298,6 +4772,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -4307,6 +4782,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -4339,6 +4815,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -4354,6 +4831,7 @@ "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4395,6 +4873,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4402,7 +4881,8 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/fast-check": { "version": "3.23.1", @@ -4419,6 +4899,7 @@ "url": "https://opencollective.com/fast-check" } ], + "license": "MIT", "dependencies": { "pure-rand": "^6.1.0" }, @@ -4429,17 +4910,20 @@ "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "license": "MIT" }, "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==", + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4456,6 +4940,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "peer": true, "dependencies": { "is-glob": "^4.0.1" @@ -4467,23 +4952,27 @@ "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT", "peer": true }, "node_modules/fast-redact": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4491,18 +4980,21 @@ "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "peer": true, "dependencies": { "reusify": "^1.0.4" @@ -4513,6 +5005,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -4521,6 +5014,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", "peer": true, "dependencies": { "flat-cache": "^3.0.4" @@ -4534,6 +5028,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -4543,6 +5038,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4554,6 +5050,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4565,6 +5062,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -4582,6 +5080,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4589,13 +5088,15 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", @@ -4612,6 +5113,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", "peer": true, "dependencies": { "flatted": "^3.2.9", @@ -4623,9 +5125,10 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "license": "ISC", "peer": true }, "node_modules/follow-redirects": { @@ -4638,6 +5141,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4650,7 +5154,8 @@ "node_modules/foreach": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" }, "node_modules/foreground-child": { "version": "3.3.0", @@ -4698,6 +5203,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4706,6 +5212,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4714,6 +5221,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -4725,6 +5233,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4732,12 +5241,29 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4747,6 +5273,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -4755,6 +5282,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -4763,6 +5291,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -4782,6 +5311,7 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -4791,6 +5321,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4803,6 +5334,7 @@ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", "dev": true, + "license": "MIT", "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", @@ -4820,6 +5352,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4839,6 +5372,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "peer": true, "dependencies": { "is-glob": "^4.0.3" @@ -4851,6 +5385,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4860,6 +5395,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4872,6 +5408,7 @@ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, + "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -4886,6 +5423,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", "peer": true, "dependencies": { "type-fest": "^0.20.2" @@ -4901,6 +5439,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "peer": true, "dependencies": { "array-union": "^2.1.0", @@ -4918,11 +5457,15 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz", + "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4932,18 +5475,21 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT", "peer": true }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4952,6 +5498,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4960,9 +5507,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { "node": ">= 0.4" }, @@ -4971,9 +5522,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4985,6 +5537,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4995,23 +5548,27 @@ "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -5027,6 +5584,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5045,6 +5603,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -5058,6 +5617,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -5067,6 +5627,7 @@ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, + "license": "MIT", "bin": { "husky": "bin.js" }, @@ -5081,6 +5642,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5105,12 +5667,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "peer": true, "engines": { "node": ">= 4" @@ -5120,6 +5684,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5135,6 +5700,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -5144,6 +5710,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -5163,6 +5730,7 @@ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5172,6 +5740,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -5181,6 +5750,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5189,13 +5759,15 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -5204,6 +5776,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -5212,15 +5785,11 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -5229,13 +5798,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -5250,6 +5821,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -5259,6 +5831,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5268,6 +5841,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5276,6 +5850,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "peer": true, "dependencies": { "is-extglob": "^2.1.1" @@ -5288,6 +5863,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -5297,6 +5873,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5305,6 +5882,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -5315,6 +5893,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5327,6 +5906,7 @@ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, + "license": "MIT", "dependencies": { "text-extensions": "^2.0.0" }, @@ -5337,12 +5917,14 @@ "node_modules/is-url": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/isomorphic-ws": { "version": "5.0.0", @@ -5358,6 +5940,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -5367,6 +5950,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -5383,6 +5967,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -5397,6 +5982,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -5411,6 +5997,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -5439,6 +6026,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -5457,6 +6045,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5472,6 +6061,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5482,6 +6072,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5493,29 +6084,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5528,6 +6102,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -5554,6 +6129,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -5568,6 +6144,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -5599,6 +6176,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5614,6 +6192,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5625,29 +6204,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -5681,6 +6243,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5696,6 +6259,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5707,29 +6271,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -5775,6 +6322,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5790,6 +6338,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5801,29 +6350,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -5839,6 +6371,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5854,6 +6387,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5865,29 +6399,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -5900,6 +6417,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -5916,6 +6434,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5931,40 +6450,24 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "supports-color": "^7.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -5982,6 +6485,7 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5991,6 +6495,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -6016,6 +6521,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -6029,6 +6535,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -6044,6 +6551,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6059,6 +6567,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6070,29 +6579,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -6113,6 +6605,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6128,6 +6621,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6139,29 +6633,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -6176,6 +6653,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -6193,6 +6671,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -6202,6 +6681,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -6222,6 +6702,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -6235,6 +6716,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6250,6 +6732,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6261,29 +6744,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -6316,6 +6782,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6331,6 +6798,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6342,29 +6810,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -6398,6 +6849,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6413,6 +6865,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6424,29 +6877,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -6478,6 +6914,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6493,6 +6930,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6504,29 +6942,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -6544,6 +6965,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6559,6 +6981,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6570,29 +6993,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -6610,6 +7016,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6625,6 +7032,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6637,6 +7045,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6648,29 +7057,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -6690,6 +7082,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6705,6 +7098,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6716,29 +7110,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -6754,6 +7131,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6769,6 +7147,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -6786,6 +7165,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "license": "MIT", "engines": { "node": ">=10" } @@ -6793,18 +7173,21 @@ "node_modules/js-base64": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "license": "BSD-3-Clause" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -6815,45 +7198,50 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" }, "node_modules/jsep": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.9.tgz", - "integrity": "sha512-i1rBX5N7VPl0eYb6+mHNp52sEuaS2Wi8CDYx1X5sn9naevL78+265XJqy1qENEk7mRKwS06NHpUqiBwR7qeodw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", "engines": { "node": ">= 10.16.0" } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT", "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-pointer": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "license": "MIT", "dependencies": { "foreach": "^2.0.4" } @@ -6862,25 +7250,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT", "peer": 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==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -6895,16 +7280,18 @@ "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/jsonpath-plus": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.1.0.tgz", - "integrity": "sha512-gHfV1IYqH8uJHYVTs8BJX1XKy2/rR93+f8QQi0xhx95aCiXn1ettYAd5T+7FU6wfqyDoX/wy0pm/fL3jOKJ9Lg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.2.0.tgz", + "integrity": "sha512-T9V+8iNYKFL2n2rF+w02LBOT2JjDnTjioaNFrxRy0Bv1y/hNsqR/EBK7Ojy2ythRHwmz2cRIls+9JitQGZC/sw==", + "license": "MIT", "dependencies": { - "@jsep-plugin/assignment": "^1.2.1", - "@jsep-plugin/regex": "^1.0.3", - "jsep": "^1.3.9" + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" }, "bin": { "jsonpath": "bin/jsonpath-cli.js", @@ -6919,6 +7306,7 @@ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -6934,6 +7322,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "peer": true, "dependencies": { "json-buffer": "3.0.1" @@ -6943,22 +7332,24 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/kubernetes-fluent-client": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/kubernetes-fluent-client/-/kubernetes-fluent-client-3.3.4.tgz", - "integrity": "sha512-PQc6ZfdkTXVIoIXxN9Gkh8lpyDfw0CjecYrLzR5atinhnaWXD9FKZaay87XsKR2tdyryEVJHv1MsQtgCXaxMtA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/kubernetes-fluent-client/-/kubernetes-fluent-client-3.3.7.tgz", + "integrity": "sha512-KBgt2tQ76CfrDd8aig1xrCIcazztARdTYsqHH1//DctbUEB++2yz+KYR9CYBisSySDS625e86MVfxIB63R77hw==", + "license": "Apache-2.0", "dependencies": { "@kubernetes/client-node": "1.0.0-rc7", "fast-json-patch": "3.1.1", "http-status-codes": "2.3.0", "node-fetch": "2.7.0", "quicktype-core": "23.0.170", - "type-fest": "4.27.0", - "undici": "6.21.0", + "type-fest": "4.30.0", + "undici": "7.1.0", "yargs": "17.7.2" }, "bin": { @@ -6969,9 +7360,10 @@ } }, "node_modules/kubernetes-fluent-client/node_modules/type-fest": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.27.0.tgz", - "integrity": "sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==", + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -6984,6 +7376,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6992,6 +7385,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "^1.2.1", @@ -7005,13 +7399,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -7025,72 +7421,84 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" }, "node_modules/lodash.mergewith": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -7100,6 +7508,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -7114,12 +7523,14 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "license": "ISC", "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", @@ -7141,6 +7552,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7149,6 +7561,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7158,6 +7571,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -7166,6 +7580,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7175,6 +7590,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=16.10" }, @@ -7186,6 +7602,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -7194,12 +7611,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 8" @@ -7209,6 +7628,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7217,6 +7637,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7229,6 +7650,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -7240,6 +7662,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7248,6 +7671,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==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -7260,6 +7684,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -7268,6 +7693,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7282,6 +7708,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7299,6 +7726,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -7310,6 +7738,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7318,6 +7747,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -7334,6 +7764,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7342,6 +7773,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7353,6 +7785,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7363,12 +7796,14 @@ "node_modules/minipass-flush/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==", + "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7380,6 +7815,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7390,12 +7826,14 @@ "node_modules/minipass-pipeline/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==", + "license": "ISC" }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7407,6 +7845,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7417,7 +7856,8 @@ "node_modules/minipass-sized/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==", + "license": "ISC" }, "node_modules/minizlib": { "version": "3.0.1", @@ -7494,39 +7934,29 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/nock": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", - "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">= 10.13" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7546,6 +7976,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "peer": true, "engines": { "node": ">= 6.13.0" @@ -7555,19 +7986,22 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7577,6 +8011,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -7594,9 +8029,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7617,6 +8053,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -7625,6 +8062,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -7636,6 +8074,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -7645,6 +8084,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7656,9 +8096,9 @@ } }, "node_modules/openid-client": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.0.tgz", - "integrity": "sha512-4GCCGZt1i2kTHpwvaC/sCpTpQqDnBzDzuJcJMbH+y1Q5qI8U8RBvoSh28svarXszZHR5BAMXbJPX1PGPRE3VOA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", "license": "MIT", "dependencies": { "jose": "^4.15.9", @@ -7692,6 +8132,7 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", "peer": true, "dependencies": { "deep-is": "^0.1.3", @@ -7709,6 +8150,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7724,6 +8166,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -7739,6 +8182,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -7754,6 +8198,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -7765,6 +8210,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -7777,6 +8223,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -7790,12 +8237,14 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -7808,6 +8257,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -7825,6 +8275,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7834,6 +8285,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -7842,6 +8294,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7850,6 +8303,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7858,7 +8312,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -7894,27 +8349,31 @@ "node_modules/path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -7926,6 +8385,7 @@ "version": "9.5.0", "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -7947,6 +8407,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", "dependencies": { "split2": "^4.0.0" } @@ -7955,6 +8416,7 @@ "version": "13.0.0", "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.0.0.tgz", "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==", + "license": "MIT", "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", @@ -7977,13 +8439,15 @@ "node_modules/pino-std-serializers": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -7993,6 +8457,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -8005,6 +8470,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8018,6 +8484,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -8030,6 +8497,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -8045,6 +8513,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -8057,6 +8526,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8065,6 +8535,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -8073,6 +8544,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8.0" @@ -8082,6 +8554,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "license": "MIT", "peer": true, "bin": { "prettier": "bin/prettier.cjs" @@ -8098,6 +8571,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -8111,6 +8585,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8119,6 +8594,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -8126,12 +8602,14 @@ "node_modules/process-warning": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==", + "license": "MIT" }, "node_modules/prom-client": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz", "integrity": "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==", + "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.4.0", "tdigest": "^0.1.1" @@ -8144,6 +8622,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -8156,6 +8635,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -8164,19 +8644,11 @@ "node": ">= 6" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -8189,6 +8661,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -8198,6 +8671,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8217,12 +8691,14 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -8257,17 +8733,20 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" }, "node_modules/quicktype-core": { "version": "23.0.170", "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.170.tgz", "integrity": "sha512-ZsjveG0yJUIijUx4yQshzyQ5EAXKbFSBTQJHnJ+KoSZVxcS+m3GcmDpzrdUIRYMhgLaF11ZGvLSYi5U0xcwemw==", + "license": "Apache-2.0", "dependencies": { "@glideapps/ts-necessities": "2.2.3", "browser-or-node": "^3.0.0", @@ -8289,6 +8768,7 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -8298,6 +8778,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8306,6 +8787,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -8320,12 +8802,14 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/readable-stream": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -8341,6 +8825,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -8349,6 +8834,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8358,6 +8844,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8373,6 +8860,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -8390,6 +8878,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -8402,15 +8891,17 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -8419,6 +8910,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -8427,6 +8919,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "peer": true, "engines": { "iojs": ">=1.0.0", @@ -8444,6 +8937,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -8473,6 +8967,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true, "dependencies": { "queue-microtask": "^1.2.2" @@ -8495,12 +8990,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -8508,17 +9005,20 @@ "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==", + "license": "MIT" }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8530,6 +9030,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -8553,6 +9054,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8560,12 +9062,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8574,6 +9078,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -8588,6 +9093,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -8603,12 +9109,14 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8620,6 +9128,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } @@ -8628,6 +9137,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -8645,12 +9155,14 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sigstore": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -8666,12 +9178,14 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -8680,6 +9194,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -8689,6 +9204,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -8702,6 +9218,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -8712,9 +9229,10 @@ } }, "node_modules/sonic-boom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", - "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -8724,6 +9242,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -8733,6 +9252,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -8742,20 +9262,22 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } }, "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -8767,6 +9289,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -8776,6 +9299,7 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -8788,6 +9312,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8796,6 +9321,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8813,6 +9339,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -8822,6 +9349,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -8834,6 +9362,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8862,6 +9391,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8887,6 +9417,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8896,6 +9427,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8904,6 +9436,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -8915,6 +9448,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8927,6 +9461,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8973,6 +9508,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "license": "MIT", "dependencies": { "bintrees": "1.0.2" } @@ -8982,6 +9518,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -8996,6 +9533,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9006,6 +9544,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9018,6 +9557,7 @@ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -9029,12 +9569,14 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT", "peer": true }, "node_modules/thread-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } @@ -9043,18 +9585,21 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", - "dev": true + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" }, "node_modules/tmp": { "version": "0.2.3", @@ -9078,21 +9623,14 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -9104,6 +9642,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -9111,12 +9650,14 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "license": "MIT", "peer": true, "engines": { "node": ">=16" @@ -9130,6 +9671,7 @@ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -9176,18 +9718,20 @@ "node_modules/ts-toolbelt": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tuf-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", + "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.3.6", @@ -9201,6 +9745,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "^1.2.1" @@ -9214,6 +9759,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9222,6 +9768,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=10" @@ -9234,6 +9781,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -9246,6 +9794,7 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "license": "MIT", "dependencies": { "ts-toolbelt": "^9.6.0" } @@ -9254,6 +9803,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", @@ -9264,22 +9814,25 @@ } }, "node_modules/undici": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", - "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.1.0.tgz", + "integrity": "sha512-3+mdX2R31khuLCm2mKExSlMdJsfol7bJkIMH80tdXA74W34rT1jKemUTlYR7WY3TqsV4wfOgpatWmmB2Jl1+5g==", + "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" }, "node_modules/unicode-properties": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" @@ -9289,6 +9842,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" @@ -9297,13 +9851,15 @@ "node_modules/unicode-trie/node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9315,6 +9871,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "license": "ISC", "dependencies": { "unique-slug": "^5.0.0" }, @@ -9326,6 +9883,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -9337,14 +9895,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -9360,9 +9919,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9375,6 +9935,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "punycode": "^2.1.0" @@ -9383,7 +9944,8 @@ "node_modules/urijs": { "version": "1.19.11", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "license": "MIT" }, "node_modules/url-parse": { "version": "1.5.10", @@ -9399,6 +9961,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -9411,6 +9974,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "peer": true, "bin": { "uuid": "dist/bin/uuid" @@ -9421,6 +9985,7 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -9434,6 +9999,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9443,6 +10009,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -9450,12 +10017,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -9465,6 +10034,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9479,6 +10049,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -9487,12 +10058,14 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9538,28 +10111,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9570,32 +10126,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -9629,6 +10171,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -9637,12 +10180,14 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -9654,6 +10199,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9671,6 +10217,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -9679,6 +10226,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 8db51c905..f329b9f18 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "follow-redirects": "1.15.9", "http-status-codes": "^2.3.0", "json-pointer": "^0.6.2", - "kubernetes-fluent-client": "3.3.4", + "kubernetes-fluent-client": "3.3.7", "pino": "9.5.0", "pino-pretty": "13.0.0", "prom-client": "15.1.3", @@ -69,8 +69,8 @@ "husky": "^9.1.6", "jest": "29.7.0", "js-yaml": "^4.1.0", - "nock": "^13.5.4", - "ts-jest": "29.2.5" + "ts-jest": "29.2.5", + "undici": "^7.0.1" }, "peerDependencies": { "@types/prompts": "2.4.9", diff --git a/src/cli/build.ts b/src/cli/build.ts index 27160977e..5ec58740e 100644 --- a/src/cli/build.ts +++ b/src/cli/build.ts @@ -11,9 +11,10 @@ import { dependencies, version } from "./init/templates"; import { RootCmd } from "./root"; import { peprFormat } from "./format"; import { Option } from "commander"; -import { createDirectoryIfNotExists, validateCapabilityNames, parseTimeout } from "../lib/helpers"; +import { validateCapabilityNames, parseTimeout } from "../lib/helpers"; import { sanitizeResourceName } from "../sdk/sdk"; import { determineRbacMode } from "./build.helpers"; +import { createDirectoryIfNotExists } from "../lib/filesystemService"; const peprTS = "pepr.ts"; let outputDir: string = "dist"; export type Reloader = (opts: BuildResult) => void | Promise; diff --git a/src/cli/init/templates.ts b/src/cli/init/templates.ts index 8b90a7827..7143f053d 100644 --- a/src/cli/init/templates.ts +++ b/src/cli/init/templates.ts @@ -58,7 +58,7 @@ export function genPkgJSON(opts: InitOptions, pgkVerOverride?: string) { }, dependencies: { pepr: pgkVerOverride || version, - nock: "13.5.4", + undici: "^7.0.1", }, devDependencies: { typescript, diff --git a/src/lib/assets/index.ts b/src/lib/assets/index.ts index 3cb42fcef..864ac2f1d 100644 --- a/src/lib/assets/index.ts +++ b/src/lib/assets/index.ts @@ -3,6 +3,7 @@ import crypto from "crypto"; import { dumpYaml } from "@kubernetes/client-node"; +import { kind } from "kubernetes-fluent-client"; import { ModuleConfig } from "../module"; import { TLSOut, genTLS } from "../tls"; import { CapabilityExport } from "../types"; @@ -11,7 +12,7 @@ import { deploy } from "./deploy"; import { loadCapabilities } from "./loader"; import { allYaml, zarfYaml, overridesFile, zarfYamlChart } from "./yaml"; import { namespaceComplianceValidator, replaceString } from "../helpers"; -import { createDirectoryIfNotExists, dedent } from "../helpers"; +import { dedent } from "../helpers"; import { resolve } from "path"; import { chartYaml, @@ -27,6 +28,69 @@ import { apiTokenSecret, service, tlsSecret, watcherService } from "./networking import { watcher, moduleSecret } from "./pods"; import { clusterRoleBinding, serviceAccount, storeRole, storeRoleBinding } from "./rbac"; +import { createDirectoryIfNotExists } from "../filesystemService"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function toYaml(obj: any): string { + return dumpYaml(obj, { noRefs: true }); +} + +function createWebhookYaml( + assets: Assets, + webhookConfiguration: kind.MutatingWebhookConfiguration | kind.ValidatingWebhookConfiguration, +): string { + const yaml = toYaml(webhookConfiguration); + return replaceString( + replaceString( + replaceString(yaml, assets.name, "{{ .Values.uuid }}"), + assets.config.onError === "reject" ? "Fail" : "Ignore", + "{{ .Values.admission.failurePolicy }}", + ), + `${assets.config.webhookTimeout}` || "10", + "{{ .Values.admission.webhookTimeout }}", + ); +} + +function helmLayout(basePath: string, unique: string) { + const helm: Record> = { + dirs: { + chart: resolve(`${basePath}/${unique}-chart`), + }, + files: {}, + }; + + helm.dirs = { + ...helm.dirs, + charts: `${helm.dirs.chart}/charts`, + tmpls: `${helm.dirs.chart}/templates`, + }; + + helm.files = { + ...helm.files, + valuesYaml: `${helm.dirs.chart}/values.yaml`, + chartYaml: `${helm.dirs.chart}/Chart.yaml`, + namespaceYaml: `${helm.dirs.tmpls}/namespace.yaml`, + watcherServiceYaml: `${helm.dirs.tmpls}/watcher-service.yaml`, + admissionServiceYaml: `${helm.dirs.tmpls}/admission-service.yaml`, + mutationWebhookYaml: `${helm.dirs.tmpls}/mutation-webhook.yaml`, + validationWebhookYaml: `${helm.dirs.tmpls}/validation-webhook.yaml`, + admissionDeploymentYaml: `${helm.dirs.tmpls}/admission-deployment.yaml`, + admissionServiceMonitorYaml: `${helm.dirs.tmpls}/admission-service-monitor.yaml`, + watcherDeploymentYaml: `${helm.dirs.tmpls}/watcher-deployment.yaml`, + watcherServiceMonitorYaml: `${helm.dirs.tmpls}/watcher-service-monitor.yaml`, + tlsSecretYaml: `${helm.dirs.tmpls}/tls-secret.yaml`, + apiTokenSecretYaml: `${helm.dirs.tmpls}/api-token-secret.yaml`, + moduleSecretYaml: `${helm.dirs.tmpls}/module-secret.yaml`, + storeRoleYaml: `${helm.dirs.tmpls}/store-role.yaml`, + storeRoleBindingYaml: `${helm.dirs.tmpls}/store-role-binding.yaml`, + clusterRoleYaml: `${helm.dirs.tmpls}/cluster-role.yaml`, + clusterRoleBindingYaml: `${helm.dirs.tmpls}/cluster-role-binding.yaml`, + serviceAccountYaml: `${helm.dirs.tmpls}/service-account.yaml`, + }; + + return helm; +} + export class Assets { readonly name: string; readonly tls: TLSOut; @@ -78,102 +142,59 @@ export class Assets { return allYaml(this, imagePullSecret); }; + /* eslint max-statements: ["warn", 21] */ generateHelmChart = async (basePath: string) => { - const CHART_DIR = `${basePath}/${this.config.uuid}-chart`; - const CHAR_TEMPLATES_DIR = `${CHART_DIR}/templates`; - const valuesPath = resolve(CHART_DIR, `values.yaml`); - const chartPath = resolve(CHART_DIR, `Chart.yaml`); - const nsPath = resolve(CHAR_TEMPLATES_DIR, `namespace.yaml`); - const watcherSVCPath = resolve(CHAR_TEMPLATES_DIR, `watcher-service.yaml`); - const admissionSVCPath = resolve(CHAR_TEMPLATES_DIR, `admission-service.yaml`); - const mutationWebhookPath = resolve(CHAR_TEMPLATES_DIR, `mutation-webhook.yaml`); - const validationWebhookPath = resolve(CHAR_TEMPLATES_DIR, `validation-webhook.yaml`); - const admissionDeployPath = resolve(CHAR_TEMPLATES_DIR, `admission-deployment.yaml`); - const admissionServiceMonitorPath = resolve(CHAR_TEMPLATES_DIR, `admission-service-monitor.yaml`); - const watcherDeployPath = resolve(CHAR_TEMPLATES_DIR, `watcher-deployment.yaml`); - const watcherServiceMonitorPath = resolve(CHAR_TEMPLATES_DIR, `watcher-service-monitor.yaml`); - const tlsSecretPath = resolve(CHAR_TEMPLATES_DIR, `tls-secret.yaml`); - const apiTokenSecretPath = resolve(CHAR_TEMPLATES_DIR, `api-token-secret.yaml`); - const moduleSecretPath = resolve(CHAR_TEMPLATES_DIR, `module-secret.yaml`); - const storeRolePath = resolve(CHAR_TEMPLATES_DIR, `store-role.yaml`); - const storeRoleBindingPath = resolve(CHAR_TEMPLATES_DIR, `store-role-binding.yaml`); - const clusterRolePath = resolve(CHAR_TEMPLATES_DIR, `cluster-role.yaml`); - const clusterRoleBindingPath = resolve(CHAR_TEMPLATES_DIR, `cluster-role-binding.yaml`); - const serviceAccountPath = resolve(CHAR_TEMPLATES_DIR, `service-account.yaml`); - - // create helm chart - try { - // create chart dir - await createDirectoryIfNotExists(CHART_DIR); - - // create charts dir - await createDirectoryIfNotExists(`${CHART_DIR}/charts`); - - // create templates dir - await createDirectoryIfNotExists(`${CHAR_TEMPLATES_DIR}`); + const helm = helmLayout(basePath, this.config.uuid); - // create values file - await overridesFile(this, valuesPath); - - // create the chart.yaml - await fs.writeFile(chartPath, dedent(chartYaml(this.config.uuid, this.config.description || ""))); - - // create the namespace.yaml in templates - await fs.writeFile(nsPath, dedent(nsTemplate())); + try { + await Promise.all( + Object.values(helm.dirs) + .sort((l, r) => l.split("/").length - r.split("/").length) + .map(async dir => await createDirectoryIfNotExists(dir)), + ); const code = await fs.readFile(this.path); - await fs.writeFile(watcherSVCPath, dumpYaml(watcherService(this.name), { noRefs: true })); - await fs.writeFile(admissionSVCPath, dumpYaml(service(this.name), { noRefs: true })); - await fs.writeFile(tlsSecretPath, dumpYaml(tlsSecret(this.name, this.tls), { noRefs: true })); - await fs.writeFile(apiTokenSecretPath, dumpYaml(apiTokenSecret(this.name, this.apiToken), { noRefs: true })); - await fs.writeFile(moduleSecretPath, dumpYaml(moduleSecret(this.name, code, this.hash), { noRefs: true })); - await fs.writeFile(storeRolePath, dumpYaml(storeRole(this.name), { noRefs: true })); - await fs.writeFile(storeRoleBindingPath, dumpYaml(storeRoleBinding(this.name), { noRefs: true })); - await fs.writeFile(clusterRolePath, dedent(clusterRoleTemplate())); - await fs.writeFile(clusterRoleBindingPath, dumpYaml(clusterRoleBinding(this.name), { noRefs: true })); - await fs.writeFile(serviceAccountPath, dumpYaml(serviceAccount(this.name), { noRefs: true })); - - const mutateWebhook = await webhookConfig(this, "mutate", this.config.webhookTimeout); - const validateWebhook = await webhookConfig(this, "validate", this.config.webhookTimeout); - const watchDeployment = watcher(this, this.hash, this.buildTimestamp); + const pairs: [string, () => string][] = [ + [helm.files.chartYaml, () => dedent(chartYaml(this.config.uuid, this.config.description || ""))], + [helm.files.namespaceYaml, () => dedent(nsTemplate())], + [helm.files.watcherServiceYaml, () => toYaml(watcherService(this.name))], + [helm.files.admissionServiceYaml, () => toYaml(service(this.name))], + [helm.files.tlsSecretYaml, () => toYaml(tlsSecret(this.name, this.tls))], + [helm.files.apiTokenSecretYaml, () => toYaml(apiTokenSecret(this.name, this.apiToken))], + [helm.files.storeRoleYaml, () => toYaml(storeRole(this.name))], + [helm.files.storeRoleBindingYaml, () => toYaml(storeRoleBinding(this.name))], + [helm.files.clusterRoleYaml, () => dedent(clusterRoleTemplate())], + [helm.files.clusterRoleBindingYaml, () => toYaml(clusterRoleBinding(this.name))], + [helm.files.serviceAccountYaml, () => toYaml(serviceAccount(this.name))], + [helm.files.moduleSecretYaml, () => toYaml(moduleSecret(this.name, code, this.hash))], + ]; + await Promise.all(pairs.map(async ([file, content]) => await fs.writeFile(file, content()))); + + await overridesFile(this, helm.files.valuesYaml); + + const [mutateWebhook, validateWebhook] = await Promise.all([ + webhookConfig(this, "mutate", this.config.webhookTimeout), + webhookConfig(this, "validate", this.config.webhookTimeout), + ]); if (validateWebhook || mutateWebhook) { - await fs.writeFile(admissionDeployPath, dedent(admissionDeployTemplate(this.buildTimestamp))); - await fs.writeFile(admissionServiceMonitorPath, dedent(serviceMonitorTemplate("admission"))); + await fs.writeFile(helm.files.admissionDeploymentYaml, dedent(admissionDeployTemplate(this.buildTimestamp))); + await fs.writeFile(helm.files.admissionServiceMonitorYaml, dedent(serviceMonitorTemplate("admission"))); } if (mutateWebhook) { - const yamlMutateWebhook = dumpYaml(mutateWebhook, { noRefs: true }); - const mutateWebhookTemplate = replaceString( - replaceString( - replaceString(yamlMutateWebhook, this.name, "{{ .Values.uuid }}"), - this.config.onError === "reject" ? "Fail" : "Ignore", - "{{ .Values.admission.failurePolicy }}", - ), - `${this.config.webhookTimeout}` || "10", - "{{ .Values.admission.webhookTimeout }}", - ); - await fs.writeFile(mutationWebhookPath, mutateWebhookTemplate); + await fs.writeFile(helm.files.mutationWebhookYaml, createWebhookYaml(this, mutateWebhook)); } if (validateWebhook) { - const yamlValidateWebhook = dumpYaml(validateWebhook, { noRefs: true }); - const validateWebhookTemplate = replaceString( - replaceString( - replaceString(yamlValidateWebhook, this.name, "{{ .Values.uuid }}"), - this.config.onError === "reject" ? "Fail" : "Ignore", - "{{ .Values.admission.failurePolicy }}", - ), - `${this.config.webhookTimeout}` || "10", - "{{ .Values.admission.webhookTimeout }}", - ); - await fs.writeFile(validationWebhookPath, validateWebhookTemplate); + await fs.writeFile(helm.files.validationWebhookYaml, createWebhookYaml(this, validateWebhook)); } + const watchDeployment = watcher(this, this.hash, this.buildTimestamp); if (watchDeployment) { - await fs.writeFile(watcherDeployPath, dedent(watcherDeployTemplate(this.buildTimestamp))); - await fs.writeFile(watcherServiceMonitorPath, dedent(serviceMonitorTemplate("watcher"))); + await fs.writeFile(helm.files.watcherDeploymentYaml, dedent(watcherDeployTemplate(this.buildTimestamp))); + await fs.writeFile(helm.files.watcherServiceMonitorYaml, dedent(serviceMonitorTemplate("watcher"))); } } catch (err) { console.error(`Error generating helm chart: ${err.message}`); diff --git a/src/lib/capability.ts b/src/lib/capability.ts index 61aa26e9b..c9120053a 100644 --- a/src/lib/capability.ts +++ b/src/lib/capability.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-statements */ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023-Present The Pepr Authors diff --git a/src/lib/controller/index.ts b/src/lib/controller/index.ts index 4f3660bf5..2e9e45fab 100644 --- a/src/lib/controller/index.ts +++ b/src/lib/controller/index.ts @@ -13,11 +13,13 @@ import { ModuleConfig, isWatchMode } from "../module"; import { mutateProcessor } from "../mutate-processor"; import { validateProcessor } from "../validate-processor"; import { StoreController } from "./store"; -import { ResponseItem, AdmissionRequest } from "../types"; +import { AdmissionRequest } from "../types"; +import { karForMutate, karForValidate, KubeAdmissionReview } from "./index.util"; if (!process.env.PEPR_NODE_WARNINGS) { process.removeAllListeners("warning"); } + export class Controller { // Track whether the server is running #running = false; @@ -183,6 +185,8 @@ export class Controller { */ #metrics = async (req: express.Request, res: express.Response) => { try { + // https://github.com/prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#basic-info + res.set("Content-Type", "text/plain; version=0.0.4"); res.send(await this.#metricsCollector.getMetrics()); } catch (err) { Log.error(err, `Error getting metrics`); @@ -206,77 +210,38 @@ export class Controller { // Get the request from the body or create an empty request const request: AdmissionRequest = req.body?.request || ({} as AdmissionRequest); - // Run the before hook if it exists - this.#beforeHook && this.#beforeHook(request || {}); - - // Setup identifiers for logging - const name = request?.name ? `/${request.name}` : ""; - const namespace = request?.namespace || ""; - const gvk = request?.kind || { group: "", version: "", kind: "" }; - - const reqMetadata = { - uid: request.uid, - namespace, - name, + const { name, namespace, gvk } = { + name: request?.name ? `/${request.name}` : "", + namespace: request?.namespace || "", + gvk: request?.kind || { group: "", version: "", kind: "" }, }; + const reqMetadata = { uid: request.uid, namespace, name }; Log.info({ ...reqMetadata, gvk, operation: request.operation, admissionKind }, "Incoming request"); Log.debug({ ...reqMetadata, request }, "Incoming request body"); - // Process the request - let response: MutateResponse | ValidateResponse[]; + // Run the before hook if it exists + this.#beforeHook && this.#beforeHook(request || {}); - // Call mutate or validate based on the admission kind - if (admissionKind === "Mutate") { - response = await mutateProcessor(this.#config, this.#capabilities, request, reqMetadata); - } else { - response = await validateProcessor(this.#config, this.#capabilities, request, reqMetadata); - } + // Process the request + const response: MutateResponse | ValidateResponse[] = + admissionKind === "Mutate" + ? await mutateProcessor(this.#config, this.#capabilities, request, reqMetadata) + : await validateProcessor(this.#config, this.#capabilities, request, reqMetadata); // Run the after hook if it exists - const responseList: ValidateResponse[] | MutateResponse[] = Array.isArray(response) ? response : [response]; - responseList.map(res => { + [response].flat().map(res => { this.#afterHook && this.#afterHook(res); - // Log the response Log.info({ ...reqMetadata, res }, "Check response"); }); - let kubeAdmissionResponse: ValidateResponse[] | MutateResponse | ResponseItem; - - if (admissionKind === "Mutate") { - kubeAdmissionResponse = response; - Log.debug({ ...reqMetadata, response }, "Outgoing response"); - res.send({ - apiVersion: "admission.k8s.io/v1", - kind: "AdmissionReview", - response: kubeAdmissionResponse, - }); - } else { - kubeAdmissionResponse = - responseList.length === 0 - ? { - uid: request.uid, - allowed: true, - status: { message: "no in-scope validations -- allowed!" }, - } - : { - uid: responseList[0].uid, - allowed: responseList.filter(r => !r.allowed).length === 0, - status: { - message: (responseList as ValidateResponse[]) - .filter(rl => !rl.allowed) - .map(curr => curr.status?.message) - .join("; "), - }, - }; - res.send({ - apiVersion: "admission.k8s.io/v1", - kind: "AdmissionReview", - response: kubeAdmissionResponse, - }); - } - - Log.debug({ ...reqMetadata, kubeAdmissionResponse }, "Outgoing response"); + const kar: KubeAdmissionReview = + admissionKind === "Mutate" + ? karForMutate(response as MutateResponse) + : karForValidate(request, response as ValidateResponse[]); + + Log.debug({ ...reqMetadata, kubeAdmissionResponse: kar.response }, "Outgoing response"); + res.send(kar); this.#metricsCollector.observeEnd(startTime, admissionKind); } catch (err) { diff --git a/src/lib/controller/index.util.test.ts b/src/lib/controller/index.util.test.ts new file mode 100644 index 000000000..496b6ed19 --- /dev/null +++ b/src/lib/controller/index.util.test.ts @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023-Present The Pepr Authors + +import { describe, it, expect } from "@jest/globals"; +import { MutateResponse, ValidateResponse } from "../k8s"; +import * as sut from "./index.util"; +import { AdmissionRequest } from "../types"; + +describe("karForMutate()", () => { + it("returns given MutateResponse wrapped in an KubeAdmissionReview", () => { + const mr: MutateResponse = { uid: "uid", allowed: true }; + const kar: sut.KubeAdmissionReview = { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: mr, + }; + const result = sut.karForMutate(mr); + expect(result).toEqual(kar); + }); +}); + +describe("karForValidate()", () => { + describe("given 0 ValidationResponse[]'s", () => { + it("returns KubeAdmissionReview with abbreviated success message", () => { + const ar = { uid: "uid" } as unknown as AdmissionRequest; + const vrs: ValidateResponse[] = []; + const resp = { + uid: ar.uid, + allowed: true, + status: { code: 200, message: "no in-scope validations -- allowed!" }, + }; + const kar: sut.KubeAdmissionReview = { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: resp, + }; + const result = sut.karForValidate(ar, vrs); + expect(result).toEqual(kar); + }); + }); + + describe("given 1-or-more ValidationResponse[]'s", () => { + it("returns KubeAdmissionReview with detailed success message", () => { + const ar = { uid: "uid" } as unknown as AdmissionRequest; + const vrs: ValidateResponse[] = [ + { + uid: "uid", + allowed: true, + status: { + code: 200, + message: "msg", + }, + }, + ]; + const resp = { + uid: ar.uid, + allowed: true, + status: { code: 200, message: "" }, + }; + const kar: sut.KubeAdmissionReview = { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: resp, + }; + const result = sut.karForValidate(ar, vrs); + expect(result).toEqual(kar); + }); + + it("returns KubeAdmissionReview with detailed failure message", () => { + const ar = { uid: "uid" } as unknown as AdmissionRequest; + const vrs: ValidateResponse[] = [ + { + uid: "uid", + allowed: false, + status: { + code: 422, + message: "mess", + }, + }, + { + uid: "uid", + allowed: false, + status: { + code: 422, + message: "age", + }, + }, + ]; + const resp = { + uid: ar.uid, + allowed: false, + status: { code: 422, message: "mess; age" }, + }; + const kar: sut.KubeAdmissionReview = { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: resp, + }; + const result = sut.karForValidate(ar, vrs); + expect(result).toEqual(kar); + }); + }); +}); diff --git a/src/lib/controller/index.util.ts b/src/lib/controller/index.util.ts new file mode 100644 index 000000000..cad73983a --- /dev/null +++ b/src/lib/controller/index.util.ts @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023-Present The Pepr Authors + +import { MutateResponse, ValidateResponse } from "../k8s"; +import { ResponseItem, AdmissionRequest } from "../types"; + +export interface KubeAdmissionReview { + apiVersion: string; + kind: string; + response: ValidateResponse[] | MutateResponse | ResponseItem; +} + +export function karForMutate(mr: MutateResponse): KubeAdmissionReview { + return { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: mr, + }; +} + +export function karForValidate(ar: AdmissionRequest, vr: ValidateResponse[]): KubeAdmissionReview { + const isAllowed = vr.filter(r => !r.allowed).length === 0; + + const resp: ValidateResponse = + vr.length === 0 + ? { + uid: ar.uid, + allowed: true, + status: { code: 200, message: "no in-scope validations -- allowed!" }, + } + : { + uid: vr[0].uid, + allowed: isAllowed, + status: { + code: isAllowed ? 200 : 422, + message: vr + .filter(rl => !rl.allowed) + .map(curr => curr.status?.message) + .join("; "), + }, + }; + return { + apiVersion: "admission.k8s.io/v1", + kind: "AdmissionReview", + response: resp, + }; +} diff --git a/src/lib/controller/store.ts b/src/lib/controller/store.ts index 7fe8ca5fe..5c05ec860 100644 --- a/src/lib/controller/store.ts +++ b/src/lib/controller/store.ts @@ -12,7 +12,7 @@ import { DataOp, DataSender, DataStore, Storage } from "../storage"; import { fillStoreCache, sendUpdatesAndFlushCache } from "./storeCache"; const namespace = "pepr-system"; -export const debounceBackoff = 5000; +export const debounceBackoff = 1000; export class StoreController { #name: string; diff --git a/src/lib/filesystemService.test.ts b/src/lib/filesystemService.test.ts new file mode 100644 index 000000000..da00e4840 --- /dev/null +++ b/src/lib/filesystemService.test.ts @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023-Present The Pepr Authors + +import { describe, jest, expect, it } from "@jest/globals"; +import { createDirectoryIfNotExists } from "./filesystemService"; +import { promises as fs } from "fs"; + +jest.mock("fs", () => { + return { + promises: { + access: jest.fn(), + mkdir: jest.fn(), + }, + }; +}); + +describe("createDirectoryIfNotExists function", () => { + it("should create a directory if it doesn't exist", async () => { + (fs.access as jest.Mock).mockRejectedValue({ code: "ENOENT" } as never); + (fs.mkdir as jest.Mock).mockResolvedValue(undefined as never); + + const directoryPath = "/pepr/pepr-test-module/asdf"; + + await createDirectoryIfNotExists(directoryPath); + + expect(fs.access).toHaveBeenCalledWith(directoryPath); + expect(fs.mkdir).toHaveBeenCalledWith(directoryPath, { recursive: true }); + }); + + it("should not create a directory if it already exists", async () => { + jest.resetAllMocks(); + (fs.access as jest.Mock).mockResolvedValue(undefined as never); + + const directoryPath = "/pepr/pepr-test-module/asdf"; + + await createDirectoryIfNotExists(directoryPath); + + expect(fs.access).toHaveBeenCalledWith(directoryPath); + expect(fs.mkdir).not.toHaveBeenCalled(); + }); + + it("should throw an error for other fs.access errors", async () => { + jest.resetAllMocks(); + (fs.access as jest.Mock).mockRejectedValue({ code: "ERROR" } as never); + + const directoryPath = "/pepr/pepr-test-module/asdf"; + + try { + await createDirectoryIfNotExists(directoryPath); + } catch (error) { + expect(error.code).toEqual("ERROR"); + } + }); +}); diff --git a/src/lib/filesystemService.ts b/src/lib/filesystemService.ts new file mode 100644 index 000000000..3a581d61f --- /dev/null +++ b/src/lib/filesystemService.ts @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023-Present The Pepr Authors + +import { promises } from "fs"; + +export async function createDirectoryIfNotExists(path: string) { + try { + await promises.access(path); + } catch (error) { + if (error.code === "ENOENT") { + await promises.mkdir(path, { recursive: true }); + } else { + throw error; + } + } +} diff --git a/src/lib/filter/adjudicators.test.ts b/src/lib/filter/adjudicators.test.ts index 77ad8e200..041d90b46 100644 --- a/src/lib/filter/adjudicators.test.ts +++ b/src/lib/filter/adjudicators.test.ts @@ -2,72 +2,52 @@ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { expect, describe, it } from "@jest/globals"; -import * as sut from "./adjudicators"; +import { + bindsToKind, + carriesIgnoredNamespace, + metasMismatch, + mismatchedAnnotations, + mismatchedEvent, + mismatchedGroup, + mismatchedKind, + mismatchedLabels, + mismatchedName, + mismatchedNameRegex, + mismatchedNamespace, + mismatchedNamespaceRegex, + mismatchedVersion, + missingCarriableNamespace, + operationMatchesEvent, + unbindableNamespaces, + uncarryableNamespace, +} from "./adjudicators"; import { KubernetesObject } from "kubernetes-fluent-client"; import { AdmissionRequest, Binding, DeepPartial } from "../types"; import { Event, Operation } from "../enums"; - -describe("carriesDeletionTimestamp", () => { - //[ KubernetesObject, result ] - it.each([ - [{}, false], - [{ metadata: {} }, false], - [{ metadata: { deletionTimestamp: null } }, false], - [{ metadata: { deletionTimestamp: new Date() } }, true], - ])("given %j, returns %s", (given, expected) => { - const ko = given as DeepPartial; - - const result = sut.carriesDeletionTimestamp(ko); - - expect(result).toBe(expected); - }); -}); - -describe("missingDeletionTimestamp", () => { - //[ KubernetesObject, result ] - it.each([ - [{}, true], - [{ metadata: {} }, true], - [{ metadata: { deletionTimestamp: null } }, true], - [{ metadata: { deletionTimestamp: new Date() } }, false], - ])("given %j, returns %s", (given, expected) => { - const ko = given as DeepPartial; - - const result = sut.missingDeletionTimestamp(ko); - - expect(result).toBe(expected); - }); -}); - -describe("mismatchedDeletionTimestamp", () => { - //[ Binding, KubernetesObject, result ] - it.each([ - [{}, {}, false], - [{}, { metadata: { deletionTimestamp: new Date() } }, false], - [{ filters: { deletionTimestamp: true } }, {}, true], - [{ filters: { deletionTimestamp: true } }, { metadata: { deletionTimestamp: new Date() } }, false], - ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { - const binding = bnd as DeepPartial; - const object = obj as DeepPartial; - - const result = sut.mismatchedDeletionTimestamp(binding, object); - - expect(result).toBe(expected); - }); -}); +import { + defaultAdmissionRequest, + defaultBinding, + defaultFilters, + defaultKubernetesObject, +} from "./adjudicators/defaultTestObjects"; describe("mismatchedName", () => { //[ Binding, KubernetesObject, result ] it.each([ - [{}, {}, false], - [{}, { metadata: { name: "name" } }, false], [{ filters: { name: "name" } }, {}, true], [{ filters: { name: "name" } }, { metadata: { name: "name" } }, false], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { - const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, name: bnd.filters.name }, + }; + + const kubernetesObject: KubernetesObject = { + ...defaultKubernetesObject, + metadata: "metadata" in obj ? obj.metadata : defaultKubernetesObject.metadata, + }; - const result = sut.mismatchedName(binding, object); + const result = mismatchedName(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -89,7 +69,7 @@ describe("mismatchedNameRegex", () => { const binding = bnd as DeepPartial; const object = obj as DeepPartial; - const result = sut.mismatchedNameRegex(binding, object); + const result = mismatchedNameRegex(binding, object); expect(result).toBe(expected); }); @@ -111,7 +91,7 @@ describe("bindsToKind", () => { const binding = bnd as DeepPartial; const kind = knd as string; - const result = sut.bindsToKind(binding, kind); + const result = bindsToKind(binding, kind); expect(result).toBe(expected); }); @@ -129,7 +109,7 @@ describe("mismatchedNamespace", () => { const binding = bnd as DeepPartial; const object = obj as DeepPartial; - const result = sut.mismatchedNamespace(binding, object); + const result = mismatchedNamespace(binding, object); expect(result).toBe(expected); }); @@ -137,30 +117,32 @@ describe("mismatchedNamespace", () => { describe("mismatchedNamespaceRegex", () => { //[ Binding, KubernetesObject, result ] + const testRegex1 = "^n[aeiou]mespace$"; //regexr.com/89l8f + const testRegex2 = "^n[aeiou]me$"; //regexr.com/89l8l + const testRegex3 = "^sp[aeiou]ce$"; //regexr.com/89l8o it.each([ - [{}, {}, false], - [{}, { metadata: { namespace: "namespace" } }, false], - [{ filters: { regexNamespaces: ["^n.mespace$"] } }, {}, true], - - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "namespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nemespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nimespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nomespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "numespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "n3mespace" } }, true], - - [{ filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, { metadata: { namespace: "name" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, { metadata: { namespace: "space" } }, false], - [ - { filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, - { metadata: { namespace: "namespace" } }, - true, - ], + [{ filters: { regexNamespaces: [new RegExp("^n.mespace$").source] } }, {}, true], + + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "namespace" } }, false], + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "nemespace" } }, false], + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "nimespace" } }, false], + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "nomespace" } }, false], + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "numespace" } }, false], + [{ filters: { regexNamespaces: [testRegex1] } }, { metadata: { namespace: "n3mespace" } }, true], + + [{ filters: { regexNamespaces: [testRegex2, testRegex3] } }, { metadata: { namespace: "name" } }, false], + [{ filters: { regexNamespaces: [testRegex2, testRegex3] } }, { metadata: { namespace: "space" } }, false], + [{ filters: { regexNamespaces: [testRegex2, testRegex3] } }, { metadata: { namespace: "namespace" } }, true], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { - const binding = bnd as DeepPartial; - const object = obj as DeepPartial; - - const result = sut.mismatchedNamespaceRegex(binding, object); + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, regexNamespaces: bnd.filters.regexNamespaces }, + }; + const kubernetesObject: KubernetesObject = { + ...defaultKubernetesObject, + metadata: "metadata" in obj ? obj.metadata : defaultKubernetesObject.metadata, + }; + const result = mismatchedNamespaceRegex(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -186,7 +168,7 @@ describe("metasMismatch", () => { [{ an: "no", ta: "te" }, { an: "no", ta: "te" }, false], [{ an: "no", ta: "te" }, { an: "no", ta: "to" }, true], ])("given left %j and right %j, returns %s", (bnd, obj, expected) => { - const result = sut.metasMismatch(bnd, obj); + const result = metasMismatch(bnd, obj); expect(result).toBe(expected); }); @@ -220,7 +202,7 @@ describe("mismatchedAnnotations", () => { const binding = bnd as DeepPartial; const object = obj as DeepPartial; - const result = sut.mismatchedAnnotations(binding, object); + const result = mismatchedAnnotations(binding, object); expect(result).toBe(expected); }); @@ -248,7 +230,7 @@ describe("mismatchedLabels", () => { const binding = bnd as DeepPartial; const object = obj as DeepPartial; - const result = sut.mismatchedLabels(binding, object); + const result = mismatchedLabels(binding, object); expect(result).toBe(expected); }); @@ -279,7 +261,7 @@ describe("missingCarriableNamespace", () => { ])("given capabilityNamespaces %j and object %j, returns %s", (nss, obj, expected) => { const object = obj as DeepPartial; - const result = sut.missingCarriableNamespace(nss, object); + const result = missingCarriableNamespace(nss, object); expect(result).toBe(expected); }); @@ -308,7 +290,7 @@ describe("uncarryableNamespace", () => { ])("given capabilityNamespaces %j and object %j, returns %s", (nss, obj, expected) => { const object = obj as DeepPartial; - const result = sut.uncarryableNamespace(nss, object); + const result = uncarryableNamespace(nss, object); expect(result).toBe(expected); }); @@ -337,7 +319,7 @@ describe("carriesIgnoredNamespace", () => { ])("given capabilityNamespaces %j and object %j, returns %s", (nss, obj, expected) => { const object = obj as DeepPartial; - const result = sut.carriesIgnoredNamespace(nss, object); + const result = carriesIgnoredNamespace(nss, object); expect(result).toBe(expected); }); @@ -367,7 +349,7 @@ describe("unbindableNamespaces", () => { ])("given capabilityNamespaces %j and binding %j, returns %s", (nss, bnd, expected) => { const binding = bnd as DeepPartial; - const result = sut.unbindableNamespaces(nss, binding); + const result = unbindableNamespaces(nss, binding); expect(result).toBe(expected); }); @@ -376,10 +358,6 @@ describe("unbindableNamespaces", () => { describe("operationMatchesEvent", () => { //[ Operation, Event, result ] it.each([ - ["", "", true], - ["", Event.CREATE, false], - [Operation.CREATE, "", false], - [Operation.CREATE, Event.CREATE, true], [Operation.CREATE, Event.UPDATE, false], [Operation.CREATE, Event.DELETE, false], @@ -404,7 +382,7 @@ describe("operationMatchesEvent", () => { [Operation.CONNECT, Event.CREATE_OR_UPDATE, false], [Operation.CONNECT, Event.ANY, true], ])("given operation %s and event %s, returns %s", (op, evt, expected) => { - const result = sut.operationMatchesEvent(op, evt); + const result = operationMatchesEvent(op, evt); expect(result).toEqual(expected); }); @@ -413,10 +391,6 @@ describe("operationMatchesEvent", () => { describe("mismatchedEvent", () => { //[ Binding, AdmissionRequest, result ] it.each([ - [{}, {}, false], - [{}, { operation: Operation.CREATE }, true], - [{ event: Event.CREATE }, {}, true], - [{ event: Event.CREATE }, { operation: Operation.CREATE }, false], [{ event: Event.UPDATE }, { operation: Operation.CREATE }, true], [{ event: Event.DELETE }, { operation: Operation.CREATE }, true], @@ -441,10 +415,16 @@ describe("mismatchedEvent", () => { [{ event: Event.CREATE_OR_UPDATE }, { operation: Operation.CONNECT }, true], [{ event: Event.ANY }, { operation: Operation.CONNECT }, false], ])("given binding %j and admission request %j, returns %s", (bnd, req, expected) => { - const binding = bnd as DeepPartial; - const request = req as DeepPartial; + const binding: Binding = { + ...defaultBinding, + event: bnd.event, + }; + const request: AdmissionRequest = { + ...defaultAdmissionRequest, + operation: req.operation, + }; - const result = sut.mismatchedEvent(binding, request); + const result = mismatchedEvent(binding, request); expect(result).toEqual(expected); }); @@ -462,7 +442,7 @@ describe("mismatchedGroup", () => { const binding = bnd as DeepPartial; const request = req as DeepPartial; - const result = sut.mismatchedGroup(binding, request); + const result = mismatchedGroup(binding, request); expect(result).toEqual(expected); }); @@ -480,7 +460,7 @@ describe("mismatchedVersion", () => { const binding = bnd as DeepPartial; const request = req as DeepPartial; - const result = sut.mismatchedVersion(binding, request); + const result = mismatchedVersion(binding, request); expect(result).toEqual(expected); }); @@ -498,7 +478,7 @@ describe("mismatchedKind", () => { const binding = bnd as DeepPartial; const request = req as DeepPartial; - const result = sut.mismatchedKind(binding, request); + const result = mismatchedKind(binding, request); expect(result).toEqual(expected); }); diff --git a/src/lib/filter/adjudicators.ts b/src/lib/filter/adjudicators.ts index cacd629c5..084cc39f2 100644 --- a/src/lib/filter/adjudicators.ts +++ b/src/lib/filter/adjudicators.ts @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { Event, Operation } from "../enums"; -import { AdmissionRequest } from "../../lib/types"; +import { AdmissionRequest, Binding } from "../../lib/types"; import { __, allPass, @@ -58,33 +58,60 @@ export const carriesDeletionTimestamp = pipe( ); export const missingDeletionTimestamp = complement(carriesDeletionTimestamp); -export const carriedKind = pipe(kubernetesObject => kubernetesObject?.metadata?.kind, defaultTo("not set")); -export const carriedVersion = pipe(kubernetesObject => kubernetesObject?.metadata?.version, defaultTo("not set")); -export const carriedName = pipe(kubernetesObject => kubernetesObject?.metadata?.name, defaultTo("")); +export const carriedKind = pipe( + (kubernetesObject: KubernetesObject): string | undefined => kubernetesObject?.kind, + defaultTo("not set"), +); +export const carriedVersion = pipe( + (kubernetesObject: KubernetesObject): string | undefined => kubernetesObject?.metadata?.resourceVersion, + defaultTo("not set"), +); +export const carriedName = pipe( + (kubernetesObject: KubernetesObject): string | undefined => kubernetesObject?.metadata?.name, + defaultTo(""), +); export const carriesName = pipe(carriedName, equals(""), not); export const missingName = complement(carriesName); -export const carriedNamespace = pipe(kubernetesObject => kubernetesObject?.metadata?.namespace, defaultTo("")); +export const carriedNamespace = pipe( + (kubernetesObject: KubernetesObject): string | undefined => kubernetesObject?.metadata?.namespace, + defaultTo(""), +); export const carriesNamespace = pipe(carriedNamespace, equals(""), not); -export const carriedAnnotations = pipe(kubernetesObject => kubernetesObject?.metadata?.annotations, defaultTo({})); +export const carriedAnnotations = pipe( + (kubernetesObject: KubernetesObject): { [key: string]: string } | undefined => + kubernetesObject?.metadata?.annotations, + defaultTo({}), +); export const carriesAnnotations = pipe(carriedAnnotations, equals({}), not); -export const carriedLabels = pipe(kubernetesObject => kubernetesObject?.metadata?.labels, defaultTo({})); +export const carriedLabels = pipe( + (kubernetesObject: KubernetesObject): { [key: string]: string } | undefined => kubernetesObject?.metadata?.labels, + defaultTo({}), +); export const carriesLabels = pipe(carriedLabels, equals({}), not); /* Binding collectors */ -export const definesDeletionTimestamp = pipe(binding => binding?.filters?.deletionTimestamp, defaultTo(false)); +export const definesDeletionTimestamp = pipe( + (binding: Binding): boolean => binding?.filters?.deletionTimestamp ?? false, + defaultTo(false), +); export const ignoresDeletionTimestamp = complement(definesDeletionTimestamp); -export const definedName = pipe(binding => binding?.filters?.name, defaultTo("")); +export const definedName = pipe((binding: Binding): string => { + return binding.filters.name; +}, defaultTo("")); export const definesName = pipe(definedName, equals(""), not); export const ignoresName = complement(definesName); -export const definedNameRegex = pipe(binding => binding?.filters?.regexName, defaultTo("")); +export const definedNameRegex = pipe( + (binding: Partial): string | undefined => binding.filters?.regexName, + defaultTo(""), +); export const definesNameRegex = pipe(definedNameRegex, equals(""), not); export const definedNamespaces = pipe(binding => binding?.filters?.namespaces, defaultTo([])); @@ -93,45 +120,49 @@ export const definesNamespaces = pipe(definedNamespaces, equals([]), not); export const definedNamespaceRegexes = pipe(binding => binding?.filters?.regexNamespaces, defaultTo([])); export const definesNamespaceRegexes = pipe(definedNamespaceRegexes, equals([]), not); -export const definedAnnotations = pipe(binding => binding?.filters?.annotations, defaultTo({})); +export const definedAnnotations = pipe((binding: Partial) => binding?.filters?.annotations, defaultTo({})); export const definesAnnotations = pipe(definedAnnotations, equals({}), not); -export const definedLabels = pipe(binding => binding?.filters?.labels, defaultTo({})); +export const definedLabels = pipe((binding: Partial) => binding?.filters?.labels, defaultTo({})); export const definesLabels = pipe(definedLabels, equals({}), not); -export const definedEvent = pipe(binding => binding?.event, defaultTo("")); -export const definesDelete = pipe(definedEvent, equals(Operation.DELETE)); +export const definedEvent = (binding: Binding): Event => { + return binding.event; +}; -export const definedGroup = pipe(binding => binding?.kind?.group, defaultTo("")); +export const definesDelete = pipe(definedEvent, equals(Event.DELETE)); + +export const definedGroup = pipe((binding): string => binding?.kind?.group, defaultTo("")); export const definesGroup = pipe(definedGroup, equals(""), not); -export const definedVersion = pipe(binding => binding?.kind?.version, defaultTo("")); +export const definedVersion = pipe( + (binding: Partial): string | undefined => binding?.kind?.version, + defaultTo(""), +); export const definesVersion = pipe(definedVersion, equals(""), not); -export const definedKind = pipe(binding => binding?.kind?.kind, defaultTo("")); +export const definedKind = pipe((binding): string => binding?.kind?.kind, defaultTo("")); export const definesKind = pipe(definedKind, equals(""), not); -export const definedCategory = pipe(binding => { +export const definedCategory = (binding: Partial) => { + // Ordering matters, finalize is a "watch" // prettier-ignore - return ( - binding.isFinalize ? "Finalize" : + return binding.isFinalize ? "Finalize" : binding.isWatch ? "Watch" : binding.isMutate ? "Mutate" : binding.isValidate ? "Validate" : - "" - ); -}); + ""; +}; -export const definedCallback = pipe(binding => { +export const definedCallback = (binding: Partial) => { + // Ordering matters, finalize is a "watch" // prettier-ignore - return ( - binding.isFinalize ? binding.finalizeCallback : + return binding.isFinalize ? binding.finalizeCallback : binding.isWatch ? binding.watchCallback : binding.isMutate ? binding.mutateCallback : - binding.isValidate ? binding.validateCallback: - null - ); -}); + binding.isValidate ? binding.validateCallback : + null; +}; export const definedCallbackName = pipe(definedCallback, defaultTo({ name: "" }), callback => callback.name); /* @@ -246,12 +277,13 @@ export const misboundDeleteWithDeletionTimestamp = allPass([definesDelete, defin export const operationMatchesEvent = anyPass([ pipe(nthArg(1), equals(Event.ANY)), - pipe((operation, event) => operation === event), - pipe((operation, event) => (operation ? event.includes(operation) : false)), + pipe((operation: Operation, event: Event): boolean => operation.valueOf() === event.valueOf()), + pipe((operation: Operation, event: Event): boolean => (operation ? event.includes(operation) : false)), ]); export const mismatchedEvent = pipe( - (binding, request) => operationMatchesEvent(declaredOperation(request), definedEvent(binding)), + (binding: Binding, request: AdmissionRequest): boolean => + operationMatchesEvent(declaredOperation(request), definedEvent(binding)), not, ); diff --git a/src/lib/filter/adjudicators/bindingAdjudicators.test.ts b/src/lib/filter/adjudicators/bindingAdjudicators.test.ts index 0c0db0a9a..52a9808d6 100644 --- a/src/lib/filter/adjudicators/bindingAdjudicators.test.ts +++ b/src/lib/filter/adjudicators/bindingAdjudicators.test.ts @@ -2,23 +2,66 @@ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { expect, describe, it } from "@jest/globals"; -import * as sut from "../adjudicators"; import { KubernetesObject } from "kubernetes-fluent-client"; -import { Binding, DeepPartial } from "../../types"; +import { Binding, DeepPartial, ValidateActionResponse } from "../../types"; import { Event } from "../../enums"; +import { + bindsToNamespace, + carriedAnnotations, + carriedLabels, + carriedName, + carriedNamespace, + carriesAnnotations, + carriesLabels, + carriesName, + carriesNamespace, + definedAnnotations, + definedCallback, + definedCallbackName, + definedCategory, + definedEvent, + definedGroup, + definedKind, + definedLabels, + definedName, + definedNameRegex, + definedNamespaceRegexes, + definedNamespaces, + definedVersion, + definesAnnotations, + definesDelete, + definesDeletionTimestamp, + definesGroup, + definesKind, + definesLabels, + definesName, + definesNameRegex, + definesNamespaceRegexes, + definesNamespaces, + definesVersion, + ignoresDeletionTimestamp, + ignoresName, + misboundDeleteWithDeletionTimestamp, + misboundNamespace, + missingName, +} from "../adjudicators"; +import { defaultBinding, defaultFilters, defaultKubernetesObject } from "./defaultTestObjects"; describe("definesDeletionTimestamp", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { deletionTimestamp: null } }, false], [{ filters: { deletionTimestamp: false } }, false], [{ filters: { deletionTimestamp: true } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + deletionTimestamp: given.filters.deletionTimestamp, + }, + }; - const result = sut.definesDeletionTimestamp(binding); + const result = definesDeletionTimestamp(binding); expect(result).toBe(expected); }); @@ -27,15 +70,18 @@ describe("definesDeletionTimestamp", () => { describe("ignoresDeletionTimestamp", () => { //[ Binding, result ] it.each([ - [{}, true], - [{ filters: {} }, true], - [{ filters: { deletionTimestamp: null } }, true], [{ filters: { deletionTimestamp: false } }, true], [{ filters: { deletionTimestamp: true } }, false], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + deletionTimestamp: given.filters.deletionTimestamp, + }, + }; - const result = sut.ignoresDeletionTimestamp(binding); + const result = ignoresDeletionTimestamp(binding); expect(result).toBe(expected); }); @@ -43,15 +89,16 @@ describe("ignoresDeletionTimestamp", () => { describe("definedName", () => { //[ Binding, result ] - it.each([ - [{}, ""], - [{ filters: {} }, ""], - [{ filters: { name: null } }, ""], - [{ filters: { name: "name" } }, "name"], - ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ filters: { name: "name" } }, "name"]])("given %j, returns '%s'", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + name: given.filters.name, + }, + }; - const result = sut.definedName(binding); + const result = definedName(binding); expect(result).toBe(expected); }); @@ -59,15 +106,16 @@ describe("definedName", () => { describe("definesName", () => { //[ Binding, result ] - it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { name: null } }, false], - [{ filters: { name: "name" } }, true], - ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ filters: { name: "name" } }, true]])("given %j, returns %s", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + name: given.filters.name, + }, + }; - const result = sut.definesName(binding); + const result = definesName(binding); expect(result).toBe(expected); }); @@ -75,15 +123,16 @@ describe("definesName", () => { describe("ignoresName", () => { //[ Binding, result ] - it.each([ - [{}, true], - [{ filters: {} }, true], - [{ filters: { name: null } }, true], - [{ filters: { name: "name" } }, false], - ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ filters: { name: "name" } }, false]])("given %j, returns %s", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + name: given.filters.name, + }, + }; - const result = sut.ignoresName(binding); + const result = ignoresName(binding); expect(result).toBe(expected); }); @@ -91,15 +140,16 @@ describe("ignoresName", () => { describe("definedNameRegex", () => { //[ Binding, result ] - it.each([ - [{}, ""], - [{ filters: {} }, ""], - [{ filters: { regexName: null } }, ""], - [{ filters: { regexName: "n.me" } }, "n.me"], - ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ filters: { regexName: "n.me" } }, "n.me"]])("given %j, returns '%s'", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + regexName: given.filters.regexName, + }, + }; - const result = sut.definedNameRegex(binding); + const result = definedNameRegex(binding); expect(result).toBe(expected); }); @@ -107,15 +157,16 @@ describe("definedNameRegex", () => { describe("definesNameRegex", () => { //[ Binding, result ] - it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { regexName: null } }, false], - [{ filters: { regexName: "n.me" } }, true], - ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ filters: { regexName: "n.me" } }, true]])("given %j, returns %s", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + regexName: given.filters.regexName, + }, + }; - const result = sut.definesNameRegex(binding); + const result = definesNameRegex(binding); expect(result).toBe(expected); }); @@ -123,15 +174,13 @@ describe("definesNameRegex", () => { describe("carriedName", () => { //[ KubernetesObject, result ] - it.each([ - [{}, ""], - [{ metadata: {} }, ""], - [{ metadata: { name: null } }, ""], - [{ metadata: { name: "name" } }, "name"], - ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ metadata: { name: "name" } }, "name"]])("given %j, returns '%s'", (given, expected) => { + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { name: given.metadata.name }, + }; - const result = sut.carriedName(binding); + const result = carriedName(kubernetesObject); expect(result).toBe(expected); }); @@ -139,15 +188,13 @@ describe("carriedName", () => { describe("carriesName", () => { //[ KubernetesObject, result ] - it.each([ - [{}, false], - [{ metadata: {} }, false], - [{ metadata: { name: null } }, false], - [{ metadata: { name: "name" } }, true], - ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ metadata: { name: "name" } }, true]])("given %j, returns %s", (given, expected) => { + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { name: given.metadata.name }, + }; - const result = sut.carriesName(binding); + const result = carriesName(kubernetesObject); expect(result).toBe(expected); }); @@ -155,15 +202,13 @@ describe("carriesName", () => { describe("missingName", () => { //[ Binding, result ] - it.each([ - [{}, true], - [{ metadata: {} }, true], - [{ metadata: { name: null } }, true], - [{ metadata: { name: "name" } }, false], - ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + it.each([[{ metadata: { name: "name" } }, false]])("given %j, returns %s", (given, expected) => { + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { name: given.metadata.name }, + }; - const result = sut.missingName(binding); + const result = missingName(kubernetesObject); expect(result).toBe(expected); }); @@ -172,15 +217,18 @@ describe("missingName", () => { describe("bindsToNamespace", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ kind: {} }, false], - [{ kind: { kind: null } }, false], [{ kind: { kind: "" } }, false], [{ kind: { kind: "Namespace" } }, true], - ])("given binding %j returns %s", (bnd, expected) => { - const binding = bnd as DeepPartial; + ])("given binding %j returns %s", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + }, + kind: { kind: given.kind.kind, group: defaultBinding.kind.group }, + }; - const result = sut.bindsToNamespace(binding); + const result = bindsToNamespace(binding); expect(result).toBe(expected); }); @@ -189,16 +237,19 @@ describe("bindsToNamespace", () => { describe("definedNamespaces", () => { //[ Binding, result ] it.each([ - [{}, []], - [{ filters: {} }, []], - [{ filters: { namespaces: null } }, []], [{ filters: { namespaces: [] } }, []], [{ filters: { namespaces: ["namespace"] } }, ["namespace"]], [{ filters: { namespaces: ["name", "space"] } }, ["name", "space"]], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + namespaces: given.filters.namespaces, + }, + }; - const result = sut.definedNamespaces(binding); + const result = definedNamespaces(binding); expect(result).toEqual(expected); }); @@ -207,16 +258,19 @@ describe("definedNamespaces", () => { describe("definesNamespaces", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { namespaces: null } }, false], [{ filters: { namespaces: [] } }, false], [{ filters: { namespaces: ["namespace"] } }, true], [{ filters: { namespaces: ["name", "space"] } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + namespaces: given.filters.namespaces, + }, + }; - const result = sut.definesNamespaces(binding); + const result = definesNamespaces(binding); expect(result).toBe(expected); }); @@ -225,16 +279,19 @@ describe("definesNamespaces", () => { describe("definedNamespaceRegexes", () => { //[ Binding, result ] it.each([ - [{}, []], - [{ filters: {} }, []], - [{ filters: { regexNamespaces: null } }, []], [{ filters: { regexNamespaces: [] } }, []], - [{ filters: { regexNamespaces: ["n.mesp.ce"] } }, ["n.mesp.ce"]], - [{ filters: { regexNamespaces: ["n.me", "sp.ce"] } }, ["n.me", "sp.ce"]], + [{ filters: { regexNamespaces: [new RegExp("n.mesp.ce").source] } }, ["n.mesp.ce"]], + [{ filters: { regexNamespaces: [new RegExp("n.me").source, new RegExp("sp.ce").source] } }, ["n.me", "sp.ce"]], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + regexNamespaces: given.filters.regexNamespaces, + }, + }; - const result = sut.definedNamespaceRegexes(binding); + const result = definedNamespaceRegexes(binding); expect(result).toEqual(expected); }); @@ -243,16 +300,19 @@ describe("definedNamespaceRegexes", () => { describe("definesNamespaceRegexes", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { regexNamespaces: null } }, false], [{ filters: { regexNamespaces: [] } }, false], - [{ filters: { regexNamespaces: ["n.mesp.ce"] } }, true], - [{ filters: { regexNamespaces: ["n.me", "sp.ce"] } }, true], + [{ filters: { regexNamespaces: [new RegExp("n.mesp.ce").source] } }, true], + [{ filters: { regexNamespaces: [new RegExp("n.me").source, new RegExp("sp.ce").source] } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + regexNamespaces: given.filters.regexNamespaces, + }, + }; - const result = sut.definesNamespaceRegexes(binding); + const result = definesNamespaceRegexes(binding); expect(result).toBe(expected); }); @@ -267,9 +327,9 @@ describe("carriedNamespace", () => { [{ metadata: { namespace: "" } }, ""], [{ metadata: { namespace: "namespace" } }, "namespace"], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = given as DeepPartial; - const result = sut.carriedNamespace(binding); + const result = carriedNamespace(kubernetesObject); expect(result).toEqual(expected); }); @@ -278,15 +338,15 @@ describe("carriedNamespace", () => { describe("carriesNamespace", () => { //[ KubernetesObject, result ] it.each([ - [{}, false], - [{ metadata: {} }, false], - [{ metadata: { namespace: null } }, false], [{ metadata: { namespace: "" } }, false], [{ metadata: { namespace: "namespace" } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { namespace: given.metadata.namespace }, + }; - const result = sut.carriesNamespace(binding); + const result = carriesNamespace(kubernetesObject); expect(result).toBe(expected); }); @@ -300,9 +360,16 @@ describe("misboundNamespace", () => { [{ kind: { kind: "Namespace" }, filters: { namespaces: [] } }, false], [{ kind: { kind: "Namespace" }, filters: { namespaces: ["namespace"] } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + namespaces: given.filters.namespaces, + }, + kind: { kind: given.kind.kind, group: defaultBinding.kind.group }, + }; - const result = sut.misboundNamespace(binding); + const result = misboundNamespace(binding); expect(result).toBe(expected); }); @@ -311,16 +378,19 @@ describe("misboundNamespace", () => { describe("definedAnnotations", () => { //[ Binding, result ] it.each([ - [{}, {}], - [{ filters: {} }, {}], - [{ filters: { annotations: null } }, {}], [{ filters: { annotations: {} } }, {}], [{ filters: { annotations: { annotation: "" } } }, { annotation: "" }], [{ filters: { annotations: { anno: "tation" } } }, { anno: "tation" }], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + annotations: given.filters.annotations, + }, + }; - const result = sut.definedAnnotations(binding); + const result = definedAnnotations(binding); expect(result).toEqual(expected); }); @@ -329,16 +399,19 @@ describe("definedAnnotations", () => { describe("definesAnnotations", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { annotations: null } }, false], [{ filters: { annotations: {} } }, false], [{ filters: { annotations: { annotation: "" } } }, true], [{ filters: { annotations: { anno: "tation" } } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + annotations: given.filters.annotations, + }, + }; - const result = sut.definesAnnotations(binding); + const result = definesAnnotations(binding); expect(result).toBe(expected); }); @@ -347,16 +420,16 @@ describe("definesAnnotations", () => { describe("carriedAnnotations", () => { //[ KuberneteObject, result ] it.each([ - [{}, {}], - [{ metadata: {} }, {}], - [{ metadata: { annotations: null } }, {}], [{ metadata: { annotations: {} } }, {}], [{ metadata: { annotations: { annotation: "" } } }, { annotation: "" }], [{ metadata: { annotations: { anno: "tation" } } }, { anno: "tation" }], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { annotations: given.metadata.annotations }, + }; - const result = sut.carriedAnnotations(binding); + const result = carriedAnnotations(kubernetesObject); expect(result).toEqual(expected); }); @@ -365,16 +438,16 @@ describe("carriedAnnotations", () => { describe("carriesAnnotations", () => { //[ KubernetesObject, result ] it.each([ - [{}, false], - [{ metadata: {} }, false], - [{ metadata: { annotations: null } }, false], [{ metadata: { annotations: {} } }, false], [{ metadata: { annotations: { annotation: "" } } }, true], [{ metadata: { annotations: { anno: "tation" } } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { annotations: given.metadata.annotations }, + }; - const result = sut.carriesAnnotations(binding); + const result = carriesAnnotations(kubernetesObject); expect(result).toBe(expected); }); @@ -383,16 +456,19 @@ describe("carriesAnnotations", () => { describe("definedLabels", () => { //[ Binding, result ] it.each([ - [{}, {}], - [{ filters: {} }, {}], - [{ filters: { labels: null } }, {}], [{ filters: { labels: {} } }, {}], [{ filters: { labels: { label: "" } } }, { label: "" }], [{ filters: { labels: { lab: "el" } } }, { lab: "el" }], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + labels: given.filters.labels, + }, + }; - const result = sut.definedLabels(binding); + const result = definedLabels(binding); expect(result).toEqual(expected); }); @@ -401,16 +477,19 @@ describe("definedLabels", () => { describe("definesLabels", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ filters: {} }, false], - [{ filters: { labels: null } }, false], [{ filters: { labels: {} } }, false], [{ filters: { labels: { label: "" } } }, true], [{ filters: { labels: { lab: "el" } } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + labels: given.filters.labels, + }, + }; - const result = sut.definesLabels(binding); + const result = definesLabels(binding); expect(result).toBe(expected); }); @@ -419,16 +498,16 @@ describe("definesLabels", () => { describe("carriedLabels", () => { //[ KubernetesObject, result ] it.each([ - [{}, {}], - [{ metadata: {} }, {}], - [{ metadata: { labels: null } }, {}], [{ metadata: { labels: {} } }, {}], [{ metadata: { labels: { label: "" } } }, { label: "" }], [{ metadata: { labels: { lab: "el" } } }, { lab: "el" }], ])("given %j, returns %j", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { labels: given.metadata.labels }, + }; - const result = sut.carriedLabels(binding); + const result = carriedLabels(kubernetesObject); expect(result).toEqual(expected); }); @@ -437,16 +516,16 @@ describe("carriedLabels", () => { describe("carriesLabels", () => { //[ KubernetesObject, result ] it.each([ - [{}, false], - [{ metadata: {} }, false], - [{ metadata: { labels: null } }, false], [{ metadata: { labels: {} } }, false], [{ metadata: { labels: { label: "" } } }, true], [{ metadata: { labels: { lab: "el" } } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const kubernetesObject = { + ...defaultKubernetesObject, + metadata: { labels: given.metadata.labels }, + }; - const result = sut.carriesLabels(binding); + const result = carriesLabels(kubernetesObject); expect(result).toBe(expected); }); @@ -455,17 +534,17 @@ describe("carriesLabels", () => { describe("definedEvent", () => { //[ Binding, result ] it.each([ - [{}, ""], - [{ event: "" }, ""], - [{ event: "nonsense" }, "nonsense"], [{ event: Event.CREATE }, Event.CREATE], [{ event: Event.CREATE_OR_UPDATE }, Event.CREATE_OR_UPDATE], [{ event: Event.UPDATE }, Event.UPDATE], [{ event: Event.DELETE }, Event.DELETE], ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + event: given.event, + }; - const result = sut.definedEvent(binding); + const result = definedEvent(binding); expect(result).toEqual(expected); }); @@ -474,17 +553,17 @@ describe("definedEvent", () => { describe("definesDelete", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ event: "" }, false], - [{ event: "nonsense" }, false], [{ event: Event.CREATE }, false], [{ event: Event.CREATE_OR_UPDATE }, false], [{ event: Event.UPDATE }, false], [{ event: Event.DELETE }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + event: given.event, + }; - const result = sut.definesDelete(binding); + const result = definesDelete(binding); expect(result).toEqual(expected); }); @@ -493,20 +572,33 @@ describe("definesDelete", () => { describe("misboundDeleteWithDeletionTimestamp", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ event: "" }, false], - [{ event: "nonsense" }, false], + [{ event: Event.DELETE, filters: { deletionTimestamp: false } }, false], + [{ event: Event.DELETE, filters: { deletionTimestamp: true } }, true], + ])("given %j, returns %s", (given, expected) => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, deletionTimestamp: given.filters.deletionTimestamp }, + event: given.event, + }; + + const result = misboundDeleteWithDeletionTimestamp(binding); + + expect(result).toEqual(expected); + }); +}); +describe("when filters are not set", () => { + it.each([ [{ event: Event.CREATE }, false], [{ event: Event.CREATE_OR_UPDATE }, false], [{ event: Event.UPDATE }, false], [{ event: Event.DELETE }, false], - [{ event: Event.DELETE, filters: {} }, false], - [{ event: Event.DELETE, filters: { deletionTimestamp: false } }, false], - [{ event: Event.DELETE, filters: { deletionTimestamp: true } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + event: given.event, + }; - const result = sut.misboundDeleteWithDeletionTimestamp(binding); + const result = misboundDeleteWithDeletionTimestamp(binding); expect(result).toEqual(expected); }); @@ -515,16 +607,15 @@ describe("misboundDeleteWithDeletionTimestamp", () => { describe("definedGroup", () => { //[ Binding, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], - [{ kind: {} }, ""], - [{ kind: { group: null } }, ""], [{ kind: { group: "" } }, ""], [{ kind: { group: "group" } }, "group"], ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: defaultBinding.kind.kind, group: given.kind.group }, + }; - const result = sut.definedGroup(binding); + const result = definedGroup(binding); expect(result).toEqual(expected); }); @@ -533,16 +624,15 @@ describe("definedGroup", () => { describe("definesGroup", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ kind: null }, false], - [{ kind: {} }, false], - [{ kind: { group: null } }, false], [{ kind: { group: "" } }, false], [{ kind: { group: "group" } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: defaultBinding.kind.kind, group: given.kind.group }, + }; - const result = sut.definesGroup(binding); + const result = definesGroup(binding); expect(result).toEqual(expected); }); @@ -551,16 +641,15 @@ describe("definesGroup", () => { describe("definedVersion", () => { //[ Binding, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], - [{ kind: {} }, ""], - [{ kind: { version: null } }, ""], [{ kind: { version: "" } }, ""], [{ kind: { version: "version" } }, "version"], ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: "some-kind", group: "some-group", version: given.kind.version }, + }; - const result = sut.definedVersion(binding); + const result = definedVersion(binding); expect(result).toEqual(expected); }); @@ -569,16 +658,15 @@ describe("definedVersion", () => { describe("definesVersion", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ kind: null }, false], - [{ kind: {} }, false], - [{ kind: { version: null } }, false], [{ kind: { version: "" } }, false], [{ kind: { version: "version" } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: "some-kind", group: "some-group", version: given.kind.version }, + }; - const result = sut.definesVersion(binding); + const result = definesVersion(binding); expect(result).toEqual(expected); }); @@ -587,16 +675,15 @@ describe("definesVersion", () => { describe("definedKind", () => { //[ Binding, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], - [{ kind: {} }, ""], - [{ kind: { kind: null } }, ""], [{ kind: { kind: "" } }, ""], [{ kind: { kind: "kind" } }, "kind"], ])("given %j, returns '%s'", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: given.kind.kind, group: defaultBinding.kind.group }, + }; - const result = sut.definedKind(binding); + const result = definedKind(binding); expect(result).toEqual(expected); }); @@ -605,16 +692,15 @@ describe("definedKind", () => { describe("definesKind", () => { //[ Binding, result ] it.each([ - [{}, false], - [{ kind: null }, false], - [{ kind: {} }, false], - [{ kind: { kind: null } }, false], [{ kind: { kind: "" } }, false], [{ kind: { kind: "kind" } }, true], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + kind: { kind: given.kind.kind, group: defaultBinding.kind.group }, + }; - const result = sut.definesKind(binding); + const result = definesKind(binding); expect(result).toEqual(expected); }); @@ -629,16 +715,21 @@ describe("definedCategory", () => { [{ isWatch: true }, "Watch"], [{ isFinalize: true, isWatch: true }, "Finalize"], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + ...given, + }; - const result = sut.definedCategory(binding); + const result = definedCategory(binding); expect(result).toEqual(expected); }); }); describe("definedCallback", () => { - const validateCallback = () => {}; + const validateCallback = (): ValidateActionResponse => { + return { allowed: false }; + }; const mutateCallback = () => {}; const watchCallback = () => {}; const finalizeCallback = () => {}; @@ -651,16 +742,21 @@ describe("definedCallback", () => { [{ isWatch: true, watchCallback }, watchCallback], [{ isFinalize: true, finalizeCallback }, finalizeCallback], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + ...given, + }; - const result = sut.definedCallback(binding); + const result = definedCallback(binding); expect(result).toEqual(expected); }); }); describe("definedCallbackName", () => { - const validateCallback = () => {}; + const validateCallback = (): ValidateActionResponse => { + return { allowed: false }; + }; const mutateCallback = () => {}; const watchCallback = () => {}; const finalizeCallback = () => {}; @@ -673,9 +769,12 @@ describe("definedCallbackName", () => { [{ isWatch: true, watchCallback }, "watchCallback"], [{ isFinalize: true, finalizeCallback }, "finalizeCallback"], ])("given %j, returns %s", (given, expected) => { - const binding = given as DeepPartial; + const binding: Binding = { + ...defaultBinding, + ...given, + }; - const result = sut.definedCallbackName(binding); + const result = definedCallbackName(binding); expect(result).toEqual(expected); }); diff --git a/src/lib/filter/adjudicators/bindingKubernetesObjectAdjudicators.test.ts b/src/lib/filter/adjudicators/bindingKubernetesObjectAdjudicators.test.ts index eeeedaa50..7071c8a6b 100644 --- a/src/lib/filter/adjudicators/bindingKubernetesObjectAdjudicators.test.ts +++ b/src/lib/filter/adjudicators/bindingKubernetesObjectAdjudicators.test.ts @@ -1,24 +1,37 @@ -/* eslint-disable max-statements */ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { expect, describe, it } from "@jest/globals"; -import * as sut from "../adjudicators"; import { KubernetesObject } from "kubernetes-fluent-client"; import { Binding, DeepPartial } from "../../types"; +import { + mismatchedName, + mismatchedDeletionTimestamp, + mismatchedNameRegex, + mismatchedNamespace, + mismatchedNamespaceRegex, + mismatchedAnnotations, + mismatchedLabels, + metasMismatch, +} from "../adjudicators"; +import { defaultBinding, defaultFilters, defaultKubernetesObject } from "./defaultTestObjects"; describe("mismatchedName", () => { //[ Binding, KubernetesObject, result ] it.each([ - [{}, {}, false], - [{}, { metadata: { name: "name" } }, false], [{ filters: { name: "name" } }, {}, true], [{ filters: { name: "name" } }, { metadata: { name: "name" } }, false], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { - const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, name: bnd.filters.name }, + }; + const kubernetesObject: KubernetesObject = { + ...defaultKubernetesObject, + metadata: "metadata" in obj ? obj.metadata : defaultKubernetesObject.metadata, + }; - const result = sut.mismatchedName(binding, object); + const result = mismatchedName(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -33,9 +46,9 @@ describe("mismatchedDeletionTimestamp", () => { [{ filters: { deletionTimestamp: true } }, { metadata: { deletionTimestamp: new Date() } }, false], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const kubernetesObject = obj as DeepPartial; - const result = sut.mismatchedDeletionTimestamp(binding, object); + const result = mismatchedDeletionTimestamp(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -55,9 +68,9 @@ describe("mismatchedNameRegex", () => { [{ filters: { regexName: "^n[aeiou]me$" } }, { metadata: { name: "n3me" } }, true], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const kubernetesObject = obj as DeepPartial; - const result = sut.mismatchedNameRegex(binding, object); + const result = mismatchedNameRegex(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -73,9 +86,9 @@ describe("mismatchedNamespace", () => { [{ filters: { namespaces: ["namespace"] } }, { metadata: { namespace: "namespace" } }, false], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const kubernetesObject = obj as DeepPartial; - const result = sut.mismatchedNamespace(binding, object); + const result = mismatchedNamespace(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -83,30 +96,35 @@ describe("mismatchedNamespace", () => { describe("mismatchedNamespaceRegex", () => { //[ Binding, KubernetesObject, result ] - it.each([ - [{}, {}, false], - [{}, { metadata: { namespace: "namespace" } }, false], - [{ filters: { regexNamespaces: ["^n.mespace$"] } }, {}, true], + const testRegex1 = "^n.mespace$"; //regexr.com/89l8u + const testRegex2 = "^n[aeiou]mespace$"; //regexr.com/89l8f + const testRegex3 = "^n[aeiou]me$"; //regexr.com/89l8l + const testRegex4 = "^sp[aeiou]ce$"; //regexr.com/89l8o - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "namespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nemespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nimespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "nomespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "numespace" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]mespace$"] } }, { metadata: { namespace: "n3mespace" } }, true], - - [{ filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, { metadata: { namespace: "name" } }, false], - [{ filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, { metadata: { namespace: "space" } }, false], - [ - { filters: { regexNamespaces: ["^n[aeiou]me$", "^sp[aeiou]ce$"] } }, - { metadata: { namespace: "namespace" } }, - true, - ], + it.each([ + [{ filters: { regexNamespaces: [testRegex1] } }, {}, true], + + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "namespace" } }, false], + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "nemespace" } }, false], + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "nimespace" } }, false], + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "nomespace" } }, false], + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "numespace" } }, false], + [{ filters: { regexNamespaces: [testRegex2] } }, { metadata: { namespace: "n3mespace" } }, true], + + [{ filters: { regexNamespaces: [testRegex3, testRegex4] } }, { metadata: { namespace: "name" } }, false], + [{ filters: { regexNamespaces: [testRegex3, testRegex4] } }, { metadata: { namespace: "space" } }, false], + [{ filters: { regexNamespaces: [testRegex3, testRegex4] } }, { metadata: { namespace: "namespace" } }, true], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { - const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, regexNamespaces: bnd.filters.regexNamespaces }, + }; + const kubernetesObject: KubernetesObject = { + ...defaultKubernetesObject, + metadata: "metadata" in obj ? obj.metadata : defaultKubernetesObject.metadata, + }; - const result = sut.mismatchedNamespaceRegex(binding, object); + const result = mismatchedNamespaceRegex(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -138,9 +156,9 @@ describe("mismatchedAnnotations", () => { ], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const kubernetesObject = obj as DeepPartial; - const result = sut.mismatchedAnnotations(binding, object); + const result = mismatchedAnnotations(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -166,9 +184,9 @@ describe("mismatchedLabels", () => { [{ filters: { labels: { l: "a", b: "le" } } }, { metadata: { labels: { l: "a", b: "le" } } }, false], ])("given binding %j and object %j, returns %s", (bnd, obj, expected) => { const binding = bnd as DeepPartial; - const object = obj as DeepPartial; + const kubernetesObject = obj as DeepPartial; - const result = sut.mismatchedLabels(binding, object); + const result = mismatchedLabels(binding, kubernetesObject); expect(result).toBe(expected); }); @@ -194,7 +212,7 @@ describe("metasMismatch", () => { [{ an: "no", ta: "te" }, { an: "no", ta: "te" }, false], [{ an: "no", ta: "te" }, { an: "no", ta: "to" }, true], ])("given left %j and right %j, returns %s", (bnd, obj, expected) => { - const result = sut.metasMismatch(bnd, obj); + const result = metasMismatch(bnd, obj); expect(result).toBe(expected); }); diff --git a/src/lib/filter/adjudicators/defaultTestObjects.ts b/src/lib/filter/adjudicators/defaultTestObjects.ts new file mode 100644 index 000000000..3b584308b --- /dev/null +++ b/src/lib/filter/adjudicators/defaultTestObjects.ts @@ -0,0 +1,46 @@ +import { GroupVersionKind, kind, KubernetesObject } from "kubernetes-fluent-client"; +import { Event, Operation } from "../../enums"; +import { AdmissionRequest, Binding, Filters } from "../../types"; + +export const defaultFilters: Filters = { + annotations: {}, + deletionTimestamp: false, + labels: {}, + name: "", + namespaces: [], + regexName: "^default$", + regexNamespaces: [] as string[], +}; + +const defaultGroupVersionKind: GroupVersionKind = { + kind: "some-kind", + group: "some-group", +}; + +export const defaultBinding: Binding = { + event: Event.ANY, + filters: defaultFilters, + kind: defaultGroupVersionKind, + model: kind.Pod, + isFinalize: false, + isMutate: false, + isQueue: false, + isValidate: false, + isWatch: false, +}; + +export const defaultAdmissionRequest: AdmissionRequest = { + uid: "some-uid", + kind: { kind: "a-kind", group: "a-group" }, + resource: { group: "some-group", version: "some-version", resource: "some-resource" }, + operation: Operation.CONNECT, + name: "some-name", + userInfo: {}, + object: {}, +}; + +export const defaultKubernetesObject: KubernetesObject = { + apiVersion: "some-version", + kind: "some-kind", + metadata: { name: "some-name" }, +}; diff --git a/src/lib/filter/adjudicators/requestAdjudicators.test.ts b/src/lib/filter/adjudicators/requestAdjudicators.test.ts index 6ab471114..ebb3bff7c 100644 --- a/src/lib/filter/adjudicators/requestAdjudicators.test.ts +++ b/src/lib/filter/adjudicators/requestAdjudicators.test.ts @@ -2,126 +2,75 @@ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { expect, describe, it } from "@jest/globals"; -import * as sut from "../adjudicators"; import { Operation } from "../../enums"; -import { GroupVersionKind } from "kubernetes-fluent-client"; +import { AdmissionRequest } from "../../types"; +import { defaultAdmissionRequest } from "./defaultTestObjects"; +import { declaredUid, declaredKind, declaredVersion, declaredGroup, declaredOperation } from "../adjudicators"; describe("declaredUid", () => { - const defaultAdmissionRequest = { - uid: undefined, - kind: { kind: "a-kind", group: "a-group" }, - group: "a-group", - resource: { group: "some-group", version: "some-version", resource: "some-resource" }, - operation: Operation.CONNECT, - name: "some-name", - userInfo: {}, - object: {}, - }; //[ AdmissionRequest, result ] - it.each([ - [{}, ""], - [{ uid: null }, ""], - [{ uid: "uid" }, "uid"], - ])("given %j, returns '%s'", (given, expected) => { - const request = { + it.each([[{ uid: "uid" }, "uid"]])("given %j, returns '%s'", (given, expected) => { + const admissionRequest: AdmissionRequest = { ...defaultAdmissionRequest, - uid: ("uid" in given ? given.uid : (undefined as unknown as string)) as string, + uid: given.uid, }; - const result = sut.declaredUid(request); + const result = declaredUid(admissionRequest); expect(result).toEqual(expected); }); }); describe("declaredKind", () => { - const defaultAdmissionRequest = { - uid: "some-uid", - kind: undefined, - group: "a-group", - resource: { group: "some-group", version: "some-version", resource: "some-resource" }, - operation: Operation.CONNECT, - name: "some-name", - userInfo: {}, - object: {}, - }; //[ AdmissionRequest, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], - [{ kind: {} }, ""], - [{ kind: { kind: null } }, ""], [{ kind: { kind: "" } }, ""], [{ kind: { kind: "kind" } }, "kind"], ])("given %j, returns '%s'", (given, expected) => { - const request = { + const admissionRequest: AdmissionRequest = { ...defaultAdmissionRequest, - kind: ("kind" in given ? given.kind : (undefined as unknown as string)) as GroupVersionKind, + kind: { kind: given.kind.kind, group: defaultAdmissionRequest.kind.group }, }; - const result = sut.declaredKind(request); + const result = declaredKind(admissionRequest); expect(result).toEqual(expected); }); }); describe("declaredVersion", () => { - const defaultAdmissionRequest = { - uid: "some-uid", - kind: undefined, - group: "a-group", - resource: { group: "some-group", version: "some-version", resource: "some-resource" }, - operation: Operation.CONNECT, - name: "some-name", - userInfo: {}, - object: {}, - }; //[ AdmissionRequest, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], [{ kind: {} }, ""], - [{ kind: { version: null } }, ""], [{ kind: { version: "" } }, ""], [{ kind: { version: "version" } }, "version"], ])("given %j, returns '%s'", (given, expected) => { - const request = { + const admissionRequest: AdmissionRequest = { ...defaultAdmissionRequest, - kind: ("kind" in given ? given.kind : (undefined as unknown as string)) as GroupVersionKind, + kind: + "version" in given.kind + ? { ...defaultAdmissionRequest.kind, version: given.kind.version } + : defaultAdmissionRequest.kind, }; - const result = sut.declaredVersion(request); + const result = declaredVersion(admissionRequest); expect(result).toEqual(expected); }); }); describe("declaredGroup", () => { - const defaultAdmissionRequest = { - uid: "some-uid", - kind: undefined, - group: "a-group", - resource: { group: "some-group", version: "some-version", resource: "some-resource" }, - operation: Operation.CONNECT, - name: "some-name", - userInfo: {}, - object: {}, - }; //[ AdmissionRequest, result ] it.each([ - [{}, ""], - [{ kind: null }, ""], - [{ kind: {} }, ""], - [{ kind: { group: null } }, ""], [{ kind: { group: "" } }, ""], [{ kind: { group: "group" } }, "group"], ])("given %j, returns '%s'", (given, expected) => { - const request = { + const admissionRequest: AdmissionRequest = { ...defaultAdmissionRequest, - kind: ("kind" in given ? given.kind : (undefined as unknown as string)) as GroupVersionKind, + kind: { ...defaultAdmissionRequest.kind, group: given.kind.group }, }; - const result = sut.declaredGroup(request); + const result = declaredGroup(admissionRequest); expect(result).toEqual(expected); }); @@ -139,10 +88,6 @@ describe("declaredOperation", () => { }; //[ AdmissionRequest, result ] it.each([ - [{}, ""], - [{ operation: null }, ""], - [{ operation: "" }, ""], - [{ operation: "operation" }, "operation"], [{ operation: Operation.CONNECT }, Operation.CONNECT], [{ operation: Operation.CREATE }, Operation.CREATE], [{ operation: Operation.UPDATE }, Operation.UPDATE], @@ -150,10 +95,10 @@ describe("declaredOperation", () => { ])("given %j, returns '%s'", (given, expected) => { const request = { ...defaultAdmissionRequest, - operation: ("operation" in given ? given.operation : (undefined as unknown as string)) as Operation, + operation: given.operation, }; - const result = sut.declaredOperation(request); + const result = declaredOperation(request); expect(result).toEqual(expected); }); diff --git a/src/lib/filter/filter.test.ts b/src/lib/filter/filter.test.ts index a008945f3..2fb391632 100644 --- a/src/lib/filter/filter.test.ts +++ b/src/lib/filter/filter.test.ts @@ -9,9 +9,9 @@ import { shouldSkipRequest } from "./filter"; import { AdmissionRequest, Binding } from "../types"; import { Event } from "../enums"; -export const callback = () => undefined; +const callback = () => undefined; -export const podKind = modelToGroupVersionKind(kind.Pod.name); +const podKind = modelToGroupVersionKind(kind.Pod.name); describe("Fuzzing shouldSkipRequest", () => { test("should handle random inputs without crashing", () => { @@ -198,7 +198,7 @@ test("create: should not reject when regex namespace does match", () => { filters: { name: "", namespaces: [], - regexNamespaces: ["^helm"], + regexNamespaces: [new RegExp("^helm").source], regexName: "", labels: {}, annotations: {}, @@ -218,7 +218,7 @@ test("create: should reject when regex namespace does not match", () => { filters: { name: "", namespaces: [], - regexNamespaces: ["^argo"], + regexNamespaces: [new RegExp("^argo").source], regexName: "", labels: {}, annotations: {}, @@ -240,7 +240,7 @@ test("delete: should reject when regex namespace does not match", () => { filters: { name: "", namespaces: [], - regexNamespaces: ["^argo"], + regexNamespaces: [new RegExp("^argo").source], regexName: "", labels: {}, annotations: {}, @@ -262,7 +262,7 @@ test("delete: should not reject when regex namespace does match", () => { filters: { name: "", namespaces: [], - regexNamespaces: ["^helm"], + regexNamespaces: [new RegExp("^helm").source], regexName: "", labels: {}, annotations: {}, diff --git a/src/lib/filter/shouldSkipRequest.test.ts b/src/lib/filter/shouldSkipRequest.test.ts index 0c432300c..8cac7f733 100644 --- a/src/lib/filter/shouldSkipRequest.test.ts +++ b/src/lib/filter/shouldSkipRequest.test.ts @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2023-Present The Pepr Authors import { expect, describe, it } from "@jest/globals"; -import { kind, modelToGroupVersionKind } from "kubernetes-fluent-client"; +import { kind } from "kubernetes-fluent-client"; import * as fc from "fast-check"; import { AdmissionRequestCreateClusterRole, @@ -11,48 +11,18 @@ import { AdmissionRequestDeletePod, } from "../../fixtures/loader"; import { shouldSkipRequest } from "./filter"; -import { AdmissionRequest, Binding } from "../types"; +import { AdmissionRequest, Binding, Filters } from "../types"; import { Event } from "../enums"; +import { defaultFilters } from "./adjudicators/defaultTestObjects"; +import { clusterScopedBinding, groupBinding, podKind } from "../helpers.test"; -export const callback = () => undefined; - -export const podKind = modelToGroupVersionKind(kind.Pod.name); -export const deploymentKind = modelToGroupVersionKind(kind.Deployment.name); -export const clusterRoleKind = modelToGroupVersionKind(kind.ClusterRole.name); - -const defaultFilters = { - annotations: {}, - deletionTimestamp: false, - labels: {}, - name: "", - namespaces: [], - regexName: "^default$", - regexNamespaces: [], -}; -const defaultBinding = { - callback, +const defaultBinding: Binding = { event: Event.ANY, filters: defaultFilters, kind: podKind, model: kind.Pod, }; -export const groupBinding = { - callback, - event: Event.CREATE, - filters: defaultFilters, - kind: deploymentKind, - model: kind.Deployment, -}; - -export const clusterScopedBinding = { - callback, - event: Event.DELETE, - filters: defaultFilters, - kind: clusterRoleKind, - model: kind.ClusterRole, -}; - describe("when fuzzing shouldSkipRequest", () => { it("should handle random inputs without crashing", () => { fc.assert( @@ -155,7 +125,7 @@ describe("when a binding contains a group scoped object", () => { ); }); it("should not skip request when the group is the same", () => { - const groupBindingNoRegex = { + const groupBindingNoRegex: Binding = { ...groupBinding, filters: { ...groupBinding.filters, @@ -170,7 +140,7 @@ describe("when a capability defines namespaces and the admission request object const capabilityNamespaces = ["monitoring"]; const admissionRequestCreateClusterRole = AdmissionRequestCreateClusterRole(); it("should skip request when the capability namespace does not exist on the object", () => { - const binding = { + const binding: Binding = { ...clusterScopedBinding, event: Event.CREATE, filters: { @@ -188,7 +158,7 @@ describe("when a binding contains a cluster scoped object", () => { const admissionRequestCreateClusterRole = AdmissionRequestCreateClusterRole(); it("should skip request when the binding defines a namespace on a cluster scoped object", () => { - const clusterScopedBindingWithNamespace = { + const clusterScopedBindingWithNamespace: Binding = { ...clusterScopedBinding, event: Event.CREATE, filters: { @@ -211,41 +181,41 @@ describe("when a pod is created", () => { }); it("should not reject when regex name does match", () => { - const filters = { ...defaultFilters, regexName: "^cool" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "^cool" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toBe(""); }); it("should not reject when regex namespace does match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, - regexNamespaces: ["^helm"], + regexNamespaces: [new RegExp("^helm").source], regexName: "", }; - const binding = { ...defaultBinding, filters }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toBe(""); }); it("should reject when regex namespace does not match", () => { - const filters = { ...defaultFilters, regexNamespaces: ["^argo"] }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexNamespaces: [new RegExp("^argo").source] }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch( /Ignoring Admission Callback: Binding defines namespace regexes '.+' but Object carries '.+'./, ); }); it("should not reject when namespace is not ignored", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch(""); }); it("should reject when namespace is ignored", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [], ["helm-releasename"])).toMatch( /Ignoring Admission Callback: Object carries namespace '.+' but ignored namespaces include '.+'./, @@ -255,8 +225,8 @@ describe("when a pod is created", () => { describe("when a pod is deleted", () => { it("should reject when regex name does not match", () => { - const filters = { ...defaultFilters, regexName: "^default$" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "^default$" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestDeletePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch( /Ignoring Admission Callback: Binding defines name regex '.+' but Object carries '.+'./, @@ -264,15 +234,15 @@ describe("when a pod is deleted", () => { }); it("should not reject when regex name does match", () => { - const filters = { ...defaultFilters, regexName: "^cool" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "^cool" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestDeletePod(); expect(shouldSkipRequest(binding, pod, [])).toBe(""); }); it("should reject when regex namespace does not match", () => { - const filters = { ...defaultFilters, regexNamespaces: ["^argo"] }; - const binding = { + const filters: Filters = { ...defaultFilters, regexNamespaces: [new RegExp("eargo").source] }; + const binding: Binding = { ...defaultBinding, filters, }; @@ -283,15 +253,15 @@ describe("when a pod is deleted", () => { }); it("should not reject when regex namespace does match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, - regexNamespaces: ["^helm"], + regexNamespaces: [new RegExp("^helm").source], regexName: "", labels: {}, annotations: {}, deletionTimestamp: false, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -300,8 +270,8 @@ describe("when a pod is deleted", () => { }); it("should reject when name does not match", () => { - const filters = { ...defaultFilters, name: "bleh", regexName: "^not-cool" }; - const binding = { + const filters: Filters = { ...defaultFilters, name: "bleh", regexName: "^not-cool" }; + const binding: Binding = { ...defaultBinding, filters, }; @@ -312,8 +282,8 @@ describe("when a pod is deleted", () => { }); it("should reject when namespace is ignored", () => { - const filters = { ...defaultFilters, regexName: "", namespaces: [] }; - const binding = { + const filters: Filters = { ...defaultFilters, regexName: "", namespaces: [] }; + const binding: Binding = { ...defaultBinding, filters, }; @@ -324,11 +294,10 @@ describe("when a pod is deleted", () => { }); it("should not reject when namespace is not ignored", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, filters, - callback, }; const pod = AdmissionRequestDeletePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch(""); @@ -336,8 +305,8 @@ describe("when a pod is deleted", () => { }); it("should reject when kind does not match", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, kind: { group: "", @@ -345,7 +314,6 @@ it("should reject when kind does not match", () => { kind: "Nope", }, filters, - callback, }; const pod = AdmissionRequestCreatePod(); @@ -355,8 +323,8 @@ it("should reject when kind does not match", () => { }); it("should reject when group does not match", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, kind: { group: "Nope", @@ -364,7 +332,6 @@ it("should reject when group does not match", () => { kind: "Pod", }, filters, - callback, }; const pod = AdmissionRequestCreatePod(); @@ -374,8 +341,8 @@ it("should reject when group does not match", () => { }); it("should reject when version does not match", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, kind: { group: "", @@ -383,7 +350,6 @@ it("should reject when version does not match", () => { kind: "Pod", }, filters, - callback, }; const pod = AdmissionRequestCreatePod(); @@ -393,25 +359,25 @@ it("should reject when version does not match", () => { }); it("should allow when group, version, and kind match", () => { - const filters = { ...defaultFilters, regexName: "" }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, regexName: "" }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toBe(""); }); it("should allow when kind match and others are empty", () => { - const filters = { ...defaultFilters, regexName: "" }; + const filters: Filters = { ...defaultFilters, regexName: "" }; - const binding = { ...defaultBinding, filters }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toBe(""); }); it("should reject when the capability namespace does not match", () => { - const filters = { ...defaultFilters }; - const binding = { + const filters: Filters = { ...defaultFilters }; + const binding: Binding = { ...defaultBinding, filters, }; @@ -423,8 +389,8 @@ it("should reject when the capability namespace does not match", () => { }); it("should reject when namespace does not match", () => { - const filters = { ...defaultFilters, namespaces: ["bleh"] }; - const binding = { ...defaultBinding, filters }; + const filters: Filters = { ...defaultFilters, namespaces: ["bleh"] }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch( @@ -433,7 +399,7 @@ it("should reject when namespace does not match", () => { }); it("should allow when namespace is match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, namespaces: ["helm-releasename", "unicorn", "things"], labels: {}, @@ -442,7 +408,7 @@ it("should allow when namespace is match", () => { regexNamespaces: [], regexName: "", }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -452,13 +418,13 @@ it("should allow when namespace is match", () => { }); it("should reject when label does not match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, labels: { foo: "bar", }, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -470,7 +436,7 @@ it("should reject when label does not match", () => { }); it("should allow when label is match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, regexName: "", labels: { @@ -479,7 +445,7 @@ it("should allow when label is match", () => { }, annotations: {}, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -496,13 +462,13 @@ it("should allow when label is match", () => { }); it("should reject when annotation does not match", () => { - const filters = { + const filters: Filters = { ...defaultFilters, annotations: { foo: "bar", }, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -514,7 +480,7 @@ it("should reject when annotation does not match", () => { }); it("should allow when annotation is match", () => { - const filters = { + const filters: Filters = { name: "", namespaces: [], labels: {}, @@ -526,7 +492,7 @@ it("should allow when annotation is match", () => { regexNamespaces: [], regexName: "", }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -543,7 +509,7 @@ it("should allow when annotation is match", () => { }); it("should use `oldObject` when the operation is `DELETE`", () => { - const filters = { + const filters: Filters = { ...defaultFilters, regexNamespaces: [], regexName: "", @@ -553,7 +519,7 @@ it("should use `oldObject` when the operation is `DELETE`", () => { }, annotations: {}, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -564,7 +530,7 @@ it("should use `oldObject` when the operation is `DELETE`", () => { }); it("should allow when deletionTimestamp is present on pod", () => { - const filters = { + const filters: Filters = { name: "", namespaces: [], labels: {}, @@ -576,7 +542,7 @@ it("should allow when deletionTimestamp is present on pod", () => { }, deletionTimestamp: true, }; - const binding = { + const binding: Binding = { ...defaultBinding, filters, }; @@ -594,7 +560,7 @@ it("should allow when deletionTimestamp is present on pod", () => { }); it("should reject when deletionTimestamp is not present on pod", () => { - const filters = { + const filters: Filters = { ...defaultFilters, regexName: "", annotations: { @@ -603,7 +569,7 @@ it("should reject when deletionTimestamp is not present on pod", () => { }, deletionTimestamp: true, }; - const binding = { ...defaultBinding, filters }; + const binding: Binding = { ...defaultBinding, filters }; const pod = AdmissionRequestCreatePod(); pod.object.metadata = pod.object.metadata || {}; @@ -619,13 +585,13 @@ it("should reject when deletionTimestamp is not present on pod", () => { }); describe("when multiple filters are triggered", () => { - const filters = { + const filters: Filters = { ...defaultFilters, regexName: "asdf", name: "not-a-match", namespaces: ["not-allowed", "also-not-matching"], }; - const binding = { ...defaultBinding, filters }; + const binding: Binding = { ...defaultBinding, filters }; it("should display the failure message for the first matching filter", () => { const pod = AdmissionRequestCreatePod(); expect(shouldSkipRequest(binding, pod, [])).toMatch( diff --git a/src/lib/helpers.test.ts b/src/lib/helpers.test.ts index e093c24c4..8fdfd5511 100644 --- a/src/lib/helpers.test.ts +++ b/src/lib/helpers.test.ts @@ -6,7 +6,6 @@ import { Event } from "./enums"; import { addVerbIfNotExists, bindingAndCapabilityNSConflict, - createDirectoryIfNotExists, createRBACMap, filterNoMatchReason, dedent, @@ -25,28 +24,30 @@ import { } from "./helpers"; import { sanitizeResourceName } from "../sdk/sdk"; import * as fc from "fast-check"; -import { expect, describe, test, jest, beforeEach, afterEach } from "@jest/globals"; -import { promises as fs } from "fs"; +import { expect, describe, jest, beforeEach, afterEach, it } from "@jest/globals"; import { SpiedFunction } from "jest-mock"; -import { KubernetesObject, kind } from "kubernetes-fluent-client"; +import { KubernetesObject, kind, modelToGroupVersionKind } from "kubernetes-fluent-client"; +import { defaultFilters, defaultKubernetesObject, defaultBinding } from "./filter/adjudicators/defaultTestObjects"; export const callback = () => undefined; -jest.mock("kubernetes-fluent-client", () => { - return { - K8s: jest.fn(), - kind: jest.fn(), - }; -}); +export const podKind = modelToGroupVersionKind(kind.Pod.name); +export const deploymentKind = modelToGroupVersionKind(kind.Deployment.name); +export const clusterRoleKind = modelToGroupVersionKind(kind.ClusterRole.name); -jest.mock("fs", () => { - return { - promises: { - access: jest.fn(), - mkdir: jest.fn(), - }, - }; -}); +export const groupBinding: Binding = { + event: Event.CREATE, + filters: defaultFilters, + kind: deploymentKind, + model: kind.Deployment, +}; + +export const clusterScopedBinding: Binding = { + event: Event.DELETE, + filters: defaultFilters, + kind: clusterRoleKind, + model: kind.ClusterRole, +}; const mockCapabilities: CapabilityExport[] = JSON.parse(`[ { @@ -295,7 +296,7 @@ const mockCapabilities: CapabilityExport[] = JSON.parse(`[ ]`); describe("validateCapabilityNames Property-Based Tests", () => { - test("should only accept names that are valid after sanitation", () => { + it("should only accept names that are valid after sanitation", () => { fc.assert( fc.property( fc.array( @@ -320,24 +321,24 @@ describe("validateCapabilityNames Property-Based Tests", () => { }); describe("validateCapabilityNames", () => { - test("should return true if all capability names are valid", () => { + it("should return true if all capability names are valid", () => { const capabilities = mockCapabilities; expect(() => validateCapabilityNames(capabilities)).not.toThrow(); }); - test("should throw an error if a capability name is invalid", () => { + it("should throw an error if a capability name is invalid", () => { const capabilities = mockCapabilities; capabilities[0].name = "invalid name"; expect(() => validateCapabilityNames(capabilities)).toThrowError(ValidationError); }); - test("should ignore when capabilities are not loaded", () => { + it("should ignore when capabilities are not loaded", () => { expect(validateCapabilityNames(undefined)).toBe(undefined); }); }); describe("createRBACMap", () => { - test("should return the correct RBACMap for given capabilities", () => { + it("should return the correct RBACMap for given capabilities", () => { const result = createRBACMap(mockCapabilities); const expected = { @@ -358,163 +359,124 @@ describe("createRBACMap", () => { }); describe("addVerbIfNotExists", () => { - test("should add a verb if it does not exist in the array", () => { + it("should add a verb if it does not exist in the array", () => { const verbs = ["get", "list"]; addVerbIfNotExists(verbs, "watch"); expect(verbs).toEqual(["get", "list", "watch"]); }); - test("should not add a verb if it already exists in the array", () => { + it("should not add a verb if it already exists in the array", () => { const verbs = ["get", "list", "watch"]; addVerbIfNotExists(verbs, "get"); expect(verbs).toEqual(["get", "list", "watch"]); // The array remains unchanged }); }); -describe("createDirectoryIfNotExists function", () => { - test("should create a directory if it doesn't exist", async () => { - (fs.access as jest.Mock).mockRejectedValue({ code: "ENOENT" } as never); - (fs.mkdir as jest.Mock).mockResolvedValue(undefined as never); - - const directoryPath = "/pepr/pepr-test-module/asdf"; - - await createDirectoryIfNotExists(directoryPath); - - expect(fs.access).toHaveBeenCalledWith(directoryPath); - expect(fs.mkdir).toHaveBeenCalledWith(directoryPath, { recursive: true }); - }); - - test("should not create a directory if it already exists", async () => { - jest.resetAllMocks(); - (fs.access as jest.Mock).mockResolvedValue(undefined as never); - - const directoryPath = "/pepr/pepr-test-module/asdf"; - - await createDirectoryIfNotExists(directoryPath); - - expect(fs.access).toHaveBeenCalledWith(directoryPath); - expect(fs.mkdir).not.toHaveBeenCalled(); - }); - - test("should throw an error for other fs.access errors", async () => { - jest.resetAllMocks(); - (fs.access as jest.Mock).mockRejectedValue({ code: "ERROR" } as never); - - const directoryPath = "/pepr/pepr-test-module/asdf"; - - try { - await createDirectoryIfNotExists(directoryPath); - } catch (error) { - expect(error.code).toEqual("ERROR"); - } - }); -}); - describe("hasAnyOverlap", () => { - test("returns true for overlapping arrays", () => { + it("returns true for overlapping arrays", () => { expect(hasAnyOverlap([1, 2, 3], [3, 4, 5])).toBe(true); }); - test("returns false for non-overlapping arrays", () => { + it("returns false for non-overlapping arrays", () => { expect(hasAnyOverlap([1, 2, 3], [4, 5, 6])).toBe(false); }); - test("returns false for empty arrays", () => { + it("returns false for empty arrays", () => { expect(hasAnyOverlap([], [1, 2, 3])).toBe(false); expect(hasAnyOverlap([1, 2, 3], [])).toBe(false); }); - test("returns false for two empty arrays", () => { + it("returns false for two empty arrays", () => { expect(hasAnyOverlap([], [])).toBe(false); }); }); describe("hasEveryOverlap", () => { - test("returns true if all elements in array1 are in array2", () => { + it("returns true if all elements in array1 are in array2", () => { expect(hasEveryOverlap([1, 2], [1, 2, 3])).toBe(true); }); - test("returns false if any element in array1 is not in array2", () => { + it("returns false if any element in array1 is not in array2", () => { expect(hasEveryOverlap([1, 2, 4], [1, 2, 3])).toBe(false); }); - test("returns true if array1 is empty", () => { + it("returns true if array1 is empty", () => { expect(hasEveryOverlap([], [1, 2, 3])).toBe(true); }); - test("returns false if array2 is empty", () => { + it("returns false if array2 is empty", () => { expect(hasEveryOverlap([1, 2], [])).toBe(false); }); - test("returns true if both arrays are empty", () => { + it("returns true if both arrays are empty", () => { expect(hasEveryOverlap([], [])).toBe(true); }); }); describe("ignoredNamespaceConflict", () => { - test("returns true if there is an overlap", () => { + it("returns true if there is an overlap", () => { expect(ignoredNamespaceConflict(["ns1", "ns2"], ["ns2", "ns3"])).toBe(true); }); - test("returns false if there is no overlap", () => { + it("returns false if there is no overlap", () => { expect(ignoredNamespaceConflict(["ns1", "ns2"], ["ns3", "ns4"])).toBe(false); }); - test("returns false if either array is empty", () => { + it("returns false if either array is empty", () => { expect(ignoredNamespaceConflict([], ["ns1", "ns2"])).toBe(false); expect(ignoredNamespaceConflict(["ns1", "ns2"], [])).toBe(false); }); - test("returns false if both arrays are empty", () => { + it("returns false if both arrays are empty", () => { expect(ignoredNamespaceConflict([], [])).toBe(false); }); }); describe("bindingAndCapabilityNSConflict", () => { - test("returns false if capabilityNamespaces is empty", () => { + it("returns false if capabilityNamespaces is empty", () => { expect(bindingAndCapabilityNSConflict(["ns1", "ns2"], [])).toBe(false); }); - test("returns true if capability namespaces are not empty and there is no overlap with binding namespaces", () => { + it("returns true if capability namespaces are not empty and there is no overlap with binding namespaces", () => { expect(bindingAndCapabilityNSConflict(["ns1", "ns2"], ["ns3", "ns4"])).toBe(true); }); - test("returns true if capability namespaces are not empty and there is an overlap", () => { + it("returns true if capability namespaces are not empty and there is an overlap", () => { expect(bindingAndCapabilityNSConflict(["ns1", "ns2"], ["ns2", "ns3"])).toBe(true); }); - test("returns false if both arrays are empty", () => { + it("returns false if both arrays are empty", () => { expect(bindingAndCapabilityNSConflict([], [])).toBe(false); }); }); describe("generateWatchNamespaceError", () => { - test("returns error for ignored namespace conflict", () => { + it("returns error for ignored namespace conflict", () => { const error = generateWatchNamespaceError(["ns1"], ["ns1"], []); expect(error).toBe("Binding uses a Pepr ignored namespace: ignoredNamespaces: [ns1] bindingNamespaces: [ns1]."); }); - test("returns error for binding and capability namespace conflict", () => { + it("returns error for binding and capability namespace conflict", () => { const error = generateWatchNamespaceError([""], ["ns2"], ["ns3"]); expect(error).toBe( "Binding uses namespace not governed by capability: bindingNamespaces: [ns2] capabilityNamespaces: [ns3].", ); }); - test("returns combined error for both conflicts", () => { + it("returns combined error for both conflicts", () => { const error = generateWatchNamespaceError(["ns1"], ["ns1"], ["ns3", "ns4"]); expect(error).toBe( "Binding uses a Pepr ignored namespace: ignoredNamespaces: [ns1] bindingNamespaces: [ns1]. Binding uses namespace not governed by capability: bindingNamespaces: [ns1] capabilityNamespaces: [ns3, ns4].", ); }); - test("returns empty string when there are no conflicts", () => { + it("returns empty string when there are no conflicts", () => { const error = generateWatchNamespaceError([], ["ns2"], []); expect(error).toBe(""); }); }); -const nsViolation: CapabilityExport[] = JSON.parse(`[ +const namespaceViolation: CapabilityExport[] = JSON.parse(`[ { "name": "test-capability-namespaces", "description": "Should be confined to namespaces listed in capabilities and not be able to use ignored namespaces", @@ -568,34 +530,35 @@ const allNSCapabilities: CapabilityExport[] = JSON.parse(`[ } ]`); -const nonNsViolation: CapabilityExport[] = JSON.parse(`[ +const nonNsViolation: CapabilityExport[] = [ { - "name": "test-capability-namespaces", - "description": "Should be confined to namespaces listed in capabilities and not be able to use ignored namespaces", - "namespaces": [ - "miami", - "dallas", - "milwaukee" - ], - "bindings": [ - { - "kind": { - "kind": "Namespace", - "version": "v1", - "group": "" - }, - "event": "CREATE", - "filters": { - "name": "", - "namespaces": ["miami"], - "labels": {}, - "annotations": {} - }, - "isMutate": true - } - ] - } -]`); + name: "test-capability-namespaces", + description: "Should be confined to namespaces listed in capabilities and not be able to use ignored namespaces", + namespaces: ["miami", "dallas", "milwaukee"], + bindings: [ + { + kind: { + kind: "Namespace", + version: "v1", + group: "", + }, + model: kind.Pod, + event: Event.CREATE, + filters: { + name: "", + namespaces: ["miami"], + labels: {}, + annotations: {}, + deletionTimestamp: false, + regexName: "", + regexNamespaces: [], + }, + isMutate: true, + }, + ], + hasSchedule: false, + }, +]; describe("namespaceComplianceValidator", () => { let errorSpy: SpiedFunction<{ (...data: unknown[]): void; (message?: unknown, ...optionalParams: unknown[]): void }>; @@ -606,83 +569,83 @@ describe("namespaceComplianceValidator", () => { afterEach(() => { errorSpy.mockRestore(); }); - test("should throw error for invalid regex namespaces", () => { - const nsViolationCapability: CapabilityExport = { + it("should throw error for invalid regex namespaces", () => { + const namespaceViolationCapability: CapabilityExport = { ...nonNsViolation[0], bindings: nonNsViolation[0].bindings.map(binding => ({ ...binding, filters: { ...binding.filters, namespaces: [], - regexNamespaces: [new RegExp(/^system/).source], + regexNamespaces: [new RegExp("^system").source], }, })), }; expect(() => { - namespaceComplianceValidator(nsViolationCapability); + namespaceComplianceValidator(namespaceViolationCapability); }).toThrowError( - `Ignoring Watch Callback: Object namespace does not match any capability namespace with regex ${nsViolationCapability.bindings[0].filters.regexNamespaces[0]}.`, + `Ignoring Watch Callback: Object namespace does not match any capability namespace with regex ${namespaceViolationCapability.bindings[0].filters.regexNamespaces[0]}.`, ); }); - test("should not throw an error for valid regex namespaces", () => { - const nonnsViolationCapability: CapabilityExport = { + it("should not throw an error for valid regex namespaces", () => { + const nonNamespaceViolationCapability: CapabilityExport = { ...nonNsViolation[0], bindings: nonNsViolation[0].bindings.map(binding => ({ ...binding, filters: { ...binding.filters, namespaces: [], - regexNamespaces: [new RegExp(/^mia/).source], + regexNamespaces: [new RegExp("^mia").source], }, })), }; expect(() => { - namespaceComplianceValidator(nonnsViolationCapability); + namespaceComplianceValidator(nonNamespaceViolationCapability); }).not.toThrow(); }); - test("should throw error for invalid regex ignored namespaces", () => { - const nsViolationCapability: CapabilityExport = { + it("should throw error for invalid regex ignored namespaces", () => { + const namespaceViolationCapability: CapabilityExport = { ...nonNsViolation[0], bindings: nonNsViolation[0].bindings.map(binding => ({ ...binding, filters: { ...binding.filters, namespaces: [], - regexNamespaces: [new RegExp(/^mia/).source], + regexNamespaces: [new RegExp("^mia").source], }, })), }; expect(() => { - namespaceComplianceValidator(nsViolationCapability, ["miami"]); + namespaceComplianceValidator(namespaceViolationCapability, ["miami"]); }).toThrowError( - `Ignoring Watch Callback: Regex namespace: ${nsViolationCapability.bindings[0].filters.regexNamespaces[0]}, is an ignored namespace: miami.`, + `Ignoring Watch Callback: Regex namespace: ${namespaceViolationCapability.bindings[0].filters.regexNamespaces[0]}, is an ignored namespace: miami.`, ); }); - test("should not throw an error for valid regex ignored namespaces", () => { - const nonnsViolationCapability: CapabilityExport = { + it("should not throw an error for valid regex ignored namespaces", () => { + const nonNamespaceViolationCapability: CapabilityExport = { ...nonNsViolation[0], bindings: nonNsViolation[0].bindings.map(binding => ({ ...binding, filters: { ...binding.filters, namespaces: [], - regexNamespaces: [new RegExp(/^mia/).source], + regexNamespaces: [new RegExp("^mia").source], }, })), }; expect(() => { - namespaceComplianceValidator(nonnsViolationCapability, ["Seattle"]); + namespaceComplianceValidator(nonNamespaceViolationCapability, ["Seattle"]); }).not.toThrow(); }); - test("should not throw an error for valid namespaces", () => { + it("should not throw an error for valid namespaces", () => { expect(() => { namespaceComplianceValidator(nonNsViolation[0]); }).not.toThrow(); }); - test("should throw an error for binding namespace using a non capability namespace", () => { + it("should throw an error for binding namespace using a non capability namespace", () => { try { - namespaceComplianceValidator(nsViolation[0]); + namespaceComplianceValidator(namespaceViolation[0]); } catch (e) { expect(e.message).toBe( "Error in test-capability-namespaces capability. A binding violates namespace rules. Please check ignoredNamespaces and capability namespaces: Binding uses namespace not governed by capability: bindingNamespaces: [new york] capabilityNamespaces: [miami, dallas, milwaukee].", @@ -690,7 +653,7 @@ describe("namespaceComplianceValidator", () => { } }); - test("should throw an error for binding namespace using an ignored namespace: Part 1", () => { + it("should throw an error for binding namespace using an ignored namespace: Part 1", () => { /* * this test case lists miami as a capability namespace, but also as an ignored namespace * in this case, there should be an error since ignoredNamespaces have precedence @@ -704,7 +667,7 @@ describe("namespaceComplianceValidator", () => { } }); - test("should throw an error for binding namespace using an ignored namespace: Part 2", () => { + it("should throw an error for binding namespace using an ignored namespace: Part 2", () => { /* * This capability uses all namespaces but new york should be ignored * the binding uses new york so it should fail @@ -721,42 +684,42 @@ describe("namespaceComplianceValidator", () => { describe("parseTimeout", () => { const PREV = "a"; - test("should return a number when a valid string number between 1 and 30 is provided", () => { + it("should return a number when a valid string number between 1 and 30 is provided", () => { expect(parseTimeout("5", PREV)).toBe(5); expect(parseTimeout("1", PREV)).toBe(1); expect(parseTimeout("30", PREV)).toBe(30); }); - test("should throw an InvalidArgumentError for non-numeric strings", () => { + it("should throw an InvalidArgumentError for non-numeric strings", () => { expect(() => parseTimeout("abc", PREV)).toThrow(Error); expect(() => parseTimeout("", PREV)).toThrow(Error); }); - test("should throw an InvalidArgumentError for numbers outside the 1-30 range", () => { + it("should throw an InvalidArgumentError for numbers outside the 1-30 range", () => { expect(() => parseTimeout("0", PREV)).toThrow(Error); expect(() => parseTimeout("31", PREV)).toThrow(Error); }); - test("should throw an InvalidArgumentError for numeric strings that represent floating point numbers", () => { + it("should throw an InvalidArgumentError for numeric strings that represent floating point numbers", () => { expect(() => parseTimeout("5.5", PREV)).toThrow(Error); expect(() => parseTimeout("20.1", PREV)).toThrow(Error); }); }); describe("secretOverLimit", () => { - test("should return true for a string larger than 1MiB", () => { + it("should return true for a string larger than 1MiB", () => { const largeString = "a".repeat(1048577); expect(secretOverLimit(largeString)).toBe(true); }); - test("should return false for a string smaller than 1MiB", () => { + it("should return false for a string smaller than 1MiB", () => { const smallString = "a".repeat(1048575); expect(secretOverLimit(smallString)).toBe(false); }); }); describe("dedent", () => { - test("removes leading spaces based on the smallest indentation", () => { + it("removes leading spaces based on the smallest indentation", () => { const input = ` kind: Namespace metadata: @@ -769,13 +732,13 @@ describe("dedent", () => { expect(inputArray[2]).toBe(" name: pepr-system"); }); - test("does not remove internal spacing of lines", () => { + it("does not remove internal spacing of lines", () => { const input = `kind: ->>> Namespace`; expect(dedent(input)).toBe("kind: ->>> Namespace"); }); - test("handles strings without leading whitespace consistently", () => { + it("handles strings without leading whitespace consistently", () => { const input = `kind: Namespace metadata:`; @@ -784,7 +747,7 @@ metadata:`; expect(inputArray[1]).toBe("metadata:"); }); - test("handles empty strings without crashing", () => { + it("handles empty strings without crashing", () => { const input = ``; const expected = ``; expect(dedent(input)).toBe(expected); @@ -792,7 +755,7 @@ metadata:`; }); describe("replaceString", () => { - test("replaces single instance of a string", () => { + it("replaces single instance of a string", () => { const original = "Hello, world!"; const stringA = "world"; const stringB = "Jest"; @@ -800,7 +763,7 @@ describe("replaceString", () => { expect(replaceString(original, stringA, stringB)).toBe(expected); }); - test("replaces multiple instances of a string", () => { + it("replaces multiple instances of a string", () => { const original = "Repeat, repeat, repeat"; const stringA = "repeat"; const stringB = "done"; @@ -808,7 +771,7 @@ describe("replaceString", () => { expect(replaceString(original, stringA, stringB)).toBe(expected); }); - test("does nothing if string to replace is not found", () => { + it("does nothing if string to replace is not found", () => { const original = "Nothing changes here"; const stringA = "absent"; const stringB = "present"; @@ -816,7 +779,7 @@ describe("replaceString", () => { expect(replaceString(original, stringA, stringB)).toBe(expected); }); - test("escapes special regex characters in string to be replaced", () => { + it("escapes special regex characters in string to be replaced", () => { const original = "Find the period."; const stringA = "."; const stringB = "!"; @@ -824,7 +787,7 @@ describe("replaceString", () => { expect(replaceString(original, stringA, stringB)).toBe(expected); }); - test("replaces string with empty string if stringB is empty", () => { + it("replaces string with empty string if stringB is empty", () => { const original = "Remove this part."; const stringA = " this part"; const stringB = ""; @@ -834,367 +797,336 @@ describe("replaceString", () => { }); describe("filterNoMatchReason", () => { - test("returns regex namespace filter error for Pods whos namespace does not match the regex", () => { - const binding = { - kind: { kind: "Pod" }, - filters: { regexNamespaces: ["(.*)-system"], namespaces: [] }, - }; - const obj = { metadata: { namespace: "pepr-demo" } }; - const objArray = [ - { ...obj }, - { ...obj, metadata: { namespace: "pepr-uds" } }, - { ...obj, metadata: { namespace: "pepr-core" } }, - { ...obj, metadata: { namespace: "uds-ns" } }, - { ...obj, metadata: { namespace: "uds" } }, - ]; - const capabilityNamespaces: string[] = []; - objArray.map(object => { - const result = filterNoMatchReason( - binding as unknown as Partial, - object as unknown as Partial, - capabilityNamespaces, - ); + it.each([ + [{}], + [{ metadata: { namespace: "pepr-uds" } }], + [{ metadata: { namespace: "pepr-core" } }], + [{ metadata: { namespace: "uds-ns" } }], + [{ metadata: { namespace: "uds" } }], + ])( + "given %j, it returns regex namespace filter error for Pods whose namespace does not match the regex", + (obj: KubernetesObject) => { + const kubernetesObject: KubernetesObject = obj.metadata + ? { + ...defaultKubernetesObject, + metadata: { ...defaultKubernetesObject.metadata, namespace: obj.metadata.namespace }, + } + : { ...defaultKubernetesObject, metadata: obj as unknown as undefined }; + const binding: Binding = { + ...defaultBinding, + kind: { kind: "Pod", group: "some-group" }, + filters: { ...defaultFilters, regexNamespaces: [new RegExp("(.*)-system").source] }, + }; + + const capabilityNamespaces: string[] = []; + const expectedErrorMessage = `Ignoring Watch Callback: Binding defines namespace regexes '["(.*)-system"]' but Object carries`; + const result = filterNoMatchReason(binding, kubernetesObject, capabilityNamespaces); expect(result).toEqual( - `Ignoring Watch Callback: Binding defines namespace regexes '["(.*)-system"]' but Object carries '${object?.metadata?.namespace}'.`, + typeof kubernetesObject.metadata === "object" && obj !== null && Object.keys(obj).length > 0 + ? `${expectedErrorMessage} '${kubernetesObject.metadata.namespace}'.` + : `${expectedErrorMessage} ''.`, ); - }); - }); + }, + ); +}); - test("returns no regex namespace filter error for Pods whos namespace does match the regex", () => { - const binding = { - kind: { kind: "Pod" }, - filters: { regexNamespaces: [/(.*)-system/], namespaces: [] }, - }; - const obj = { metadata: { namespace: "pepr-demo" } }; - const objArray = [ - { ...obj, metadata: { namespace: "pepr-system" } }, - { ...obj, metadata: { namespace: "pepr-uds-system" } }, - { ...obj, metadata: { namespace: "uds-system" } }, - { ...obj, metadata: { namespace: "some-thing-that-is-a-system" } }, - { ...obj, metadata: { namespace: "your-system" } }, - ]; - const capabilityNamespaces: string[] = []; - objArray.map(object => { - const result = filterNoMatchReason( - binding as unknown as Partial, - object as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual(``); - }); - }); +describe("when pod namespace matches the namespace regex", () => { + it.each([["pepr-system"], ["pepr-uds-system"], ["uds-system"], ["some-thing-that-is-a-system"], ["your-system"]])( + "should not return an error message (namespace: '%s')", + namespace => { + const binding: Binding = { + ...defaultBinding, + kind: { kind: "Pod", group: "some-group" }, + filters: { + ...defaultFilters, + regexName: "", + regexNamespaces: [new RegExp("(.*)-system").source], + namespaces: [], + }, + }; + const kubernetesObject: KubernetesObject = { ...defaultKubernetesObject, metadata: { namespace: namespace } }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, kubernetesObject, capabilityNamespaces); + expect(result).toEqual(""); + }, + ); +}); - // Names Fail - test("returns regex name filter error for Pods whos name does not match the regex", () => { - const binding = { - kind: { kind: "Pod" }, - filters: { regexName: "^system", namespaces: [] }, - }; - const obj = { metadata: { name: "pepr-demo" } }; - const objArray = [ - { ...obj }, - { ...obj, metadata: { name: "pepr-uds" } }, - { ...obj, metadata: { name: "pepr-core" } }, - { ...obj, metadata: { name: "uds-ns" } }, - { ...obj, metadata: { name: "uds" } }, - ]; - const capabilityNamespaces: string[] = []; - objArray.map(object => { - const result = filterNoMatchReason( - binding as unknown as Partial, - object as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual( - `Ignoring Watch Callback: Binding defines name regex '^system' but Object carries '${object?.metadata?.name}'.`, - ); - }); +// Names Fail +it("returns regex name filter error for Pods whos name does not match the regex", () => { + const binding: Binding = { + ...defaultBinding, + kind: { kind: "Pod", group: "some-group" }, + filters: { ...defaultFilters, regexName: "^system", namespaces: [] }, + }; + const obj = { metadata: { name: "pepr-demo" } }; + const objArray = [ + { ...obj }, + { ...obj, metadata: { name: "pepr-uds" } }, + { ...obj, metadata: { name: "pepr-core" } }, + { ...obj, metadata: { name: "uds-ns" } }, + { ...obj, metadata: { name: "uds" } }, + ]; + const capabilityNamespaces: string[] = []; + objArray.map(object => { + const result = filterNoMatchReason(binding, object as unknown as Partial, capabilityNamespaces); + expect(result).toEqual( + `Ignoring Watch Callback: Binding defines name regex '^system' but Object carries '${object?.metadata?.name}'.`, + ); }); +}); - // Names Pass - test("returns no regex name filter error for Pods whos name does match the regex", () => { - const binding = { - kind: { kind: "Pod" }, - filters: { regexName: /^system/, namespaces: [] }, - }; - const obj = { metadata: { name: "pepr-demo" } }; - const objArray = [ - { ...obj, metadata: { name: "systemd" } }, - { ...obj, metadata: { name: "systemic" } }, - { ...obj, metadata: { name: "system-of-kube-apiserver" } }, - { ...obj, metadata: { name: "system" } }, - { ...obj, metadata: { name: "system-uds" } }, - ]; - const capabilityNamespaces: string[] = []; - objArray.map(object => { - const result = filterNoMatchReason( - binding as unknown as Partial, - object as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual(``); - }); +// Names Pass +it("returns no regex name filter error for Pods whos name does match the regex", () => { + const binding: Binding = { + ...defaultBinding, + kind: { kind: "Pod", group: "some-group" }, + filters: { ...defaultFilters, regexName: "^system" }, + }; + const obj = { metadata: { name: "pepr-demo" } }; + const objArray = [ + { ...obj, metadata: { name: "systemd" } }, + { ...obj, metadata: { name: "systemic" } }, + { ...obj, metadata: { name: "system-of-kube-apiserver" } }, + { ...obj, metadata: { name: "system" } }, + { ...obj, metadata: { name: "system-uds" } }, + ]; + const capabilityNamespaces: string[] = []; + objArray.map(object => { + const result = filterNoMatchReason(binding, object as unknown as Partial, capabilityNamespaces); + expect(result).toEqual(``); }); +}); - test("returns missingCarriableNamespace filter error for cluster-scoped objects when capability namespaces are present", () => { - const binding = { - kind: { kind: "ClusterRole" }, +describe("when capability namespaces are present", () => { + it("should return missingCarriableNamespace filter error for cluster-scoped objects", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, regexName: "" }, + kind: { kind: "ClusterRole", group: "some-group" }, }; - const obj = { + const obj: KubernetesObject = { kind: "ClusterRole", apiVersion: "rbac.authorization.k8s.io/v1", metadata: { name: "clusterrole1" }, }; const capabilityNamespaces: string[] = ["monitoring"]; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); + const result = filterNoMatchReason(binding, obj, capabilityNamespaces); expect(result).toEqual( "Ignoring Watch Callback: Object does not carry a namespace but namespaces allowed by Capability are '[\"monitoring\"]'.", ); }); +}); - test("returns mismatchedNamespace filter error for clusterScoped objects with namespace filters", () => { - const binding = { - kind: { kind: "ClusterRole" }, - filters: { namespaces: ["ns1"] }, - }; - const obj = { - kind: "ClusterRole", - apiVersion: "rbac.authorization.k8s.io/v1", - metadata: { name: "clusterrole1" }, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual("Ignoring Watch Callback: Binding defines namespaces '[\"ns1\"]' but Object carries ''."); - }); +it("returns mismatchedNamespace filter error for clusterScoped objects with namespace filters", () => { + const binding: Binding = { + ...defaultBinding, + kind: { kind: "ClusterRole", group: "some-group" }, + filters: { ...defaultFilters, namespaces: ["ns1"] }, + }; + const obj = { + kind: "ClusterRole", + apiVersion: "rbac.authorization.k8s.io/v1", + metadata: { name: "clusterrole1" }, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual("Ignoring Watch Callback: Binding defines namespaces '[\"ns1\"]' but Object carries ''."); +}); - test("returns namespace filter error for namespace objects with namespace filters", () => { - const binding = { - kind: { kind: "Namespace" }, - filters: { namespaces: ["ns1"] }, - }; - const obj = {}; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual("Ignoring Watch Callback: Cannot use namespace filter on a namespace object."); - }); +it("returns namespace filter error for namespace objects with namespace filters", () => { + const binding: Binding = { + ...defaultBinding, + kind: { kind: "Namespace", group: "some-group" }, + filters: { ...defaultFilters, namespaces: ["ns1"] }, + }; + const obj = {}; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual("Ignoring Watch Callback: Cannot use namespace filter on a namespace object."); +}); - test("return an Ignoring Watch Callback string if the binding name and object name are different", () => { - const binding = { - filters: { name: "pepr" }, - }; - const obj = { - metadata: { - name: "not-pepr", - }, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual(`Ignoring Watch Callback: Binding defines name 'pepr' but Object carries 'not-pepr'.`); - }); - test("returns no Ignoring Watch Callback string if the binding name and object name are the same", () => { - const binding = { - filters: { name: "pepr" }, +it("return an Ignoring Watch Callback string if the binding name and object name are different", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, name: "pepr" }, + }; + const obj = { + metadata: { + name: "not-pepr", + }, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual(`Ignoring Watch Callback: Binding defines name 'pepr' but Object carries 'not-pepr'.`); +}); + +describe("when the binding name and KubernetesObject name are the same", () => { + it("should not return an Ignoring Watch Callback message", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, regexName: "", name: "pepr" }, }; - const obj = { + const obj: KubernetesObject = { metadata: { name: "pepr" }, }; const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); + const result = filterNoMatchReason(binding, obj, capabilityNamespaces); expect(result).toEqual(""); }); +}); - test("return deletionTimestamp error when there is no deletionTimestamp in the object", () => { - const binding = { - filters: { deletionTimestamp: true }, - }; - const obj = { - metadata: {}, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual("Ignoring Watch Callback: Binding defines deletionTimestamp but Object does not carry it."); - }); +it("return deletionTimestamp error when there is no deletionTimestamp in the object", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, deletionTimestamp: true }, + }; + const obj = { + metadata: {}, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual("Ignoring Watch Callback: Binding defines deletionTimestamp but Object does not carry it."); +}); - test("return no deletionTimestamp error when there is a deletionTimestamp in the object", () => { - const binding = { - filters: { deletionTimestamp: true }, - }; - const obj = { - metadata: { - deletionTimestamp: "2021-01-01T00:00:00Z", - }, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).not.toEqual("Ignoring Watch Callback: Binding defines deletionTimestamp Object does not carry it."); - }); +it("return no deletionTimestamp error when there is a deletionTimestamp in the object", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, deletionTimestamp: true }, + }; + const obj = { + metadata: { + deletionTimestamp: "2021-01-01T00:00:00Z", + }, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).not.toEqual("Ignoring Watch Callback: Binding defines deletionTimestamp Object does not carry it."); +}); - test("returns label overlap error when there is no overlap between binding and object labels", () => { - const binding = { - filters: { labels: { key: "value" } }, - }; - const obj = { - metadata: { labels: { anotherKey: "anotherValue" } }, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual( - `Ignoring Watch Callback: Binding defines labels '{"key":"value"}' but Object carries '{"anotherKey":"anotherValue"}'.`, - ); - }); +it("returns label overlap error when there is no overlap between binding and object labels", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, labels: { key: "value" } }, + }; + const obj = { + metadata: { labels: { anotherKey: "anotherValue" } }, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual( + `Ignoring Watch Callback: Binding defines labels '{"key":"value"}' but Object carries '{"anotherKey":"anotherValue"}'.`, + ); +}); - test("returns annotation overlap error when there is no overlap between binding and object annotations", () => { - const binding = { - filters: { annotations: { key: "value" } }, - }; - const obj = { - metadata: { annotations: { anotherKey: "anotherValue" } }, - }; - const capabilityNamespaces: string[] = []; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual( - `Ignoring Watch Callback: Binding defines annotations '{"key":"value"}' but Object carries '{"anotherKey":"anotherValue"}'.`, - ); - }); +it("returns annotation overlap error when there is no overlap between binding and object annotations", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, annotations: { key: "value" } }, + }; + const obj = { + metadata: { annotations: { anotherKey: "anotherValue" } }, + }; + const capabilityNamespaces: string[] = []; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual( + `Ignoring Watch Callback: Binding defines annotations '{"key":"value"}' but Object carries '{"anotherKey":"anotherValue"}'.`, + ); +}); - test("returns capability namespace error when object is not in capability namespaces", () => { - const binding = { - model: kind.Pod, - event: Event.ANY, - kind: { - group: "", - version: "v1", - kind: "Pod", - }, - filters: { - name: "bleh", - namespaces: [], - regexNamespaces: [], - regexName: "", - labels: {}, - annotations: {}, - deletionTimestamp: false, - }, - callback, - }; +it("returns capability namespace error when object is not in capability namespaces", () => { + const binding: Binding = { + model: kind.Pod, + event: Event.ANY, + kind: { + group: "", + version: "v1", + kind: "Pod", + }, + filters: { + name: "bleh", + namespaces: [], + regexNamespaces: [], + regexName: "", + labels: {}, + annotations: {}, + deletionTimestamp: false, + }, + watchCallback: callback, + }; - const obj = { - metadata: { namespace: "ns2", name: "bleh" }, - }; - const capabilityNamespaces = ["ns1"]; - const result = filterNoMatchReason( - binding as Binding, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual( - `Ignoring Watch Callback: Object carries namespace 'ns2' but namespaces allowed by Capability are '["ns1"]'.`, - ); - }); + const obj = { + metadata: { namespace: "ns2", name: "bleh" }, + }; + const capabilityNamespaces = ["ns1"]; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual( + `Ignoring Watch Callback: Object carries namespace 'ns2' but namespaces allowed by Capability are '["ns1"]'.`, + ); +}); - test("returns binding namespace error when filter namespace is not part of capability namespaces", () => { - const binding = { - filters: { namespaces: ["ns3"], regexNamespaces: [] }, - }; - const obj = {}; - const capabilityNamespaces = ["ns1", "ns2"]; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual( - `Ignoring Watch Callback: Binding defines namespaces ["ns3"] but namespaces allowed by Capability are '["ns1","ns2"]'.`, - ); - }); +it("returns binding namespace error when filter namespace is not part of capability namespaces", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, namespaces: ["ns3"], regexNamespaces: [] }, + }; + const obj = {}; + const capabilityNamespaces = ["ns1", "ns2"]; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual( + `Ignoring Watch Callback: Binding defines namespaces ["ns3"] but namespaces allowed by Capability are '["ns1","ns2"]'.`, + ); +}); - test("returns binding and object namespace error when they do not overlap", () => { - const binding = { - filters: { namespaces: ["ns1"], regexNamespaces: [] }, - }; - const obj = { - metadata: { namespace: "ns2" }, - }; - const capabilityNamespaces = ["ns1", "ns2"]; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual(`Ignoring Watch Callback: Binding defines namespaces '["ns1"]' but Object carries 'ns2'.`); - }); +it("returns binding and object namespace error when they do not overlap", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, namespaces: ["ns1"], regexNamespaces: [] }, + }; + const obj = { + metadata: { namespace: "ns2" }, + }; + const capabilityNamespaces = ["ns1", "ns2"]; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual(`Ignoring Watch Callback: Binding defines namespaces '["ns1"]' but Object carries 'ns2'.`); +}); - test("return watch violation message when object is in an ignored namespace", () => { - const binding = { - filters: { namespaces: ["ns3"] }, +describe("when a KubernetesObject is in an ingnored namespace", () => { + it("should return a watch violation message", () => { + const binding: Binding = { + ...defaultBinding, + filters: { ...defaultFilters, regexName: "", namespaces: ["ns3"] }, }; - const obj = { + const kubernetesObject: KubernetesObject = { + ...defaultKubernetesObject, metadata: { namespace: "ns3" }, }; const capabilityNamespaces = ["ns3"]; const ignoredNamespaces = ["ns3"]; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ignoredNamespaces, - ); + const result = filterNoMatchReason(binding, kubernetesObject, capabilityNamespaces, ignoredNamespaces); expect(result).toEqual( `Ignoring Watch Callback: Object carries namespace 'ns3' but ignored namespaces include '["ns3"]'.`, ); }); +}); - test("returns empty string when all checks pass", () => { - const binding = { - filters: { namespaces: ["ns1"], labels: { key: "value" }, annotations: { key: "value" } }, - }; - const obj = { - metadata: { namespace: "ns1", labels: { key: "value" }, annotations: { key: "value" } }, - }; - const capabilityNamespaces = ["ns1"]; - const result = filterNoMatchReason( - binding as unknown as Partial, - obj as unknown as Partial, - capabilityNamespaces, - ); - expect(result).toEqual(""); - }); +it("returns empty string when all checks pass", () => { + const binding: Binding = { + ...defaultBinding, + filters: { + ...defaultFilters, + regexName: "", + namespaces: ["ns1"], + labels: { key: "value" }, + annotations: { key: "value" }, + }, + }; + const obj = { + metadata: { namespace: "ns1", labels: { key: "value" }, annotations: { key: "value" } }, + }; + const capabilityNamespaces = ["ns1"]; + const result = filterNoMatchReason(binding, obj as unknown as Partial, capabilityNamespaces); + expect(result).toEqual(""); }); describe("validateHash", () => { @@ -1208,7 +1140,7 @@ describe("validateHash", () => { afterEach(() => { process.exit = originalExit; }); - test("should throw ValidationError for invalid hash values", () => { + it("should throw ValidationError for invalid hash values", () => { // Examples of invalid hashes const invalidHashes = [ "", // Empty string @@ -1222,7 +1154,7 @@ describe("validateHash", () => { }); }); - test("should not throw ValidationError for valid SHA-256 hash", () => { + it("should not throw ValidationError for valid SHA-256 hash", () => { // Example of a valid SHA-256 hash const validHash = "abc123def456abc123def456abc123def456abc123def456abc123def456abc1"; expect(() => validateHash(validHash)).not.toThrow(); @@ -1230,62 +1162,52 @@ describe("validateHash", () => { }); describe("matchesRegex", () => { - test("should return true for a valid pattern that matches the string", () => { - const pattern = /abc/; + it("should return true for a valid pattern that matches the string", () => { + const pattern = "abc"; const testString = "abc123"; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(true); }); - test("should return false for a valid pattern that does not match the string", () => { - const pattern = /xyz/; + it("should return false for a valid pattern that does not match the string", () => { + const pattern = "xyz"; const testString = "abc123"; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(false); }); - test("should return false for an invalid regex pattern", () => { - const invalidPattern = new RegExp(/^p/); // Invalid regex with unclosed bracket + it("should return false for an invalid regex pattern", () => { + const invalidPattern = "^p"; // Invalid regex with unclosed bracket const testString = "test"; - const result = matchesRegex(invalidPattern.source, testString); + const result = matchesRegex(invalidPattern, testString); expect(result).toBe(false); }); - test("should return false when pattern is null or undefined", () => { - const testString = "abc123"; - // Check for undefined - // eslint-disable-next-line @typescript-eslint/no-explicit-any - expect(matchesRegex(undefined as any, testString)).toBe(false); - // Check for null - // eslint-disable-next-line @typescript-eslint/no-explicit-any - expect(matchesRegex(null as any, testString)).toBe(false); - }); - - test("should return true for an empty string matching an empty regex", () => { - const pattern = new RegExp(""); + it("should return true for an empty string matching an empty regex", () => { + const pattern = ""; const testString = ""; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(true); }); - test("should return false for an empty string and a non-empty regex", () => { - const pattern = new RegExp("abc"); + it("should return false for an empty string and a non-empty regex", () => { + const pattern = "abc"; const testString = ""; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(false); }); - test("should return true for a complex valid regex that matches", () => { - const pattern = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]+$/; + it("should return true for a complex valid regex that matches", () => { + const pattern = "^[a-zA-Z0-9]+@[a-zA-Z0-9]+.[A-Za-z]+$"; const testString = "test@example.com"; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(true); }); - test("should return false for a complex valid regex that does not match", () => { - const pattern = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]+$/; + it("should return false for a complex valid regex that does not match", () => { + const pattern = "^[a-zA-Z0-9]+@[a-zA-Z0-9]+.[A-Za-z]+$"; const testString = "invalid-email.com"; - const result = matchesRegex(new RegExp(pattern).source, testString); + const result = matchesRegex(pattern, testString); expect(result).toBe(false); }); }); diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts index 1709909f9..2eb213de5 100644 --- a/src/lib/helpers.ts +++ b/src/lib/helpers.ts @@ -1,7 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023-Present The Pepr Authors -import { promises as fs } from "fs"; import { KubernetesObject } from "kubernetes-fluent-client"; import Log from "./logger"; import { Binding, CapabilityExport } from "./types"; @@ -32,13 +31,7 @@ import { } from "./filter/adjudicators"; export function matchesRegex(pattern: string, testString: string): boolean { - // edge-case - if (!pattern) { - return false; - } - - const regex = new RegExp(pattern); - return regex.test(testString); + return new RegExp(pattern).test(testString); } export class ValidationError extends Error {} @@ -73,8 +66,8 @@ export type RBACMap = { * Decide to run callback after the event comes back from API Server **/ export function filterNoMatchReason( - binding: Partial, - obj: Partial, + binding: Binding, + kubernetesObject: Partial, capabilityNamespaces: string[], ignoredNamespaces?: string[], ): string { @@ -82,30 +75,30 @@ export function filterNoMatchReason( // prettier-ignore return ( - mismatchedDeletionTimestamp(binding, obj) ? + mismatchedDeletionTimestamp(binding, kubernetesObject) ? `${prefix} Binding defines deletionTimestamp but Object does not carry it.` : - mismatchedName(binding, obj) ? - `${prefix} Binding defines name '${definedName(binding)}' but Object carries '${carriedName(obj)}'.` : + mismatchedName(binding, kubernetesObject) ? + `${prefix} Binding defines name '${definedName(binding)}' but Object carries '${carriedName(kubernetesObject)}'.` : misboundNamespace(binding) ? `${prefix} Cannot use namespace filter on a namespace object.` : - mismatchedLabels(binding, obj) ? + mismatchedLabels(binding, kubernetesObject) ? ( `${prefix} Binding defines labels '${JSON.stringify(definedLabels(binding))}' ` + - `but Object carries '${JSON.stringify(carriedLabels(obj))}'.` + `but Object carries '${JSON.stringify(carriedLabels(kubernetesObject))}'.` ) : - mismatchedAnnotations(binding, obj) ? + mismatchedAnnotations(binding, kubernetesObject) ? ( `${prefix} Binding defines annotations '${JSON.stringify(definedAnnotations(binding))}' ` + - `but Object carries '${JSON.stringify(carriedAnnotations(obj))}'.` + `but Object carries '${JSON.stringify(carriedAnnotations(kubernetesObject))}'.` ) : - uncarryableNamespace(capabilityNamespaces, obj) ? + uncarryableNamespace(capabilityNamespaces, kubernetesObject) ? ( - `${prefix} Object carries namespace '${carriedNamespace(obj)}' ` + + `${prefix} Object carries namespace '${carriedNamespace(kubernetesObject)}' ` + `but namespaces allowed by Capability are '${JSON.stringify(capabilityNamespaces)}'.` ) : @@ -115,32 +108,32 @@ export function filterNoMatchReason( `but namespaces allowed by Capability are '${JSON.stringify(capabilityNamespaces)}'.` ) : - mismatchedNamespace(binding, obj) ? + mismatchedNamespace(binding, kubernetesObject) ? ( `${prefix} Binding defines namespaces '${JSON.stringify(definedNamespaces(binding))}' ` + - `but Object carries '${carriedNamespace(obj)}'.` + `but Object carries '${carriedNamespace(kubernetesObject)}'.` ) : - mismatchedNamespaceRegex(binding, obj) ? + mismatchedNamespaceRegex(binding, kubernetesObject) ? ( `${prefix} Binding defines namespace regexes ` + `'${JSON.stringify(definedNamespaceRegexes(binding))}' ` + - `but Object carries '${carriedNamespace(obj)}'.` + `but Object carries '${carriedNamespace(kubernetesObject)}'.` ) : - mismatchedNameRegex(binding, obj) ? + mismatchedNameRegex(binding, kubernetesObject) ? ( `${prefix} Binding defines name regex '${definedNameRegex(binding)}' ` + - `but Object carries '${carriedName(obj)}'.` + `but Object carries '${carriedName(kubernetesObject)}'.` ) : - carriesIgnoredNamespace(ignoredNamespaces, obj) ? + carriesIgnoredNamespace(ignoredNamespaces, kubernetesObject) ? ( - `${prefix} Object carries namespace '${carriedNamespace(obj)}' ` + + `${prefix} Object carries namespace '${carriedNamespace(kubernetesObject)}' ` + `but ignored namespaces include '${JSON.stringify(ignoredNamespaces)}'.` ) : - missingCarriableNamespace(capabilityNamespaces, obj) ? + missingCarriableNamespace(capabilityNamespaces, kubernetesObject) ? ( `${prefix} Object does not carry a namespace ` + `but namespaces allowed by Capability are '${JSON.stringify(capabilityNamespaces)}'.` @@ -191,18 +184,6 @@ export function createRBACMap(capabilities: CapabilityExport[]): RBACMap { }, {}); } -export async function createDirectoryIfNotExists(path: string) { - try { - await fs.access(path); - } catch (error) { - if (error.code === "ENOENT") { - await fs.mkdir(path, { recursive: true }); - } else { - throw error; - } - } -} - export function hasEveryOverlap(array1: T[], array2: T[]): boolean { if (!Array.isArray(array1) || !Array.isArray(array2)) { return false; @@ -255,11 +236,13 @@ export function generateWatchNamespaceError( return err.replace(/\.([^ ])/g, ". $1"); } -// namespaceComplianceValidator ensures that capability bindinds respect ignored and capability namespaces +// namespaceComplianceValidator ensures that capability bindings respect ignored and capability namespaces export function namespaceComplianceValidator(capability: CapabilityExport, ignoredNamespaces?: string[]) { const { namespaces: capabilityNamespaces, bindings, name } = capability; - const bindingNamespaces = bindings.flatMap((binding: Binding) => binding.filters.namespaces); - const bindingRegexNamespaces = bindings.flatMap((binding: Binding) => binding.filters.regexNamespaces || []); + const bindingNamespaces: string[] = bindings.flatMap((binding: Binding) => binding.filters.namespaces); + const bindingRegexNamespaces: string[] = bindings.flatMap( + (binding: Binding) => binding.filters.regexNamespaces || [], + ); const namespaceError = generateWatchNamespaceError( ignoredNamespaces ? ignoredNamespaces : [], @@ -334,7 +317,7 @@ export const parseTimeout = (value: string, previous: unknown): number => { }; // Remove leading whitespace while keeping format of file -export function dedent(file: string) { +export function dedent(file: string): string { // Check if the first line is empty and remove it const lines = file.split("\n"); if (lines[0].trim() === "") { @@ -351,7 +334,7 @@ export function dedent(file: string) { return file; } -export function replaceString(str: string, stringA: string, stringB: string) { +export function replaceString(str: string, stringA: string, stringB: string): string { // eslint-disable-next-line no-useless-escape const escapedStringA = stringA.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); const regExp = new RegExp(escapedStringA, "g"); diff --git a/src/lib/metrics.test.ts b/src/lib/metrics.test.ts index 5999fb684..789d7b841 100644 --- a/src/lib/metrics.test.ts +++ b/src/lib/metrics.test.ts @@ -7,42 +7,42 @@ import { performance } from "perf_hooks"; import { MetricsCollector } from "./metrics"; test("constructor initializes counters correctly", () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); expect(collector).toBeTruthy(); }); test("error method increments error counter", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); collector.error(); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_errors 1/); }); test("alert method increments alerts counter", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); collector.alert(); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_alerts 1/); }); test("observeStart returns current timestamp", () => { - const timeBefore = performance.now(); - const startTime = MetricsCollector.observeStart(); - const timeAfter = performance.now(); + const timeBefore: number = performance.now(); + const startTime: number = MetricsCollector.observeStart(); + const timeAfter: number = performance.now(); expect(timeBefore <= startTime).toBe(true); expect(timeAfter >= startTime).toBe(true); }); test("observeEnd updates summary", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); - const startTime = MetricsCollector.observeStart(); + const startTime: number = MetricsCollector.observeStart(); await new Promise(resolve => setTimeout(resolve, 100)); // Delay to simulate operation collector.observeEnd(startTime); @@ -50,7 +50,7 @@ test("observeEnd updates summary", async () => { collector.observeEnd(startTime, "validate"); collector.observeEnd(startTime, "validate"); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_mutate_count 1/); expect(metrics).toMatch(/testPrefix_mutate_sum \d+\.\d+/); @@ -59,11 +59,11 @@ test("observeEnd updates summary", async () => { }); test("coverage tests, with duplicate counters, default prefix (pepr) and still works properly", async () => { - const collector = new MetricsCollector(); + const collector: MetricsCollector = new MetricsCollector(); collector.addCounter("testCounter", "testHelp"); // second one should log, but still work fine TODO: validate log collector.addCounter("testCounter", "testHelp"); - let metrics = await collector.getMetrics(); + let metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/pepr_testCounter 0/); collector.incCounter("testCounter"); metrics = await collector.getMetrics(); @@ -71,7 +71,7 @@ test("coverage tests, with duplicate counters, default prefix (pepr) and still w collector.addSummary("testSummary", "testHelp"); // second one should log, but still work fine TODO: validate log collector.addSummary("testSummary", "testHelp"); - const startTime = MetricsCollector.observeStart(); + const startTime: number = MetricsCollector.observeStart(); await new Promise(resolve => setTimeout(resolve, 100)); // Delay to simulate operation collector.observeEnd(startTime, "testSummary"); @@ -82,41 +82,41 @@ test("coverage tests, with duplicate counters, default prefix (pepr) and still w }); test("incCacheMiss increments cache miss gauge", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); collector.incCacheMiss("window1"); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_cache_miss{window="window1"} 1/); }); test("incRetryCount increments retry count gauge", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); collector.incRetryCount("1"); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_resync_failure_count{count="1"} 1/); }); test("initCacheMissWindow initializes cache miss gauge to zero", async () => { - const collector = new MetricsCollector("testPrefix"); + const collector: MetricsCollector = new MetricsCollector("testPrefix"); collector.initCacheMissWindow("window1"); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).toMatch(/testPrefix_cache_miss{window="window1"} 0/); }); test("should initialize cache miss window and maintain size limit", async () => { process.env.PEPR_MAX_CACHE_MISS_WINDOWS = "3"; - const collector = new MetricsCollector("pepr"); + const collector: MetricsCollector = new MetricsCollector("pepr"); collector.initCacheMissWindow("window1"); collector.initCacheMissWindow("window2"); collector.initCacheMissWindow("window3"); collector.initCacheMissWindow("window4"); - const metrics = await collector.getMetrics(); + const metrics: string = await collector.getMetrics(); expect(metrics).not.toContain("window1"); expect(metrics).toContain("window4"); @@ -124,7 +124,7 @@ test("should initialize cache miss window and maintain size limit", async () => collector.initCacheMissWindow("window6"); collector.initCacheMissWindow("window7"); - const updatedMetrics = await collector.getMetrics(); + const updatedMetrics: string = await collector.getMetrics(); expect(updatedMetrics).not.toContain("window4"); expect(updatedMetrics).toContain("window5"); expect(updatedMetrics).toContain("window6"); diff --git a/src/lib/metrics.ts b/src/lib/metrics.ts index 8ec036848..e965ec9fe 100644 --- a/src/lib/metrics.ts +++ b/src/lib/metrics.ts @@ -9,6 +9,7 @@ import Log from "./logger"; const loggingPrefix = "MetricsCollector"; +type MetricsCollectorInstance = InstanceType; interface MetricNames { errors: string; alerts: string; @@ -60,7 +61,7 @@ export class MetricsCollector { this.addGauge(this.#metricNames.resyncFailureCount, "Number of failures per resync operation", ["count"]); } - #getMetricName = (name: string) => `${this.#prefix}_${name}`; + #getMetricName = (name: string): string => `${this.#prefix}_${name}`; #addMetric = | Gauge | Summary>( collection: Map, @@ -68,7 +69,7 @@ export class MetricsCollector { name: string, help: string, labelNames?: string[], - ) => { + ): void => { if (collection.has(this.#getMetricName(name))) { Log.debug(`Metric for ${name} already exists`, loggingPrefix); return; @@ -84,42 +85,42 @@ export class MetricsCollector { collection.set(this.#getMetricName(name), metric); }; - addCounter = (name: string, help: string) => { + addCounter = (name: string, help: string): void => { this.#addMetric(this.#counters, promClient.Counter, name, help, []); }; - addSummary = (name: string, help: string) => { + addSummary = (name: string, help: string): void => { this.#addMetric(this.#summaries, promClient.Summary, name, help, []); }; - addGauge = (name: string, help: string, labelNames?: string[]) => { + addGauge = (name: string, help: string, labelNames?: string[]): void => { this.#addMetric(this.#gauges, promClient.Gauge, name, help, labelNames); }; - incCounter = (name: string) => { + incCounter = (name: string): void => { this.#counters.get(this.#getMetricName(name))?.inc(); }; - incGauge = (name: string, labels?: Record, value: number = 1) => { + incGauge = (name: string, labels?: Record, value: number = 1): void => { this.#gauges.get(this.#getMetricName(name))?.inc(labels || {}, value); }; /** * Increments the error counter. */ - error = () => this.incCounter(this.#metricNames.errors); + error = (): void => this.incCounter(this.#metricNames.errors); /** * Increments the alerts counter. */ - alert = () => this.incCounter(this.#metricNames.alerts); + alert = (): void => this.incCounter(this.#metricNames.alerts); /** * Observes the duration since the provided start time and updates the summary. * @param startTime - The start time. * @param name - The metrics summary to increment. */ - observeEnd = (startTime: number, name: string = this.#metricNames.mutate) => { + observeEnd = (startTime: number, name: string = this.#metricNames.mutate): void => { this.#summaries.get(this.#getMetricName(name))?.observe(performance.now() - startTime); }; @@ -127,13 +128,13 @@ export class MetricsCollector { * Fetches the current metrics from the registry. * @returns The metrics. */ - getMetrics = () => this.#registry.metrics(); + getMetrics = (): Promise => this.#registry.metrics(); /** * Returns the current timestamp from performance.now() method. Useful for start timing an operation. * @returns The timestamp. */ - static observeStart() { + static observeStart(): number { return performance.now(); } @@ -141,7 +142,7 @@ export class MetricsCollector { * Increments the cache miss gauge for a given label. * @param label - The label for the cache miss. */ - incCacheMiss = (window: string) => { + incCacheMiss = (window: string): void => { this.incGauge(this.#metricNames.cacheMiss, { window }); }; @@ -149,7 +150,7 @@ export class MetricsCollector { * Increments the retry count gauge. * @param count - The count to increment by. */ - incRetryCount = (count: string) => { + incRetryCount = (count: string): void => { this.incGauge(this.#metricNames.resyncFailureCount, { count }); }; @@ -157,7 +158,7 @@ export class MetricsCollector { * Initializes the cache miss gauge for a given label. * @param label - The label for the cache miss. */ - initCacheMissWindow = (window: string) => { + initCacheMissWindow = (window: string): void => { this.#rollCacheMissWindows(); this.#gauges.get(this.#getMetricName(this.#metricNames.cacheMiss))?.set({ window }, 0); this.#cacheMissWindows.set(window, 0); @@ -166,7 +167,7 @@ export class MetricsCollector { /** * Manages the size of the cache miss gauge map. */ - #rollCacheMissWindows = () => { + #rollCacheMissWindows = (): void => { const maxCacheMissWindows = process.env.PEPR_MAX_CACHE_MISS_WINDOWS ? parseInt(process.env.PEPR_MAX_CACHE_MISS_WINDOWS, 10) : undefined; @@ -181,4 +182,4 @@ export class MetricsCollector { }; } -export const metricsCollector = new MetricsCollector("pepr"); +export const metricsCollector: MetricsCollectorInstance = new MetricsCollector("pepr"); diff --git a/src/lib/schedule.ts b/src/lib/schedule.ts index 19db58cfb..cd960e44f 100644 --- a/src/lib/schedule.ts +++ b/src/lib/schedule.ts @@ -57,11 +57,11 @@ export class OnSchedule implements Schedule { this.startTime = schedule?.startTime; this.completions = schedule?.completions; } - setStore(store: PeprStore) { + setStore(store: PeprStore): void { this.store = store; this.startInterval(); } - startInterval() { + startInterval(): void { this.checkStore(); this.getDuration(); this.setupInterval(); @@ -70,7 +70,7 @@ export class OnSchedule implements Schedule { * Checks the store for this schedule and sets the values if it exists * @returns */ - checkStore() { + checkStore(): void { const result = this.store && this.store.getItem(this.name); if (result) { const storedSchedule = JSON.parse(result); @@ -84,7 +84,7 @@ export class OnSchedule implements Schedule { * Saves the schedule to the store * @returns */ - saveToStore() { + saveToStore(): void { const schedule = { completions: this.completions, startTime: this.startTime, @@ -97,7 +97,7 @@ export class OnSchedule implements Schedule { /** * Gets the durations in milliseconds */ - getDuration() { + getDuration(): void { switch (this.unit) { case "seconds": if (this.every < 10) throw new Error("10 Seconds in the smallest interval allowed"); @@ -119,7 +119,7 @@ export class OnSchedule implements Schedule { /** * Sets up the interval */ - setupInterval() { + setupInterval(): void { const now = new Date(); let delay: number | undefined; @@ -146,7 +146,7 @@ export class OnSchedule implements Schedule { /** * Starts the interval */ - start() { + start(): void { this.intervalId = setInterval(() => { if (this.completions === 0) { this.stop(); @@ -165,7 +165,7 @@ export class OnSchedule implements Schedule { /** * Stops the interval */ - stop() { + stop(): void { if (this.intervalId) { clearInterval(this.intervalId); this.intervalId = null; diff --git a/src/lib/storage.ts b/src/lib/storage.ts index 754fd5917..2f56b2f12 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -12,15 +12,15 @@ export type Unsubscribe = () => void; const MAX_WAIT_TIME = 15000; const STORE_VERSION_PREFIX = "v2"; -export function v2StoreKey(key: string) { +export function v2StoreKey(key: string): string { return `${STORE_VERSION_PREFIX}-${pointer.escape(key)}`; } -export function v2UnescapedStoreKey(key: string) { +export function v2UnescapedStoreKey(key: string): string { return `${STORE_VERSION_PREFIX}-${key}`; } -export function stripV2Prefix(key: string) { +export function stripV2Prefix(key: string): string { return key.replace(/^v2-/, ""); } export interface PeprStore { @@ -80,11 +80,11 @@ export class Storage implements PeprStore { #subscriberId = 0; #readyHandlers: DataReceiver[] = []; - registerSender = (send: DataSender) => { + registerSender = (send: DataSender): void => { this.#send = send; }; - receive = (data: DataStore) => { + receive = (data: DataStore): void => { this.#store = data || {}; this.#onReady(); @@ -96,7 +96,7 @@ export class Storage implements PeprStore { } }; - getItem = (key: string) => { + getItem = (key: string): string | null => { const result = this.#store[v2UnescapedStoreKey(key)] || null; if (result !== null && typeof result !== "function" && typeof result !== "object") { return result; @@ -104,7 +104,7 @@ export class Storage implements PeprStore { return null; }; - clear = () => { + clear = (): void => { Object.keys(this.#store).length > 0 && this.#dispatchUpdate( "remove", @@ -112,11 +112,11 @@ export class Storage implements PeprStore { ); }; - removeItem = (key: string) => { + removeItem = (key: string): void => { this.#dispatchUpdate("remove", [v2StoreKey(key)]); }; - setItem = (key: string, value: string) => { + setItem = (key: string, value: string): void => { this.#dispatchUpdate("add", [v2StoreKey(key)], value); }; @@ -128,7 +128,7 @@ export class Storage implements PeprStore { * @param value - The value of the key * @returns */ - setItemAndWait = (key: string, value: string) => { + setItemAndWait = (key: string, value: string): Promise => { this.#dispatchUpdate("add", [v2StoreKey(key)], value); return new Promise((resolve, reject) => { @@ -154,7 +154,7 @@ export class Storage implements PeprStore { * @param key - The key to add into the store * @returns */ - removeItemAndWait = (key: string) => { + removeItemAndWait = (key: string): Promise => { this.#dispatchUpdate("remove", [v2StoreKey(key)]); return new Promise((resolve, reject) => { const unsubscribe = this.subscribe(data => { @@ -172,13 +172,13 @@ export class Storage implements PeprStore { }); }; - subscribe = (subscriber: DataReceiver) => { + subscribe = (subscriber: DataReceiver): (() => void) => { const idx = this.#subscriberId++; this.#subscribers[idx] = subscriber; return () => this.unsubscribe(idx); }; - onReady = (callback: DataReceiver) => { + onReady = (callback: DataReceiver): void => { this.#readyHandlers.push(callback); }; @@ -186,18 +186,18 @@ export class Storage implements PeprStore { * Remove a subscriber from the list of subscribers. * @param idx - The index of the subscriber to remove. */ - unsubscribe = (idx: number) => { + unsubscribe = (idx: number): void => { delete this.#subscribers[idx]; }; - #onReady = () => { + #onReady = (): void => { // Notify all ready handlers with a clone of the store for (const handler of this.#readyHandlers) { handler(clone(this.#store)); } // Make this a noop so that it can't be called again - this.#onReady = () => {}; + this.#onReady = (): void => {}; }; /** @@ -206,7 +206,7 @@ export class Storage implements PeprStore { * @param keys - The keys to update. * @param [value] - The new value. */ - #dispatchUpdate = (op: DataOp, keys: string[], value?: string) => { + #dispatchUpdate = (op: DataOp, keys: string[], value?: string): void => { this.#send(op, keys, value); }; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 6a00c07be..7ce5a0a8a 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -70,6 +70,17 @@ export interface RegExpFilter { obj: RegExp; source: string; } + +export type Filters = { + annotations: Record; + deletionTimestamp: boolean; + labels: Record; + name: string; + namespaces: string[]; + regexName: string; + regexNamespaces: string[]; +}; + export type Binding = { event: Event; isMutate?: boolean; @@ -79,15 +90,7 @@ export type Binding = { isFinalize?: boolean; readonly model: GenericClass; readonly kind: GroupVersionKind; - readonly filters: { - name: string; - regexName: string; - namespaces: string[]; - regexNamespaces: string[]; - labels: Record; - annotations: Record; - deletionTimestamp: boolean; - }; + readonly filters: Filters; alias?: string; readonly mutateCallback?: MutateAction>; readonly validateCallback?: ValidateAction>; diff --git a/src/templates/capabilities/hello-pepr.ts b/src/templates/capabilities/hello-pepr.ts index 1ae68ee8e..fc826b3e5 100644 --- a/src/templates/capabilities/hello-pepr.ts +++ b/src/templates/capabilities/hello-pepr.ts @@ -9,7 +9,7 @@ import { fetchStatus, kind, } from "pepr"; -import nock from "nock"; +import { MockAgent, setGlobalDispatcher } from "undici"; /** * The HelloPepr Capability is an example capability to demonstrate some general concepts of Pepr. @@ -273,14 +273,24 @@ When(a.ConfigMap) .WithLabel("chuck-norris") .Mutate(cm => cm.SetLabel("got-jokes", "true")) .Watch(async cm => { - const jokeURL = "https://icanhazdadjoke.com/"; - - // Set up Nock to mock the API calls globally with header matching - nock(jokeURL).get("/").reply(200, { - id: "R7UfaahVfFd", - joke: "Funny joke goes here.", - status: 200, - }); + const jokeURL = "https://icanhazdadjoke.com"; + + const mockAgent: MockAgent = new MockAgent(); + setGlobalDispatcher(mockAgent); + const mockClient = mockAgent.get(jokeURL); + mockClient.intercept({ path: "/", method: "GET" }).reply( + 200, + { + id: "R7UfaahVfFd", + joke: "Funny joke goes here.", + status: 200, + }, + { + headers: { + "Content-Type": "application/json; charset=utf-8", + }, + }, + ); // Try/catch is not needed as a response object will always be returned const response = await fetch(jokeURL, {