diff --git a/.eslintrc.js b/.eslintrc.js index 3c1a1e304b..a9018e47b4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,6 @@ module.exports = { env: { browser: true, es2015: true, node: true }, - settings: { "import/resolver": "webpack" }, + settings: { "import/resolver": "webpack", react: { version: "detect" } }, extends: ["eslint:recommended", "plugin:react/recommended", "prettier"], overrides: [ { diff --git a/.github/workflows/dependabot.yaml b/.github/workflows/dependabot.yaml index aeca775c6b..07ae17886b 100644 --- a/.github/workflows/dependabot.yaml +++ b/.github/workflows/dependabot.yaml @@ -16,12 +16,12 @@ env: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_KEY }} AWS_DEFAULT_REGION: us-east-1 APPZI_TOKEN: ${{ secrets.APPZI_TOKEN }} - MENDABLE_API_KEY: ${{ secrets.MENDABLE_API_KEY }} FULLSTORY_ORGID: ${{ secrets.FULLSTORY_ORGID }} ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} jobs: dependabot_build: diff --git a/.github/workflows/nightly-docker-build.yaml b/.github/workflows/nightly-docker-build.yaml index c19fabe58f..4fb39c93c7 100644 --- a/.github/workflows/nightly-docker-build.yaml +++ b/.github/workflows/nightly-docker-build.yaml @@ -13,6 +13,7 @@ env: ALGOLIA_APP_ID: "123456789" ALGOLIA_SEARCH_KEY: "123456789" ALGOLIA_INDEX_NAME: "madeup-index" + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} jobs: build: diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml index bee925e50f..0b3d45c0b1 100644 --- a/.github/workflows/pull_request.yaml +++ b/.github/workflows/pull_request.yaml @@ -20,6 +20,7 @@ env: ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} jobs: run-ci: diff --git a/.github/workflows/release-branch-pr.yaml b/.github/workflows/release-branch-pr.yaml index 91af71ea76..2bebf91084 100644 --- a/.github/workflows/release-branch-pr.yaml +++ b/.github/workflows/release-branch-pr.yaml @@ -17,6 +17,7 @@ env: ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} GITHUB_BRANCH: ${{ github.ref_name }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} concurrency: diff --git a/.github/workflows/release-preview.yaml b/.github/workflows/release-preview.yaml index ca5c7df030..285c9143a2 100644 --- a/.github/workflows/release-preview.yaml +++ b/.github/workflows/release-preview.yaml @@ -11,12 +11,12 @@ env: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_KEY }} AWS_DEFAULT_REGION: us-east-1 APPZI_TOKEN: ${{ secrets.APPZI_TOKEN }} - MENDABLE_API_KEY: ${{ secrets.MENDABLE_API_KEY }} FULLSTORY_ORGID: ${{ secrets.FULLSTORY_ORGID }} ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} concurrency: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2d9200aaaf..1445201402 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,12 +20,12 @@ env: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_KEY }} AWS_DEFAULT_REGION: us-east-1 APPZI_TOKEN: ${{ secrets.APPZI_TOKEN }} - MENDABLE_API_KEY: ${{ secrets.MENDABLE_API_KEY }} FULLSTORY_ORGID: ${{ secrets.FULLSTORY_ORGID }} ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} concurrency: diff --git a/.github/workflows/screenshot_capture.yaml b/.github/workflows/screenshot_capture.yaml index 0c7fae5463..2ad9b53a61 100644 --- a/.github/workflows/screenshot_capture.yaml +++ b/.github/workflows/screenshot_capture.yaml @@ -20,6 +20,7 @@ env: ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} ALGOLIA_INDEX_NAME: ${{ secrets.ALGOLIA_INDEX_NAME }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} jobs: diff --git a/.github/workflows/visual-comparison.yaml b/.github/workflows/visual-comparison.yaml index d2553d7c29..087d8dddfd 100644 --- a/.github/workflows/visual-comparison.yaml +++ b/.github/workflows/visual-comparison.yaml @@ -9,7 +9,7 @@ on: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MENDABLE_API_KEY: ${{ secrets.MENDABLE_API_KEY }} + PALETTE_API_KEY: ${{ secrets.PALETTE_API_KEY }} FULLSTORY_ORGID: ${{ secrets.FULLSTORY_ORGID }} ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} diff --git a/.gitignore b/.gitignore index a3bf5ca550..ad4e8f385a 100644 --- a/.gitignore +++ b/.gitignore @@ -64,7 +64,7 @@ test-results/ playwright-report/ artifact.zip -# Netlify +# Netlify .netlify/ # Ignore _partials/index.ts @@ -76,4 +76,4 @@ static/img/packs .vale-config/ vale/styles/spectrocloud/ vale/styles/spectrocloud-docs-internal/ -vale/styles/config/vocabularies/spectrocloud-vocab \ No newline at end of file +vale/styles/config/vocabularies/spectrocloud-vocab diff --git a/.gitleaksignore b/.gitleaksignore index dc1917d90f..cc61b83e1e 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -15,6 +15,7 @@ d748cceb3859df5c354b96a0c3d115513f6c123e:docs/docs-content/devx/apps/deploy-app. 404219eb2cad1fbd5e03d64783b1db285c8e08b3:docs/docs-content/integrations/portworx_operator.md:private-key:613 504642da118b99f12e838c6ff9a1166cc8fcff61:docs/docs-content/integrations/portworx_operator.md:private-key:309 86b8971f386ee3b00d2558a7fd6029f312b335cf:docs/docs-content/integrations/portworx.md:private-key:269 +1058de28bdc307a7b9a80ba6f1c26d2165d43414:docs/deprecated/integrations/portworx.md:private-key:263 feaea7ee07b76653233cf4ff8376953bfb216c8d:docs/docs-content/integrations/ubuntu.md:generic-api-key:65 261324e61a4dd4a3da73c8c03f45d3fcca826817:packages/docs/content/clusters/cluster-management/cluster-rbac.md:generic-api-key:112 261324e61a4dd4a3da73c8c03f45d3fcca826817:packages/docs/content/clusters/cluster-management/cluster-rbac.md:generic-api-key:113 diff --git a/.prettierignore b/.prettierignore index eb3379c58a..7e33410237 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,7 +11,7 @@ docs/api-content/**/*.json # Troublesome files tsconfig.json -src/components/IconMapper/dynamicFontAwesomeImports.js +src/components/IconMapper/dynamicFontAwesomeImports.* docs/docs-content/security-bulletins/cve-reports.md # Ignore partials diff --git a/Makefile b/Makefile index 2b19329d7a..3e08fc8623 100644 --- a/Makefile +++ b/Makefile @@ -32,12 +32,21 @@ deep-clean: ## Clean all artifacts rm -rf node_modules build public .cache .docusaurus npm run clear && npm run clean-api-docs docker image rm $(IMAGE) || echo "No image exists." + rm -rfv static/img/packs + +clean-logos: ## Clean logos + rm -rf static/img/packs clean-versions: ## Clean Docusarus content versions @echo "cleaning versions" rm -rf api_versions.json versions.json versioned_docs versioned_sidebars api_versioned_sidebars api_versioned_docs versioned_partials git checkout -- docusaurus.config.js static/robots.txt + +clean-packs: ## Clean supplemental packs and pack images + rm -rf static/img/packs + rm -rf .docusaurus/packs-integrations/api_pack_response.json + clean-api: ## Clean API docs @echo "cleaning api docs" npm run clean-api-docs diff --git a/README.md b/README.md index 80659cc041..3f7f51e0d5 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,13 @@ required environment variables. The values are not important for local developme ALGOLIA_APP_ID=1234567890 ALGOLIA_SEARCH_KEY=1234567890 ALGOLIA_INDEX_NAME=spectrocloud +PALETTE_API_KEY="" ``` +> [!IMPORTANT] You need a Palette API key to start the local development server. Refer to the +> [Create API Key](https://docs.spectrocloud.com/user-management/authentication/api-key/create-api-key/) guide to learn +> how to create a Palette API key. + ## Documentation Content Create a branch to keep track of all your changes. @@ -650,7 +655,8 @@ To add tutorials to an existing category, create a new **.md** file in the respe This is a custom component that allows you to create and use Docusaurus' [Import Markdown](https://docusaurus.io/docs/markdown-features/react#importing-markdown) functionality. -> [!IMPORTANT] +> [!IMPORTANT] +> > Docusaurus does not provide the ability to dynamically configure table of contents. See > [this issue](https://github.com/facebook/docusaurus/issues/6201) for more information. This means that you should > avoid adding headings to partials that you intend to use with the Partials Component. @@ -714,6 +720,124 @@ This is a +```json +[ + "palette-upgrader", + "csi-aws-new", + "inser-pack-name-here" +] +``` + +Excluded packs are not displayed in the packs component. + +#### README Content + +The pack component will display a Pack's README file if it exists. The README content comes from the Palette API. +Depending on the available content, the packs component will display the README content, the additional details content, +or a message indicating that no content is available. Refer to the table below for the different scenarios. + +| README Available | Additional Details File Available | Content Displayed | +| ---------------- | --------------------------------- | -------------------------------------------------------- | +| ✅ | ✅ | Both README and Additional Details content is displayed. | +| ✅ | ❌ | Only the README content is displayed. | +| ❌ | ✅ | Only the Additional Details content is displayed. | +| ❌ | ❌ | A message indicating that no content is available. | + +#### Additional Details Content + +To display the Additional Details content, create a markdown file with the same name as the pack in the the +[`docs/docs-content/integrations/`](./docs/docs-content/integrations/) content folder. For example, if the pack name is +`ubuntu-aws`, you would create a markdown file called `ubuntu-aws.md`. The additional details content requires you to +follow the [Packs layout guide](https://spectrocloud.atlassian.net/wiki/spaces/DE/pages/1802797059/Packs). + +If you want to add content specific to a version, include the following heading and tabs component in the markdown file. + + +```md +## Versions Supported + + -> Tabs for different versions + + Insert content here as needed. Create more `TabItem` components as needed. + + +``` + +> [!WARNING] +> +> Ensure the`Tabs` component has the `queryString` prop set to `parent`. This is required for the component to work. The +> `Tabs` component must also have a `## Versions Supported` heading. If you do not follow this format, the content will +> not be displayed correctly, and as a result, actual tabs will be displayed, and the pack will lose the ability to +> automatically display the content for the select version the user has specified in the version drop-down. + +The packs component will always display the top-level tab content, so if you add content for a new version, ensure the +new `TabItem` component is the first in the list. If a new pack version does not have a respective tag, the latest +version content will be displayed automatically. + +#### Links + +When authoring additional details content, you must use the `` component to link to other documentation +pages. The component is required to ensure that the links are versioned correctly. Refer to the +[Internal Links](#internal-links) section for more information. + +If you want to link to a heading inside the pack component, you must also use the `` and include the +path to the component followed by the heading id. The following is an example of how to link to a heading inside the +pack component. Take note of the `#` symbol followed by the heading id. + +```md + +``` + +Omit the `version=xxxx&parent=xxxx` value that is part of the query string. If you include the `version` and `parent` +values, the link will not work as expected. + +### Link to a Pack + +You must use the `` component to link to a pack. The following is an example of how to link to a pack. +For more information, refer to the [Internal Links](#internal-links) section. + +```md + +``` + +If you do not use the `` component, the link will not be versioned correctly, and the build will fail. + ## Netlify Previews By default Netlify previews are enabled for pull requests. However, some branches do not require Netlify previews. In @@ -739,7 +863,9 @@ documentation. Next, download the required Vale plugins. ``` + make sync-vale + ``` To execute the writing check, issue the command below. The command below will identify files that are modified by @@ -747,7 +873,9 @@ comparing the current git branch against the `master` branch. Ensure your local accurate results. ``` + make check-writing + ``` You may also use the Vale CLI to directly scan a file and receive feedback. diff --git a/_partials/packs/_kubernetes-genercic.mdx b/_partials/packs/_kubernetes-genercic.mdx new file mode 100644 index 0000000000..c7e6416443 --- /dev/null +++ b/_partials/packs/_kubernetes-genercic.mdx @@ -0,0 +1,638 @@ +--- +partial_category: packs +partial_name: kubernetes-generic +--- + + +### Support Lifecycle + + +We support CNCF Kubernetes for N-3 Kubernetes minor versions for a duration of 14 months. The duration exceeds the +official EOL by four months. Once we stop supporting the minor version, we initiate the deprecation process. Refer to +the guide to learn more. + + + +:::warning + + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the +section. + +Review the to learn about pack update and deprecation schedules. + +::: + +## Versions Supported + + + + + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. + + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + . + + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can specify the service domain only at cluster creation. After the cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The Kubeadm config is updated with hardening improvements that do the following: + +- Meet CIS standards for Operating Systems (OS). + + +- Enable a Kubernetes audit policy in the pack. The audit policy is hidden, and you cannot customize the default audit + policy. If you want to apply your custom audit policy, refer to the + guide to learn how to create your custom audit policy + by adjusting the API server flags. + +- Replace a deprecated PodSecurityPolicy (PSP) with one that offers three built-in policy profiles for broad security + coverage: + + - **Privileged**: An unrestricted policy that provides wide permission levels and allows for known privilege + escalations. + + - **Baseline**: A policy that offers minimal restrictions and prevents known privilege escalations. As shown in the + example below, you can override the default cluster-wide policy to set baseline enforcement by enabling the + `PodSecurity` Admission plugin in the `enable-admission-plugins` section of the YAML file. You can then add a custom + Admission configuration and set the `admission-control-config-file` flag to the custom Admission. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + ``` + + - **Restricted**: A heavily restricted policy that follows the best practices of Pod hardening. This policy is set to + warn and audit and identifies Pods that require privileged access. + + You can enforce these policies at the Cluster or Namespace level. For workloads that require privileged access, you + can relax `PodSecurity` enforcement by adding these labels in the Namespace: + + ```yaml + pod-security.kubernetes.io/enforce: privileged + pod-security.kubernetes.io/enforce-version: v1.26 + ``` + +### Kubeadm Configuration File + +The default pack YAML contains minimal configurations offered by the managed provider. + +### Configure OIDC Identity Provider + +You can configure an OpenID Connect (OIDC) identity provider to authenticate users and groups in your cluster. OIDC is +an authentication layer on top of OAuth 2.0, an authorization framework that allows users to authenticate to a cluster +without using a password. + +OIDC requires a _Role Binding_ for the users or groups you want to provide cluster access. You must create a Role +Binding to a Kubernetes role that is available in the cluster. The Kubernetes role can be a custom role you created or a +[default Kubernetes role](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles), such as the +`cluster-admin` role. To learn how to create a Role Binding through Palette, refer to +. + +#### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and Azure AKS. + + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. Replace the + `identityProvider` value with your OIDC provider name. + + ```yaml + pack: + palette: + config: + oidc: + identityProvider: yourIdentityProviderNameHere + ``` + +2. Add the following `kubeadmconfig` parameters. Replace the values with your OIDC provider values. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +3. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + + ```yaml + oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: + ``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + + ```yaml + clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: yourSecretKeyHere + oidc-extra-scope: profile,email + ``` + +3. Provide third-party OIDC IDP details. + + +4. Refer to the for guidance on how to access an EKS cluster. + + + + + + + + + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. + + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + . + + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can only specify the service domain at cluster creation. After cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The Kubeadm config is updated with hardening improvements that do the following: + +- Meet CIS standards for operating systems (OS). + + +- Enable a Kubernetes audit policy in the pack. The audit policy is hidden, and you cannot customize the default audit + policy. If you want to apply your custom audit policy, refer to the + guide to learn how to create your custom audit policy + by adjusting the API server flags. + +- Replace a deprecated PodSecurityPolicy (PSP) with one that offers three built-in policy profiles for broad security + coverage: + + - **Privileged**: An unrestricted policy that provides wide permission levels and allows for known privilege + escalations. + + - **Baseline**: A policy that offers minimal restrictions and prevents known privilege escalations. As shown in the + example below, you can override the default cluster-wide policy to set baseline enforcement by enabling the + `PodSecurity` Admission plugin in the `enable-admission-plugins` section of the YAML file. You can then add a custom + Admission configuration and set the `admission-control-config-file` flag to the custom Admission. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + ``` + + - **Restricted**: A heavily restricted policy that follows Pod hardening best practices. This policy is set to warn + and audit and identifies Pods that require privileged access. + + You can enforce these policies at the cluster level or the Namespace level. For workloads that require privileged + access, you can relax `PodSecurity` enforcement by adding these labels in the Namespace: + + ```yaml + pod-security.kubernetes.io/enforce: privileged + pod-security.kubernetes.io/enforce-version: v1.26 + ``` + +### Kubeadm Configuration File + +The default pack YAML contains minimal configurations offered by the managed provider. + +### Configure OIDC Identity Provider + +You can configure an OpenID Connect (OIDC) identity provider to authenticate users and groups in your cluster. OIDC is +an authentication layer on top of OAuth 2.0, an authorization framework that allows users to authenticate to a cluster +without using a password. + + +OIDC requires a _Role Binding_ for the users or groups you want to provide cluster access. You must create a Role +Binding to a Kubernetes role that is available in the cluster. The Kubernetes role can be a custom role you created or a +[default Kubernetes role](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles), such as the +`cluster-admin` role. To learn how to create a Role Binding through Palette, refer to +. + +#### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and Azure AKS. + + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. Replace the + `identityProvider` value with your OIDC provider name. + + ```yaml + pack: + palette: + config: + oidc: + identityProvider: yourIdentityProviderNameHere + ``` + +2. Add the following `kubeadmconfig` parameters. Replace the values with your OIDC provider values. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +3. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + + ```yaml + oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: + ``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + + ```yaml + clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: yourSecretKeyHere + oidc-extra-scope: profile,email + ``` + +3. Provide third-party OIDC IDP details. + + +4. Refer to the for guidance on how to access an EKS cluster. + + + + + + + + + + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. + + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + . + + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can only specify the service domain at cluster creation. After cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The Kubeadm config is updated with hardening improvements that do the following: + +- Meet CIS standards for operating systems (OS). + + +- Enable a Kubernetes audit policy in the pack. The audit policy is hidden, and you cannot customize the default audit + policy. If you want to apply your custom audit policy, refer to the + guide to learn how to create your custom audit policy + by adjusting the API server flags. + +- Replace a deprecated PodSecurityPolicy (PSP) with one that offers three built-in policy profiles for broad security + coverage: + + - **Privileged**: An unrestricted policy that provides wide permission levels and allows for known privilege + escalations. + + - **Baseline**: A policy that offers minimal restrictions and prevents known privilege escalations. As shown in the + example below, you can override the default cluster-wide policy to set baseline enforcement by enabling the + `PodSecurity` Admission plugin in the `enable-admission-plugins` section of the YAML file. You can then add a custom + Admission configuration and set the `admission-control-config-file` flag to the custom Admission. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + ``` + + - **Restricted**: A heavily restricted policy that follows Pod hardening best practices. This policy is set to warn + and audit and identifies Pods that require privileged access. + + You can enforce these policies at the cluster level or the Namespace level. For workloads that require privileged + access, you can relax `PodSecurity` enforcement by adding these labels in the Namespace: + + ```yaml + pod-security.kubernetes.io/enforce: privileged + pod-security.kubernetes.io/enforce-version: v1.26 + ``` + +### Kubeadm Configuration File + +The default pack YAML contains minimal configurations offered by the managed provider. + +### Configure OIDC Identity Provider + +You can configure an OpenID Connect (OIDC) identity provider to authenticate users and groups in your cluster. OIDC is +an authentication layer on top of OAuth 2.0, an authorization framework that allows users to authenticate to a cluster +without using a password. + +OIDC requires a _Role Binding_ for the users or groups you want to provide cluster access. You must create a Role +Binding to a Kubernetes role that is available in the cluster. The Kubernetes role can be a custom role you created or a +[default Kubernetes role](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles), such as the +`cluster-admin` role. To learn how to create a Role Binding through Palette, refer to +. + +#### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and Azure AKS. + + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. Replace the + `identityProvider` value with your OIDC provider name. + + ```yaml + pack: + palette: + config: + oidc: + identityProvider: yourIdentityProviderNameHere + ``` + +2. Add the following `kubeadmconfig` parameters. Replace the values with your OIDC provider values. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +3. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + +```yaml +oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: +``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + +```yaml +clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: yourSecretKeyHere + oidc-extra-scope: profile,email +``` + +3. Provide third-party OIDC IDP details. + + +4. Refer to the for guidance on how to access an EKS cluster. + + + + + + + + + + diff --git a/_partials/packs/_longhorn.mdx b/_partials/packs/_longhorn.mdx new file mode 100644 index 0000000000..c1526289d7 --- /dev/null +++ b/_partials/packs/_longhorn.mdx @@ -0,0 +1,324 @@ +--- +partial_category: packs +partial_name: longhorn +--- + + +## Versions Supported + + + + +### Longhorn with Harbor Registry in Airgap Environments + +When you use the Longhorn pack in an airgapped environment, the Harbor Edge-Native Config pack is required for your +cluster to function. However, you must change the image references in the Longhorn pack to use the base URL of the local +Harbor registry. Otherwise, the cluster will fail to deploy, with the `longhorn-driver-deployer` pod stuck in the `Init` +state. + +1. Log in to Palette. + +2. From the left **Main Menu**, select **Profiles**. + +3. Select the cluster profile you use to deploy the cluster with Longhorn. + +4. In the pack YAML for the Longhorn pack, replace the base URL of each image referenced in the pack with the Harbor + registry. + + For example, the following is a snippet of the Longhorn pack's YAML before and after you replace the base URL. + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + Refer to pack documentation to learn how to + find the node IP and port of the Harbor registry. If you have given the registry a domain name, you can use the + domain name instead of the node IP. + +## Known Issues + +The following known issues exist in the Longhorn 1.5.X release. + +- A deadlock may occurs when using a RWX volume and a cluster node is recreated. This issue is disclosed as a + [known issue](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues#v153) in the Longhorn GitHub repository] + and a fix is on the roadmap. Workarounds provided by the community can be found in the + [issue discussion](https://github.com/longhorn/longhorn/issues/7183#issuecomment-1823715359). + +- Rebooting or upgrading a cluster with Longhorn has a small possibility of triggering a race condition that causes pods + to be stuck in the terminating state. This issue is related to a + [known issue](https://github.com/longhorn/longhorn/issues/6962) in the Longhorn GitHub repository and a fix is on the + roadmap. + +- Using Longhorn together in airgap environments with an external registry requires you to update the Longhorn pack + image references to use the base URL of the Harbor registry. For more information, refer to + Longhorn Deployer Stuck in Init State in Airgap Environments section. + + + + +### Longhorn with Harbor Registry in Airgap Environments + +When you use the Longhorn pack in an airgapped environment, the Harbor Edge-Native Config pack is required for your +cluster to function. However, you must change the image references in the Longhorn pack to use the base URL of the local +Harbor registry. Otherwise, the cluster will fail to deploy, with the `longhorn-driver-deployer` pod stuck in the `Init` +state. + +1. Log in to Palette. + +2. From the left **Main Menu**, select **Profiles**. + +3. Select the cluster profile you use to deploy the cluster with Longhorn. + +4. In the pack YAML for the Longhorn pack, replace the base URL of each image referenced in the pack with the Harbor + registry. + + For example, the following is a snippet of the Longhorn pack's YAML before and after you replace the base URL. + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + Refer to pack documentation to learn how to + find the node IP and port of the Harbor registry. If you have given the registry a domain name, you can use the + domain name instead of the node IP. + +## Known Issues + +The following known issues exist in the Longhorn 1.5.X release. + +- A deadlock may occurs when using a RWX volume and a cluster node is recreated. This issue is disclosed as a + [known issue](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues#v153) in the Longhorn GitHub repository] + and a fix is on the roadmap. Workarounds provided by the community can be found in the + [issue discussion](https://github.com/longhorn/longhorn/issues/7183#issuecomment-1823715359). + +- Rebooting or upgrading a cluster with Longhorn has a small possibility of triggering a race condition that causes pods + to be stuck in the terminating state. This issue is related to a + [known issue](https://github.com/longhorn/longhorn/issues/6962) in the Longhorn GitHub repository and a fix is on the + roadmap. + +- Using Longhorn together in airgap environments with an external registry requires you to update the Longhorn pack + image references to use the base URL of the Harbor registry. For more information, refer to + Longhorn Deployer Stuck in Init State in Airgap Environments section. + + + + + +### Longhorn with Harbor Registry in Airgap Environments + +When you use the Longhorn pack in an airgapped environment, the Harbor Edge-Native Config pack is required for your +cluster to function. However, you must change the image references in the Longhorn pack to use the base URL of the local +Harbor registry. Otherwise, the cluster will fail to deploy, with the `longhorn-driver-deployer` pod stuck in the `Init` +state. + +1. Log in to Palette. + +2. From the left **Main Menu**, select **Profiles**. + +3. Select the cluster profile you use to deploy the cluster with Longhorn. + +4. In the pack YAML for the Longhorn pack, replace the base URL of each image referenced in the pack with the Harbor + registry. + + For example, the following is a snippet of the Longhorn pack's YAML before and after you replace the base URL. + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + Refer to pack documentation to learn how to + find the node IP and port of the Harbor registry. If you have given the registry a domain name, you can use the + domain name instead of the node IP. + + + + + +### Longhorn with Harbor Registry in Airgap Environments + +When you use the Longhorn pack in an airgapped environment, the Harbor Edge-Native Config pack is required for your +cluster to function. However, you must change the image references in the Longhorn pack to use the base URL of the local +Harbor registry. Otherwise, the cluster will fail to deploy, with the `longhorn-driver-deployer` pod stuck in the `Init` +state. + +1. Log in to Palette. + +2. From the left **Main Menu**, select **Profiles**. + +3. Select the cluster profile you use to deploy the cluster with Longhorn. + +4. In the pack YAML for the Longhorn pack, replace the base URL of each image referenced in the pack with the Harbor + registry. + + For example, the following is a snipped of the Longhorn pack's YAML before and after you replace the base URL: + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: gcr.io/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + ```yaml + pack: + namespace: "longhorn-system" + namespaceLabels: + "longhorn-system": + "pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" + content: + images: + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-engine:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-ui:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-instance-manager:v1.5.3 + - image: 10.10.137.220:30003/spectro-images-public/packs/csi-longhorn/1.5.3/longhorn-share-manager:v1.5.3 + ``` + + + + + + Refer to pack documentation to learn how to + find the node IP and port of the Harbor registry. If you have given the registry a domain name, you can use the + domain name instead of the node IP. + + + diff --git a/_partials/packs/_portworkx-operator.mdx b/_partials/packs/_portworkx-operator.mdx new file mode 100644 index 0000000000..8abbdec79d --- /dev/null +++ b/_partials/packs/_portworkx-operator.mdx @@ -0,0 +1,1673 @@ +--- +partial_category: packs +partial_name: portworx-operator +--- + +## Versions Supported + + + + +The default installation of Portworx /w Operator will deploy the following components in the Kubernetes cluster: + +- Portworx Operator + +- `StorageCluster` resource that tells the Operator how to deploy and configure Portworx. + +- `StorageClass` resource for dynamic provisioning of `PersistentVolumes`` using the `pxd.portworx.com` provisioner. + +- [Stork](https://docs.portworx.com/portworx-enterprise/operations/operate-kubernetes/storage-operations/stork.html). + Portworx's storage scheduler for Kubernetes. + + + +
+ +### License Model + +This pack can install Portworx in three different licensing modes: + +- **Essentials**: a free Portworx license with limited functionality that allows you to deploy a small production or + proof-of-concept workloads. Essentials limits capacity and advanced features, but otherwise functions the same way as + the fully featured Portworx Enterprise version of Portworx. + +- **Enterprise**: the fully featured version of Portworx. If you install this model without a valid key, Portworx will + automatically enter a 30-day trial mode. + +- **Enterprise SaaS PAYG**: the fully featured version of Portworx but using a SaaS license key that allows unlimited + use and in-arrears billing. If you install this model without a valid key, Portworx will automatically enter a 30-day + trial mode. + +Use the presets in the pack user interface to select which license model you want to use, then update the +`charts.portworx-generic.license` section for your chosen license model. + +
+ + + + +```yaml +license: + type: essentials + essentials: + # Base64-decoded value of the px-essen-user-id value in the px-essential secret + # Find your Essentials Entitlement ID at https://central.portworx.com/profile + userId: 1234abcd-12ab-12ab-12ab-123456abcdef + # Base64-decoded value of the px-osb-endpoint value in the px-essential secret + # Leave at the default value unless there are special circumstances + endpoint: https://pxessentials.portworx.com/osb/billing/v1/register +``` + + + + +```yaml +license: + type: saas + saas: + key: +``` + + + + + +```yaml +license: + type: enterprise + enterprise: + activateLicense: true + activationId: + # customLicenseServer: + # url: http://hostname:7070/fne/bin/capability + # importUnknownCa: true + # licenseBorrowInterval: 1w15m + # addFeatures: + # - feature1 + # - feature2 +``` + + + + +### Storage Specification + +You can install Portworx in a variety of storage configurations. + +- **Existing disks (generic)**: This mode does not integrate with any particular storage solution, it uses existing + disks available on the nodes. + +- **AWS Cloud Storage**: This mode integrates with Amazon EBS block volumes and allows AWS EKS and EC2 based Kubernetes + clusters to dynamically attach EBS volumes to worker nodes for Portworx. + +- **Azure Cloud Storage**: This mode integrates with Azure block storage and allows Azure AKS and regular Azure + Kubernetes clusters to dynamically attach Azure block storage to worker nodes for Portworx. + +- **Google Cloud Storage**: This mode integrates with Google persistent disks and allows GKE and regular Google + Kubernetes clusters to dynamically attach persistent disks to worker nodes for Portworx. + +- **VMware vSphere Datastores**: This mode integrates with VMware vSphere storage and allows Kubernetes clusters on + vSphere to dynamically attach vSAN and regular Datastore disks to worker nodes for Portworx. + +- **Pure Storage Flash Array**: This mode integrates with Pure Storage Flash Arrays and allows Kubernetes clusters to + dynamically attach Flash Array disks over iSCSI to worker nodes for Portworx. + +:::tip + +Use the presets in the pack user interface to select which storage specification you want to use, then update the +`charts.portworx-generic.storageCluster` section to your specific needs. + +::: + +Select the tab below for the storage specification you want to use. Use the example YAML as a starting point for your +configuration. + +
+ + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + storage: + useAll: true + # kvdbDevice: /dev/sdb + journalDevice: auto + # network: + # dataInterface: eth0 + # mgmtInterface: eth1 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true +``` + + + + +To deploy Portworx in an AWS environment, ensure the following IAM policy is created in AWS and attached to the +`nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role.
+ +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": + [ + "ec2:AttachVolume", + "ec2:ModifyVolume", + "ec2:DetachVolume", + "ec2:CreateTags", + "ec2:CreateVolume", + "ec2:DeleteTags", + "ec2:DeleteVolume", + "ec2:DescribeTags", + "ec2:DescribeVolumeAttribute", + "ec2:DescribeVolumesModifications", + "ec2:DescribeVolumeStatus", + "ec2:DescribeVolumes", + "ec2:DescribeInstances", + "autoscaling:DescribeAutoScalingGroups", + ], + "Resource": ["*"], + }, + ], +} +``` + +- When deploying a regular Kubernetes cluster on an AWS EC2 using Palette, attach the policy to the + `nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role. Or alternatively, edit the AWS cloud account in Palette, enable + the `Add IAM Policies` option, and select the Portworx IAM policy described above. This will automatically attach the + IAM policy to the correct IAM role.. + +- When deploying an AWS EKS cluster, use the `managedMachinePool.roleAdditionalPolicies` option in the Kubernetes pack + layer YAML to automatically attach the Portworx IAM policy to the EKS worker pool IAM role . The example below shows + how to attach the Portworx IAM policy to the EKS worker pool IAM role. + +```yaml +managedMachinePool: + roleAdditionalPolicies: + - "arn:aws:iam::012345678901:policy/my-portworx-policy" +``` + +```yaml +storageCluster: + annotations: + portworx.io/is-eks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + maxStorageNodesPerZone: 0 + deviceSpecs: + - type=gp3,size=150 + kvdbDeviceSpec: type=gp3,size=150 + journalDeviceSpec: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true +``` + +
+ + +```yaml +storageCluster: + annotations: + portworx.io/is-aks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + maxStorageNodesPerZone: 0 + deviceSpecs: + - type=Premium_LRS,size=150 + kvdbDeviceSpec: type=Premium_LRS,size=150 + journalDeviceSpec: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true + env: + - name: AZURE_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_SECRET + - name: AZURE_CLIENT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_ID + - name: AZURE_TENANT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_TENANT_ID +azureSecret: + tenantId: "your_azure_tenant_id" + clientId: "your_azure_client_id" + clientSecret: "your_client_secret" +``` + + + + +```yaml +storageCluster: + annotations: + portworx.io/is-gke: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + maxStorageNodesPerZone: 0 + deviceSpecs: + - type=pd-standard,size=150 + kvdbDeviceSpec: type=pd-standard,size=150 + journalDeviceSpec: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true +``` + + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + maxStorageNodesPerZone: 0 + deviceSpecs: + - type=lazyzeroedthick,size=150 + kvdbDeviceSpec: type=lazyzeroedthick,size=32 + journalDeviceSpec: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true + env: + - name: VSPHERE_INSECURE + value: "true" + - name: VSPHERE_USER + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_USER + - name: VSPHERE_PASSWORD + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_PASSWORD + - name: VSPHERE_VCENTER + value: my-vcenter.company.local + - name: VSPHERE_VCENTER_PORT + value: "443" + - name: VSPHERE_DATASTORE_PREFIX + value: Datastore + - name: VSPHERE_INSTALL_MODE + value: shared +vsphereSecret: + user: "username_for_vCenter_here" + password: "your_password" +``` + + + + +To activate the Pure Flash Array integration, you will need to create a Kubernetes secret named `px-pure-secret` on your +cluster containing your +[Flash Array license JSON](https://docs.portworx.com/portworx-enterprise/platform/kubernetes/flasharray/install/install-flasharray-on-cloud#create-a-json-configuration-file). +The secret must be created in the namespace that contains the `StorageCluster` resource. The namespace is `portworx` by +default. + +Use the following command to create the secret: + +``` +kubectl create secret generic px-pure-secret --namespace portworx --from-file=pure.json= +``` + +Alternatively, you can attach a manifest to the Portworx /w Operator pack that contains the YAML for the secret. + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:3.0.0 + imagePullPolicy: Always + deleteStrategy: + type: UninstallAndWipe + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + maxStorageNodesPerZone: 0 + deviceSpecs: + - size=150 + kvdbDeviceSpec: size=32 + journalDeviceSpec: auto + # network: + # dataInterface: eth0 + # mgmtInterface: eth1 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + providers: + - name: default + params: + url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local:9090 + type: prometheus + runtimeOptions: + default-io-profile: "6" + csi: + enabled: true + monitoring: + telemetry: + enabled: true + prometheus: + enabled: false + exportMetrics: true + env: + - name: PURE_FLASHARRAY_SAN_TYPE + value: ISCSI # or "FC" +``` + + + + +
+ +
+ +### Etcd + +Portworx Enterprise supports multiple etcd scenarios. Portworx will default to an internal key-value store (KVDB). + +#### Kvdb and Etcd Presets + +The following pack presets are available for configuring etcd. + +The pack defaults to the **Use Internal Kvdb** option. You can change to a different preset if you need to connect to an +external etcd server. + + + + +```yaml +storageCluster: + spec: + kvdb: + internal: true +``` + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 +``` + + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 + authSecret: px-kvdb-auth + +# External kvdb related config, only used if storageCluster.spec.kvdb.internal != true +externalKvdb: + useCertsForSSL: true + # The CA cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cacert: | + < PEM KEY DATA > + # The cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cert: | + < PEM KEY DATA > + # The key to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + key: | + < PEM KEY DATA > +``` + + + + +#### Integration With External Etcd + +Use the following steps to integrate Portworx to an external etcd server by following the steps below. + +1. During the cluster profile creation, select the Portworx pack and click on the **Presets** button in the top right + corner of the pack user interface. + +2. Select the **Use External Kvdb over HTTP** or **Use External Kvdb over SSL** preset in the pack UI. If your external + etcd server requires certificate authentication, select **Use External Kvdb over SSL** preset. + +3. Configure the external etcd endpoints in the YAML parameter block named + `charts.portworx-generic.storageCluster.spec.kvdb.endpoints`. + +4. If you selected the **Use External Kvdb over SSL** preset, you will also need to configure the + `charts.portworx-generic.externalKvdb` section. Set `charts.portworx-generic.externalKvdb.useCertsForSSL` to `true` + to enable certificate authentication. Input your SSL certificates in the `cacert`, `cert`, and `key` sections of + `charts.portworx-generic.externalKvdb`. The preset will give you cropped example values that you can overwrite with + your actual PEM certificates. Leave the `charts.portworx-generic.storageCluster.spec.kvdb.endpoints` option to its + default of `px-kvdb-auth`. The name of the Kubernetes secret will automatically get created by this pack. + +:::warning + + When inserting SSL certificate values into the YAML. Ensure you follow the provided indentation style. Otherwise, SSL certificates will not be imported correctly and will result in Portworx deployment failure. + +::: + +
+ +
+ + + +The default installation of Portworx /w Operator will deploy the following components in the Kubernetes cluster: + +- Portworx Operator + +- `StorageCluster` resource that tells the Operator how to deploy and configure Portworx. + +- `StorageClass` resource for dynamic provisioning of `PersistentVolumes`` using the `pxd.portworx.com` provisioner. + +- [Stork](https://docs.portworx.com/portworx-enterprise/operations/operate-kubernetes/storage-operations/stork.html). + Portworx's storage scheduler for Kubernetes. + +- [Lighthouse](https://portworx.com/blog/manage-portworx-clusters-using-lighthouse/). Portworx's monitoring and alerting + solution for Kubernetes. + +
+ +### License Model + +This pack can install Portworx in three different licensing modes: + +- **Essentials**: a free Portworx license with limited functionality that allows you to deploy a small production or + proof-of-concept workloads. Essentials limits capacity and advanced features, but otherwise functions the same way as + the fully featured Portworx Enterprise version of Portworx. + +- **Enterprise**: the fully featured version of Portworx. If you install this model without a valid key, Portworx will + automatically enter a 30-day trial mode. + +- **Enterprise SaaS PAYG**: the fully featured version of Portworx but using a SaaS license key that allows unlimited + use and in-arrears billing. If you install this model without a valid key, Portworx will automatically enter a 30-day + trial mode. + +Use the presets in the pack user interface to select which license model you want to use, then update the +`charts.portworx-generic.license` section for your chosen license model. + +
+ + + + +```yaml +license: + type: essentials + essentials: + # Base64-decoded value of the px-essen-user-id value in the px-essential secret + # Find your Essentials Entitlement ID at https://central.portworx.com/profile + userId: 1234abcd-12ab-12ab-12ab-123456abcdef + # Base64-decoded value of the px-osb-endpoint value in the px-essential secret + # Leave at the default value unless there are special circumstances + endpoint: https://pxessentials.portworx.com/osb/billing/v1/register +``` + + + + +```yaml +license: + type: saas + saas: + key: +``` + + + + + +```yaml +license: + type: enterprise + enterprise: + activateLicense: true + activationId: + # customLicenseServer: + # url: http://hostname:7070/fne/bin/capability + # importUnknownCa: true + # licenseBorrowInterval: 1w15m + # addFeatures: + # - feature1 + # - feature2 +``` + + + + +### Storage Specification + +You can install Portworx in a variety of storage configurations. + +- **Existing disks (generic)**: This mode does not integrate with any particular storage solution, it uses existing + disks available on the nodes. + +- **AWS Cloud Storage**: This mode integrates with Amazon EBS block volumes and allows AWS EKS and EC2 based Kubernetes + clusters to dynamically attach EBS volumes to worker nodes for Portworx. + +- **Azure Cloud Storage**: This mode integrates with Azure block storage and allows Azure AKS and regular Azure + Kubernetes clusters to dynamically attach Azure block storage to worker nodes for Portworx. + +- **Google Cloud Storage**: This mode integrates with Google persistent disks and allows GKE and regular Google + Kubernetes clusters to dynamically attach persistent disks to worker nodes for Portworx. + +- **VMware vSphere Datastores**: This mode integrates with VMware vSphere storage and allows Kubernetes clusters on + vSphere to dynamically attach vSAN and regular Datastore disks to worker nodes for Portworx. + +- **Pure Storage Flash Array**: This mode integrates with Pure Storage Flash Arrays and allows Kubernetes clusters to + dynamically attach Flash Array disks over iSCSI to worker nodes for Portworx. + +:::tip + +Use the presets in the pack user interface to select which storage specification you want to use, then update the +`charts.portworx-generic.storageCluster` section to your specific needs. + +::: + +Select the tab below for the storage specification you want to use. Use the example YAML as a starting point for your +configuration. + +
+ + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + storage: + useAll: true + journalDevice: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + + + + +To deploy Portworx in an AWS environment, ensure the following IAM policy is created in AWS and attached to the +`nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role.
+ +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": + [ + "ec2:AttachVolume", + "ec2:ModifyVolume", + "ec2:DetachVolume", + "ec2:CreateTags", + "ec2:CreateVolume", + "ec2:DeleteTags", + "ec2:DeleteVolume", + "ec2:DescribeTags", + "ec2:DescribeVolumeAttribute", + "ec2:DescribeVolumesModifications", + "ec2:DescribeVolumeStatus", + "ec2:DescribeVolumes", + "ec2:DescribeInstances", + "autoscaling:DescribeAutoScalingGroups", + ], + "Resource": ["*"], + }, + ], +} +``` + +- When deploying a regular Kubernetes cluster on an AWS EC2 using Palette, attach the policy to the + `nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role. Or alternatively, edit the AWS cloud account in Palette, enable + the `Add IAM Policies` option, and select the Portworx IAM policy described above. This will automatically attach the + IAM policy to the correct IAM role.. + +- When deploying an AWS EKS cluster, use the `managedMachinePool.roleAdditionalPolicies` option in the Kubernetes pack + layer YAML to automatically attach the Portworx IAM policy to the EKS worker pool IAM role . The example below shows + how to attach the Portworx IAM policy to the EKS worker pool IAM role. + +```yaml +managedMachinePool: + roleAdditionalPolicies: + - "arn:aws:iam::012345678901:policy/my-portworx-policy" +``` + +```yaml +storageCluster: + annotations: + portworx.io/is-eks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=gp2,size=150 + kvdbDeviceSpec: type=gp2,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + +
+ + +```yaml +storageCluster: + annotations: + portworx.io/is-aks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=Premium_LRS,size=150 + kvdbDeviceSpec: type=Premium_LRS,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: AZURE_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_SECRET + - name: AZURE_CLIENT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_ID + - name: AZURE_TENANT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_TENANT_ID + azureSecret: + tenantId: "your_azure_tenant_id" + clientId: "your_azure_client_id" + clientSecret: "your_client_secret" +``` + + + + +```yaml +storageCluster: + annotations: + portworx.io/is-gke: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=pd-standard,size=150 + kvdbDeviceSpec: type=pd-standard,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=lazyzeroedthick,size=150 + kvdbDeviceSpec: type=lazyzeroedthick,size=32 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: VSPHERE_INSECURE + value: "true" + - name: VSPHERE_USER + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_USER + - name: VSPHERE_PASSWORD + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_PASSWORD + - name: VSPHERE_VCENTER + value: "my-vcenter.company.local" + - name: VSPHERE_VCENTER_PORT + value: "443" + - name: VSPHERE_DATASTORE_PREFIX + value: "datastore" + - name: VSPHERE_INSTALL_MODE + value: "shared" +vsphereSecret: + user: "username_for_vCenter_here" + password: "your_password" +``` + + + + +To activate the Pure Flash Array integration, you will need to create a Kubernetes secret named `px-pure-secret` on your +cluster containing your +[Flash Array license JSON](https://docs.portworx.com/portworx-enterprise/platform/kubernetes/flasharray/install/install-flasharray-on-cloud#create-a-json-configuration-file). +The secret must be created in the namespace that contains the `StorageCluster` resource. The namespace is `kube-system` +by default. + +Use the following command to create the secret: + +``` +kubectl create secret generic px-pure-secret --namespace portworx --from-file=pure.json= +``` + +Alternatively, you can attach a manifest to the Portworx /w Operator pack that contains the YAML for the secret. + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - size=150 + kvdbDeviceSpec: size=32 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: PURE_FLASHARRAY_SAN_TYPE + value: "ISCSI" +``` + + +
+ +
+ +### Etcd + +Portworx Enterprise supports multiple etcd scenarios. Portworx will default to an internal key-value store (KVDB). + +#### Kvdb and Etcd Presets + +The following pack presets are available for configuring etcd. + +The pack defaults to the **Use Internal Kvdb** option. You can change to a different preset if you need to connect to an +external etcd server. + + + + +```yaml +storageCluster: + spec: + kvdb: + internal: true +``` + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 +``` + + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 + authSecret: px-kvdb-auth + +# External kvdb related config, only used if storageCluster.spec.kvdb.internal != true +externalKvdb: + useCertsForSSL: true + # The CA cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cacert: | + < PEM KEY DATA > + # The cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cert: | + < PEM KEY DATA > + # The key to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + key: | + < PEM KEY DATA > +``` + + + + +#### Integration With External Etcd + +Use the following steps to integrate Portworx to an external etcd server by following the steps below. + +1. During the cluster profile creation, select the Portworx pack and click on the **Presets** button in the top right + corner of the pack user interface. + +2. Select the **Use External Kvdb over HTTP** or **Use External Kvdb over SSL** preset in the pack UI. If your external + etcd server requires certificate authentication, select **Use External Kvdb over SSL** preset. + +3. Configure the external etcd endpoints in the YAML parameter block named + `charts.portworx-generic.storageCluster.spec.kvdb.endpoints`. + +4. If you selected the **Use External Kvdb over SSL** preset, you will also need to configure the + `charts.portworx-generic.externalKvdb` section. Set `charts.portworx-generic.externalKvdb.useCertsForSSL` to `true` + to enable certificate authentication. Input your SSL certificates in the `cacert`, `cert`, and `key` sections of + `charts.portworx-generic.externalKvdb`. The preset will give you cropped example values that you can overwrite with + your actual PEM certificates. Leave the `charts.portworx-generic.storageCluster.spec.kvdb.endpoints` option to its + default of `px-kvdb-auth`. The name of the Kubernetes secret will automatically get created by this pack. + +:::warning + + When inserting SSL certificate values into the YAML. Ensure you follow the provided indentation style. Otherwise, SSL certificates will not be imported correctly and will result in Portworx deployment failure. + +::: + +
+ +
+ + + +The default installation of Portworx /w Operator will deploy the following components in the Kubernetes cluster: + +- Portworx Operator + +- `StorageCluster` resource that tells the Operator how to deploy and configure Portworx. + +- `StorageClass` resource for dynamic provisioning of `PersistentVolumes`` using the `pxd.portworx.com` provisioner. + +- [Stork](https://docs.portworx.com/portworx-enterprise/operations/operate-kubernetes/storage-operations/stork.html). + Portworx's storage scheduler for Kubernetes. + +- [Lighthouse](https://portworx.com/blog/manage-portworx-clusters-using-lighthouse/). Portworx's monitoring and alerting + solution for Kubernetes. + +
+ +### License Model + +This pack can install Portworx in three different licensing modes: + +- **Essentials**: a free Portworx license with limited functionality that allows you to deploy a small production or + proof-of-concept workloads. Essentials limits capacity and advanced features, but otherwise functions the same way as + the fully featured Portworx Enterprise version of Portworx. + +- **Enterprise**: the fully featured version of Portworx. If you install this model without a valid key, Portworx will + automatically enter a 30-day trial mode. + +- **Enterprise SaaS PAYG**: the fully featured version of Portworx but using a SaaS license key that allows unlimited + use and in-arrears billing. If you install this model without a valid key, Portworx will automatically enter a 30-day + trial mode. + +Use the presets in the pack user interface to select which license model you want to use, then update the +`charts.portworx-generic.license` section for your chosen license model. + +
+ + + + +```yaml +license: + type: essentials + essentials: + # Base64-decoded value of the px-essen-user-id value in the px-essential secret + # Find your Essentials Entitlement ID at https://central.portworx.com/profile + userId: 1234abcd-12ab-12ab-12ab-123456abcdef + # Base64-decoded value of the px-osb-endpoint value in the px-essential secret + # Leave at the default value unless there are special circumstances + endpoint: https://pxessentials.portworx.com/osb/billing/v1/register +``` + + + + +```yaml +license: + type: saas + saas: + key: +``` + + + + + +```yaml +license: + type: enterprise + enterprise: + activateLicense: true + activationId: + # customLicenseServer: + # url: http://hostname:7070/fne/bin/capability + # importUnknownCa: true + # licenseBorrowInterval: 1w15m + # addFeatures: + # - feature1 + # - feature2 +``` + + + + +### Storage Specification + +You can install Portworx in a variety of storage configurations. + +- **Existing disks (generic)**: This mode does not integrate with any particular storage solution, it uses existing + disks available on the nodes. + +- **AWS Cloud Storage**: This mode integrates with Amazon EBS block volumes and allows AWS EKS and EC2 based Kubernetes + clusters to dynamically attach EBS volumes to worker nodes for Portworx. + +- **Azure Cloud Storage**: This mode integrates with Azure block storage and allows Azure AKS and regular Azure + Kubernetes clusters to dynamically attach Azure block storage to worker nodes for Portworx. + +- **Google Cloud Storage**: This mode integrates with Google persistent disks and allows GKE and regular Google + Kubernetes clusters to dynamically attach persistent disks to worker nodes for Portworx. + +- **VMware vSphere Datastores**: This mode integrates with VMware vSphere storage and allows Kubernetes clusters on + vSphere to dynamically attach vSAN and regular Datastore disks to worker nodes for Portworx. + +- **Pure Storage Flash Array**: This mode integrates with Pure Storage Flash Arrays and allows Kubernetes clusters to + dynamically attach Flash Array disks over iSCSI to worker nodes for Portworx. + +:::tip + +Use the presets in the pack user interface to select which storage specification you want to use, then update the +`charts.portworx-generic.storageCluster` section to your specific needs. + +::: + +Select the tab below for the storage specification you want to use. Use the example YAML as a starting point for your +configuration. + +
+ + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + storage: + useAll: true + journalDevice: auto + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + + + + +To deploy Portworx in an AWS environment, ensure the following IAM policy is created in AWS and attached to the +`nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role.
+ +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": + [ + "ec2:AttachVolume", + "ec2:ModifyVolume", + "ec2:DetachVolume", + "ec2:CreateTags", + "ec2:CreateVolume", + "ec2:DeleteTags", + "ec2:DeleteVolume", + "ec2:DescribeTags", + "ec2:DescribeVolumeAttribute", + "ec2:DescribeVolumesModifications", + "ec2:DescribeVolumeStatus", + "ec2:DescribeVolumes", + "ec2:DescribeInstances", + "autoscaling:DescribeAutoScalingGroups", + ], + "Resource": ["*"], + }, + ], +} +``` + +- When deploying a regular Kubernetes cluster on an AWS EC2 using Palette, attach the policy to the + `nodes.cluster-api-provider-aws.sigs.k8s.io` IAM role. Or alternatively, edit the AWS cloud account in Palette, enable + the `Add IAM Policies` option, and select the Portworx IAM policy described above. This will automatically attach the + IAM policy to the correct IAM role.. + +- When deploying an AWS EKS cluster, use the `managedMachinePool.roleAdditionalPolicies` option in the Kubernetes pack + layer YAML to automatically attach the Portworx IAM policy to the EKS worker pool IAM role . The example below shows + how to attach the Portworx IAM policy to the EKS worker pool IAM role. + +```yaml +managedMachinePool: + roleAdditionalPolicies: + - "arn:aws:iam::012345678901:policy/my-portworx-policy" +``` + +```yaml +storageCluster: + annotations: + portworx.io/is-eks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=gp2,size=150 + kvdbDeviceSpec: type=gp2,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + +
+ + +```yaml +storageCluster: + annotations: + portworx.io/is-aks: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=Premium_LRS,size=150 + kvdbDeviceSpec: type=Premium_LRS,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: AZURE_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_SECRET + - name: AZURE_CLIENT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_CLIENT_ID + - name: AZURE_TENANT_ID + valueFrom: + secretKeyRef: + name: px-azure + key: AZURE_TENANT_ID + azureSecret: + tenantId: "your_azure_tenant_id" + clientId: "your_azure_client_id" + clientSecret: "your_client_secret" +``` + + + + +```yaml +storageCluster: + annotations: + portworx.io/is-gke: "true" + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=pd-standard,size=150 + kvdbDeviceSpec: type=pd-standard,size=150 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false +``` + + + + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - type=lazyzeroedthick,size=150 + kvdbDeviceSpec: type=lazyzeroedthick,size=32 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: VSPHERE_INSECURE + value: "true" + - name: VSPHERE_USER + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_USER + - name: VSPHERE_PASSWORD + valueFrom: + secretKeyRef: + name: px-vsphere-secret + key: VSPHERE_PASSWORD + - name: VSPHERE_VCENTER + value: "my-vcenter.company.local" + - name: VSPHERE_VCENTER_PORT + value: "443" + - name: VSPHERE_DATASTORE_PREFIX + value: "datastore" + - name: VSPHERE_INSTALL_MODE + value: "shared" +vsphereSecret: + user: "username_for_vCenter_here" + password: "your_password" +``` + + + + +To activate the Pure Flash Array integration, you will need to create a Kubernetes secret named `px-pure-secret` on your +cluster containing your +[Flash Array license JSON](https://docs.portworx.com/portworx-enterprise/platform/kubernetes/flasharray/install/install-flasharray-on-cloud#create-a-json-configuration-file). +The secret must be created in the namespace that contains the `StorageCluster` resource. The namespace is `kube-system` +by default. + +Use the following command to create the secret: + +``` +kubectl create secret generic px-pure-secret --namespace portworx --from-file=pure.json= +``` + +Alternatively, you can attach a manifest to the Portworx /w Operator pack that contains the YAML for the secret. + +```yaml +storageCluster: + spec: + # Use the Portworx Spec Builder at https://central.portworx.com/landing/login to define custom configurations, then paste the spec section here + image: portworx/oci-monitor:2.11.2 + imagePullPolicy: Always + kvdb: + internal: true + # endpoints: + # - etcd:https://etcd.company.domain:2379 + # authSecret: px-kvdb-auth + cloudStorage: + deviceSpecs: + - size=150 + kvdbDeviceSpec: size=32 + secretsProvider: k8s + stork: + enabled: true + args: + webhook-controller: "true" + autopilot: + enabled: true + csi: + enabled: true + monitoring: + prometheus: + enabled: false + exportMetrics: false + env: + - name: PURE_FLASHARRAY_SAN_TYPE + value: "ISCSI" +``` + + +
+ +
+ +### Etcd + +Portworx Enterprise supports multiple etcd scenarios. Portworx will default to an internal key-value store (KVDB). + +#### Kvdb and Etcd Presets + +The following pack presets are available for configuring etcd. + +The pack defaults to the **Use Internal Kvdb** option. You can change to a different preset if you need to connect to an +external etcd server. + + + + +```yaml +storageCluster: + spec: + kvdb: + internal: true +``` + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 +``` + + + + + +```yaml +storageCluster: + spec: + kvdb: + endpoints: + - etcd:http://etcd.company.domain:2379 + authSecret: px-kvdb-auth + +# External kvdb related config, only used if storageCluster.spec.kvdb.internal != true +externalKvdb: + useCertsForSSL: true + # The CA cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cacert: | + < PEM KEY DATA > + # The cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + cert: | + < PEM KEY DATA > + # The key to use for etcd authentication. Make sure to follow the same indentation style as given in the example below + key: | + < PEM KEY DATA > +``` + + + + +#### Integration With External Etcd + +Use the following steps to integrate Portworx to an external etcd server by following the steps below. + +1. During the cluster profile creation, select the Portworx pack and click on the **Presets** button in the top right + corner of the pack user interface. + +2. Select the **Use External Kvdb over HTTP** or **Use External Kvdb over SSL** preset in the pack UI. If your external + etcd server requires certificate authentication, select **Use External Kvdb over SSL** preset. + +3. Configure the external etcd endpoints in the YAML parameter block named + `charts.portworx-generic.storageCluster.spec.kvdb.endpoints`. + +4. If you selected the **Use External Kvdb over SSL** preset, you will also need to configure the + `charts.portworx-generic.externalKvdb` section. Set `charts.portworx-generic.externalKvdb.useCertsForSSL` to `true` + to enable certificate authentication. Input your SSL certificates in the `cacert`, `cert`, and `key` sections of + `charts.portworx-generic.externalKvdb`. The preset will give you cropped example values that you can overwrite with + your actual PEM certificates. Leave the `charts.portworx-generic.storageCluster.spec.kvdb.endpoints` option to its + default of `px-kvdb-auth`. The name of the Kubernetes secret will automatically get created by this pack. + +:::warning + +When inserting SSL certificate values into the YAML. Ensure you follow the provided indentation style. Otherwise, SSL +certificates will not be imported correctly and will result in Portworx deployment failure. + +::: + +
+ +
\ No newline at end of file diff --git a/_partials/packs/_rke2.mdx b/_partials/packs/_rke2.mdx new file mode 100644 index 0000000000..a19ee0b2f0 --- /dev/null +++ b/_partials/packs/_rke2.mdx @@ -0,0 +1,72 @@ +--- +partial_category: packs +partial_name: rke2 +--- + + +## Versions Supported + + + + + + +You can add RKE2 to an Edge cluster profile as the Kubernetes layer. Refer to the guide to learn more. + +RKE2 offers several customization options, ranging from networking to security. We recommend you review the following +RKE2 documentation: + +- [Configuration Options](https://docs.rke2.io/install/configuration) + +- [Inbound Network Rules](https://docs.rke2.io/install/requirements#inbound-network-rules) + +- [Registries Configuration](https://docs.rke2.io/install/containerd_registry_configuration) + +- [Advanced Options](https://docs.rke2.io/advanced) + + +Many of the Day-2 cluster management responsibilities are handled by Palette. Review the reference resource to learn more about Palette and Day-2 operations. + + + + + + +You can add RKE2 to an Edge cluster profile as the Kubernetes layer. Refer to the guide to learn more. + +RKE2 offers several customization options, ranging from networking to security. We recommend you review the following +RKE2 documentation: + +- [Configuration Options](https://docs.rke2.io/install/configuration) + +- [Inbound Network Rules](https://docs.rke2.io/install/requirements#inbound-network-rules) + +- [Registries Configuration](https://docs.rke2.io/install/containerd_registry_configuration) + +- [Advanced Options](https://docs.rke2.io/advanced) + + +Many of the Day-2 cluster management responsibilities are handled by Palette. Review the reference resource to learn more about Palette and Day-2 operations. + + + + + +You can add RKE2 to an Edge cluster profile as the Kubernetes layer. Refer to the guide to learn more. + +RKE2 offers several customization options, ranging from networking to security. We recommend you review the following +RKE2 documentation: + +- [Configuration Options](https://docs.rke2.io/install/configuration) + +- [Inbound Network Rules](https://docs.rke2.io/install/requirements#inbound-network-rules) + +- [Registries Configuration](https://docs.rke2.io/install/containerd_registry_configuration) + +- [Advanced Options](https://docs.rke2.io/advanced) + + +Many of the Day-2 cluster management responsibilities are handled by Palette. Review the reference resource to learn more about Palette and Day-2 operations. + + + \ No newline at end of file diff --git a/_partials/packs/_rook-ceph.mdx b/_partials/packs/_rook-ceph.mdx new file mode 100644 index 0000000000..eaee474887 --- /dev/null +++ b/_partials/packs/_rook-ceph.mdx @@ -0,0 +1,417 @@ +--- +partial_category: packs +partial_name: rook-ceph +--- + +## Versions Supported + + + + + +### Rook on Edge Clusters + +To use Rook-Ceph on Edge clusters, you need to make a few changes to the cluster profile depending on your cluster +configuration. + +1. In the YAML file for BYO-OS pack, add the following blocks to the `stages` configuration in the OS pack of the + cluster profile. + + ```yaml + stages: + initramfs: + - files: + - path: /etc/modules-load.d/ceph.conf + permissions: 644 + owner: 0 + group: 0 + content: | + rbd + ceph + encoding: "" + ownerstring: "" + after-upgrade: + - name: "Erase Old Partitions on Boot Disk" + commands: + - wipefs -a /dev/sdb + ``` + +2. Click on the Rook-Ceph layer. In the upper-right corner of the Rook-Ceph layer's YAML editing interface, click + **Presets**. Set the preset to either single-node or multi-node depending on your cluster configuration. + +3. If you chose the **Single Node Cluster** preset, skip this step. + + If you chose the **Multi Node Cluster with Replicas** preset, set the value of + `manifests.storageClass.volumeBindingMode` to `Immediate`. + +### Access Ceph Dashboard + +The Ceph dashboard gives you an overview of the status of your Ceph cluster, including overall health, and the status of +all Ceph daemons. By default, the Dashboard is exposed as a ClusterIP-type service on the port 7000 on single node +clusters. + +1. Issue the following command to view the service and find its cluster IP and port. + + ```shell + kukubectl --namespace rook-ceph get svc | grep dashboard + ``` + + ```hideClipboard + rook-ceph-mgr-dashboard ClusterIP 192.169.32.142 7000/TCP 15m + ``` + +2. If you are on a node of the cluster, you can visit the dashboard by visiting the cluster IP and the exposed port. + + If you are remotely accessing the cluster, you can issue the following command to enable port forwarding from your + local machine to the dashboard service. + + ```shell + kukubectl port-forward svc/rook-ceph-mgr-dashboard -n rook-ceph 8443:7000 & + ``` + + If your dashboard service is exposed on a different port, replace 7000 with the port that the dashboard service is + exposed on. + +3. Once you can connect to the dashboard, you need to provide the login credentials to access the dashboard. Rook + creates a default user named `admin` and generates a secret called `rook-ceph-dashboard-password` in the namespace of + the Rook-Ceph cluster. To retrieve the generated password, issue the following command: + + ```shell + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo + ``` + +4. Use the password you receive in the output with the username `admin` to log in to the Ceph Dashboard. + +### Known Issues + +- If a cluster experiences network issues, it's possible for the file mount to become unavailable and remain unavailable + even after the network is restored. This a known issue disclosed in the + [Rook GitHub repository](https://github.com/rook/rook/issues/13818). Refer to the + [Troubleshooting section](#file-mount-becomes-unavailable-after-cluster-experiences-network-issues) for a workaround + if you observe this issue in your cluster. + + + + + + + + +### Rook on Edge Clusters + +To use Rook-Ceph on Edge clusters, you need to make a few changes to the cluster profile depending on your cluster +configuration. + +1. In the YAML file for BYO-OS pack, add the following blocks to the `stages` configuration in the OS pack of the + cluster profile. + + ```yaml + stages: + initramfs: + - files: + - path: /etc/modules-load.d/ceph.conf + permissions: 644 + owner: 0 + group: 0 + content: | + rbd + ceph + encoding: "" + ownerstring: "" + after-upgrade: + - name: "Erase Old Partitions on Boot Disk" + commands: + - wipefs -a /dev/sdb + ``` + +2. Click on the Rook-Ceph layer. In the upper-right corner of the Rook-Ceph layer's YAML editing interface, click + **Presets**. Set the preset to either single-node or multi-node depending on your cluster configuration. + +3. If you chose the **Single Node Cluster** preset, skip this step. + + If you chose the **Multi Node Cluster with Replicas** preset, set the value of + `manifests.storageClass.volumeBindingMode` to `Immediate`. + +### Access Ceph Dashboard + +The Ceph dashboard gives you an overview of the status of your Ceph cluster, including overall health, and the status of +all Ceph daemons. By default, the Dashboard is exposed as a ClusterIP-type service on the port 7000 on single node +clusters. + +1. Issue the following command to view the service and find its cluster IP and port. + + ```shell + kukubectl --namespace rook-ceph get svc | grep dashboard + ``` + + ```hideClipboard + rook-ceph-mgr-dashboard ClusterIP 192.169.32.142 7000/TCP 15m + ``` + +2. If you are on a node of the cluster, you can visit the dashboard by visiting the cluster IP and the exposed port. + + If you are remotely accessing the cluster, you can issue the following command to enable port forwarding from your + local machine to the dashboard service. + + ```shell + kukubectl port-forward svc/rook-ceph-mgr-dashboard -n rook-ceph 8443:7000 & + ``` + + If your dashboard service is exposed on a different port, replace 7000 with the port that the dashboard service is + exposed on. + +3. Once you can connect to the dashboard, you need to provide the login credentials to access the dashboard. Rook + creates a default user named `admin` and generates a secret called `rook-ceph-dashboard-password` in the namespace of + the Rook-Ceph cluster. To retrieve the generated password, issue the following command: + + ```shell + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo + ``` + +4. Use the password you receive in the output with the username `admin` to log in to the Ceph Dashboard. + +### Known Issues + +- If a cluster experiences network issues, it's possible for the file mount to become unavailable and remain unavailable + even after the network is restored. This a known issue disclosed in the + [Rook GitHub repository](https://github.com/rook/rook/issues/13818). Refer to the + [Troubleshooting section](#file-mount-becomes-unavailable-after-cluster-experiences-network-issues) for a workaround + if you observe this issue in your cluster. + + + + + + +### Rook on Edge Clusters + +To use Rook-Ceph on Edge clusters, you need to make a few changes to the cluster profile depending on your cluster +configuration. + +1. In the YAML file for BYO-OS pack, add the following blocks to the `stages` configuration in the OS pack of the + cluster profile. + + ```yaml + stages: + initramfs: + - files: + - path: /etc/modules-load.d/ceph.conf + permissions: 644 + owner: 0 + group: 0 + content: | + rbd + ceph + encoding: "" + ownerstring: "" + after-upgrade: + - name: "Erase Old Partitions on Boot Disk" + commands: + - wipefs -a /dev/sdb + ``` + +2. Click on the Rook-Ceph layer. In the upper-right corner of the Rook-Ceph layer's YAML editing interface, click + **Presets**. Set the preset to either single-node or multi-node depending on your cluster configuration. + +3. If you chose the **Single Node Cluster** preset, skip this step. + + If you chose the **Multi Node Cluster with Replicas** preset, set the value of + `manifests.storageClass.volumeBindingMode` to `Immediate`. + +### Access Ceph Dashboard + +The Ceph dashboard gives you an overview of the status of your Ceph cluster, including overall health, and the status of +all Ceph daemons. By default, the Dashboard is exposed as a ClusterIP-type service on the port 7000 on single node +clusters. + +1. Issue the following command to view the service and find its cluster IP and port. + + ```shell + kukubectl --namespace rook-ceph get svc | grep dashboard + ``` + + ```hideClipboard + rook-ceph-mgr-dashboard ClusterIP 192.169.32.142 7000/TCP 15m + ``` + +2. If you are on a node of the cluster, you can visit the dashboard by visiting the cluster IP and the exposed port. + + If you are remotely accessing the cluster, you can issue the following command to enable port forwarding from your + local machine to the dashboard service. + + ```shell + kukubectl port-forward svc/rook-ceph-mgr-dashboard -n rook-ceph 8443:7000 & + ``` + + If your dashboard service is exposed on a different port, replace 7000 with the port that the dashboard service is + exposed on. + +3. Once you can connect to the dashboard, you need to provide the login credentials to access the dashboard. Rook + creates a default user named `admin` and generates a secret called `rook-ceph-dashboard-password` in the namespace of + the Rook-Ceph cluster. To retrieve the generated password, issue the following command: + + ```shell + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo + ``` + +4. Use the password you receive in the output with the username `admin` to log in to the Ceph Dashboard. + +### Known Issues + +- If a cluster experiences network issues, it's possible for the file mount to become unavailable and remain unavailable + even after the network is restored. This a known issue disclosed in the + [Rook GitHub repository](https://github.com/rook/rook/issues/13818). Refer to the + [Troubleshooting section](#file-mount-becomes-unavailable-after-cluster-experiences-network-issues) for a workaround + if you observe this issue in your cluster. + + + + + + +### Rook on Edge Clusters + +To use Rook-Ceph on Edge clusters, you need to make a few changes to the cluster profile depending on your cluster +configuration. + +1. In the YAML file for BYO-OS pack, add the following blocks to the `stages` configuration in the OS pack of the + cluster profile. + + ```yaml + stages: + initramfs: + - files: + - path: /etc/modules-load.d/ceph.conf + permissions: 644 + owner: 0 + group: 0 + content: | + rbd + ceph + encoding: "" + ownerstring: "" + after-upgrade: + - name: "Erase Old Partitions on Boot Disk" + commands: + - wipefs -a /dev/sdb + ``` + +2. Click on the Rook-Ceph layer. In the upper-right corner of the Rook-Ceph layer's YAML editing interface, click + **Presets**. Set the preset to either single-node or multi-node depending on your cluster configuration. + +3. If you chose the **Single Node Cluster** preset, skip this step. + + If you chose the **Multi Node Cluster with Replicas** preset, set the value of + `manifests.storageClass.volumeBindingMode` to `Immediate`. + +### Access Ceph Dashboard + +The Ceph dashboard gives you an overview of the status of your Ceph cluster, including overall health, and the status of +all Ceph daemons. By default, the Dashboard is exposed as a ClusterIP-type service on the port 7000 on single node +clusters. + +1. Issue the following command to view the service and find its cluster IP and port. + + ```shell + kukubectl --namespace rook-ceph get svc | grep dashboard + ``` + + ```hideClipboard + rook-ceph-mgr-dashboard ClusterIP 192.169.32.142 7000/TCP 15m + ``` + +2. If you are on a node of the cluster, you can visit the dashboard by visiting the cluster IP and the exposed port. + + If you are remotely accessing the cluster, you can issue the following command to enable port forwarding from your + local machine to the dashboard service. + + ```shell + kukubectl port-forward svc/rook-ceph-mgr-dashboard -n rook-ceph 8443:7000 & + ``` + + If your dashboard service is exposed on a different port, replace 7000 with the port that the dashboard service is + exposed on. + +3. Once you can connect to the dashboard, you need to provide the login credentials to access the dashboard. Rook + creates a default user named `admin` and generates a secret called `rook-ceph-dashboard-password` in the namespace of + the Rook-Ceph cluster. To retrieve the generated password, issue the following command: + + ```shell + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo + ``` + +4. Use the password you receive in the output with the username `admin` to log in to the Ceph Dashboard. + +### Known Issues + +- If a cluster experiences network issues, it's possible for the file mount to become unavailable and remain unavailable + even after the network is restored. This a known issue disclosed in the + [Rook GitHub repository](https://github.com/rook/rook/issues/13818). Refer to the + [Troubleshooting section](#file-mount-becomes-unavailable-after-cluster-experiences-network-issues) for a workaround + if you observe this issue in your cluster. + + + + + + +## Troubleshooting + +### File Mount Becomes Unavailable after Cluster Experiences Network Issues + +A known issue exists with Rook-Ceph where file mounts become unavailable and remain unavailable even after network +issues are resolved. + +#### Debug Steps + +1. One way to debug is to reboot the node that is experiencing the issues. If you are unable to reboot the node, or if + rebooting the node does not fix the issue, continue to the following steps. + + +2. Connect to your cluster via the command-line. For more information, refer to + +3. Issue the following command to identify Persistent Volume Claims (PVC) from Ceph File System (FS). + + ```shell + kubectl get pvc --all | grep "cephFS" + ``` + +4. Scale down all workloads, including pods, deployments, and StatefulSets using the PVC to zero. + + To scale down a deployment, use the following command. Replace `deployment-name` with the name of the deployment. + + ```shell + kubectl scale deployment deployment-name --replicas=0 + ``` + + To scale down a StatefulSet, use the following command. Replace `statefulset-name` with the name of the StatefulSet. + + ```shell + kubectl scale statefulset statefulset-name --replicas=0 + ``` + + To scale down a pod, delete it. Make sure you delete the deployments and StatefulSets first. If a pod belongs to a + StatefulSet or a deployment, it will simply be recreated. + + ```shell + kubectl delete pods pod-name + ``` + + :::tip + + If you do not know which workloads use the PVC, you can start by getting a list of all pods that are using PVCs and + their PVC names with the following command. + + ```shell + kubectl get pods --all-namespaces --output=json | jq '.items[] | {name: .metadata.name, namespace: .metadata.namespace, claimName: .spec | select( has ("volumes") ).volumes[] | select( has ("persistentVolumeClaim") ).persistentVolumeClaim.claimName }' + ``` + + You can then find workloads that are associated with the pods and scale them down to zero. + + ::: + +5. Once all the workloads are scaled down, all existing volume mounts will be unmounted, followed by fresh new mounts of + cephFS volumes. Ensure that all workloads are scaled down to zero. Even if one pod remains that uses the PVC, the + unmount will not happen and the issue will not be resolved. + +6. Scale the workloads back to their original state. diff --git a/_partials/packs/_trident.mdx b/_partials/packs/_trident.mdx new file mode 100644 index 0000000000..4c0a96e06a --- /dev/null +++ b/_partials/packs/_trident.mdx @@ -0,0 +1,231 @@ +--- +partial_category: packs +partial_name: trident +--- + +## Versions Supported + + + + +After deploying Trident, you will need to create a backend and a storage class before you can start provisioning volumes +and mounting those to any pods. + +### Create a Storage Backend + +Trident supports multiple storage backends. Select a supported backend that fits your needs. You can find example of +different backends by reviewing the driver manifests examples in the official Trident +[repository](https://github.com/NetApp/trident/tree/master/trident-installer/sample-input/backends-samples). If you +decide to use one of the example configurations, make sure you update the configuration with your credentials and +environment configurations. + +The example below creates a backend with the ONTAP-NAS driver. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: backend-ontap-nas-secret + namespace: trident +type: Opaque +stringData: + username: [USERNAME] + password: [PASSWORD] +--- +apiVersion: trident.netapp.io/v1 +kind: TridentBackendConfig +metadata: + name: backend-ontap-nas + namespace: trident +spec: + version: 1 + storageDriverName: ontap-nas + managementLIF: [ONTAP_MANAGEMENT_LIF_IP] + dataLIF: [DATA_LIF_IP] + backendName: ontap-nas + autoExportCIDRs: + - [x.x.x.x/xx] + autoExportPolicy: true + svm: [SVM] + credentials: + name: backend-ontap-nas-secret +``` + +#### Create a Storage Class + +Kubernetes supports the ability to bind statically or dynamically provisioned volumes to pods. Statically provisioned +volumes are manually created by a user and then referenced in a deployment. Astra Trident allows you to leverage your +NetApp storage. You must create a storage class before you can request dynamically provisioned volumes. + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: trident-csi + namespace: trident +provisioner: csi.trident.netapp.io +parameters: + backendType: "ontap-nas" + csi.storage.k8s.io/fstype: ext4 +``` + +#### Provision Volumes + +An example of provisioning a Persistent Volume Claim (PVC). + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: trident-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: trident-csi +``` + +#### Deploy a Pod and Mount the Volume. + +The following code snippet is an example of a pod deployment. The pod contains an Nginx container, with a claim to the +previously created PVC. Once deployed, the PVC with its bound Persistent Volume (PV), will mount to the pod and provide +persistent storage to this application. + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: example-pv-pod + namespace: trident +spec: + volumes: + - name: example-pv-vol + persistentVolumeClaim: + claimName: trident-pvc + containers: + - name: example-pv-pod + image: nginx + ports: + - containerPort: 80 + name: "http-server" + volumeMounts: + - mountPath: "/usr/share/nginx/html" + name: example-pv-vol +``` + + + + + +After deploying Trident, you will need to create a backend and a storage class before you can start provisioning volumes +and mounting those to any pods. + +### Create a Storage Backend + +Trident supports multiple storage backends. Select a supported backend that fits your needs. You can find example of +different backends by reviewing the driver manifests examples in the official Trident +[repository](https://github.com/NetApp/trident/tree/master/trident-installer/sample-input/backends-samples). If you +decide to use one of the example configurations, make sure you update the configuration with your credentials and +environment configurations. + +The example below creates a backend with the ONTAP-NAS driver. + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: backend-ontap-nas-secret + namespace: trident +type: Opaque +stringData: + username: [USERNAME] + password: [PASSWORD] +--- +apiVersion: trident.netapp.io/v1 +kind: TridentBackendConfig +metadata: + name: backend-ontap-nas + namespace: trident +spec: + version: 1 + storageDriverName: ontap-nas + managementLIF: [ONTAP_MANAGEMENT_LIF_IP] + dataLIF: [DATA_LIF_IP] + backendName: ontap-nas + autoExportCIDRs: + - [x.x.x.x/xx] + autoExportPolicy: true + svm: [SVM] + credentials: + name: backend-ontap-nas-secret +``` + +#### Create a Storage Class + +Kubernetes supports the ability to bind statically or dynamically provisioned volumes to Pods. Statically provisioned +volumes are manually created by a user and then referenced in a deployment. Astra Trident allows you to leverage your +NetApp storage. You must create a storage class before you can request dynamically provisioned volumes. + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: trident-csi + namespace: trident +provisioner: csi.trident.netapp.io +parameters: + backendType: "ontap-nas" + csi.storage.k8s.io/fstype: ext4 +``` + +#### Provision Volumes + +An example of provisioning a Persistent Volume Claim (PVC). + +```yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: trident-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: trident-csi +``` + +#### Deploy a Pod and Mount the Volume. + +The following code snippet is an example of a pod deployment. The pod contains an Nginx container, with a claim to the +previously created PVC. Once deployed, the PVC with its bound Persistent Volume (PV), will mount to the pod and provide +persistent storage to this application. + +```yaml +kind: Pod +apiVersion: v1 +metadata: + name: example-pv-pod + namespace: trident +spec: + volumes: + - name: example-pv-vol + persistentVolumeClaim: + claimName: trident-pvc + containers: + - name: example-pv-pod + image: nginx + ports: + - containerPort: 80 + name: "http-server" + volumeMounts: + - mountPath: "/usr/share/nginx/html" + name: example-pv-vol +``` + + + + \ No newline at end of file diff --git a/_partials/packs/_ubuntu.mdx b/_partials/packs/_ubuntu.mdx new file mode 100644 index 0000000000..6272186311 --- /dev/null +++ b/_partials/packs/_ubuntu.mdx @@ -0,0 +1,293 @@ +--- +partial_category: packs +partial_name: ubuntu +--- + +:::info + + + +Review the page to learn about our pack update and deprecation schedules. + + +::: + +## Version Supported + + + + + + +To use the Ubuntu OS pack, add the pack to your cluster profile when you select the OS layer. Refer to the +guide to learn more. + + +#### Add Custom Files + +You can create custom files that you define in the `files` section that precedes the `preKubeadmCommands` and +`postKubeadmCommands` sections. The files are invoked during runtime. + +```yaml +kubeadmconfig: + files: + - targetPath: /usr/local/share/ca-certificates/mycom.crt + targetOwner: "root:root" + targetPermissions: "0644" + content: | + -----BEGIN CERTIFICATE----- + MIICyzCCAbOgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl + cm5ldGVzMB4XDTIwMDkyMjIzNDMyM1oXDTMwMDkyMDIzNDgyM1owFTETMBEGA1UE + AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdA + nZYs1el/6f9PgV/aO9mzy7MvqaZoFnqO7Qi4LZfYzixLYmMUzi+h8/RLPFIoYLiz + qiDn+P8c9I1uxB6UqGrBt7dkXfjrUZPs0JXEOX9U/6GFXL5C+n3AUlAxNCS5jobN + fbLt7DH3WoT6tLcQefTta2K+9S7zJKcIgLmBlPNDijwcQsbenSwDSlSLkGz8v6N2 + 7SEYNCV542lbYwn42kbcEq2pzzAaCqa5uEPsR9y+uzUiJpv5tDHUdjbFT8tme3vL + 9EdCPODkqtMJtCvz0hqd5SxkfeC2L+ypaiHIxbwbWe7GtliROvz9bClIeGY7gFBK + jZqpLdbBVjo0NZBTJFUCAwEAAaMmMCQwDgYDVR0PAQH/BAQDAgKkMBIGA1UdEwEB + /wQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBADIKoE0P+aVJGV9LWGLiOhki + HFv/vPPAQ2MPk02rLjWzCaNrXD7aPPgT/1uDMYMHD36u8rYyf4qPtB8S5REWBM/Y + g8uhnpa/tGsaqO8LOFj6zsInKrsXSbE6YMY6+A8qvv5lPWpJfrcCVEo2zOj7WGoJ + ixi4B3fFNI+wih8/+p4xW+n3fvgqVYHJ3zo8aRLXbXwztp00lXurXUyR8EZxyR+6 + b+IDLmHPEGsY9KOZ9VLLPcPhx5FR9njFyXvDKmjUMJJgUpRkmsuU1mCFC+OHhj56 + IkLaSJf6z/p2a3YjTxvHNCqFMLbJ2FvJwYCRzsoT2wm2oulnUAMWPI10vdVM+Nc= + -----END CERTIFICATE----- + preKubeadmCommands: + - echo "Executing pre kube admin config commands" + - update-ca-certificates + - "systemctl restart containerd; sleep 3" + - 'while [ ! -S /var/run/containerd/containerd.sock ]; do echo "Waiting for containerd..."; sleep 1; done' + postKubeadmCommands: + - echo "Executing post kube admin config commands" +``` + +In the next example, a configuration file is added to a folder. + +```yaml +kubeadmconfig: + files: + - targetPath: /etc/containerd/config.toml + targetOwner: "root:root" + targetPermissions: "0644" + content: | + version = 2 + imports = ["/etc/containerd/conf.d/*.toml"] + [plugins] + [plugins."io.containerd.grpc.v1.cri"] + sandbox_image = "registry.k8s.io/pause:3.9" + device_ownership_from_security_context = true + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] + SystemdCgroup = true + preKubeadmCommands: + - 'echo "====> Applying pre Kubeadm commands"' + postKubeadmCommands: + - 'echo "====> Applying post Kubeadm commands"' +``` + +### Ubuntu Pro + +Ubuntu Pro is a security and maintenance subscription offering from Canonical that offers long-term security support and +many other security hardening features. Ubuntu Pro offers several more benefits than the free Ubuntu offering: + +- Extended Security Maintenance + +- Kernel Livepatch service to avoid reboots + +- FIPS 140-2 Level 1 certified crypto modules + +- Common Criteria EAL2 + +For more information, refer to the [Ubuntu Pro](https://ubuntu.com/pro) documentation from Canonical. + +You can enable Ubuntu Pro when deploying clusters with Palette. To enable Ubuntu Pro, select Ubuntu as the OS layer for +a cluster profile and expand the **Preset Menu** to reveal the Ubuntu Pro parameters. + +| Parameter | Description | Default Value | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| **token** | The Canonical subscription token for Ubuntu Pro. Refer to the Ubuntu Pro [subscribe page](https://ubuntu.com/pro/subscribe) to aquire a subscription token. | `""` | +| **esm-apps** | Expanded Security Maintenance (ESM) for Applications. Refer to the Ubuntu [ESM documentation](https://ubuntu.com/security/esm) to learn more. | Disabled | +| **livepatch** | Canonical Livepatch service. Refer to the Ubuntu [Livepatch](https://ubuntu.com/security/livepatch) documenation for more details. | Disabled | +| **fips** | Federal Information Processing Standards (FIPS) 140 validated cryptography for Linux workloads on Ubuntu. This installs NIST-certified core packages. Refer to the Ubuntu [FIPS](https://ubuntu.com/security/certifications/docs/2204) documentation to learn more. | Disabled | +| **fips-updates** | Install NIST-certified core packages with priority security updates. Refer to the Ubuntu [FIPS Updates](https://ubuntu.com/security/certifications/docs/fips-updates) documentation to learn more. | Disabled | +| **cis** | Gain access to OpenSCAP-based tooling that automates both hardening and auditing with certified content based on published CIS benchmarks. Refer to the Ubuntu [CIS](https://ubuntu.com/security/certifications/docs/2204/usg/cis) documentation to learn more. | Disabled | + +Use the following steps to enable Ubuntu Pro. + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. Navigate to the left **Main Menu** and select **Profiles**. + +3. Click on **Add Cluster Profile**. + +4. Fill out the input fields for **Name**, **Version**, **Description**, **Type** and **Tags**. Click on **Next** to + continue. + +5. Select the infrastructure provider and click on **Next**. + +6. Select the OS layer and use the following information to find the Ubuntu pack: + +- **Pack Type** - OS + +- **Registry** - Public Repo + +- **Pack Name** -Ubuntu + +- **Pack Version** - 20.04 or 22.04 + +7. Modify the Ubuntu **Pack values** to activate the **Presets** options for the Ubuntu YAML file. Click on the + **\** button to reveal the YAML editor and expand the **Preset Drawer**. + +![A view of the cluster profile creation wizard for Ubuntu Pro](/integrations_ubuntu_ubuntu-pro-preset-drawer.webp) + +8. Click the **Ubuntu Advantage/Pro** checkbox to include the Ubuntu Pro parameters in the pack configuration file. + +9. Toggle options on or off to enable or disable the various Ubuntu Pro services. + +10. Click the **Next layer** button to continue to the next layer. + +11. Complete the remainder of the cluster profile creation wizard by selecting the next cluster profile layers. + + + + + + +To use the Ubuntu OS pack, add the pack to your cluster profile when you select the OS layer. Refer to the +guide to learn more. + +#### Add Custom Files + +You can create custom files that you define in the `files` section that precedes the `preKubeadmCommands` and +`postKubeadmCommands` sections. The files are invoked during runtime. + +```yaml +kubeadmconfig: + files: + - targetPath: /usr/local/share/ca-certificates/mycom.crt + targetOwner: "root:root" + targetPermissions: "0644" + content: | + -----BEGIN CERTIFICATE----- + MIICyzCCAbOgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl + cm5ldGVzMB4XDTIwMDkyMjIzNDMyM1oXDTMwMDkyMDIzNDgyM1owFTETMBEGA1UE + AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdA + nZYs1el/6f9PgV/aO9mzy7MvqaZoFnqO7Qi4LZfYzixLYmMUzi+h8/RLPFIoYLiz + qiDn+P8c9I1uxB6UqGrBt7dkXfjrUZPs0JXEOX9U/6GFXL5C+n3AUlAxNCS5jobN + fbLt7DH3WoT6tLcQefTta2K+9S7zJKcIgLmBlPNDijwcQsbenSwDSlSLkGz8v6N2 + 7SEYNCV542lbYwn42kbcEq2pzzAaCqa5uEPsR9y+uzUiJpv5tDHUdjbFT8tme3vL + 9EdCPODkqtMJtCvz0hqd5SxkfeC2L+ypaiHIxbwbWe7GtliROvz9bClIeGY7gFBK + jZqpLdbBVjo0NZBTJFUCAwEAAaMmMCQwDgYDVR0PAQH/BAQDAgKkMBIGA1UdEwEB + /wQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBADIKoE0P+aVJGV9LWGLiOhki + HFv/vPPAQ2MPk02rLjWzCaNrXD7aPPgT/1uDMYMHD36u8rYyf4qPtB8S5REWBM/Y + g8uhnpa/tGsaqO8LOFj6zsInKrsXSbE6YMY6+A8qvv5lPWpJfrcCVEo2zOj7WGoJ + ixi4B3fFNI+wih8/+p4xW+n3fvgqVYHJ3zo8aRLXbXwztp00lXurXUyR8EZxyR+6 + b+IDLmHPEGsY9KOZ9VLLPcPhx5FR9njFyXvDKmjUMJJgUpRkmsuU1mCFC+OHhj56 + IkLaSJf6z/p2a3YjTxvHNCqFMLbJ2FvJwYCRzsoT2wm2oulnUAMWPI10vdVM+Nc= + -----END CERTIFICATE----- + preKubeadmCommands: + - echo "Executing pre kube admin config commands" + - update-ca-certificates + - "systemctl restart containerd; sleep 3" + - 'while [ ! -S /var/run/containerd/containerd.sock ]; do echo "Waiting for containerd..."; sleep 1; done' + postKubeadmCommands: + - echo "Executing post kube admin config commands" +``` + +In the next example, a configuration file is added to a folder. + +```yaml +kubeadmconfig: + files: + - targetPath: /etc/containerd/config.toml + targetOwner: "root:root" + targetPermissions: "0644" + content: | + ## template: jinja + + # Use config version 2 to enable new configuration fields. + # Config file is parsed as version 1 by default. + version = 2 + + imports = ["/etc/containerd/conf.d/*.toml"] + + [plugins] + [plugins."io.containerd.grpc.v1.cri"] + sandbox_image = "registry.k8s.io/pause:3.9" + device_ownership_from_security_context = true + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] + SystemdCgroup = true + preKubeadmCommands: + - 'echo "====> Applying pre Kubeadm commands"' + postKubeadmCommands: + - 'echo "====> Applying post Kubeadm commands"' +``` + +### Ubuntu Pro + +Ubuntu Pro is a security and maintenance subscription offering from Canonical that offers long-term security support and +many other security hardening features. Ubuntu Pro offers several more benefits than the free Ubuntu offering: + +- Extended Security Maintenance + +- Kernel Livepatch service to avoid reboots + +- FIPS 140-2 Level 1 certified crypto modules + +- Common Criteria EAL2 + +For more information, refer to the [Ubuntu Pro](https://ubuntu.com/pro) documentation from Canonical. + +You can enable Ubuntu Pro when deploying clusters with Palette. To enable Ubuntu Pro, select Ubuntu as the OS for a +cluster profile and expand the **Preset Menu** to reveal the Ubuntu Pro parameters. + +| Parameter | Description | Default Value | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| **token** | The Canonical subscription token for Ubuntu Pro. Refer to the Ubuntu Pro [subscribe page](https://ubuntu.com/pro/subscribe) to aquire a subscription token. | `""` | +| **esm-apps** | Expanded Security Maintenance (ESM) for Applications. Refer to the Ubuntu [ESM documentation](https://ubuntu.com/security/esm) to learn more. | Disabled | +| **livepatch** | Canonical Livepatch service. Refer to the Ubuntu [Livepatch](https://ubuntu.com/security/livepatch) documenation for more details. | Disabled | +| **fips** | Federal Information Processing Standards (FIPS) 140 validated cryptography for Linux workloads on Ubuntu. This installs NIST-certified core packages. Refer to the Ubuntu [FIPS](https://ubuntu.com/security/certifications/docs/2204) documentation to learn more. | Disabled | +| **fips-updates** | Install NIST-certified core packages with priority security updates. Refer to the Ubuntu [FIPS Updates](https://ubuntu.com/security/certifications/docs/fips-updates) documentation to learn more. | Disabled | +| **cis** | Gain access to OpenSCAP-based tooling that automates both hardening and auditing with certified content based on published CIS benchmarks. Refer to the Ubuntu [CIS](https://ubuntu.com/security/certifications/docs/2204/usg/cis) documentation to learn more. | Disabled | + +Use the following steps to enable Ubuntu Pro. + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. Navigate to the left **Main Menu** and select **Profiles**. + +3. Click on **Add Cluster Profile**. + +4. Fill out the input fields for **Name**, **Version**, **Description**, **Type** and **Tags**. Click on **Next** to + continue. + +5. Select the infrastructure provider and click on **Next**. + +6. Select the OS layer and use the following information to find the Ubuntu pack: + +- **Pack Type** - OS + +- **Registry** - Public Repo + +- **Pack Name** -Ubuntu + +- **Pack Version** - 20.04 or 22.04 + +7. Modify the Ubuntu **Pack values** to activate the **Presets** options for the Ubuntu YAML file. Click on the + **\** button to reveal the YAML editor and expand the **Preset Drawer**. + +![A view of the cluster profile creation wizard for Ubuntu Pro](/integrations_ubuntu_ubuntu-pro-preset-drawer.webp) + +8. Click the **Ubuntu Advantage/Pro** checkbox to include the Ubuntu Pro parameters in the pack configuration file. + +9. Toggle options on or off to enable or disable the various Ubuntu Pro services. + +10. Click the **Next layer** button to continue to the next layer. + +11. Complete the remainder of the cluster profile creation wizard by selecting the next cluster profile layers. + + + diff --git a/declarations.d.ts b/declarations.d.ts index 95771c99c6..b8eab7bd34 100644 --- a/declarations.d.ts +++ b/declarations.d.ts @@ -5,6 +5,11 @@ declare module "*.module.scss" { export default classes; } +declare module "*.md" { + const value: string; // markdown is just a string + export default value; +} + declare module "*.scss" { const src: string; export default src; diff --git a/docs/docs-content/integrations/antrea-cni.md b/docs/deprecated/integrations/antrea-cni.md similarity index 100% rename from docs/docs-content/integrations/antrea-cni.md rename to docs/deprecated/integrations/antrea-cni.md diff --git a/docs/deprecated/integrations/argo-cd.md b/docs/deprecated/integrations/argo-cd.md new file mode 100644 index 0000000000..a2968d64a0 --- /dev/null +++ b/docs/deprecated/integrations/argo-cd.md @@ -0,0 +1,52 @@ +--- +sidebar_label: "Argo CD" +title: "Argo CD" +description: "Argo CD for Spectro Cloud Palette" + +type: "integration" +category: ["system app", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/argo-cd/blobs/sha256:647cd3df6fec421e6580589ea7229762d8e828c77036f835f14f4c15c2a44c4c?type=image.webp" +tags: ["packs", "argo-cd", "system app"] +--- + +[Argo CD](https://argo-cd.readthedocs.io/en/stable/) is a declarative, GitOps continuous delivery tool for Kubernetes. +Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application +state. Argo CD automates the deployment of the desired application states in the specified target environments. +Application deployments can track updates to branches, tags, or pinned to a specific version of manifests at a Git +commit. Start using Argo CD with Palette today by consuming this pack. + +## Prerequisites + +- Kubernetes 1.7+ + +## Version Supported + + + + +- **3.3.5** + + + + + +- **3.2.6** + + + + +## Notable Parameters + +| Parameter | Description | +| ---------------------------- | ---------------------------------------------------------------------------------------------------- | +| global.image.repository | The repository that is the source of truth. | +| global.image.tag | The image tag to pull. | +| global.image.imagePullPolicy | If defined, a imagePullPolicy applied to all ArgoCD deployments. Defaults to ` IfNotPresent` | +| global.securityContext | A list of security contexts | +| imagePullSecrets | If defined, uses a Secret to pull an image from a private Docker registry or repository. | +| hostAliases | A list of mapping between IP and hostnames that will be injected as entries in the pod's hosts files | + +## References + +- [Argo CD](https://argo-cd.readthedocs.io/en/stable/) diff --git a/docs/deprecated/integrations/aws-cluster-autoscaler.md b/docs/deprecated/integrations/aws-cluster-autoscaler.md new file mode 100644 index 0000000000..b50d93f0b2 --- /dev/null +++ b/docs/deprecated/integrations/aws-cluster-autoscaler.md @@ -0,0 +1,668 @@ +--- +sidebar_label: "AWS Cluster Autoscaler" +title: "AWS Cluster Autoscaler" +description: "AWS Cluster Autoscaler for Spectro Cloud Palette" +hide_table_of_contents: true +type: "integration" +category: ["system app", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/aws-cluster-autoscaler/blobs/sha256:f86813591b3b63b3afcf0a604a7c8c715660448585e89174908f3c6a421ad8d8?type=image.webp" +tags: ["packs", "aws-cluster-autoscaler", "system app", "eks"] +--- + +Palette supports auto scaling for Amazon Elastic Kubernetes Service (EKS) host clusters through the AWS Cluster +Autoscaler pack. + +The Cluster Autoscaler pack monitors the cluster workload and utilizes +[Amazon EC2 Auto Scaling Groups](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) +to dynamically provision or shut down nodes, maximizing the cluster's performance and making it more resilient to +failures. The Kubernetes clusters are resized under the following conditions: + +- Scale-up: The Cluster Autoscaler triggers a scale-up operation if insufficient cluster resources lead to multiple pod + failures. The pods become eligible for scheduling on the new nodes. The Cluster Autoscaler checks for pod failures + every 30 seconds and schedules impacted pods on new nodes. Scaling up will not happen when the given pods have node + affinity. + +- Scale-down: The Cluster Autoscaler triggers a scale-down operation if nodes are underutilized for ten continuous + minutes, and their pods are eligible for rescheduling on other available nodes. The node utilization threshold for + scaling down a node defaults to 50% of the node's capacity. The Cluster Autoscaler calculates the node utilization + threshold based on CPU and memory utilization. In scenarios where the node is underutilized, the Cluster Autoscaler + migrates the pods from underutilized nodes to other available nodes and then shuts down the underutilized nodes. + +## Versions Supported + + + + + +### Prerequisites + +- An EKS host cluster with Kubernetes 1.28.x or higher. + +- Permission to create an IAM policy in the AWS account you use with Palette. + +### Parameters + +| **Parameter** | **Description** | **Default Value** | **Required** | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | +| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | + +### Usage + +The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first +define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the +cluster's node groups. + +Use the following steps to create the IAM policy and deploy the Cluster Autoscaler pack. + +1. In AWS, create a new IAM policy using the snippet below and give it a name, for example, + _PaletteEKSClusterAutoscaler_. Refer to the + [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) guide for + instructions. + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "autoscaling:DescribeAutoScalingGroups", + "autoscaling:DescribeAutoScalingInstances", + "autoscaling:DescribeLaunchConfigurations", + "autoscaling:DescribeScalingActivities", + "autoscaling:DescribeTags", + "ec2:DescribeInstanceTypes", + "ec2:DescribeLaunchTemplateVersions" + ], + "Resource": ["*"] + }, + { + "Effect": "Allow", + "Action": [ + "autoscaling:SetDesiredCapacity", + "autoscaling:TerminateInstanceInAutoScalingGroup", + "ec2:DescribeImages", + "ec2:GetInstanceTypesFromInstanceRequirements", + "eks:DescribeNodegroup" + ], + "Resource": ["*"] + } + ] + } + ``` + +2. Copy the IAM policy + [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html). Your policy ARN + should be similar to `arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler`. + +3. During the cluster profile creation, modify the `managedMachinePool.roleAdditionalPolicies` section in the + **values.yaml** file of the Kubernetes pack with the created IAM policy ARN. Palette will attach the IAM policy to + your cluster's node group during cluster deployment. The snapshot below illustrates the specific section to update + with the policy ARN. + + ![A snapshot displaying the ARN added to the Kubernetes pack's manifest.](/integrations_aws-cluster-autoscaler_k8s-manifest.webp) + + For example, the code block below displays the updated `managedMachinePool.roleAdditionalPolicies` section with a + sample policy ARN. + + ```yaml + managedMachinePool: + # roleName: {{ name of the self-managed role | format "${string}" }} + # A list of additional policies to attach to the node group role + roleAdditionalPolicies: + - "arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler" + ``` + + :::tip + + Instead of updating the Kubernetes pack's **values.yaml** file, you can alternatively add an inline IAM policy to the + cluster's node group post deployment. Refer to the + [Adding IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) + guide to learn how to embed an inline policy for a user or role. + + ::: + +4. Once you included all the [infrastructure pack layers](../profiles/profiles.md) to your cluster profile, add the AWS + Cluster Autoscaler pack. + +5. Next, use the created cluster profile to [deploy a cluster](../clusters/public-cloud/deploy-k8s-cluster.md). In the + **Nodes Config** section, specify the minimum and maximum number of worker pool nodes and the instance type that + suits your workload. Your worker pool will have at least the minimum number of nodes you set up, and when scaling up, + it will not exceed the maximum number of nodes configured. Note that each configured node pool will represent one + ASG. + + The snapshot below displays an example of the cluster's **Nodes Config** section. + + ![A snapshot displaying the minimum and maximum node count in Palette.](/integrations_aws-cluster-autoscaler_node-count.webp) + + :::tip + + You can also [edit the minimum and maximum number of worker pool nodes](#resize-the-cluster) for a deployed cluster + directly in the Palette UI. + + ::: + +#### Resize the Cluster + +In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster +Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce +the instance size. This will lead to insufficient resources for existing pods and multiple pod failures in the cluster. +As a result, the Cluster Autoscaler will provision new smaller-sized nodes with enough capacity to accommodate the +current workload and reschedule the affected pods on new nodes. Follow the steps below to trigger the Cluster Autoscaler +and the pod rescheduling event. + +1. During the cluster deployment, in the **Nodes Config** section, choose a large-sized instance type. For example, you + can select the worker pool instance size as **t3.2xlarge** (8 vCPUs, 32 GB RAM) or higher. + +2. Once the cluster is deployed, go to the **Nodes** tab in the cluster details page in Palette. Observe the count and + size of nodes. The snapshot below displays one node of the type **t3.2xlarge** in the cluster's worker pool. + + ![A snapshot displaying one node of the type **t3.2xlarge** in the worker pool.](/integrations_aws-cluster-autoscaler_one-node.webp) + +3. Manually reduce the instance size in the worker pool configuration to **t3.medium** (2 vCPUs, 8 GB RAM). The snapshot + below shows how to change the instance size in the node pool configuration. + + ![A snapshot displaying how to edit node pool configuration.](/integrations_aws-cluster-autoscaler_edit-node.webp) + +4. Wait a few minutes for the new nodes to be provisioned. Reducing the node size will make the Cluster Autoscaler shut + down the large node and provision smaller-sized nodes with enough capacity to accommodate the current workload. Note + that the new node count will be within the minimum and maximum limits specified in the worker pool configuration + wizard. + + The snapshot below displays the newly created **t3.medium** nodes. These two smaller-sized nodes will efficiently + manage the same workload as the single larger-sized node. + + ![A snapshot displaying new nodes of the size **t3.medium** spin up automatically, *collectively* providing enough capacity to accommodate the current workload. ](/integrations_aws-cluster-autoscaler_two-nodes.webp) + + + + + +### Prerequisites + +- An EKS host cluster with Kubernetes 1.27.x or higher. + +- Permission to create an IAM policy in the AWS account you use with Palette. + +### Parameters + +| **Parameter** | **Description** | **Default Value** | **Required** | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | +| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | + +### Usage + +The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first +define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the +cluster's node groups. + +Use the following steps to create the IAM policy and deploy the Cluster Autoscaler pack. + +1. In AWS, create a new IAM policy using the snippet below and give it a name, for example, + _PaletteEKSClusterAutoscaler_. Refer to the + [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) guide for + instructions. + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "autoscaling:DescribeAutoScalingGroups", + "autoscaling:DescribeAutoScalingInstances", + "autoscaling:DescribeLaunchConfigurations", + "autoscaling:DescribeScalingActivities", + "autoscaling:DescribeTags", + "ec2:DescribeInstanceTypes", + "ec2:DescribeLaunchTemplateVersions" + ], + "Resource": ["*"] + }, + { + "Effect": "Allow", + "Action": [ + "autoscaling:SetDesiredCapacity", + "autoscaling:TerminateInstanceInAutoScalingGroup", + "ec2:DescribeImages", + "ec2:GetInstanceTypesFromInstanceRequirements", + "eks:DescribeNodegroup" + ], + "Resource": ["*"] + } + ] + } + ``` + +2. Copy the IAM policy + [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html). Your policy ARN + should be similar to `arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler`. + +3. During the cluster profile creation, modify the `managedMachinePool.roleAdditionalPolicies` section in the + **values.yaml** file of the Kubernetes pack with the created IAM policy ARN. Palette will attach the IAM policy to + your cluster's node group during cluster deployment. The snapshot below illustrates the specific section to update + with the policy ARN. + + ![A snapshot displaying the ARN added to the Kubernetes pack's manifest.](/integrations_aws-cluster-autoscaler_k8s-manifest.webp) + + For example, the code block below displays the updated `managedMachinePool.roleAdditionalPolicies` section with a + sample policy ARN. + + ```yaml + managedMachinePool: + # roleName: {{ name of the self-managed role | format "${string}" }} + # A list of additional policies to attach to the node group role + roleAdditionalPolicies: + - "arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler" + ``` + + :::tip + + Instead of updating the Kubernetes pack's **values.yaml** file, you can alternatively add an inline IAM policy to the + cluster's node group post deployment. Refer to the + [Adding IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) + guide to learn how to embed an inline policy for a user or role. + + ::: + +4. Once you included all the [infrastructure pack layers](../profiles/profiles.md) to your cluster profile, add the AWS + Cluster Autoscaler pack. + +5. Next, use the created cluster profile to [deploy a cluster](../clusters/public-cloud/deploy-k8s-cluster.md). In the + **Nodes Config** section, specify the minimum and maximum number of worker pool nodes and the instance type that + suits your workload. Your worker pool will have at least the minimum number of nodes you set up, and when scaling up, + it will not exceed the maximum number of nodes configured. Note that each configured node pool will represent one + ASG. + + The snapshot below displays an example of the cluster's **Nodes Config** section. + + ![A snapshot displaying the minimum and maximum node count in Palette.](/integrations_aws-cluster-autoscaler_node-count.webp) + + :::tip + + You can also [edit the minimum and maximum number of worker pool nodes](#resize-the-cluster) for a deployed cluster + directly in the Palette UI. + + ::: + +#### Resize the Cluster + +In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster +Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce +the instance size. This will lead to insufficient resources for existing pods and multiple pod failures in the cluster. +As a result, the Cluster Autoscaler will provision new smaller-sized nodes with enough capacity to accommodate the +current workload and reschedule the affected pods on new nodes. Follow the steps below to trigger the Cluster Autoscaler +and the pod rescheduling event. + +1. During the cluster deployment, in the **Nodes Config** section, choose a large-sized instance type. For example, you + can select the worker pool instance size as **t3.2xlarge** (8 vCPUs, 32 GB RAM) or higher. + +2. Once the cluster is deployed, go to the **Nodes** tab in the cluster details page in Palette. Observe the count and + size of nodes. The snapshot below displays one node of the type **t3.2xlarge** in the cluster's worker pool. + + ![A snapshot displaying one node of the type **t3.2xlarge** in the worker pool.](/integrations_aws-cluster-autoscaler_one-node.webp) + +3. Manually reduce the instance size in the worker pool configuration to **t3.medium** (2 vCPUs, 8 GB RAM). The snapshot + below shows how to change the instance size in the node pool configuration. + + ![A snapshot displaying how to edit node pool configuration.](/integrations_aws-cluster-autoscaler_edit-node.webp) + +4. Wait a few minutes for the new nodes to be provisioned. Reducing the node size will make the Cluster Autoscaler shut + down the large node and provision smaller-sized nodes with enough capacity to accommodate the current workload. Note + that the new node count will be within the minimum and maximum limits specified in the worker pool configuration + wizard. + + The snapshot below displays the newly created **t3.medium** nodes. These two smaller-sized nodes will efficiently + manage the same workload as the single larger-sized node. + + ![A snapshot displaying new nodes of the size **t3.medium** spin up automatically, *collectively* providing enough capacity to accommodate the current workload. ](/integrations_aws-cluster-autoscaler_two-nodes.webp) + + + + + +### Prerequisites + +- An EKS host cluster with Kubernetes 1.26.x or higher. + +- Permission to create an IAM policy in the AWS account you use with Palette. + +### Parameters + +| **Parameter** | **Description** | **Default Value** | **Required** | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | +| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | + +### Usage + +The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first +define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the +cluster's node groups. + +Use the following steps to create the IAM policy and deploy the Cluster Autoscaler pack. + +1. In AWS, create a new IAM policy using the snippet below and give it a name, for example, + _PaletteEKSClusterAutoscaler_. Refer to the + [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) guide for + instructions. + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "autoscaling:DescribeAutoScalingGroups", + "autoscaling:DescribeAutoScalingInstances", + "autoscaling:DescribeLaunchConfigurations", + "autoscaling:DescribeScalingActivities", + "autoscaling:DescribeTags", + "ec2:DescribeInstanceTypes", + "ec2:DescribeLaunchTemplateVersions" + ], + "Resource": ["*"] + }, + { + "Effect": "Allow", + "Action": [ + "autoscaling:SetDesiredCapacity", + "autoscaling:TerminateInstanceInAutoScalingGroup", + "ec2:DescribeImages", + "ec2:GetInstanceTypesFromInstanceRequirements", + "eks:DescribeNodegroup" + ], + "Resource": ["*"] + } + ] + } + ``` + +2. Copy the IAM policy + [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html). Your policy ARN + should be similar to `arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler`. + +3. During the cluster profile creation, modify the `managedMachinePool.roleAdditionalPolicies` section in the + **values.yaml** file of the Kubernetes pack with the created IAM policy ARN. Palette will attach the IAM policy to + your cluster's node group during cluster deployment. The snapshot below illustrates the specific section to update + with the policy ARN. + + ![A snapshot displaying the ARN added to the Kubernetes pack's manifest.](/integrations_aws-cluster-autoscaler_k8s-manifest.webp) + + For example, the code block below displays the updated `managedMachinePool.roleAdditionalPolicies` section with a + sample policy ARN. + + ```yaml + managedMachinePool: + # roleName: {{ name of the self-managed role | format "${string}" }} + # A list of additional policies to attach to the node group role + roleAdditionalPolicies: + - "arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler" + ``` + + :::tip + + Instead of updating the Kubernetes pack's **values.yaml** file, you can alternatively add an inline IAM policy to the + cluster's node group post deployment. Refer to the + [Adding IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) + guide to learn how to embed an inline policy for a user or role. + + ::: + +4. Once you included all the [infrastructure pack layers](../profiles/profiles.md) to your cluster profile, add the AWS + Cluster Autoscaler pack. + +5. Next, use the created cluster profile to [deploy a cluster](../clusters/public-cloud/deploy-k8s-cluster.md). In the + **Nodes Config** section, specify the minimum and maximum number of worker pool nodes and the instance type that + suits your workload. Your worker pool will have at least the minimum number of nodes you set up, and when scaling up, + it will not exceed the maximum number of nodes configured. Note that each configured node pool will represent one + ASG. + + The snapshot below displays an example of the cluster's **Nodes Config** section. + + ![A snapshot displaying the minimum and maximum node count in Palette.](/integrations_aws-cluster-autoscaler_node-count.webp) + + :::tip + + You can also [edit the minimum and maximum number of worker pool nodes](#resize-the-cluster) for a deployed cluster + directly in the Palette UI. + + ::: + +#### Resize the Cluster + +In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster +Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce +the instance size. This will lead to insufficient resources for existing pods and multiple pod failures in the cluster. +As a result, the Cluster Autoscaler will provision new smaller-sized nodes with enough capacity to accommodate the +current workload and reschedule the affected pods on new nodes. Follow the steps below to trigger the Cluster Autoscaler +and the pod rescheduling event. + +1. During the cluster deployment, in the **Nodes Config** section, choose a large-sized instance type. For example, you + can select the worker pool instance size as **t3.2xlarge** (8 vCPUs, 32 GB RAM) or higher. + +2. Once the cluster is deployed, go to the **Nodes** tab in the cluster details page in Palette. Observe the count and + size of nodes. The snapshot below displays one node of the type **t3.2xlarge** in the cluster's worker pool. + + ![A snapshot displaying one node of the type **t3.2xlarge** in the worker pool.](/integrations_aws-cluster-autoscaler_one-node.webp) + +3. Manually reduce the instance size in the worker pool configuration to **t3.medium** (2 vCPUs, 8 GB RAM). The snapshot + below shows how to change the instance size in the node pool configuration. + + ![A snapshot displaying how to edit node pool configuration.](/integrations_aws-cluster-autoscaler_edit-node.webp) + +4. Wait a few minutes for the new nodes to be provisioned. Reducing the node size will make the Cluster Autoscaler shut + down the large node and provision smaller-sized nodes with enough capacity to accommodate the current workload. Note + that the new node count will be within the minimum and maximum limits specified in the worker pool configuration + wizard. + + The snapshot below displays the newly created **t3.medium** nodes. These two smaller-sized nodes will efficiently + manage the same workload as the single larger-sized node. + + ![A snapshot displaying new nodes of the size **t3.medium** spin up automatically, *collectively* providing enough capacity to accommodate the current workload. ](/integrations_aws-cluster-autoscaler_two-nodes.webp) + + + + + +### Prerequisites + +- An EKS host cluster with Kubernetes 1.19.x or higher. + +- Permission to create an IAM policy in the AWS account you use with Palette. + +### Parameters + +| **Parameter** | **Description** | **Default Value** | **Required** | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | +| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | + +### Usage + +The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first +define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the +cluster's node groups. + +Use the following steps to create the IAM policy and deploy the Cluster Autoscaler pack. + +1. In AWS, create a new IAM policy using the snippet below and give it a name, for example, + _PaletteEKSClusterAutoscaler_. Refer to the + [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) guide for + instructions. + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "autoscaling:DescribeAutoScalingGroups", + "autoscaling:DescribeAutoScalingInstances", + "autoscaling:DescribeLaunchConfigurations", + "autoscaling:DescribeScalingActivities", + "autoscaling:DescribeTags", + "ec2:DescribeInstanceTypes", + "ec2:DescribeLaunchTemplateVersions" + ], + "Resource": ["*"] + }, + { + "Effect": "Allow", + "Action": [ + "autoscaling:SetDesiredCapacity", + "autoscaling:TerminateInstanceInAutoScalingGroup", + "ec2:DescribeImages", + "ec2:GetInstanceTypesFromInstanceRequirements", + "eks:DescribeNodegroup" + ], + "Resource": ["*"] + } + ] + } + ``` + +2. Copy the IAM policy + [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html). Your policy ARN + should be similar to `arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler`. + +3. During the cluster profile creation, modify the `managedMachinePool.roleAdditionalPolicies` section in the + **values.yaml** file of the Kubernetes pack with the created IAM policy ARN. Palette will attach the IAM policy to + your cluster's node group during cluster deployment. The snapshot below illustrates the specific section to update + with the policy ARN. + + ![A snapshot displaying the ARN added to the Kubernetes pack's manifest.](/integrations_aws-cluster-autoscaler_k8s-manifest.webp) + + For example, the code block below displays the updated `managedMachinePool.roleAdditionalPolicies` section with a + sample policy ARN. + + ```yaml + managedMachinePool: + # roleName: {{ name of the self-managed role | format "${string}" }} + # A list of additional policies to attach to the node group role + roleAdditionalPolicies: + - "arn:aws:iam::123456789:policy/PaletteEKSClusterAutoscaler" + ``` + + :::tip + + Instead of updating the Kubernetes pack's **values.yaml** file, you can alternatively add an inline IAM policy to the + cluster's node group post deployment. Refer to the + [Adding IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) + guide to learn how to embed an inline policy for a user or role. + + ::: + +4. Once you included all the [infrastructure pack layers](../profiles/profiles.md) to your cluster profile, add the AWS + Cluster Autoscaler pack. + +5. Next, use the created cluster profile to [deploy a cluster](../clusters/public-cloud/deploy-k8s-cluster.md). In the + **Nodes Config** section, specify the minimum and maximum number of worker pool nodes and the instance type that + suits your workload. Your worker pool will have at least the minimum number of nodes you set up, and when scaling up, + it will not exceed the maximum number of nodes configured. Note that each configured node pool will represent one + ASG. + + The snapshot below displays an example of the cluster's **Nodes Config** section. + + ![A snapshot displaying the minimum and maximum node count in Palette.](/integrations_aws-cluster-autoscaler_node-count.webp) + + :::tip + + You can also [edit the minimum and maximum number of worker pool nodes](#resize-the-cluster) for a deployed cluster + directly in the Palette UI. + + ::: + +#### Resize the Cluster + +In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster +Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce +the instance size. This will lead to insufficient resources for existing pods and multiple pod failures in the cluster. +As a result, the Cluster Autoscaler will provision new smaller-sized nodes with enough capacity to accommodate the +current workload and reschedule the affected pods on new nodes. Follow the steps below to trigger the Cluster Autoscaler +and the pod rescheduling event. + +1. During the cluster deployment, in the **Nodes Config** section, choose a large-sized instance type. For example, you + can select the worker pool instance size as **t3.2xlarge** (8 vCPUs, 32 GB RAM) or higher. + +2. Once the cluster is deployed, go to the **Nodes** tab in the cluster details page in Palette. Observe the count and + size of nodes. The snapshot below displays one node of the type **t3.2xlarge** in the cluster's worker pool. + + ![A snapshot displaying one node of the type **t3.2xlarge** in the worker pool.](/integrations_aws-cluster-autoscaler_one-node.webp) + +3. Manually reduce the instance size in the worker pool configuration to **t3.medium** (2 vCPUs, 8 GB RAM). The snapshot + below shows how to change the instance size in the node pool configuration. + + ![A snapshot displaying how to edit node pool configuration.](/integrations_aws-cluster-autoscaler_edit-node.webp) + +4. Wait a few minutes for the new nodes to be provisioned. Reducing the node size will make the Cluster Autoscaler shut + down the large node and provision smaller-sized nodes with enough capacity to accommodate the current workload. Note + that the new node count will be within the minimum and maximum limits specified in the worker pool configuration + wizard. + + The snapshot below displays the newly created **t3.medium** nodes. These two smaller-sized nodes will efficiently + manage the same workload as the single larger-sized node. + + ![A snapshot displaying new nodes of the size **t3.medium** spin up automatically, *collectively* providing enough capacity to accommodate the current workload. ](/integrations_aws-cluster-autoscaler_two-nodes.webp) + + + + + +:::warning + +All versions less than version 1.22.x are considered deprecated. Upgrade to a newer version to take advantage of new +features. + +::: + + + + + +## Troubleshooting + +### Scenario - Quota Limits Exceeded + +You may observe the `LimitExceeded: Cannot exceed quota for PoliciesPerRole:10` error in the cluster deployment logs. +This may happen because the default IAM role that Palette creates for the node group already has 10 policies attached, +and you are trying to attach one more. By default, your AWS account will have a quota of 10 managed policies per IAM +role. The workaround is to follow the instructions in the +[IAM object quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entities) +guide to request a quota increase. + +### Scenario - IAM Authenticator not Found + +You may encounter an `executable aws-iam-authenticator not found` error in your terminal when attempting to access your +EKS cluster from your local machine. This may happen due to the +[aws-iam-authenticator](https://github.com/kubernetes-sigs/aws-iam-authenticator) plugin missing from your local +environment. The workaround is to install the IAM Authenticator. Refer to the +[IAM Authenticator](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html) install guide +for more information. + +## Terraform + +You can reference the AWS Cluster Autoscaler pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "aws-cluster-autoscaler" { + name = "aws-cluster-autoscaler" + version = "1.29.2" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Cluster Autoscaler on AWS](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) + +- [Amazon EKS Autoscaling](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html) + +- [AWS IAM Authenticator Plugin](https://github.com/kubernetes-sigs/aws-iam-authenticator) diff --git a/docs/docs-content/integrations/aws-ebs.md b/docs/deprecated/integrations/aws-ebs.md similarity index 100% rename from docs/docs-content/integrations/aws-ebs.md rename to docs/deprecated/integrations/aws-ebs.md diff --git a/docs/docs-content/integrations/aws-efs.md b/docs/deprecated/integrations/aws-efs.md similarity index 100% rename from docs/docs-content/integrations/aws-efs.md rename to docs/deprecated/integrations/aws-efs.md diff --git a/docs/docs-content/integrations/azure-cni.md b/docs/deprecated/integrations/azure-cni.md similarity index 100% rename from docs/docs-content/integrations/azure-cni.md rename to docs/deprecated/integrations/azure-cni.md diff --git a/docs/docs-content/integrations/azure-disk.md b/docs/deprecated/integrations/azure-disk.md similarity index 100% rename from docs/docs-content/integrations/azure-disk.md rename to docs/deprecated/integrations/azure-disk.md diff --git a/docs/docs-content/integrations/byoos.md b/docs/deprecated/integrations/byoos.md similarity index 100% rename from docs/docs-content/integrations/byoos.md rename to docs/deprecated/integrations/byoos.md diff --git a/docs/docs-content/integrations/calico.md b/docs/deprecated/integrations/calico.md similarity index 100% rename from docs/docs-content/integrations/calico.md rename to docs/deprecated/integrations/calico.md diff --git a/docs/docs-content/integrations/centos.md b/docs/deprecated/integrations/centos.md similarity index 100% rename from docs/docs-content/integrations/centos.md rename to docs/deprecated/integrations/centos.md diff --git a/docs/docs-content/integrations/certmanager.md b/docs/deprecated/integrations/certmanager.md similarity index 100% rename from docs/docs-content/integrations/certmanager.md rename to docs/deprecated/integrations/certmanager.md diff --git a/docs/deprecated/integrations/cilium-tetragon.md b/docs/deprecated/integrations/cilium-tetragon.md new file mode 100644 index 0000000000..e70e033c73 --- /dev/null +++ b/docs/deprecated/integrations/cilium-tetragon.md @@ -0,0 +1,38 @@ +--- +sidebar_label: "Cilium-Tetragon" +title: "Cilium-Tetragon" +description: "Cilium Tetragon monitoring pack for Spectro Cloud Palette" +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/tetragon/blobs/sha256:4b14874658de77afc1c966119c156f5a0c28477debc7cb1276f9e1fb63ba9cae?type=image.webp" +tags: ["packs", "cilium-tetragon", "monitoring"] +--- + +[Tetragon](https://github.com/cilium/tetragon) is an eBPF based security observability and runtime enforcement. eBPF is +used to safely and efficiently extend the kernel's capabilities without requiring changing the kernel source code or +loading kernel modules. Tetragon is a Cilium community open-source project that enables profound visibility with +filtering and aggregation with the eBPF collector support to deliver visibility at depth with minimal overhead. + +Palette supports Cilium Tetragon as an add-on pack for monitoring services. Refer to the +[Create an Add-on Profile](../profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/create-addon-profile.md) +guide for more information on how to use an add-on pack. + +## Versions Supported + + + + + +**0.8.** + + + + + +## References + +- [Tetragon GitHub](https://github.com/cilium/tetragon) + +- [Tetragon Documentation](https://tetragon.cilium.io/docs) diff --git a/docs/docs-content/integrations/cilium.md b/docs/deprecated/integrations/cilium.md similarity index 100% rename from docs/docs-content/integrations/cilium.md rename to docs/deprecated/integrations/cilium.md diff --git a/docs/docs-content/integrations/citrix-ipam.md b/docs/deprecated/integrations/citrix-ipam.md similarity index 100% rename from docs/docs-content/integrations/citrix-ipam.md rename to docs/deprecated/integrations/citrix-ipam.md diff --git a/docs/deprecated/integrations/cloudanix.md b/docs/deprecated/integrations/cloudanix.md new file mode 100644 index 0000000000..2d175d66ec --- /dev/null +++ b/docs/deprecated/integrations/cloudanix.md @@ -0,0 +1,131 @@ +--- +sidebar_label: "Cloudanix" +title: "Cloudanix" +description: + "The Cloudanix security pack provides a dashboard that displays threats and unusual behavior in Kubernetes containers + in Palette" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://cloudanix-assets.s3.amazonaws.com/static/cloudanix-logo-p.png" +tags: ["packs", "cloudanix", "security"] +--- + +The Cloudanix pack is an add-on security pack that provides a dashboard to help you detect threats and unusual behavior +in your Kubernetes clusters. Cloudanix detects the following. + +- Files added or modified in sensitive directories + +- SSH into a container + +- Modifications to shell configuration files + +- Attempts to read sensitive files that contain credential information + +- Crypto mining + +The Cloudanix dashboard provides an interactive interface that displays the mapping between threat events and associated +container, pod, and node workloads. Additionally, Cloudanix identifies the user who initiated an activity identified as +a threat and the command that was used. + +You can also start Jira workflows and target specific workloads from the Cloudanix dashboard. + +## Versions Supported + + + + + +## Prerequisites + +- CPUs: 0.5 +- Memory: 256 MiB +- Kubernetes 1.19.x to 1.25.x +- Kernel version 4.5 and higher + +## Parameters + +The Cloudanix pack has the following parameters, which are auto-filled based on Palette user information. + +| Name | Description | +| ------------------- | -------------------------------------------------------------------------- | +| `userEmail` | The email address of the user who created the cluster and cluster profile. | +| `partnerIdentifier` | A Cloudanix unique identifier for Spectro Cloud. | +| `organizationId` | The organization tenant ID in Palette. | +| `userName` | Palette user name. | +| `accountName` | Palette cloud account name. | +| `accountType` | Cloud account type such as AWS or GCP, Azure, or others. | +| `accountId` | The user's cloud account ID. | +| `clusterName` | The name of the cluster. | +| `clusterIdentifier` | The cluster's unique identifier. | +| `clusterDomain` | The Palette cloud account type such as AWS, GCP, Azure, or others. | + +## Usage + +This Helm Chart installs four Cloudanix services to enable container security capabilities: + +
+ +- **config-cron**: A job that runs periodically in a Kubernetes cluster to maintain the configuration of Cloudanix + inventory and threat services. +- **misconfig-cron**: A job that captures Kubernetes misconfigurations and displays them on the Cloudanix dashboard. +- **inventory-service**: An inventory service that detects any new Kubernetes resources and displays them on the + Cloudanix dashboard. +- **threat-service**: A threat service that exports threat events and affected Kubernetes resources, which are visible + on the Cloudanix dashboard. + +From the **Workloads** page, click the **Risks** tab to view a list of failed threat rules. You can exclude resources, +such as pods and containers, from the risk findings. + +
+ +### Kubernetes 1.25 and higher + +When you use the Cloudanix 1.0.x pack with Kubernetes 1.25 and higher, you need to add the **Spectro Namespace Labeler** +add-on pack to your cluster profile. After you create the cluster profile, you then apply it to your cluster. + +Use the following information to find the **Spectro Namespace Labeler** add-on pack. + +- **Pack Type**: System App +- **Registry**: Public Repo +- **Pack Name**: Spectro Namespace Labeler +- **Pack Version**: 1.0.x or higher + +Below is the YAML file for the **Spectro Namespace Labeler** add-on pack. No action is required.
+ +```yaml +pack: +namespace: cluster-{{ .spectro.system.cluster.uid }} + +charts: + spectro-namespace-labeler: + namespace: cluster-{{ .spectro.system.cluster.uid }} + + labels: + cloudanix: pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v1.26 +``` + +As a final step, apply the cluster profile to your cluster. + +
+
+ +## Terraform + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "cloudanix" { + name = "cloudanix" + version = "0.0.6" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Cloudanix Documentation](https://www.cloudanix.com/docs/introduction) diff --git a/docs/docs-content/integrations/collectord.md b/docs/deprecated/integrations/collectord.md similarity index 100% rename from docs/docs-content/integrations/collectord.md rename to docs/deprecated/integrations/collectord.md diff --git a/docs/deprecated/integrations/dex.md b/docs/deprecated/integrations/dex.md new file mode 100644 index 0000000000..6b96370670 --- /dev/null +++ b/docs/deprecated/integrations/dex.md @@ -0,0 +1,87 @@ +--- +sidebar_label: "Dex" +title: "Dex" +description: "Dex Authentication pack in Spectro Cloud" +type: "integration" +hide_table_of_contents: true +category: ["authentication", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/dex/blobs/sha256:78e381fe12509ed94c7c19cd6f6fc4e896ec66485364644dc1a40229fcf9d90d?type=image.webp" +tags: ["packs", "dex", "security"] +--- + +Dex is an identity service to drive authentication for Kubernetes API Server through the +[OpenID Connect](https://openid.net/connect/) plugin. Clients such as kubectl can act on behalf of users who can log in +to the cluster through any identity provider that dex supports. + +## Versions Supported + + + + + +- **2.35.1** + + + + + +- **2.30.0** + + + + + +- **2.28.0** + + + + + +- **2.25.0** + + + + + +- **2.21.0** + + + + +## Components + +Dex integration in Spectro Cloud will deploy the following components: + +- Dex. +- Dex Client (dex-k8s-authenticator). + +The integration will create self-signed certificates, will cross-configure Dex, Dex Client components & will set +appropriate flags on the Kubernetes API Server. + +## Ingress + +Follow below steps to configure Ingress on Dex + +1. Change Dex serviceType from "LoadBalancer" to "ClusterIP" (line #112) +2. Ingress (line #118) + - Enable Ingress; Change enabled from false to "true" + - Set Ingress rules like annotations, path, hosts, etc. + +Follow below steps to configure Ingress on Dex Client + +1. Change dex-k8s-authenticator serviceType from "LoadBalancer" to "ClusterIP" (line #312) +2. Ingress (line #320) + - Enable Ingress; Change enabled from false to "true" + - Set Ingress rules like annotations, path, hosts, etc. + +With these config changes, you can access Dex, Dex Client service(s) on the Ingress Controller LoadBalancer hostname / +IP + +## References + +- [Dex](https://github.com/dexidp/dex) + +- [Dex Documentation](https://dexidp.io/docs) + +- [Dex K8s Authenticator](https://github.com/mintel/dex-k8s-authenticator) diff --git a/docs/deprecated/integrations/external-dns.md b/docs/deprecated/integrations/external-dns.md new file mode 100644 index 0000000000..e4f0ee19e1 --- /dev/null +++ b/docs/deprecated/integrations/external-dns.md @@ -0,0 +1,166 @@ +--- +sidebar_label: "ExternalDNS" +title: "External DNS" +description: "ExternalDNS pack in Spectro Cloud" +type: "integration" +hide_table_of_contents: true +category: ["load balancers", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/external-dns/blobs/sha256:1bfd6dceb0b50efee4068cd6321511f6b24be86e2d613e0a8206e716ba7aea3f?type=image.webp" +tags: ["packs", "external-dns", "network"] +--- + +The integration helps configure public DNS servers with information about Kubernetes services to make them discoverable. + +## Prerequisites + +Providers have to be set up for this pack to get deployed and work seamlessly. For a list of supported providers and the +prerequisites to be set up, visit [providers](https://github.com/kubernetes-sigs/external-dns#status-of-providers) +section + +## Versions Supported + + + + + +- **0.13.1** +- **0.12.2** + + + + +- **0.7.2** + + + + + +## Components + +Integration deploys the following components: + +- External DNS + +## ExternalDNS for Services on AWS Route53 Example + +### Setup prerequisites for AWS Route53 + +- Create the following IAM policy in the AWS account. This is needed for externalDNS to list and create Route53 + resources. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": ["route53:ChangeResourceRecordSets"], + "Resource": ["arn:aws:route53:::hostedzone/*"] + }, + { + "Effect": "Allow", + "Action": ["route53:ListHostedZones", "route53:ListResourceRecordSets"], + "Resource": ["*"] + } + ] +} +``` + +- Create an IAM role and associate the policy created above. Make a note of the role ARN which will be used in + ExternalDNS deployment later +- Setup hosted zone in AWS Route53 + ```bash + # Create a DNS zone through AWS CLI + aws route53 create-hosted-zone --name "external-dns-test.my-org.com." --caller-reference "external-dns-test-$(date +%s)" + ``` + +### Deploy ExternalDNS on the cluster + +- Add ExternalDNS pack to the desired profile and deploy it to the cluster. You may want to configure the following in + pack values.yaml + + - Configure AWS provider details (line #86) + + - Credentials, Zone Type + - AssumeRoleArn with the Role ARN created above + + - Configure txtOwnerId with the ID of the hosted zone created above (line #366) + ```bash + aws route53 list-hosted-zones-by-name --output json --dns-name "external-dns-test.my-org.com." | jq -r '.HostedZones[0].Id' + ``` + - Optionally change externalDNS policy and logLevel + +### Deploy Ingress Controller on the cluster + +- Deploy one of the Ingress Controller on the cluster + +### Deploy Applications with Ingress on the cluster + +- Add Prometheus-Operator addon to the same profile where ExternalDNS is added + + - Change serviceType to ClusterIP (line #408) + - Enable Ingress for the add-on packs. In this example, let us use Prometheus-Operator integration. Ingress config for + Grafana will look like the following: + + ```yaml + #Ingress config + ingress: + ## If true, Grafana Ingress will be created + ## + enabled: true + + hosts: + - grafana.external-dns-test.my-org.com + + ## Path for grafana ingress + path: / + ``` + + When Prometheus-Operator gets deployed in the Cluster, Ingress resource for Grafana will also get created and will + look like + + ```yaml + apiVersion: extensions/v1beta1 + kind: Ingress + metadata: + name: grafana-ingress + namespace: monitoring + spec: + rules: + - host: grafana.external-dns-test.my-org.com + http: + paths: + - backend: + serviceName: grafana + servicePort: 80 + path: / + status: + loadBalancer: + ingress: + - hostname: a9a2eadb64c8e4c2fb37a1f69afb0a30-330939473.us-west-2.elb.amazonaws.com + ``` + +### Verify ExternalDNS (Ingress example) + +- If all goes well, after 2 minutes, ExternalDNS would have inserted 2 records on your hosted zone + + ```bash + aws route53 list-resource-record-sets --output json --hosted-zone-id "/hostedzone/ZEWFWZ4R16P7IB" \ + --query "ResourceRecordSets[?Name == 'grafana.external-dns-test.my-org.com.']|[?Type == 'A']" + ``` + +- After which, if you access http://grafana.external-dns-test.my-org.com on your browser, you will be able to view the + Grafana login page + +### Troubleshooting + +- Make sure Ingress resource gets created for the Applications deployed and a LoadBalancer hostname / IP address is set + on the Ingress resource +- Check the `external-dns` pod for any issues with ExternalDNS not inserting records. If required, change `logLevel` to + debug to see additional info on the logs + +## References + +- [External DNS Home](https://github.com/kubernetes-sigs/external-dns) +- [External DNS Helm Chart](https://github.com/bitnami/charts/tree/master/bitnami/external-dns) diff --git a/docs/deprecated/integrations/external-secrets-operator.md b/docs/deprecated/integrations/external-secrets-operator.md new file mode 100644 index 0000000000..ca263a2dd4 --- /dev/null +++ b/docs/deprecated/integrations/external-secrets-operator.md @@ -0,0 +1,102 @@ +--- +sidebar_label: "external-secrets-operator" +title: "External Secrets Operator" +description: "external-secrets-operator pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["authentication", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/external-secrets-operator/blobs/sha256:ee6f7f347d381852582f688c70b2564b0a346c2b2ed1221310889075a4453c6d?type=image.webp" +tags: ["packs", "external-secrets-operator", "security"] +--- + +External Secrets Operator (ESO) is a Kubernetes operator that integrates external secret management systems like AWS +Secrets Manager, HashiCorp Vault, Google Secrets Manager, or Azure Key Vault. The operator reads information from +external APIs and automatically injects the values into a Kubernetes Secret. + +You can use the External-Secrets-Operator Add-on pack as an authenticator in Palette. + +:::info + +Starting from Palette version 3.1, Palette no longer supports upgrades to Kubernetes External Secrets since this is +reaching end of life. Migrate or switch to using External Secrets operator instead. + +::: + +## Versions Supported + + + + + +- **0.7.1** +- **0.6.0** + + + + + +- **0.5.6** + + + + +### Sample SecretStore + +
+ +```yml +apiVersion: [external-secrets.io/v1beta1](http://external-secrets.io/v1beta1) +kind: ExternalSecret +metadata: + name: vault-example # Custom name +spec: + refreshInterval: "15s" + secretStoreRef: + name: vault-backend # Custom value + kind: SecretStore + target: + name: mysecretfoobar + data: + - secretKey: foobar + remoteRef: + key: secret/foo # custom value + property: my-value # custom value + +``` + +### Sample ExternalSecret YAML file + +
+ +```yml +apiVersion: external-secrets.io/v1beta1 +kind: SecretStore +metadata: + name: custom-name +spec: + provider: + vault: + server: "http://12.34.567.133:0000" # custom server end point + path: "secret" # custom path + version: "v2" # custom version + auth: + # points to a secret that contains a vault token + # https://www.vaultproject.io/docs/auth/token + tokenSecretRef: + name: "vault-token1" # Custom name and key + key: "token1" +--- +apiVersion: v1 +kind: Secret +metadata: + name: vault-token1 +data: + token: cm9vdA== # "root" # custome value +``` + +## References + +- [Amazon IAM-Policy-Examples-ASM-Secrets](https://docs.aws.amazon.com/mediaconnect/latest/ug/iam-policy-examples-asm-secrets.html) + +- [External Secrets](https://github.com/external-secrets/external-secrets) diff --git a/docs/deprecated/integrations/falco.md b/docs/deprecated/integrations/falco.md new file mode 100644 index 0000000000..15787d9a98 --- /dev/null +++ b/docs/deprecated/integrations/falco.md @@ -0,0 +1,42 @@ +--- +sidebar_label: "Falco" +title: "Falco" +description: "Integration of the Falco add on into Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/falco/blobs/sha256:4e37461d0a31959ca8af65128329750ca3417e883e7e4ba17ee085b01a383a27?type=image.webp" +tags: ["packs", "falco", "security"] +--- + +Falco integration is a behavioral activity monitor designed to detect anomalous activity in your applications. You can +use Falco to monitor the run-time security of your Kubernetes applications and internal components. + +## Versions Supported + + + + + +- **1.16.3** + + + + +- **1.0.11** +- **1.0.10** + + + + + +- **1.13.1** + + + + + +## References + +- [Falco Helm Chart GitHub](https://github.com/falcosecurity/charts/tree/master/charts/falco) diff --git a/docs/docs-content/integrations/flannel-cni.md b/docs/deprecated/integrations/flannel-cni.md similarity index 100% rename from docs/docs-content/integrations/flannel-cni.md rename to docs/deprecated/integrations/flannel-cni.md diff --git a/docs/docs-content/integrations/fluentbit.md b/docs/deprecated/integrations/fluentbit.md similarity index 100% rename from docs/docs-content/integrations/fluentbit.md rename to docs/deprecated/integrations/fluentbit.md diff --git a/docs/docs-content/integrations/frp.md b/docs/deprecated/integrations/frp.md similarity index 100% rename from docs/docs-content/integrations/frp.md rename to docs/deprecated/integrations/frp.md diff --git a/docs/docs-content/integrations/gce.md b/docs/deprecated/integrations/gce.md similarity index 100% rename from docs/docs-content/integrations/gce.md rename to docs/deprecated/integrations/gce.md diff --git a/docs/deprecated/integrations/generic-vm-libvirt.md b/docs/deprecated/integrations/generic-vm-libvirt.md new file mode 100644 index 0000000000..2f8a63d580 --- /dev/null +++ b/docs/deprecated/integrations/generic-vm-libvirt.md @@ -0,0 +1,321 @@ +--- +sidebar_label: "generic-vm-libvirt" +title: "Generic Virtual Machines Libvirt" +description: "Choosing Libvirt Generic Virtual Machine within the Palette console" +hide_table_of_contents: true +type: "integration" +category: ["system app", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/generic-vm-libvirt/blobs/sha256:23e1ba27947158ccf1ae36913601011508a55103ce1bdb517a175d752fb35eea?type=image.webp" +tags: ["packs", "generic-vm-libvirt", "system app"] +--- + +Generic-VM-Libvirt is a Palette Add-on pack used to simplify deploying the virtual machine applications from a cluster +profile or a system profile. Generic-VM-Libvirt extracts all Terraform constructs inside the pack and exposes nothing +but the values. Users will then have the ability to modify the add-on pack for the different applications. + +## Version Supported + + + + +- **1.0.2** +- **1.0.0** + + + + +
+ +## Configuring Palette Generic VM Libvirt Add-on + +To configure the Generic-VM-Libvirt add-on pack for the application cluster, begin by editing the manifest namespace +value. + +`cluster-{{ .spectro.system.cluster.uid }}` + +**Example** + +```yaml +namespace: jet-system +``` + +If multiple instances of this pack have to be deployed on the cluster for different virtual machine applications, then +modify '`spectrocloud.com/display-name`' and '`releaseNameOverride`' with distinctive names to make it unique across all +the packs in the cluster. + +
+ +```yaml +spectrocloud.com/display-name: vm-app-1 +releaseNameOverride: +``` + +
+ +## Generic-VM-Libvirt Pack Manifest + +
+ +```yaml +pack: + # for app cluster, namespace value should be "cluster-{{ .spectro.system.cluster.uid }}" + namespace: jet-system + + # if multiple instance of this pack has to be deployed on the cluster for different vm applications + # then modify 'spectrocloud.com/display-name' and 'releaseNameOverride' with unique names to make it + # unique across all the packs in the cluster + # spectrocloud.com/display-name: vm-app-1 + # releaseNameOverride: + # generic-vm-libvirt: vm-app-1 + +charts: + generic-vm-libvirt: + providers: + source: "dmacvicar/libvirt" + version: "0.6.14" + name: vm-app-1 + image: https://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img + + # uncomment the below line and comment the above line if the image is present within the host. + # image="/opt/spectrocloud/ubuntu-16.04-server-cloudimg-amd64-disk1.img" + hardware: + cpu: 2 + memory: 6 #in GB + network: ["br-int"] + rootDisk: + size: 50 #in GB + pool: ehl_images + dataDisks: + - size: 20 #in GB + pool: ehl_data + persisted: true + - size: 25 #in GB + pool: ehl_data + persisted: true + cloudInit: + userData: | + #cloud-config + # vim: syntax=yaml + # Note: Content strings here are truncated for example purposes. + ssh_pwauth: true + chpasswd: + list: + - ubuntu:welcome + expire: false + metaData: | + networkConfig: | + version: 2 + ethernets: + ens3: + dhcp4: true + + # preExecCmd & postExecCmd gets executed in each reconcile loop which runs at an interval of ~2 mins + # If you want to run some command or script only whenever VM is getting creating or after VM is destroyed + # then you can use 'preVMInitCmd' and 'postVMInitCmd' respectively + # preExecCmd: "bash /var/files/pre-exec.sh" + # postExecCmd: "bash /var/files/pre-exec.sh" + + # preVMInitCmd & postVMInitCmd gets executed only when VM is being created/recreated and after VM is created/recreated respectively + preVMInitCmd: "" + postVMInitCmd: "" + + # For first time deployment, preVMDestroyCmd won't be invoked. If there is any change in cloud-init then vm resource will get recreated, + # and 'preVMDestroyCmd' will be invoked before deleting VM and once preVMDestroyCmd gets executed successfully, then only VM resource will be deleted. + # Once VM is deleted then before another VM is created, preVMInitCmd will be invoked + + # preVMDestroyCmd can also be uded to ssh into vm or call the rest api for the application running inside vm before vm is terminated + # or to download the file and use it later once new vm is provisioned + preVMDestroyCmd: "" + + # extraDomainHclConfig: | + # cpu { + # mode = "host-passthrough" + # } + + # mounts section can be used to mount data inside existing config maps or secrets into the pod as files where pre and post + # hooks are executed + # so that data present in config map or secret can be accessed while executing pre and post exec hooks + mounts: + configMap: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 + secret: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 + + # envs section can be used to inject data inside existing config maps or secrets into the pod as env variables + # where pre and post hooks are executed + # so that data present in config map or secret can be accessed while executing pre and post exec hooks + envs: + configMap: + # - name: database-app-config + # env: DATABASE_USER + # dataKey: "db.user" + secret: + # - name: database-app-secret + # env: DATABASE_PASSWORD + # dataKey: "db.password" + + # files present in below section will be added to the pod and will be accessible while executing + # pre and post exec hooks and absolute file path would be '/var/files/' + files: + # - name: pre-exec.sh + # content: | + # #!/bin/bash + # echo "I am pre exec" + # - name: post-exec.sh + # content: | + # #!/bin/bash + # echo "I am post exec" +``` + +## Virtual Machine Hooks + +The Generic-VM-Libvirt pack supports various hooks, while deploying VM applications and supports multiple use-cases of +customizing workflow, as customers require. + +
+ +## Using preExecCmd and postExecCmd + +The **preExecCmd** and **postExecCmd** commands will be executed in every pod reconciliation. The loop runs at +approximately a 2-minute interval. + +If you want to run the command or script only, whenever the virtual machine is getting created or after the virtual +machine is destroyed, use **preVMInitCmd** and **postVMInitCmd**, respectively. + +
+ +```yaml +preExecCmd: "bash /var/files/pre-exec.sh" +``` + +```yaml +postExecCmd: "bash /var/files/pre-exec.sh" +``` + +
+ +## Using preVMInitCmd and postVMInitCmd + +The **preVMInitCmd** command is executed, only when the virtual machine is being created or recreated. Likewise, the +**postVMInitCmd** command is executed only after the virtual machine is created or recreated. + +**Note**: These commands will not be executed in each reconciliation. + +
+ +```yaml +preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" +``` + +```yaml +postVMInitCmd: "echo 'Ooho! VM is created.'" +``` + +
+ +## Using preVMDestroyCmd + +Any command or script provided in this virtual machine hook will execute before the VM gets destroyed. It will be +executed only when the VM is being deleted. A virtual machine deletion can happen for any reason, like changing anything +in cloud-init or removing the pack from the profile. + +
+ +```yaml +preVMDestroyCmd: "" +``` + +
+ +:::info + +During a first-time deployment, preVMDestroyCmd will not be invoked. However, if there is any change in +cloud-init, then the VM resource will be recreated, preVMDestroyCmd will be invoked before deleting the VM, and once +preVMDestroyCmd is executed successfully, only then will the VM resource be deleted. + +
+
+Once the virtual machine is deleted and before another virtual machine is created, preVMInitCmd will be invoked. + +::: + +
+ +## Files + +Files presented in this section will be added to the pod, where the pre-and-post exec hooks are executed. + +
+ +```yaml +files: + - name: pre-exec.sh + content: | + #!/bin/bash + echo "I am pre exec" + - name: post-exec.sh + content: | + #!/bin/bash + echo "I am post exec" +extraDomainHclConfig: | + cpu { + mode = "host-passthrough" + } +``` + +
+ +## Mounts + +Mount the data inside the existing configuration maps or secrets into the pod as files, where pre-and-post hooks are +executed. This allows the data present in the configuration map or the secrets file to be accessible while running +pre-and-post exec hooks. + +
+ +```yaml +mounts: + configMap: + - name: system-config + path: /data/system-config + - name: system-config-2 + path: /data/system-config-2 + secret: + - name: system-config + path: /data/system-config + - name: system-config-2 + path: /data/system-config-2 +``` + +
+ +## Environment Variables + +The ENVS section can inject data inside the existing config maps or secrets into the pod as environment variables, where +pre-and post-hooks are executed so that data present in the config map or the secret file can be accessed while running +pre-and-post exec hooks. + +
+ +```yaml +envs: + configMap: + - name: database-app-config + env: DATABASE_USER + dataKey: "db.user" + secret: + - name: database-app-secret + env: DATABASE_PASSWORD + dataKey: "db.password" +``` + +## References + +- [Libvirt Apps](https://libvirt.org/apps.html) diff --git a/docs/deprecated/integrations/generic-vm-vsphere.md b/docs/deprecated/integrations/generic-vm-vsphere.md new file mode 100644 index 0000000000..2fae567fda --- /dev/null +++ b/docs/deprecated/integrations/generic-vm-vsphere.md @@ -0,0 +1,351 @@ +--- +sidebar_label: "generic-vm-vsphere" +title: "Generic Virtual Machine vSphere" +description: "Choosing vSphere Generic Virtual Machine within the Palette console" +hide_table_of_contents: true +type: "integration" +category: ["system app", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/generic-vm-vsphere/blobs/sha256:3b121dca3cbc7fed0153d3e1c8c3df20076ec200e091085a3a281ba08cb2261e?type=image.webp" +tags: ["packs", "generic-vm-vsphere", "system app"] +--- + +Generic-VM-vSphere is a Palette Add-on pack used to simplify deploying the virtual machine resource from a cluster +profile or a system profile. Generic-VM-vSphere extracts all Terraform constructs inside the pack and exposes nothing +but the values. Users will then have the ability to modify the add-on pack for the different applications. + +
+ +## Version Supported + + + + +- **1.0.4** +- **1.0.0** + + + + +
+ +## Configuring Generic-VM-vSphere + +To configure the Generic-VM-vSphere Add-on pack for the application cluster, the namespace value should be as follows: + +`cluster-{{ .spectro.system.cluster.uid }}`
+ +```yaml +namespace: cluster-{{ .spectro.system.cluster.uid }} +``` + +If multiple instances of this pack has to be deployed on the cluster for different virtual machine applications, then +modify '`spectrocloud.com/display-name`' and '`releaseNameOverride`' with different names to make it unique across all +the packs in the cluster. + +
+ +```yaml +spectrocloud.com/display-name: vm-app-1 +releaseNameOverride: +``` + +
+
+ +## Generic-VM-vSphere Pack Manifest + +
+ +```yaml +pack: + # for app cluster, namespace value should be "cluster-{{ .spectro.system.cluster.uid }}" + namespace: jet-system + + # if multiple instance of this pack has to be deployed on the cluster for different vm applications + # then modify 'spectrocloud.com/display-name' and 'releaseNameOverride' with unique names to make it + # unique across all the packs in the cluster + # spectrocloud.com/display-name: vm-app-1 + # releaseNameOverride: + # generic-vm-vsphere: vm-app-1 + +charts: + generic-vm-vsphere: + providers: + source: "hashicorp/vsphere" + version: "2.2.0" + name: vm-app-1 + hardware: + cpu: 2 + memory: 6 #in GB + dataDisks: + - size: 20 #in GB + - size: 25 #in GB + + # To use an image from a remote url please uncomment the below lines and comment out the vmTemplate section. + # ovaTemplate: + # remote_ovf_url: "https://192.168.100.12:8443/artifactory/generic-eis-all/ehl-guest/sles-154-cloud-kube-v1.21.10-20220718141926-014.ova" + # name: system-cluster-ova + # network: + # - name: "VM Network" + # value: "VLAN-909" + # disk: + # size: 40 + vmTemplate: "spectro-templates/ubuntu-focal-20.04-cloudimg-20220207" + guestId: "ubuntu64Guest" #ubuntu64Guest for ubuntu, sles15_64Guest for sles etc + scsiType: "lsilogic" + + cloudInit: + # cloud init properties can be injected in vsphere via guest extra config (guestExtraConfig) or via vapp properties (vAppProperties) + # if cloud init type is vAppProperties then add data in vAppProperties: section and leave guestExtraConfig commented + # else if cloud init type is guestExtraConfig then add data in guestExtraConfig: section and leave vAppProperties commented + type: guestExtraConfig # valid values is one of ["vAppProperties" or "guestExtraConfig"] + userData: | + #cloud-config + # vim: syntax=yaml + # Note: Content strings here are truncated for example purposes. + ssh_pwauth: true + chpasswd: + list: + - ubuntu:welcome + expire: false + metaData: | + + networkConfig: | + version: 2 + ethernets: + ens3: + dhcp4: true + + guestExtraConfig: + "guestinfo.network_config": base64encode(data.template_file.network_config.rendered) + "guestinfo.network_config.encoding": "base64" + "guestinfo.userdata": base64encode(data.template_file.user_data.rendered) + "guestinfo.userdata.encoding": "base64" + + vAppProperties: + #instance-id: vm-app-1 + #hostname: vm-app-1 + #public-keys: "ssh-rsa AAAAB3....NGJwwlOmNrw== spectro@spectro" + #password: abcde12345 + #user-data: data.template_file.user_data.rendered + + # 'extraVMHclConfig' can be used to provide extra configuration in the virtual machine and config should be provided in HCL + # format + # extraVMHclConfig: | + # cdrom { + # client_device = true + # } + + # preExecCmd & postExecCmd gets executed in each reconcile loop which runs at an interval of ~2 mins + # If you want to run some command or script only whenever VM is getting creating or after VM is destroyed + # then you can use 'preVMInitCmd' and 'postVMInitCmd' respectively + # preExecCmd: "bash /var/files/pre-exec.sh" + # postExecCmd: "bash /var/files/pre-exec.sh" + + # preVMInitCmd & postVMInitCmd gets executed only when VM is being created/recreated and after VM is created/recreated respectively + preVMInitCmd: "" + postVMInitCmd: "" + + # For first time deployment, preVMDestroyCmd won't be invoked. If there is any change in cloud-init then vm resource will get recreated, + # and 'preVMDestroyCmd' will be invoked before deleting VM and once preVMDestroyCmd gets executed successfully, then only VM resource will be deleted. + # Once VM is deleted then before another VM is created, preVMInitCmd will be invoked + + # preVMDestroyCmd can also be used to ssh into vm or call the rest api for the application running inside vm before vm is terminated + # or to download the file and use it later once new vm is provisioned + preVMDestroyCmd: "" + + # mounts section can be used to mount data inside existing config maps or secrets into the pod as files where pre and post + # hooks are executed + # so that data present in config map or secret can be accessed while executing pre and post exec hooks + mounts: + configMap: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 + secret: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 + + # envs section can be used to inject data inside existing config maps or secrets into the pod as env variables + # where pre and post hooks are executed + # so that data present in config map or secret can be accessed while executing pre and post exec hooks + envs: + configMap: + # - name: database-app-config + # env: DATABASE_USER + # dataKey: "db.user" + secret: + # - name: database-app-secret + # env: DATABASE_PASSWORD + # dataKey: "db.password" + + # files present in below section will be added to the pod and will be accessible while executing + # pre and post exec hooks and absolute file path would be '/var/files/' + files: + # - name: pre-exec.sh + # content: | + # #!/bin/bash + # echo "I am pre exec" + # - name: post-exec.sh + # content: | + # #!/bin/bash + # echo "I am post exec" +``` + +## Virtual Machine Hooks + +The Generic-VM-vSphere pack supports various hooks while deploying VM applications and supports multiple use-cases of +customizing workflow, as customers require. + +
+ +## Using extraVMHclConfig + +The extraVMHclConfig command can be used to provide an extra configuration in the virtual machine and the configuration +file should be provided in HashiCorp Configuration Language (HCL) format. + +```terraform +# extraVMHclConfig: | +# cdrom { +# client_device = true +# } +``` + +## Using preExecCmd and postExecCmd + +The **preExecCmd** and **postExecCmd** commands will be executed in every pod reconciliation. The loop runs at +approximately a 2-minute interval. + +**preExecCMD** and **postVMInitCmd** are used to execute commands or scripts prior to virtual machine creation and after +virtual machine creation respectively. + +
+ +```yaml +preExecCmd: "bash /var/files/pre-exec.sh" +``` + +```yaml +postExecCmd: "bash /var/files/pre-exec.sh" +``` + +
+ +## Using preVMInitCmd and postVMInitCmd + +The **preVMInitCmd** command is executed, only when the virtual machine is being created or recreated. Likewise, the +**postVMInitCmd** command is executed only after the virtual machine is created or recreated. + +**Note**: These commands will not be executed in each reconciliation. + +
+ +```yaml +preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" +``` + +```yaml +postVMInitCmd: "echo 'Ooho! VM is created.'" +``` + +
+ +## Using preVMDestroyCmd + +Any command or script provided in this virtual machine hook will execute before the virtual machine is destroyed. It +will be executed only when the VM is getting deleted. A virtual machine deletion can happen for any reason, like +changing anything in cloud-init or removing the pack from the profile. + +
+ +```yaml +preVMDestroyCmd: "" +``` + +
+ +:::info + +During a first-time deployment, preVMDestroyCmd won't be invoked. However, if there is any change in cloud-init, +then the VM resource will be recreated, preVMDestroyCmd will be invoked before deleting the VM, and once preVMDestroyCmd +is executed successfully, only then the VM resource will be deleted. + +
+
+Once the VM is deleted and before another virtual machine is created, preVMInitCmd will be invoked. + +::: + +
+
+ +## Mounts + +Mount the data inside the existing configuration map or secret into the pod as files, where pre-and-post hooks are +executed. This allows the data present in the configuration map or the secrets file to be accessible while running +pre-and-post exec hooks. + +
+ +```yaml +mounts: + configMap: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 + secret: + # - name: system-config + # path: /data/system-config + # - name: system-config-2 + # path: /data/system-config-2 +``` + +
+ +## Environment Variables + +The ENVS section can inject data inside the existing config maps or secrets into the pod as environment variables, where +pre-and post-hooks are executed so that data present in the config map or the secret file can be accessed while running +pre-and-post exec hooks. + +
+ +```yaml +envs: + configMap: + # - name: database-app-config + # env: DATABASE_USER + # dataKey: "db.user" + secret: + # - name: database-app-secret + # env: DATABASE_PASSWORD + # dataKey: "db.password" +``` + +
+ +## Files + +Files present in this section will be added to the pod and will be accessible while executing pre-and-post execution +hooks and absolute file path would be '/var/files/\'. + +
+ +```yaml +files: +# - name: pre-exec.sh +# content: | +# #!/bin/bash +# echo "I am pre exec" +# - name: post-exec.sh +# content: | +# #!/bin/bash +# echo "I am post exec" +``` + +
diff --git a/docs/docs-content/integrations/grafana-spectrocloud-dashboards.md b/docs/deprecated/integrations/grafana-spectrocloud-dashboards.md similarity index 100% rename from docs/docs-content/integrations/grafana-spectrocloud-dashboards.md rename to docs/deprecated/integrations/grafana-spectrocloud-dashboards.md diff --git a/docs/docs-content/integrations/harbor-edge.md b/docs/deprecated/integrations/harbor-edge.md similarity index 100% rename from docs/docs-content/integrations/harbor-edge.md rename to docs/deprecated/integrations/harbor-edge.md diff --git a/docs/deprecated/integrations/heartbeat.md b/docs/deprecated/integrations/heartbeat.md new file mode 100644 index 0000000000..2c36159582 --- /dev/null +++ b/docs/deprecated/integrations/heartbeat.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "heart-beat" +title: "Heartbeat" +description: "Heart Beat monitoring pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/heartbeat/blobs/sha256:19fec69ae172c3e54d5fb09c176517cf7bfeb1bc740bde65c200e14115510313?type=image.webp" +tags: ["packs", "heart-beat", "monitoring"] +--- + +Heartbeat is a lightweight daemon installed to a remote server for periodically checking the status of the services and +determine whether they are currently available and reachable. Heartbeat is useful to verify that your service level +agreements are met during the service uptime. + +## Versions Supported + + + + + +**1.0.0** + + + + +## References + +- [Heartbeat Reference Documentation](https://www.elastic.co/guide/en/beats/heartbeat/current/index.html) diff --git a/docs/deprecated/integrations/hello-universe.md b/docs/deprecated/integrations/hello-universe.md new file mode 100644 index 0000000000..3b4684a7a0 --- /dev/null +++ b/docs/deprecated/integrations/hello-universe.md @@ -0,0 +1,179 @@ +--- +sidebar_label: "Hello Universe" +title: "Hello Universe" +description: "Learn about the Hello Universe pack and how you can use it within your Kubernetes clusters." +hide_table_of_contents: true +type: "integration" +category: ["app services", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://raw.githubusercontent.com/spectrocloud/pack-central/main/packs/hello-universe-1.1.1/logo.png" +tags: ["packs", "hello-universe", "app-services"] +--- + +[Hello Universe](https://github.com/spectrocloud/hello-universe) is a demo web application utilized to help users learn +more about [Palette](https://docs.spectrocloud.com/introduction) and its features. + +You can deploy it using two preset configurations: + +- A standalone front-end application. It provides a click counter that is saved locally and displays Spectro Cloud + themed images. +- A three-tier application with a front-end tier, API server, and PostgreSQL database. It provides a click counter that + is saved in the deployed database and displays Spectro Cloud themed images. You can read more about this configuration + on the Hello Universe + [README](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#reverse-proxy-with-kubernetes). + +:::info + +The three-tier application configuration is only supported by version 1.1.2 of the pack. + +::: + +## Versions Supported + + + + + +## Prerequisites + +- A Palette account. + +- A cluster profile where the Hello Universe pack can be integrated. + +- A Palette cluster with port `:8080` available. If port 8080 is not available, you can set a different port in the + **values.yaml** file. + +- If you are using the **Enable Hello Universe API** preset, you will need the `:3000` port available on your cluster + too. Check out the [Usage](#usage) section for further details. + +- Ensure sufficient CPU resources within the cluster to allocate a minimum of 500 milliCPU and a maximum of 500 milliCPU + per replica. + +## Parameters + +The following parameters are applied to the **hello-universe.yaml** manifest through the **values.yaml** file. Users do +not need to take any additional actions regarding these parameters. + +| **Parameter** | **Description** | **Default Value** | **Required** | +| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------------ | +| `manifests.namespace` | The namespace in which the application will be deployed. | `hello-universe` | Yes | +| `manifests.images.hellouniverse` | The [`hello-universe`](https://github.com/spectrocloud/hello-universe) application image that will be utilized to create the front-end containers. | `ghcr.io/spectrocloud/hello-universe:1.1.2`/ `ghcr.io/spectrocloud/hello-universe:1.1.2-proxy` | Yes | +| `manifests.images.hellouniverseapi` | The [`hello-universe-api`](https://github.com/spectrocloud/hello-universe-api) application image that will be utilized to create the API containers. | `ghcr.io/spectrocloud/hello-universe-api:1.0.12` | No | +| `manifests.images.hellouniversedb` | The [`hello-universe-db`](https://github.com/spectrocloud/hello-universe-db) application image that will be utilized to create the database containers. | `ghcr.io/spectrocloud/hello-universe-db:1.0.2` | No | +| `manifests.apiEnabled` | The flag that indicates whether to deploy the UI application as standalone or together with the API server. | `false` | Yes | +| `manifests.port` | The cluster port number on which the service will listen for incoming traffic. | `8080` | Yes | +| `manifests.replicas` | The number of Pods to be created. | `1` | Yes | +| `manifests.dbPassword` | The base64 encoded database password to connect to the API database. | `REPLACE_ME` | No | +| `manifests.authToken` | The base64 encoded auth token for the API connection. | `REPLACE_ME` | No | + +## Usage + +The Hello Universe pack has two presets that you can select: + +- **Disable Hello Universe API** configures Hello Universe as a standalone frontend application. This is the default + configuration of the pack. +- **Enable Hello Universe API** configures Hello Universe as a three-tier application with a frontend, API server, and + Postgres database. + +To utilize the Hello Universe pack, create either a +[full Palette cluster profile](https://docs.spectrocloud.com/profiles/cluster-profiles/create-cluster-profiles/create-full-profile) +or an +[add-on Palette cluster profile](https://docs.spectrocloud.com/profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/) +and add the pack to your profile. You can select the preset you wish to deploy on the cluster profile creation page. + +If your infrastructure provider does not offer a native load balancer solution, such as VMware and MAAS, the +[MetalLB](https://docs.spectrocloud.com/integrations/metallb) pack must be included to the cluster profile to help the +LoadBalancer service specified in the manifest obtain an IP address. + +After defining the cluster profile, use it to deploy a new cluster or attach it as an add-on profile to an existing +cluster. + +Once the cluster status displays **Running** and **Healthy**, access the Hello Universe application through the exposed +service URL along with the displayed port number. + +## Terraform + +You can reference the Hello Universe pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "community_registry" { + name = "Palette Registry" +} +data "spectrocloud_pack" "hellouniverse" { + name = "hello-universe" + version = "1.1.2" + registry_uid = data.spectrocloud_registry.community_registry.id +} +``` + + + + + +## Prerequisites + +- A Palette account. + +- A cluster profile where the Hello Universe pack can be integrated. + +- A Palette cluster with port `:8080` available. If port 8080 is not available, you can set a different port in the + **values.yaml** file. + +- Ensure sufficient CPU resources within the cluster to allocate a minimum of 100 milliCPU and a maximum of 200 milliCPU + per replica. + +## Parameters + +The following parameters are applied to the **hello-universe.yaml** manifest through the **values.yaml** file. Users do +not need to take any additional actions regarding these parameters. + +| **Parameter** | **Description** | **Default Value** | **Required** | +| --------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------- | ------------ | +| `manifests.namespace` | The namespace in which the application will be deployed. | `hello-universe` | No | +| `manifests.images.hello-universe` | The application image that will be utilized to create the containers. | `ghcr.io/spectrocloud/hello-universe:1.1.1` | No | +| `manifests.port` | The cluster port number on which the service will listen for incoming traffic. | `8080` | No | +| `manifests.replicas` | The number of Pods to be created. | `1` | No | + +## Usage + +To utilize the Hello Universe pack, create either a +[full Palette cluster profile](../profiles/cluster-profiles/create-cluster-profiles/create-full-profile.md) or an +[add-on Palette cluster profile](../profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/create-addon-profile.md) +and add the pack to your profile. + +If your infrastructure provider does not offer a native load balancer solution, such as VMware and MAAS, the +[MetalLB](./metallb.md) pack must be included to the cluster profile to help the LoadBalancer service specified in the +manifest obtain an IP address. + +After defining the cluster profile, use it to deploy a new cluster or attach it as an add-on profile to an existing +cluster. + +Once the cluster status displays **Running** and **Healthy**, access the Hello Universe application through the exposed +service URL along with the displayed port number. + +## Terraform + +You can reference the Hello Universe pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "community_registry" { + name = "Palette Registry" +} +data "spectrocloud_pack" "hellouniverse" { + name = "hello-universe" + version = "1.1.1" + registry_uid = data.spectrocloud_registry.community_registry.id +} +``` + + + + + +## References + +- [Hello Universe GitHub Repository](https://github.com/spectrocloud/hello-universe) + +- [Deploy a Custom Pack Tutorial](../tutorials/profiles/deploy-pack.md) + +- [Registries and Packs](../registries-and-packs/registries-and-packs.md) diff --git a/docs/deprecated/integrations/istio.md b/docs/deprecated/integrations/istio.md new file mode 100644 index 0000000000..be0c9df945 --- /dev/null +++ b/docs/deprecated/integrations/istio.md @@ -0,0 +1,53 @@ +--- +sidebar_label: "Istio" +title: "Istio" +description: "Choosing Istio as a Service Mesh app within the Spectro Cloud console" +hide_table_of_contents: true +type: "integration" +category: ["service mesh", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/istio/blobs/sha256:c80cf596d4859261ab892e987f835bd11161bd139dd8e4147b652c6b93924cb2?type=image.webp" +tags: ["packs", "istio", "network"] +--- + +This Integration aims to automate and simplify the rollout of the various Istio components which helps with service mesh +use cases. + +## Versions Supported + + + + + +- **1.14.3** +- **1.14.1** + + + + + +- **1.6.2** + + + + + +## Contents + +The integration deploys the Istio Operator with the 'demo' profile which deploys the following components: + +- Istiod +- Istio Ingress Gateway +- Istio Egress Gateway +- Grafana +- Prometheus +- Istio Tracing +- Kiali + +## References + +- [Istio Home](https://istio.io) + +- [Istio Documentation](https://istio.io/latest/docs) + +- [Istio Operator GitHub](https://github.com/istio/operator) diff --git a/docs/docs-content/integrations/k3s.md b/docs/deprecated/integrations/k3s.md similarity index 100% rename from docs/docs-content/integrations/k3s.md rename to docs/deprecated/integrations/k3s.md diff --git a/docs/deprecated/integrations/kibana.md b/docs/deprecated/integrations/kibana.md new file mode 100644 index 0000000000..dab77d6146 --- /dev/null +++ b/docs/deprecated/integrations/kibana.md @@ -0,0 +1,45 @@ +--- +sidebar_label: "Kibana" +title: "Elasticsearch Fluentd Kibana" +description: "Kibana Monitoring pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["logging", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/elastic-fluentd-kibana/blobs/sha256:3b6d6486eb216d46164fc8b7cb784b0be6b851a85726f18bdf4450d5ed1386eb?type=image.webp" +tags: ["packs", "elastic-fluentd-kibana", "logging"] +--- + +The logging integration installs a production-grade ElasticSearch cluster with Kibana and Fluentd by default on the +Kubernetes cluster. This integration provides a rich set of logging features like forwarding, aggregating & parsing logs +from the Kubernetes cluster. + +## Contents + +The default integration deployed will have the following components: + +- ElasticSearch control plane (3 replicas). +- ElasticSearch Data (2 replicas). +- ElasticSearch Client (2 replicas). +- ElasticSearch Curator. +- Fluentd (one per node). +- Kibana. + +## Ingress + +Follow below steps to configure Ingress on Kibana + +1. Change serviceType from "LoadBalancer" to "ClusterIP" (line #643) +2. Ingress (line #670) + - Enable Ingress; change enabled from false to "true" + - Set Ingress rules like annotations, path, hosts, etc. + +With these config changes, you can access Kibana service on the Ingress Controller LoadBalancer hostname / IP + +## References + +- [Elasticsearch GitHub](https://github.com/helm/charts/tree/master/stable/elasticsearch) + +- [Fluentd GitHub](https://github.com/helm/charts/tree/master/stable/fluentd) + +- [Kibana GitHub](https://github.com/helm/charts/tree/master/stable/kibana) diff --git a/docs/deprecated/integrations/kong.md b/docs/deprecated/integrations/kong.md new file mode 100644 index 0000000000..369b5fb7d2 --- /dev/null +++ b/docs/deprecated/integrations/kong.md @@ -0,0 +1,42 @@ +--- +sidebar_label: "Kong" +title: "Kong" +description: "Kong Ingress pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["ingress", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/kong/blobs/sha256:600f20583f85ccad4c515e51542f74aa9acb851d5b03ecb0e7b3435eb51ecf56?type=image.webp" +tags: ["packs", "kong", "network"] +--- + +The Kong integration is an Ingress Controller for Kubernetes that configures ingress with a load balancer. You can use +the Kong as an application load balancer for your application. + +## Version Supported + + + + + +- **2.13.1** + + + + + +- **1.4.0** + + + + + +## Components + +The integration adds the Kong Ingress Controller, which exposes a Kubernetes service of type LoadBalancer. + +## References + +- [Kong Ingress Controller Documentation ](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers) + +- [Kong GitHub](https://github.com/Kong/kubernetes-ingress-controller) diff --git a/docs/docs-content/integrations/konvoy.md b/docs/deprecated/integrations/konvoy.md similarity index 100% rename from docs/docs-content/integrations/konvoy.md rename to docs/deprecated/integrations/konvoy.md diff --git a/docs/deprecated/integrations/kubebench.md b/docs/deprecated/integrations/kubebench.md new file mode 100644 index 0000000000..26a00e2d45 --- /dev/null +++ b/docs/deprecated/integrations/kubebench.md @@ -0,0 +1,33 @@ +--- +sidebar_label: "kube-bench" +title: "kube-bench" +description: "kube-bench security pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: https://registry-addon.spectrocloud.com/v1/kube-bench/blobs/sha256:28c233e5ad884d5356a183c37f323263eb4acca860c28b326ecd99094b500c31?type=image.webp +tags: ["packs", "kube-bench", "security"] +--- + +Palette executes kube-bench, a CIS Benchmark scanner by Aqua Security, for every Kubernetes pack to ensure the control +plane and worker nodes are configured securely. It is available as an Add-on layer within Palette. + +kube-bench runs against a series of checks specified in a `controls` YAML file. For more information on how to write +tests and config files, refer to the [controls](https://github.com/aquasecurity/kube-bench/blob/main/docs/controls.md) +section. + +## Versions Supported + + + + + +- **0.6.8** + + + + +## References + +- [kube-bench GitHub](https://github.com/aquasecurity/kube-bench/blob/main/docs/running.md#running-kube-bench) diff --git a/docs/deprecated/integrations/kubehunter.md b/docs/deprecated/integrations/kubehunter.md new file mode 100644 index 0000000000..ea72bf5784 --- /dev/null +++ b/docs/deprecated/integrations/kubehunter.md @@ -0,0 +1,31 @@ +--- +sidebar_label: "kube-hunter" +title: "kube-hunter" +description: "kube-hunter monitoring pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/kubehunter/blobs/sha256:6b6b9138fa056677646712a888192498247f71aa421edd27b25458a8fbf8af0c?type=image.webp" +tags: ["packs", "kube-hunter", "security"] +--- + +Kube Hunter is an open-source tool that hunts for security issues in your Kubernetes clusters. It’s designed to increase +awareness and visibility of the security controls in Kubernetes environments. Kube-hunter probes a domain or address +range for open Kubernetes-related ports, and tests for any configuration issues that leave your cluster exposed to +attackers. It can be run on a machine in the cluster, and select the option to probe all the local network interfaces. + +## Versions Supported + + + + + +**1.0.3** + + + + +## References + +- [kube-hunter GitHub](https://github.com/aquasecurity/kube-hunter/) diff --git a/docs/docs-content/integrations/kubernetes-dashboard.md b/docs/deprecated/integrations/kubernetes-dashboard.md similarity index 97% rename from docs/docs-content/integrations/kubernetes-dashboard.md rename to docs/deprecated/integrations/kubernetes-dashboard.md index 50794aa9f0..a98717e390 100644 --- a/docs/docs-content/integrations/kubernetes-dashboard.md +++ b/docs/deprecated/integrations/kubernetes-dashboard.md @@ -45,9 +45,10 @@ allows you to manage clusters and the applications deployed in them. :::warning + Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. -To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. +To learn more about it and start using it, check out the pack. ::: @@ -272,9 +273,10 @@ Use the `service.loadBalancerIP` and `service.externalPort` parameters to connec :::warning + Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. -To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. +To learn more about it and start using it, check out the pack. ::: @@ -386,9 +388,10 @@ Use the `service.loadBalancerIP` and `service.externalPort` parameters to connec :::warning + Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. -To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. +To learn more about it and start using it, check out the pack. ::: @@ -500,9 +503,10 @@ Use the `service.loadBalancerIP` and `service.externalPort` parameters to connec :::warning + Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. -To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. +To learn more about it and start using it, check out the pack. ::: @@ -614,9 +618,10 @@ Use the `service.loadBalancerIP` and `service.externalPort` parameters to connec :::warning + Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. -To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. +To learn more about it and start using it, check out the pack. ::: diff --git a/docs/docs-content/integrations/kubernetes-edge.md b/docs/deprecated/integrations/kubernetes-edge.md similarity index 100% rename from docs/docs-content/integrations/kubernetes-edge.md rename to docs/deprecated/integrations/kubernetes-edge.md diff --git a/docs/docs-content/integrations/kubernetes-generic.md b/docs/deprecated/integrations/kubernetes-generic.md similarity index 100% rename from docs/docs-content/integrations/kubernetes-generic.md rename to docs/deprecated/integrations/kubernetes-generic.md diff --git a/docs/deprecated/integrations/kubernetes.md b/docs/deprecated/integrations/kubernetes.md new file mode 100644 index 0000000000..905870e905 --- /dev/null +++ b/docs/deprecated/integrations/kubernetes.md @@ -0,0 +1,1192 @@ +--- +sidebar_label: "Palette eXtended Kubernetes" +title: "Palette eXtended Kubernetes" +description: "Learn about the Palette eXtended Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/k8s-dashboard/blobs/sha256:2de5d88b2573af42d4cc269dff75744c4174ce47cbbeed5445e51a2edd8b7429?type=image.webp" +tags: ["packs", "kubernetes", "pxk"] +--- + +The Palette eXtended Kubernetes (PXK) pack supports several [cloud and data center infrastructure providers](/clusters). +This pack defines the default properties we use to deploy Kubernetes clusters and enables most of the Kubernetes +hardening standards that the Center for Internet Security (CIS) recommends. + +We also support managed Kubernetes distributions for Elastic Kubernetes Service (EKS), Azure Kubernetes Service (AKS), +Google Kubernetes Engine (GKE), and Tencent Kubernetes Engine (TKE). + +We offer PXK as a core pack in Palette. + +:::warning + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the [Kubernetes Upgrades](kubernetes-support.md#kubernetes-upgrades) +section. + +Review our [Maintenance Policy](maintenance-policy.md) to learn about pack update and deprecation schedules. + +::: + +## What is PXK? + +Palette eXtended Kubernetes (PXK) is a customized version of the open-source Cloud Native Computing Foundation (CNCF) +distribution of Kubernetes. This Kubernetes version can be deployed through Palette to all major infrastructure +providers, public cloud providers, and private data center providers. This is the default distribution when deploying a +Kubernetes cluster through Palette. You have the option to choose other Kubernetes distributions, such as MicroK8s, +Konvoy, and more, should you want to consume a different Kubernetes distribution. + +PXK is different from the upstream open-source Kubernetes version primarily because of the carefully reviewed and +applied hardening of the operating system (OS) and Kubernetes. The hardening ranges from removing unused kernel modules +to using an OS configuration that follows industry best practices. Our custom Kubernetes configuration addresses common +Kubernetes deployment security pitfalls and implements industry best practices. + +A benefit of Palette when used with PXK is the ability to apply different flavors of container storage interface (CSI) +plugins and container network interface (CNI) plugins. Other open-source Kubernetes distributions, such as MicroK8s, +RKE2, and K3s, come with a default CSI and CNI. Additional complexity and overhead are required from you to enable +different interfaces. PXK supports the ability to select other interface plugins out of the box without any additional +overhead or complexity needed from your side. + +There are no changes to the Kubernetes source code and we also follow the same versioning schema as the upstream +open-source Kubernetes distribution. + +:::info + +We also offer Palette eXtended Kubernetes Edge (PXK-E) for Edge deployments. Refer to the +[PXK-E glossary definition](../glossary-all.md#palette-extended-kubernetes-edge-pxk-e) to learn more about PXK-E. + +::: + +### PXK and Palette VerteX + +The PXK used in [Palette VerteX](../vertex/vertex.md) is compiled and linked with our +[NIST-certified FIPS crypto module](../legal-licenses/compliance.md#fips-140-2) PXK is by default enabled with +[Ubuntu Pro](https://ubuntu.com/pro) with FIPS mode enabled. Additionally, the Operating System (OS) is hardened based +on the NIST-800 standard. However, if you use a different OS through the [BYOOS](./byoos.md) pack, then you are +responsible for ensuring FIPS compliance and hardening of the OS. + +The combined usage of PXK and Palette VerteX provides a secure and FIPS-compliant experience as the Kubernetes +distribution, OS, and management platform VerteX is FIPS-compliant. + +### Support Lifecycle + +We support PXK for N-3 Kubernetes minor versions for a duration of 14 months. The duration exceeds the official EOL by +four months. Once we stop supporting the minor version, we initiate the deprecation process. Refer to the +[Kubernetes Support Lifecycle](kubernetes-support.md#palette-extended-kubernetes-support) guide to learn more. + +## Versions Supported + + + + + +## Prerequisites + +- A minimum of 4 CPU and 4 GB Memory. + +- Operating System (OS) dependencies as listed in the table. + + | OS Distribution | OS Version | Supports Kubernetes 1.29.x | + | --------------- | ---------- | -------------------------- | + | CentOS | 7.7 | ✅ | + | Ubuntu | 22.04 | ✅ | + | Ubuntu | 20.04 | ❌ | + | Ubuntu | 18.04 | ❌ | + +## Parameters + +| Parameter | Description | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | +| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | +| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | +| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | +| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | +| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | +| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | +| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | +| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | +| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | +| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | +| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | +| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | +| `cloud.maas.customEndpoint` | The custom MAAS API or DNS endpoint URL to use for the PXK cluster. This parameter is only available for MAAS. | +| `cloud.maas.customEndpointPort` | The custom MAAS API or DNS endpoint port to use for the PXK cluster. This parameter is only available for MAAS. Default value is `6443`. | + +## Usage + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. For more + information, refer to the [Clusters](../clusters/clusters.md) guide and + [Cluster Deployment Errors](../troubleshooting/cluster-deployment.md). + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain). + +- Manually configure a third-party OpenID Connect (OIDC) Identity Provider (IDP). For more information, check out + [Configure Custom OIDC](#configure-custom-oidc). + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the [Spectro Proxy](frp.md) guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can only specify the service domain at cluster creation. After cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The PXK Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + +```yaml +palette: + config: + dashboard: + identityProvider: +``` + +### Example Kubeadm Configuration File + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "192.168.0.0/16" + serviceClusterIpRange: "10.96.0.0/12" + palette: + config: + dashboard: + identityProvider: palette +kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + authorization-mode: RBAC,Node + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + extraVolumes: + - name: audit-log + hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + pathType: DirectoryOrCreate + - name: audit-policy + hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + readOnly: true + pathType: File + - name: pod-security-standard + hostPath: /etc/kubernetes/pod-security-standard.yaml + mountPath: /etc/kubernetes/pod-security-standard.yaml + readOnly: true + pathType: File + controllerManager: + extraArgs: + profiling: "false" + terminated-pod-gc-threshold: "25" + pod-eviction-timeout: "1m0s" + use-service-account-credentials: "true" + feature-gates: "RotateKubeletServerCertificate=true" + scheduler: + extraArgs: + profiling: "false" + kubeletExtraArgs: + read-only-port: "0" + event-qps: "0" + feature-gates: "RotateKubeletServerCertificate=true" + protect-kernel-defaults: "true" + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + files: + - path: hardening/audit-policy.yaml + targetPath: /etc/kubernetes/audit-policy.yaml + targetOwner: "root:root" + targetPermissions: "0600" + - path: hardening/90-kubelet.conf + targetPath: /etc/sysctl.d/90-kubelet.conf + targetOwner: "root:root" + targetPermissions: "0600" + - targetPath: /etc/kubernetes/pod-security-standard.yaml + targetOwner: "root:root" + targetPermissions: "0600" + content: | + apiVersion: apiserver.config.k8s.io/v1 + kind: AdmissionConfiguration + plugins: + - name: PodSecurity + configuration: + apiVersion: pod-security.admission.config.k8s.io/v1 + kind: PodSecurityConfiguration + defaults: + enforce: "baseline" + enforce-version: "v1.26" + audit: "baseline" + audit-version: "v1.26" + warn: "restricted" + warn-version: "v1.26" + audit: "restricted" + audit-version: "v1.26" + exemptions: + # Array of authenticated usernames to exempt. + usernames: [] + # Array of runtime class names to exempt. + runtimeClasses: [] + # Array of namespaces to exempt. + namespaces: [kube-system] + + preKubeadmCommands: + - 'echo "====> Applying kernel parameters for Kubelet"' + - 'sysctl -p /etc/sysctl.d/90-kubelet.conf' + postKubeadmCommands: + - 'echo "List of post kubeadm commands to be executed"' + + # Client configuration to add OIDC based authentication flags in kubeconfig + #clientConfig: + #oidc-issuer-url: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-issuer-url }}" + #oidc-client-id: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-client-id }}" + #oidc-client-secret: yourSecretClientSecretGoesHere + #oidc-extra-scope: profile,email +``` + +### Configure OIDC Identity Provider + +Platforms that use PXK can use the OIDC IDP feature, which offers the convenience of managing OIDC at the Kubernetes +layer. The OIDC IDP feature is particularly useful for environments that do not have their own IDP configured. In this +scenario, you can leverage Palette as an IDP without having to configure a third-party IDP. We also support the ability +to take advantage of other OIDC providers by making it possible for you to configure OIDC at the tenant level. For +additional flexibility, if you wish to use a different IDP than the one configured at the tenant level, you can select a +different IDP by adding the OIDC configuration to your cluster profile. + +When you add the PXK pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](/clusters/cluster-management/cluster-rbac#create-role-bindings). You can also configure OIDC for +virtual clusters. For guidance, refer to +[Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + :::warning + + We do not recommend choosing **None** in a production environment, as it may disable authentication for add-ons that + rely on OIDC. + + ::: + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + [Configure Custom OIDC](#configure-custom-oidc). This setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + :::info + + If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option + will not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC + authentication and not SAML authentication. + + ::: + +### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and [Azure-AKS](../clusters/public-cloud/azure/aks.md). + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +[Enable OIDC in Kubernetes Clusters With Entra ID](../user-management/saml-sso/palette-sso-with-entra-id.md#enable-oidc-in-kubernetes-clusters-with-entra-id) +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + + ```yaml + oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: + ``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + + ```yaml + clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: ************************************************** + oidc-extra-scope: profile,email + ``` + +3. Provide third-party OIDC IDP details. + + + + + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + +### Custom MAAS Endpoint + +You can specify a custom MAAS endpoint and port that instructs Palette to direct all MAAS API requests to the provided +endpoint URL. Use the `cloud.maas.customEndpoint` and `cloud.maas.customEndpointPort` parameters to specify the custom +MAAS API URL and port. This is useful in scenarios where the MAAS API endpoint is not resolvable outside of the MAAS +network. + +The following example shows how to specify a custom MAAS endpoint and port in the Kubernetes YAML file. Make sure the +`cloud.maas` section is at the same level as the `pack` section. + +```yaml hideClipboard {10-14} +pack: + k8sHardening: True + podCIDR: "192.168.0.0/16" + serviceClusterIpRange: "10.96.0.0/12" + palette: + config: + dashboard: + identityProvider: palette + +cloud: + maas: + customEndpoint: "maas-api.example.maas.org" + customEndpointPort: "6443" +``` + + + + + +## Prerequisites + +- A minimum of 4 CPU and 4 GB Memory. + +- Operating System (OS) dependencies as listed in the table. + + | OS Distribution | OS Version | Supports Kubernetes 1.28.x | + | --------------- | ---------- | -------------------------- | + | CentOS | 7.7 | ✅ | + | Ubuntu | 22.04 | ✅ | + | Ubuntu | 20.04 | ❌ | + +## Parameters + +| Parameter | Description | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | +| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | +| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | +| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | +| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | +| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | +| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | +| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | +| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | +| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | +| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | +| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | +| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | +| `cloud.maas.customEndpoint` | The custom MAAS API or DNS endpoint URL to use for the PXK cluster. This parameter is only available for MAAS. | +| `cloud.maas.customEndpointPort` | The custom MAAS API or DNS endpoint port to use for the PXK cluster. This parameter is only available for MAAS. Default value is `6443`. | + +## Usage + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. For more + information, refer to the [Clusters](../clusters/clusters.md) guide and + [Cluster Deployment Errors](../troubleshooting/cluster-deployment.md). + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain). + +- Manually configure a third-party OpenID Connect (OIDC) Identity Provider (IDP). For more information, check out + [Configure Custom OIDC](#configure-custom-oidc). + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the [Spectro Proxy](frp.md) guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can only specify the service domain at cluster creation. After cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The PXK Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + +```yaml +palette: + config: + dashboard: + identityProvider: +``` + +### Example Kubeadm Configuration File + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "192.168.0.0/16" + serviceClusterIpRange: "10.96.0.0/12" + palette: + config: + dashboard: + identityProvider: palette +kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + authorization-mode: RBAC,Node + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + extraVolumes: + - name: audit-log + hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + pathType: DirectoryOrCreate + - name: audit-policy + hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + readOnly: true + pathType: File + - name: pod-security-standard + hostPath: /etc/kubernetes/pod-security-standard.yaml + mountPath: /etc/kubernetes/pod-security-standard.yaml + readOnly: true + pathType: File + controllerManager: + extraArgs: + profiling: "false" + terminated-pod-gc-threshold: "25" + pod-eviction-timeout: "1m0s" + use-service-account-credentials: "true" + feature-gates: "RotateKubeletServerCertificate=true" + scheduler: + extraArgs: + profiling: "false" + kubeletExtraArgs: + read-only-port: "0" + event-qps: "0" + feature-gates: "RotateKubeletServerCertificate=true" + protect-kernel-defaults: "true" + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + files: + - path: hardening/audit-policy.yaml + targetPath: /etc/kubernetes/audit-policy.yaml + targetOwner: "root:root" + targetPermissions: "0600" + - path: hardening/90-kubelet.conf + targetPath: /etc/sysctl.d/90-kubelet.conf + targetOwner: "root:root" + targetPermissions: "0600" + - targetPath: /etc/kubernetes/pod-security-standard.yaml + targetOwner: "root:root" + targetPermissions: "0600" + content: | + apiVersion: apiserver.config.k8s.io/v1 + kind: AdmissionConfiguration + plugins: + - name: PodSecurity + configuration: + apiVersion: pod-security.admission.config.k8s.io/v1 + kind: PodSecurityConfiguration + defaults: + enforce: "baseline" + enforce-version: "v1.26" + audit: "baseline" + audit-version: "v1.26" + warn: "restricted" + warn-version: "v1.26" + audit: "restricted" + audit-version: "v1.26" + exemptions: + # Array of authenticated usernames to exempt. + usernames: [] + # Array of runtime class names to exempt. + runtimeClasses: [] + # Array of namespaces to exempt. + namespaces: [kube-system] + + preKubeadmCommands: + - 'echo "====> Applying kernel parameters for Kubelet"' + - 'sysctl -p /etc/sysctl.d/90-kubelet.conf' + postKubeadmCommands: + - 'echo "List of post kubeadm commands to be executed"' + + # Client configuration to add OIDC based authentication flags in kubeconfig + #clientConfig: + #oidc-issuer-url: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-issuer-url }}" + #oidc-client-id: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-client-id }}" + #oidc-client-secret: yourSecretClientSecretGoesHere + #oidc-extra-scope: profile,email +``` + +### Configure OIDC Identity Provider + +Platforms that use PXK can use the OIDC IDP feature, which offers the convenience of managing OIDC at the Kubernetes +layer. The OIDC IDP feature is particularly useful for environments that do not have their own IDP configured. In this +scenario, you can leverage Palette as an IDP without having to configure a third-party IDP. We also support the ability +to take advantage of other OIDC providers by making it possible for you to configure OIDC at the tenant level. For +additional flexibility, if you wish to use a different IDP than the one configured at the tenant level, you can select a +different IDP by adding the OIDC configuration to your cluster profile. + +When you add the PXK pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](/clusters/cluster-management/cluster-rbac#create-role-bindings). You can also configure OIDC for +virtual clusters. For guidance, refer to +[Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + :::warning + + We do not recommend choosing **None** in a production environment, as it may disable authentication for add-ons that + rely on OIDC. + + ::: + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + [Configure Custom OIDC](#configure-custom-oidc). This setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + :::info + + If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option + will not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC + authentication and not SAML authentication. + + ::: + +### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and [Azure-AKS](../clusters/public-cloud/azure/aks.md). + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +[Enable OIDC in Kubernetes Clusters With Entra ID](../user-management/saml-sso/palette-sso-with-entra-id.md#enable-oidc-in-kubernetes-clusters-with-entra-id) +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + + ```yaml + oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: + ``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + + ```yaml + clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: ************************************************** + oidc-extra-scope: profile,email + ``` + +3. Provide third-party OIDC IDP details. + + + + + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + +### Custom MAAS Endpoint + +You can specify a custom MAAS endpoint and port that instructs Palette to direct all MAAS API requests to the provided +endpoint URL. Use the `cloud.maas.customEndpoint` and `cloud.maas.customEndpointPort` parameters to specify the custom +MAAS API URL and port. This is useful in scenarios where the MAAS API endpoint is not resolvable outside of the MAAS +network. + +The following example shows how to specify a custom MAAS endpoint and port in the Kubernetes YAML file. Make sure the +`cloud.maas` section is at the same level as the `pack` section. + +```yaml hideClipboard {10-14} +pack: + k8sHardening: True + podCIDR: "192.168.0.0/16" + serviceClusterIpRange: "10.96.0.0/12" + palette: + config: + dashboard: + identityProvider: palette + +cloud: + maas: + customEndpoint: "maas-api.example.maas.org" + customEndpointPort: "6443" +``` + + + + + +## Prerequisites + +- A minimum of 4 CPU and 4 GB Memory. + +- Operating System (OS) dependencies as listed in the table. + + | OS Distribution | OS Version | Supports Kubernetes 1.27.x | + | --------------- | ---------- | -------------------------- | + | CentOS | 7.7 | ✅ | + | Ubuntu | 22.04 | ✅ | + | Ubuntu | 20.04 | ❌ | + +## Parameters + +| Parameter | Description | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | +| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | +| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | +| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | +| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | +| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | +| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | +| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | +| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | +| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | +| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | +| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | +| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | + +## Usage + +The Kubeadm configuration file is where you can do the following: + +- Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take + precedence over other defined CIDR IPs in your environment. + + As you build your cluster, check that the `podCIDR` value does not overlap with any hosts or with the service network + and the `serviceClusterIpRange` value does not overlap with any IP ranges assigned to nodes or pods. For more + information, refer to the [Clusters](../clusters/clusters.md) guide and + [Cluster Deployment Errors](../troubleshooting/cluster-deployment.md). + +- Change the default cluster DNS service domain from `cluster.local` to a DNS domain that you specify. You can only + change the DNS domain during cluster creation. For more information, refer to + [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain). + +- Manually configure a third-party OpenID Connect (OIDC) Identity Provider (IDP). For more information, check out + [Configure Custom OIDC](#configure-custom-oidc). + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the [Spectro Proxy](frp.md) guide. + +### Change Cluster DNS Service Domain + +The `pack.serviceDomain` parameter with default value `cluster.local` is not visible in the Kubernetes YAML file, and +its value can only be changed at cluster creation. To change the value, you must add `serviceDomain: "cluster.local"` to +the Kubernetes YAML file when you create a cluster, and specify the service domain you want to use. + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "172.16.0.0/16" + serviceClusterIPRange: "10.96.0.0/12" + serviceDomain: "" +``` + +:::warning + +You can only specify the service domain at cluster creation. After cluster creation completes, you cannot update the +value. Attempting to update it results in the error `serviceDomain update is forbidden for existing cluster`. + +::: + +For more information about networking configuration with DNS domains, refer to the Kubernetes +[Networking](https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta3/#kubeadm-k8s-io-v1beta3-Networking) +API documentation. + +### Configuration Changes + +The PXK Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + +```yaml +palette: + config: + dashboard: + identityProvider: +``` + +### Example Kubeadm Configuration File + +```yaml hideClipboard +pack: + k8sHardening: True + podCIDR: "192.168.0.0/16" + serviceClusterIpRange: "10.96.0.0/12" + palette: + config: + dashboard: + identityProvider: palette +kubeadmconfig: + apiServer: + extraArgs: + secure-port: "6443" + anonymous-auth: "true" + profiling: "false" + disable-admission-plugins: "AlwaysAdmit" + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + enable-admission-plugins: "AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction,PodSecurity" + admission-control-config-file: "/etc/kubernetes/pod-security-standard.yaml" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + authorization-mode: RBAC,Node + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + extraVolumes: + - name: audit-log + hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + pathType: DirectoryOrCreate + - name: audit-policy + hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + readOnly: true + pathType: File + - name: pod-security-standard + hostPath: /etc/kubernetes/pod-security-standard.yaml + mountPath: /etc/kubernetes/pod-security-standard.yaml + readOnly: true + pathType: File + controllerManager: + extraArgs: + profiling: "false" + terminated-pod-gc-threshold: "25" + pod-eviction-timeout: "1m0s" + use-service-account-credentials: "true" + feature-gates: "RotateKubeletServerCertificate=true" + scheduler: + extraArgs: + profiling: "false" + kubeletExtraArgs: + read-only-port: "0" + event-qps: "0" + feature-gates: "RotateKubeletServerCertificate=true" + protect-kernel-defaults: "true" + tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256" + files: + - path: hardening/audit-policy.yaml + targetPath: /etc/kubernetes/audit-policy.yaml + targetOwner: "root:root" + targetPermissions: "0600" + - path: hardening/90-kubelet.conf + targetPath: /etc/sysctl.d/90-kubelet.conf + targetOwner: "root:root" + targetPermissions: "0600" + - targetPath: /etc/kubernetes/pod-security-standard.yaml + targetOwner: "root:root" + targetPermissions: "0600" + content: | + apiVersion: apiserver.config.k8s.io/v1 + kind: AdmissionConfiguration + plugins: + - name: PodSecurity + configuration: + apiVersion: pod-security.admission.config.k8s.io/v1 + kind: PodSecurityConfiguration + defaults: + enforce: "baseline" + enforce-version: "v1.26" + audit: "baseline" + audit-version: "v1.26" + warn: "restricted" + warn-version: "v1.26" + audit: "restricted" + audit-version: "v1.26" + exemptions: + # Array of authenticated usernames to exempt. + usernames: [] + # Array of runtime class names to exempt. + runtimeClasses: [] + # Array of namespaces to exempt. + namespaces: [kube-system] + + preKubeadmCommands: + - 'echo "====> Applying kernel parameters for Kubelet"' + - 'sysctl -p /etc/sysctl.d/90-kubelet.conf' + postKubeadmCommands: + - 'echo "List of post kubeadm commands to be executed"' + + # Client configuration to add OIDC based authentication flags in kubeconfig + #clientConfig: + #oidc-issuer-url: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-issuer-url }}" + #oidc-client-id: "{{ .spectro.pack.kubernetes.kubeadmconfig.apiServer.extraArgs.oidc-client-id }}" + #oidc-client-secret: yourSecretClientSecretGoesHere + #oidc-extra-scope: profile,email +``` + +### Configure OIDC Identity Provider + +Platforms that use PXK can use the OIDC IDP feature, which offers the convenience of managing OIDC at the Kubernetes +layer. The OIDC IDP feature is particularly useful for environments that do not have their own IDP configured. In this +scenario, you can leverage Palette as an IDP without having to configure a third-party IDP. We also support the ability +to take advantage of other OIDC providers by making it possible for you to configure OIDC at the tenant level. For +additional flexibility, if you wish to use a different IDP than the one configured at the tenant level, you can select a +different IDP by adding the OIDC configuration to your cluster profile. + +When you add the PXK pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](/clusters/cluster-management/cluster-rbac#create-role-bindings). You can also configure OIDC for +virtual clusters. For guidance, refer to +[Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + :::warning + + We do not recommend choosing **None** in a production environment, as it may disable authentication for add-ons that + rely on OIDC. + + ::: + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + [Configure Custom OIDC](#configure-custom-oidc). This setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + :::info + + If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option + will not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC + authentication and not SAML authentication. + + ::: + +### Configure Custom OIDC + +The custom method to configure OIDC and apply RBAC for an OIDC provider can be used for all cloud services except Amazon +Elastic Kubernetes Service (EKS) and [Azure-AKS](../clusters/public-cloud/azure/aks.md). + + + + + +Follow these steps to configure a third-party OIDC IDP. You can apply these steps to all the public cloud providers +except Azure AKS and Amazon EKS clusters. Azure AKS and Amazon EKS require different configurations. AKS requires you to +use Azure Active Directory (AAD) to enable OIDC integration. Refer to +[Enable OIDC in Kubernetes Clusters With Entra ID](../user-management/saml-sso/palette-sso-with-entra-id.md#enable-oidc-in-kubernetes-clusters-with-entra-id) +to learn more. Click the **Amazon EKS** tab for steps to configure OIDC for EKS clusters. + +1. Add the following parameters to your Kubernetes YAML file when creating a cluster profile. + + ```yaml + kubeadmconfig: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Under the `clientConfig` parameter section of Kubernetes YAML file, uncomment the `oidc-` configuration lines. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + + + + + +Follow these steps to configure OIDC for managed EKS clusters. + +1. In the Kubernetes pack, uncomment the lines in the `oidcIdentityProvider` parameter section of the Kubernetes pack, + and enter your third-party provider details. + + ```yaml + oidcIdentityProvider: + identityProviderConfigName: "Spectro-docs" + issuerUrl: "issuer-url" + clientId: "user-client-id-from-Palette" + usernameClaim: "email" + usernamePrefix: "-" + groupsClaim: "groups" + groupsPrefix: "" + requiredClaims: + ``` + +2. Under the `clientConfig` parameter section of Kubernetes pack, uncomment the `oidc-` configuration lines. + + ```yaml + clientConfig: + oidc-issuer-url: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.issuerUrl }}" + oidc-client-id: "{{ .spectro.pack.kubernetes-eks.managedControlPlane.oidcIdentityProvider.clientId }}" + oidc-client-secret: ************************************************** + oidc-extra-scope: profile,email + ``` + +3. Provide third-party OIDC IDP details. + + + + + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + + + + + +:::warning + +All versions less than v1.27.x are considered deprecated. Upgrade to a newer version to take advantage of new features. + +::: + + + + +## Terraform + +You can reference Kubernetes in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes" + version = "1.29.4" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## Resources + +- [Kubernetes](https://kubernetes.io/) + +- [Kubernetes Documentation](https://kubernetes.io/docs/concepts/overview/) + +- [Image Swap with Palette](../clusters/cluster-management/image-swap.md) + +- [RHEL and PXK for Vmware](../byoos/usecases/vmware/rhel-pxk.md) diff --git a/docs/deprecated/integrations/kubevious.md b/docs/deprecated/integrations/kubevious.md new file mode 100644 index 0000000000..d0bc28d298 --- /dev/null +++ b/docs/deprecated/integrations/kubevious.md @@ -0,0 +1,67 @@ +--- +sidebar_label: "Kubevious" +title: "Kubevious" +description: "Kubevious Monitoring pack in Spectro Cloud" +type: "integration" +hide_table_of_contents: true +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/kubevious/blobs/sha256:5e33d7b51b1317a834b4552d96fc1cc8463000a7eedbcb4b784ea07236f3d7f7?type=image.webp" +tags: ["packs", "kubevious", "monitoring"] +--- + +Kubevious integration provides a graphical interface that renders easy to understand, application-centric Kubernetes +configurations. + +## Versions Supported + + + + +- **1.0.10** + + + + +- **0.8.15** + + + + +- **0.5.9** + + + + +## Components + +This integration deploys the following components: + +- Deployment +- MySql DB +- UI +- Parser + +## Ingress + +Follow the steps below to configure Ingress on Kubevious, according to the corresponding version + +1. Within the manifest, find the kubevious section **user** > **interface** > **service** > **type** and confirm/change, + according to the Kubevious version as listed in the table below. + + | **Versions** | **Parameters** | **Action** | + | ------------ | -------------------------------- | -------------------------------------------------------------------- | + | **1.0.10** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.8.15** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.5.9** | ui: svcType: **LoadBalancer** | Change kubevious.ui.svcType from **LoadBalancer** to **Cluster IP**. | + +2. Configure Ingress + - Enable Ingress; change enabled from _false_ to **true**. + - Set Ingress rules like annotations, path, hosts, etc. + +With these configuration changes, you can access the Kubevious service on the Ingress Controller LoadBalancer +hostname/IP. + +## References + +- [Kubevious GitHub](https://github.com/kubevious/kubevious) diff --git a/docs/deprecated/integrations/kubevirt.md b/docs/deprecated/integrations/kubevirt.md new file mode 100644 index 0000000000..8720256c09 --- /dev/null +++ b/docs/deprecated/integrations/kubevirt.md @@ -0,0 +1,64 @@ +--- +sidebar_label: "KubeVirt" +title: "KubeVirt" +description: "Choosing KubeVirt within the Palette console" +hide_table_of_contents: true +type: "integration" +category: ["system app", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/kubevirt/blobs/sha256:185e7a7658c05ab478f2822b080a7e21da9113b4a8bf5fb7fb3338d9a5796eed?type=image.webp" +tags: ["packs", "kubevirt", "system app"] +--- + +KubeVirt is a virtual machine management add-on for Kubernetes clusters. Create predefine virtual machines using +KubeVirt, and Palette will provision KubeVirt as an Add-on Pack to manage the VM resources within the orchestrator. + +
+ +## Version Supported + + + + +**0.51.0** + + + + +**0.55.0** + + + + +
+
+ +## Notable Parameters + +```yaml +manifests: + KubeVirt-operator: + # Enable Emulation (when no nested virtualization enabled) + useEmulation: true + KubeVirt-cr: + contents: | + apiVersion: KubeVirt.io/v1 + kind: KubeVirt + metadata: + name: KubeVirt + namespace: KubeVirt + spec: + certificateRotateStrategy: {} + configuration: + developerConfiguration: + featureGates: [] + customizeComponents: {} + imagePullPolicy: IfNotPresent + workloadUpdateStrategy: {} +``` + +## References + +- [Installing KubeVirt on Kubernetes](https://kubevirt.io/user-guide/cluster_admin/installation/#installing-kubevirt-on-kubernetes) + +- [GitHub KubeVirt](https://github.com/KubeVirt/KubeVirt/releases/tag/v0.51.0) diff --git a/docs/deprecated/integrations/kubewatch.md b/docs/deprecated/integrations/kubewatch.md new file mode 100644 index 0000000000..cfd0684789 --- /dev/null +++ b/docs/deprecated/integrations/kubewatch.md @@ -0,0 +1,41 @@ +--- +sidebar_label: "kube-watch" +title: "kube-watch" +description: "kube-watch monitoring pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/kubewatch/blobs/sha256:a277fb90357df9cbffe98eea1ed100fba1b17970b8fc056d210c4f7bfe4f17a3?type=image.webp" +tags: ["packs", "kube-watch", "monitoring"] +--- + +Kubewatch is a Kubernetes watcher that currently publishes notification to available collaboration hubs/notification +channels. It is run in the k8s cluster for monitoring resource changes and event notifications are obtained through +webhooks. The supported webhooks are: + +- slack +- hipchat +- mattermost +- flock +- webhook +- smtp + +## Usage: + +kubewatch [flags] kubewatch [command] + +## Versions Supported + + + + + +**1.0.7** + + + + +## References + +- [kube-watch GitHub](https://github.com/robusta-dev/kubewatch) diff --git a/docs/docs-content/integrations/longhorn.md b/docs/deprecated/integrations/longhorn.md similarity index 100% rename from docs/docs-content/integrations/longhorn.md rename to docs/deprecated/integrations/longhorn.md diff --git a/docs/docs-content/integrations/metallb.md b/docs/deprecated/integrations/metallb.md similarity index 100% rename from docs/docs-content/integrations/metallb.md rename to docs/deprecated/integrations/metallb.md diff --git a/docs/docs-content/integrations/microk8s.md b/docs/deprecated/integrations/microk8s.md similarity index 100% rename from docs/docs-content/integrations/microk8s.md rename to docs/deprecated/integrations/microk8s.md diff --git a/docs/deprecated/integrations/multus-cni.md b/docs/deprecated/integrations/multus-cni.md new file mode 100644 index 0000000000..3d7630a283 --- /dev/null +++ b/docs/deprecated/integrations/multus-cni.md @@ -0,0 +1,56 @@ +--- +sidebar_label: "Multus CNI" +title: "Multus" +description: "Choosing Multus CNI within the Palette console" +type: "integration" +category: ["network", "amd64"] +sidebar_class_name: "hide-from-sidebar" +hide_table_of_contents: true +logoUrl: "https://registry.spectrocloud.com/v1/cni-multus/blobs/sha256:3727499ea41784a17c818b7269c27918b8664766c40d1b1f3cd90c34d5154676?type=image.webp" +tags: ["packs", "multus", "network"] +--- + +The Multus Container Network Interface (CNI) plugin enables multiple, network interfaces to attach to pods within +Kubernetes. Palette provisions the CNI-Multus 3.8.0 Add-on pack, so you can create a multi-homed pod for Kubernetes +right within the orchestrator. + +
+ +## Version Supported + + + + +**cni-multus 3.8.0** + + + + +
+
+ +# Notable Parameters + +| **Parameters** | **Values** | **Required/Optional** | **Description** | +| -------------------------- | ---------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **name** | string | required | Enter the name of the network. | +| **type** | string | required | "multus" | +| **confDir** | string | optional | This is the directory for the CNI config file that multus reads. default /etc/cni/multus/net.d. | +| **cniDir** | string | optional | Multus CNI data directory. | +| **binDir** | string | optional | Additional directory for CNI plugins which multus calls. | +| **kubeconfig** | string | optional | Kubeconfig file for the out-of-cluster communication with kube-apiserver. | +| **logToStderr** | boolean | optional | Enable or disable logging to STDERR. Defaults to true. | +| **logFile** | string | optional | File path for log file. Multus add log in given file. | +| **logLevel** | string | optional | Logging level | +| **logOptions** | object | optional | Logging option | +| **namespaceIsolation** | boolean | optional | Enables a security feature the where pods are only allowed to access
NetworkAttachmentDefinitions in the namespace where the pod resides. Defaults to _false_. | +| **capabilities** | list | optional | Capabilities supported by at least one of the delegates. | +| **readinessindicatorfile** | string | | The path to a file whose existence denotes that the default network is ready. | + +## References + +- [Multus-CNI](https://github.com/k8snetworkplumbingwg/multi-net-spec) + +- [Multus-CNI Quickstart Guide](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/docs/quickstart.md) + +- [Mutltus Configuration](https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/docs/configuration.md) diff --git a/docs/docs-content/integrations/nfs-subdir-external.md b/docs/deprecated/integrations/nfs-subdir-external.md similarity index 100% rename from docs/docs-content/integrations/nfs-subdir-external.md rename to docs/deprecated/integrations/nfs-subdir-external.md diff --git a/docs/deprecated/integrations/nginx.md b/docs/deprecated/integrations/nginx.md new file mode 100644 index 0000000000..10d55cf71b --- /dev/null +++ b/docs/deprecated/integrations/nginx.md @@ -0,0 +1,114 @@ +--- +sidebar_label: "Nginx" +title: "Nginx" +description: "Nginx Ingress pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["ingress", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/nginx/blobs/sha256:a36bf7e8023f018298ddbf0c82a49c38e872db4b0e480a39c285ae002916a83f?type=image.webp" +tags: ["packs", "nginx", "network"] +--- + +Ingress resource(s) in Kubernetes helps provide Service(s) externally-reachable URLs, load balance traffic, terminate +SSL / TLS, and offer name-based virtual hosting. NGINX integration is an +[Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers) responsible for +fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional +frontends to help handle the traffic. + +## Versions Supported + + + + + +- **1.4.0** + + + + + +- **1.3.0** + + + + + +- **1.2.5** + +
+ + **1.2.4** + +
+ + **1.2.3** + +
+ + **1.2.1** (deprecated) + +
+ + **1.2.0** (deprecated) + +
+ + + +- **1.0.4** + + + + + +- **0.26.1** + + + + + +- **0.43.0** + + + +
+ +## Components + +Integration creates the following components: + +- Ingress Controller. +- Default Backend. + +## Default SSL Certificate + +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. + +1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ``` + +## Troubleshooting + +For basic troubleshooting, refer the below troubleshooting guide: +https://github.com/kubernetes/ingress-nginx/blob/master/docs/troubleshooting.md + +## References + +- [Nginx Ingress Controller](https://www.nginx.com/products/nginx-ingress-controller/) diff --git a/docs/docs-content/integrations/ngrok.md b/docs/deprecated/integrations/ngrok.md similarity index 100% rename from docs/docs-content/integrations/ngrok.md rename to docs/deprecated/integrations/ngrok.md diff --git a/docs/deprecated/integrations/nutanix-csi.md b/docs/deprecated/integrations/nutanix-csi.md new file mode 100644 index 0000000000..f69b71549b --- /dev/null +++ b/docs/deprecated/integrations/nutanix-csi.md @@ -0,0 +1,103 @@ +--- +sidebar_label: "Nutanix CSI" +title: "Nutanix CSI" +description: "Learn how to use the Nutanix CSI pack to provide persistent storage for your applications." +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/nutanix-csi/blobs/sha256:7944cb5fecaaac0b5d5bf47a311ab80573147a34ac438954a70f97c69d65d733?type=image.webp" +tags: ["packs", "Nutanix", "Storage"] +--- + +The Nutanix Container Storage Interface (CSI) pack provides persistent storage for stateful applications. The pack +consists of two Helm charts - **nutanix-csi-storage** and **nutanix-cloud-provider**. + +The Nutanix Container Storage Interface (CSI) Volume Driver chart leverages Nutanix Volumes and Nutanix Files to provide +scalable and persistent storage for applications. + +The Nutanix Cloud Provider chart is a plugin that allows the integration of the Nutanix Acropolis Hypervisor (AHV) +platform with Kubernetes by implementing a node controller function. + +## Versions Supported + +- 2.6.6 + +## Prerequisites + +- A Nutanix Prism Central account. + +- A Nutanix Prism Element cluster created. + +- A Nutanix cloud registered with Palette with the name `nutanix`. For more information, refer to + [Register Nutanix Cloud](../clusters/data-center/nutanix/register-nutanix-cloud.md). + +- The cluster must use Kubernetes version 1.20 or higher. + +## Parameters + +The table below lists commonly used parameters you can configure when adding the Nutanix CSI pack. Review the Nutanix +CSI Pack README for a complete list of parameters. + +| **Parameter** | **Description** | **Default** | +| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------- | +| `nutanix-cloud-provider.createConfig` | Creates a config for the Nutanix Cloud Provider. The existing config will be used if this parameter is set as `false`. | `true` | +| `nutanix-cloud-provider.configName` | Name of the ConfigMap for the Nutanix Cloud Provider config. | `nutanix-config` | +| `nutanix-cloud-provider.createSecret` | Creates a secret for the Nutanix Cloud Provider. The existing secret will be used if this parameter is set as `false`. | `true` | +| `nutanix-cloud-provider.enableCustomLabeling` | Adds additional and custom Nutanix labels to nodes. | `false` | +| `nutanix-cloud-provider.topologyDiscovery.type` | Defines how topology will be discovered (Prism or Categories). | `Prism` | +| `nutanix-cloud-provider.podAnnotations` | Adds annotations to the Cloud Provider Pod. | `{}` | +| `nutanix-csi-storage.volumeClass` | Activates the Nutanix Volumes Storage Class. | `false` | +| `nutanix-csi-storage.volumeClassName` | Name of the Nutanix Volumes Storage Class. | `nutanix-volume` | +| `nutanix-csi-storage.volumeClassRetention` | Retention policy for the Volumes Storage Class (Delete or Retain). | `Delete` | +| `nutanix-csi-storage.fileClass` | Activates Nutanix Files Storage Class. | `false` | + +## Usage + +Palette provides a default Volume storage class called `spectro-storage-class` to allow applications requiring volumes +to access persistent volumes. This storage class is created by the Nutanix CSI pack. + +A storage container must be configured in the Prism Element UI to enable the pack to create the storage class. Once the +storage container is configured, specify its name during the cluster profile creation. The container name must be +included in the values of the `nutanix-csi-storage` chart, under the `storageContainer:` line. The code snippet below +showcases an example configuration with a storage container named **test-container**. + +```bash +storageContainer: "test-container" +``` + +Nutanix Volumes utilize an Internet Small Computer System Interface (iSCSI) data service IP address to provide access to +cluster storage. In the Prism Element UI, go to the **Cluster Details** page and configure the iSCSI Data services IP +address as described in the +[Adding an ISCSI Data Services IP Address](https://portal.nutanix.com/page/documents/details?targetId=Volumes-Guide:vol-cluster-details-modify-wc-t.html) +guide. + +:::warning + +The iSCSI daemon needs to be enabled during the Nutanix cloud registration step. Refer to the +[Register Nutanix Cloud](../clusters/data-center/nutanix/register-nutanix-cloud.md) to learn more about the Nutanix +registration process. + +::: + +## Terraform + +You can reference the Nutanix CSI pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack_simple" "nutanix-csi" { + name = "nutanix-csi" + version = "2.6.6" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Nutanix Documentation](https://www.nutanixbible.com) +- [Nutanix Cloud Controller Manager on GitHub](https://github.com/nutanix-cloud-native/cloud-provider-nutanix) +- [Nutanix CSI Volume Driver Documentation](https://portal.nutanix.com/page/documents/details?targetId=CSI-Volume-Driver-v2_6:CSI-Volume-Driver-v2_6) diff --git a/docs/docs-content/integrations/opa-gatekeeper.md b/docs/deprecated/integrations/opa-gatekeeper.md similarity index 100% rename from docs/docs-content/integrations/opa-gatekeeper.md rename to docs/deprecated/integrations/opa-gatekeeper.md diff --git a/docs/deprecated/integrations/openstack-cinder.md b/docs/deprecated/integrations/openstack-cinder.md new file mode 100644 index 0000000000..6699b48453 --- /dev/null +++ b/docs/deprecated/integrations/openstack-cinder.md @@ -0,0 +1,64 @@ +--- +sidebar_label: "OpenStackCinder" +title: "Open Stack Cinder" +description: "OpenStackCinder storage pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/csi-openstack-cinder/blobs/sha256:ebb9650566d2cdfe9b0fc7d474a1cdcd562a9020807e49f891df199379ab8961?type=image.webp" +tags: ["packs", "openstack-cinder", "storage"] +--- + +Unlike the traditional storage drivers of Kubernetes and the implementation of the Container Storage Interface (CSI), we +can deliver storage plug-ins using a standard interface without ever having to change the core Kubernetes code. Open +Stack Cinder provides OpenShift Container Platform users with storage options, such as volume snapshots that are not +possible with in-tree volume plug-ins. + +## Versions Supported + + + + + +**1.23** + + + + + +**1.22** + + + + + +**1.21** + + + + + +**1.20** + + + + + +**1.19** + + + + + +**1.18** + + + + + +## References + +- [OpenStack Cinder CSI Driver Operator](https://docs.openshift.com/container-platform/4.7/storage/container_storage_interface/persistent-storage-csi-cinder.html#csi-about_persistent-storage-csi-cinder) + +- [CSI Cinder driver](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/cinder-csi-plugin/using-cinder-csi-plugin.md/) diff --git a/docs/deprecated/integrations/permission-manager.md b/docs/deprecated/integrations/permission-manager.md new file mode 100644 index 0000000000..0ebc2d653c --- /dev/null +++ b/docs/deprecated/integrations/permission-manager.md @@ -0,0 +1,53 @@ +--- +sidebar_label: "Permission Manager" +title: "Permission Manager" +description: "Permission Manager Authentication pack in Spectro Cloud" +type: "integration" +hide_table_of_contents: true +category: ["authentication", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/permission-manager/blobs/sha256:15d08b02d78823c12616b72d1b5adb0520940016b89bae1f758e6f1a105597ff?type=image.webp" +tags: ["packs", "permission-manager", "security"] +--- + +This integration provides a graphical user interface for RBAC management in Kubernetes. You can create users, assign +namespaces/permissions, and distribute Kubeconfig YAML files quickly. + +## Versions Supported + + + + +- **1.0.0** + + + + +## Configuration + +| Name | Supported Value | Description | +| ------------ | -------------------------- | ------------------------------------------------------------------ | +| namespace | Any valid namespace string | The namespace under which this integration should be deployed onto | +| authPassword | | Login password for the web interface | + +## Customizing the permission templates + +Create a ClusterRole starting with `template-namespaced-resources___` or `template-cluster-resources___` and apply it to +the cluster. Permission manager will honor any custom resources with this naming convention and will populate on the +user interface. + +## Ingress + +Follow below steps to configure Ingress on Permission Manager + +1. Change serviceType from "LoadBalancer" to "ClusterIP" (line #10) +2. Ingress (line #13) + - Enable Ingress; Change enabled from false to "true" + - Set Ingress rules like annotations, path, hosts, etc. + +With these config changes, you can access Permission manager service on the Ingress Controller LoadBalancer hostname / +IP + +## References + +- [Permission Manager GitHub](https://github.com/sighupio/permission-manager) diff --git a/docs/docs-content/integrations/portworx.md b/docs/deprecated/integrations/portworx.md similarity index 100% rename from docs/docs-content/integrations/portworx.md rename to docs/deprecated/integrations/portworx.md diff --git a/docs/docs-content/integrations/portworx_operator.md b/docs/deprecated/integrations/portworx_operator.md similarity index 100% rename from docs/docs-content/integrations/portworx_operator.md rename to docs/deprecated/integrations/portworx_operator.md diff --git a/docs/deprecated/integrations/prismacloud.md b/docs/deprecated/integrations/prismacloud.md new file mode 100644 index 0000000000..66879f8bbc --- /dev/null +++ b/docs/deprecated/integrations/prismacloud.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "prisma-cloud-compute" +title: "Prisma Cloud Compute" +description: "prism-cloud-compute Security pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/prismacloud/blobs/sha256:9ddb035af0e9f299e5df178ebb3153e90383a5e42ded2c1a3f6c9470dd851c12?type=image.webp" +tags: ["packs", "prismacloud", "security"] +--- + +Prisma Cloud Compute is a cloud workload protection platform (CWPP) offering protection for hosts, containers, and +server-less deployments in any cloud, and across the software lifecycle. Prisma Cloud Compute is cloud-native and +API-enabled. It can protect tenant workloads, regardless of the underlying compute technology or the cloud deployment. + +## Versions Supported + + + + + +**20.9.0** + + + + +## References + +- [Prisma Cloud Compute Documentation](https://docs.paloaltonetworks.com/prisma/prisma-cloud) diff --git a/docs/deprecated/integrations/prometheus-agent.md b/docs/deprecated/integrations/prometheus-agent.md new file mode 100644 index 0000000000..f1404b62de --- /dev/null +++ b/docs/deprecated/integrations/prometheus-agent.md @@ -0,0 +1,154 @@ +--- +sidebar_label: "Prometheus Agent" +title: "Prometheus Agent" +description: "Prometheus Agent Monitoring Pack" +type: "integration" +hide_table_of_contents: true +category: ["monitoring", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/prometheus-operator/blobs/sha256:64589616d7f667e5f1d7e3c9a39e32c676e03518a318924e123738693e104ce0?type=image.webp" +tags: ["packs", "prometheus-agent", "monitoring"] +--- + +Prometheus is an open-source monitoring and alerting system that is designed to collect and analyze metrics from various +systems and services. + +Prometheus is built around a time-series database that stores metrics data. It uses a flexible querying language called +PromQL to extract and process metrics data. Prometheus also has a powerful alerting system that can be used to send +notifications when specific conditions are met. + +Prometheus can be used to monitor a wide range of systems and services, including servers, containers, databases, and +applications. It can be deployed in a variety of environments, including on-prem, cloud, and hybrid setups. + +The Prometheus Agent pack works in tandem with the [Prometheus Operator pack](prometheus-operator.md). Check out the +guides [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) and +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) to learn how to create a +monitoring stack with Prometheus for your Palette environment. + +## Versions Supported + +**19.0.X** + +## Prerequisites + +- A host cluster that has the [Prometheus Operator pack](prometheus-operator.md) installed. + +## Parameters + +The Prometheus agent supports all the parameters exposed by the Prometheus Helm Chart. Refer to the +[Prometheus Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus#configuration) +documentation for details. + +From a Palette perspective, you must provide a value for the `remoteWrite.url` parameter shown in the following example. + +
+ +```yaml +charts: + prometheus: + server: + remoteWrite: + - url: "" +``` + +The `remoteWrite.url` is exposed by the [Prometheus Operator pack](prometheus-operator.md) when installed in a cluster. +You can find the Prometheus server URL by reviewing the details of the Kubernetes cluster hosting the Prometheus server. +Use the URL exposed by the Prometheus service. + +The following image displays a host cluster with the Prometheus Operator pack installed. Use the URL exposed for port +9090 to populate the `remoteWrite.url` parameter. + +![A view of the cluster details page with a highlighted box around the Prometheus service URL](/integrations_prometheus-agent_cluster-detail-view.webp) + +
+ +:::warning + +The Prometheus server URL must be in the format `http://HOST:PORT/api/v1/write`. Example: +`http://a2c938972938b4f0daee5f56edbd40af-1690032247.us-east-1.elb.amazonaws.com:9090/api/v1/write` + +::: + +If the Prometheus server is configured with authentication, add the authentication parameters. Replace `` and +`` with the actual credential values. + +
+ +```yaml +charts: + prometheus: + server: + remoteWrite: + - url: "" + remote_timeout: "5s" + basic_auth: + username: "" + password: +``` + +## Usage + +The Prometheus agent pack works out-of-the-box and only requires you to provide a Prometheus server URL. Add the +Prometheus agent pack to a cluster profile to get started with Prometheus. You can create a new cluster profile that has +the Prometheus agent as an add-on pack or you can update an existing cluster profile by adding the Prometheus agent +pack. For guidance, review +[Update a Cluster Profile](../profiles/cluster-profiles/modify-cluster-profiles/update-cluster-profile.md). + +Log in to the Grafana dashboard to view and create dashboards. You can find the Grafana dashboard URL by reviewing the +details of the Kubernetes cluster hosting the Prometheus server. Use the URL exposed by the +**prometheus-operator-kube-prometheus-stack-grafana** service. + +![The URL of the service prometheus-operator-kube-prometheus-stack-grafana](/integrations_prometheus-agent_cluster-detail-view-grafana.webp) + +Palette exposes a set of Grafana dashboards by default. You can find the Spectro Cloud dashboards by navigating to +Grafana's left **Main Menu** > **Dashboards** and expanding the **Spectro Cloud** folder. + +The following dashboards are available by default: + +- Kubernetes/System/API Server: A view of the resources and status of the Kubernetes cluster hosting the Prometheus + server. + +- Kubernetes/Views/Global: An aggregate view of all the resources used by Kubernetes clusters. + +- Kubernetes/Views/Namespaces: An aggregate view of all the resources used by a specific Kubernetes namespace. + +- Kubernetes/Views/Nodes: A view of all nodes with the Prometheus agent installed. + +- Kubernetes/Views/Pods: A view of all the pods in a node with the Prometheus agent installed. + +
+ +:::info + +Use the filters to narrow down the information displayed. All Palette dashboards include the **project** and **cluster** +filter. + +::: + +We encourage you to check out the [Grafana](https://grafana.com/tutorials/) tutorials and learning resources to learn +more about Grafana. + +## Terraform + +You can retrieve details about the Prometheus agent pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "pack-info" { + name = "prometheus-agent" + version = "19.0.2" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +# References + +- [Prometheus Operator pack](prometheus-operator.md) + +- [Prometheus Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus#configuration) + +- [Grafana Tutorials](https://grafana.com/tutorials/) diff --git a/docs/docs-content/integrations/prometheus-cluster-metrics.md b/docs/deprecated/integrations/prometheus-cluster-metrics.md similarity index 100% rename from docs/docs-content/integrations/prometheus-cluster-metrics.md rename to docs/deprecated/integrations/prometheus-cluster-metrics.md diff --git a/docs/deprecated/integrations/prometheus-operator.md b/docs/deprecated/integrations/prometheus-operator.md new file mode 100644 index 0000000000..a4e3ecc22d --- /dev/null +++ b/docs/deprecated/integrations/prometheus-operator.md @@ -0,0 +1,1240 @@ +--- +sidebar_label: "Prometheus Operator" +title: "Prometheus Operator" +description: "Prometheus Operator Monitoring pack in Spectro Cloud" +type: "integration" +hide_table_of_contents: true +category: ["monitoring", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/prometheus-operator/blobs/sha256:64589616d7f667e5f1d7e3c9a39e32c676e03518a318924e123738693e104ce0?type=image.webp" +tags: ["packs", "prometheus-operator", "monitoring"] +--- + +Prometheus is an open-source monitoring system that is designed to collect and analyze metrics from various sources, +such as applications, servers, and networks. It is widely used in the DevOps world to monitor the health and performance +of applications and infrastructure. Prometheus stores metrics in a time-series database and provides a query language +for analyzing the data. It also includes a powerful alerting system that can notify operators when thresholds are +breached. + +The Prometheus Operator is a tool that simplifies the deployment and management of Prometheus in a Kubernetes cluster. +It automates tasks such as configuring Prometheus, creating and managing Prometheus rules and alerts and scaling +Prometheus instances based on demand. The Operator uses Kubernetes custom resources to define and manage Prometheus +instances and related resources, such as ServiceMonitors, which enable Prometheus to discover and monitor services +running in the cluster. + +You can use the Prometheus Operator to create a monitoring stack that other host clusters point to and forward metrics +to. Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +:::info + +We recommend you use version v44.3.x or greater moving forward for a simplified and improved user experience when +creating a monitoring stack for your architecture. Starting with version v44.3.x the remote monitoring feature is +supported. Check out the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) to learn +more about the remote monitoring feature. + +::: + +## Versions Supported + + + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the + monitoring stack have 1.5x to 2x the minimum required size: + + Recommended size: + + - 8 CPU + - 16 GB Memory + - 20 GB Storage + + As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider + increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the + following resources from the monitoring stack: + + Each added agent: + + - 0.1 CPU + - 250 MiB Memory + - 1 GB Storage + + Refer to the + [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) + documentation for additional guidance. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +## Usage + +Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +#### Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This +plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require +this plugin to function properly. + +```yaml {5} +charts: + kube-prometheus-stack: + grafana: + plugins: + - grafana-piechart-panel +``` + +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, then by default a service with a load balancer will be created that exposes +port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different +object storage for event data. Refer to the +[Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. + +
+ +#### Remote Monitoring + +You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation +point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ +service. Use the generated service URL to provide other Kubernetes clusters with the installed +[Prometheus Agent](prometheus-agent.md) so that cluster metrics can be forwarded to the Prometheus server. + +The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can +change any configuration related to remote monitoring to fine-tune settings for your environment. + +Refer to the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) resource to learn more +about configuration options. + +To get started with remote monitoring, check out the +[Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. + +
+ +#### Palette Resources Monitoring + +You can access internal Palette metrics in Grafana by adding the +[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + +
+ +#### Persistent Storage + +You can configure the Prometheus Operator to use persistent storage. To enable persistent storage add the following code +snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML +configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. + +
+ +```yaml +kube-prometheus-stack: + prometheus: + prometheusSpec: + storageSpec: + volumeClaimTemplate: + metadata: + name: prom-operator-pvc + spec: + storageClassName: spectro-storage-class + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 5Gi +``` + +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/) + +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- Service monitors to scrape internal Kubernetes components + +
+ + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the + monitoring stack have 1.5x to 2x the minimum required size: + + Recommended size: + + - 8 CPU + - 16 GB Memory + - 20 GB Storage + + As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider + increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the + following resources from the monitoring stack: + + Each added agent: + + - 0.1 CPU + - 250 MiB Memory + - 1 GB Storage + + Refer to the + [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) + documentation for additional guidance. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +## Usage + +Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +#### Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This +plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require +this plugin to function properly. + +```yaml {5} +charts: + kube-prometheus-stack: + grafana: + plugins: + - grafana-piechart-panel +``` + +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, then by default a service with a load balancer will be created that exposes +port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different +object storage for event data. Refer to the +[Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. + +
+ +#### Remote Monitoring + +You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation +point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ +service. Use the generated service URL to provide other Kubernetes clusters with the installed +[Prometheus Agent](prometheus-agent.md) so that cluster metrics can be forwarded to the Prometheus server. + +The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can +change any configuration related to remote monitoring to fine-tune settings for your environment. + +Refer to the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) resource to learn more +about configuration options. + +To get started with remote monitoring, check out the +[Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. + +
+ +#### Palette Resources Monitoring + +You can access internal Palette metrics in Grafana by adding the +[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + +
+ +#### Persistent Storage + +You can configure the Prometheus Operator to use persistent storage. To enable persistent storage, add the following +code snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML +configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. + +
+ +```yaml +kube-prometheus-stack: + prometheus: + prometheusSpec: + storageSpec: + volumeClaimTemplate: + metadata: + name: prom-operator-pvc + spec: + storageClassName: spectro-storage-class + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 5Gi +``` + +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/) + +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- Service monitors to scrape internal Kubernetes components + +
+ + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the + monitoring stack have 1.5x to 2x the minimum required size: + + Recommended size: + + - 8 CPU + - 16 GB Memory + - 20 GB Storage + + As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider + increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the + following resources from the monitoring stack: + + Each added agent: + + - 0.1 CPU + - 250 MiB Memory + - 1 GB Storage + + Refer to the + [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) + documentation for additional guidance. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +## Usage + +Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +#### Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This +plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require +this plugin to function properly. + +```yaml {5} +charts: + kube-prometheus-stack: + grafana: + plugins: + - grafana-piechart-panel +``` + +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, then by default a service with a load balancer will be created that exposes +port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different +object storage for event data. Refer to the +[Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. + +
+ +#### Remote Monitoring + +You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation +point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ +service. Use the generated service URL to provide other Kubernetes clusters with the installed +[Prometheus Agent](prometheus-agent.md), so that cluster metrics can be forwarded to the Prometheus server. + +The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can +change any configuration related to remote monitoring to fine-tune settings for your environment. + +Refer to the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) resource to learn more +about the available configuration options. + +To get started with remote monitoring, check out the +[Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. + +
+ +#### Palette Resources Monitoring + +You can access internal Palette metrics in Grafana by adding the +[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + +
+ +#### Persistent Storage + +You can configure the Prometheus Operator to use persistent storage. To enable persistent storage add the following code +snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML +configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. + +
+ +```yaml +kube-prometheus-stack: + prometheus: + prometheusSpec: + storageSpec: + volumeClaimTemplate: + metadata: + name: prom-operator-pvc + spec: + storageClassName: spectro-storage-class + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 5Gi +``` + +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/) + +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- Service monitors to scrape internal Kubernetes components + +
+ + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the + monitoring stack have 1.5x to 2x the minimum required size: + + Recommended size: + + - 8 CPU + - 16 GB Memory + - 20 GB Storage + + As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider + increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the + following resources from the monitoring stack: + + Each added agent: + + - 0.1 CPU + - 250 MiB Memory + - 1 GB Storage + + Refer to the + [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) + documentation for additional guidance. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +## Usage + +Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +#### Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This +plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require +this plugin to function properly. + +```yaml {5} +charts: + kube-prometheus-stack: + grafana: + plugins: + - grafana-piechart-panel +``` + +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, then by default a service with a load balancer will be created that exposes +port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different +object storage for event data. Refer to the +[Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. + +
+ +#### Remote Monitoring + +You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation +point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ +service. Use the generated service URL to provide other Kubernetes clusters with the installed +[Prometheus Agent](prometheus-agent.md) so that cluster metrics can be forwarded to the Prometheus server. + +The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can +change any configuration related to remote monitoring to fine-tune settings for your environment. + +Refer to the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) resource to learn more +about configuration options. + +To get started with remote monitoring, check out the +[Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. + +
+ +#### Palette Resources Monitoring + +You can access internal Palette metrics in Grafana by adding the +[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + +
+ +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/) + +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- Service monitors to scrape internal Kubernetes components + +
+ + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the + monitoring stack have 1.5x to 2x the minimum required size: + + Recommended size: + + - 8 CPU + - 16 GB Memory + - 20 GB Storage. + + As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider + increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the + following resources from the monitoring stack: + + Each added agent: + + - 0.1 CPU + - 250 MiB Memory + - 1 GB Storage. + + Refer to the + [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) + documentation for additional guidance. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +## Usage + +Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. + +
+ +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, then by default a service with a load balancer will be created that exposes +port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different +object storage for event data. Refer to the +[Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. + +
+ +#### Remote Monitoring + +You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation +point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ +service. Use the generated service URL to provide other Kubernetes clusters with the +[Prometheus Agent](prometheus-agent.md) installed so that cluster metrics can be forwarded to the Prometheus server. + +The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can +change any configuration related to remote monitoring to fine-tune settings for your environment. + +Refer to the [Prometheus Remote Write](https://prometheus.io/docs/practices/remote_write/) resource to learn more about +configuration options. + +To get started with remote monitoring, check out the +[Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. + +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/). +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- and the service monitors to scrape internal Kubernetes components. + +
+ + + +## Prerequisites + +- Kubernetes v1.16 or greater. + +## Parameters + +The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the +[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) +documentation for details. + +The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: + +
+ +```yaml +charts: + kube-prometheus-stack: + grafana: + adminPassword: "" +``` + +Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. + +Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the +preset settings when you create the profile or when you deploy the cluster and review the cluster profile. + +![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) + +Review the usage section below to learn more about each preset option. + +
+ +#### Email Alerts + +You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to +enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. + +
+ +```yaml +charts: + kube-prometheus-stack: + alertmanager: + config: + receivers: + - name: email-alert + email_configs: + - to: @.com + send_resolved: true + from: @.com + smarthost: smtp..com:587 + auth_username: @.com + auth_identity: @.com + auth_password: +``` + +Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) +documentation to learn more about Alertmanager. + +
+ +#### Grafana Ingress + +You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to +enable HTTPS and require authentication for all Prometheus API requests. + +If you do not enable the ingress option, by default a service with a load balancer will be created that exposes port 80. + +Toggle the **Enable** button to enable the use of Ingress. + +
+ +#### Thanos SideCar + +[Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, +distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in +object storage, such as Amazon S3 or Google Cloud Storage, instead of a local disk. This enables Prometheus to scale +horizontally without the risk of using up local storage space. + +Toggle the **Enable** button to enable the use of Thanos. + +
+ +#### Object Store + +Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use +of object storage with Thanos. Refer to the +[Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about +how to configure each object storage. + +
+ +```yaml +charts: + kube-prometheus-stack: + prometheus: + prometheusSpec: + thanos: + objstoreConfig: +``` + +#### Thanos Ruler Object Store + +You can specify a different object storage to store the Thanos Ruler event data. Defaults to the object storage +specified for Thanos. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) +resource to learn more. + +
+ +### Dependencies + +The Prometheus Operator pack installs the following dependencies: + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) +- [Prometheus](https://prometheus.io/) +- [Prometheus Alertmanager](https://www.prometheus.io/docs/alerting/latest/alertmanager/). +- [node-exporter](https://github.com/helm/charts/tree/master/stable/prometheus-node-exporter) +- [kube-state-metrics](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) +- [Grafana](https://github.com/helm/charts/tree/master/stable/grafana) +- and the service monitors to scrape internal Kubernetes components. + +
+ + + +All versions less than v40.x.x are considered deprecated. Upgrade to a newer version to take advantage of the new +features. + + + +
+ +## Terraform + +You can retrieve details about the Prometheus operator pack by using the following Terraform code. + +
+ +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "pack-info" { + name = "prometheus-opeartor" + version = "45.4.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) + +- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) + +- [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write) + +- [Thanos & Prometheus](https://prometheus-operator.dev/docs/operator/thanos) + +- [Prometheus FAQ](https://prometheus.io/docs/introduction/faq) + +- [Prometheus Cluster Metrics](prometheus-cluster-metrics.md) diff --git a/docs/docs-content/integrations/rke2.md b/docs/deprecated/integrations/rke2.md similarity index 100% rename from docs/docs-content/integrations/rke2.md rename to docs/deprecated/integrations/rke2.md diff --git a/docs/docs-content/integrations/rook-ceph.md b/docs/deprecated/integrations/rook-ceph.md similarity index 100% rename from docs/docs-content/integrations/rook-ceph.md rename to docs/deprecated/integrations/rook-ceph.md diff --git a/docs/deprecated/integrations/spectro-k8s-dashboard.md b/docs/deprecated/integrations/spectro-k8s-dashboard.md new file mode 100644 index 0000000000..10c0c2081b --- /dev/null +++ b/docs/deprecated/integrations/spectro-k8s-dashboard.md @@ -0,0 +1,107 @@ +--- +sidebar_label: "Spectro Kubernetes Dashboard" +title: "Spectro Kubernetes Dashboard" +description: + "Palette's pre-configured Kubernetes Dashboard Monitoring pack reduces the complexity of standing up the Kubernetes + dashboard for a cluster." +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "arm64", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/k8s-dashboard/blobs/sha256:2de5d88b2573af42d4cc269dff75744c4174ce47cbbeed5445e51a2edd8b7429?type=image.webp" +tags: ["packs", "spectro-k8s-dashboard", "monitoring"] +--- + +Spectro Kubernetes Dashboard is a web-based UI for Kubernetes clusters that auto-enables the Kubernetes Dashboard using +secure ports and conveniently includes the [Spectro Proxy](frp.md) pack. + +## Versions Supported + +**2.7.x** + +
+ +## Prerequisites + +- Outbound internet connectivity for port 443 is allowed so that you and your applications can connect with the + [Spectro Proxy](frp.md) reverse proxy. + +- Users or groups must be mapped to a Kubernetes RBAC role, either a _Role_ or a _ClusterRole_. You can create a custom + role through a manifest and use Palette's roleBinding feature to associate users or groups with the role. Refer to the + [Create a Role Binding](../clusters/cluster-management/cluster-rbac.md#create-role-bindings) guide to learn more. + +## Parameters + + + +| Parameter | Description | Default | +| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | +| `namespace` | The Kubernetes namespace to install the dashboard. | `kubernetes-dashboard` | +| `ClusterRole` | The ClusterRole to assign to the Spectro Kubernetes Dashboard. | `read-only` | +| `certDuration` | Self-signed certificate duration in hours. | 8760h (365d) | +| `certRenewal` | Self-signed certificate renewal in hours | 720h (30d) | +| `enableInsecureLogin` | RBAC ensures secure login. | `false` | +| `serviceType` | The service type for the dashboard. Supported values are `ClusterIP`, `LoadBalancer`, and `NodePort`. | `ClusterIP` | +| `skipLogin` | Enables or disables the skip login option on the Spectro Kubernetes Dashboard. | `false` | +| `enableInsecureLogin` | Enables non-Secure Sockets Layer (SSL) login. Dashboard login is always restricted to HTTP(S) + localhost or HTTPS and external domain. | `false` | +| `ingress.enabled` | Ingress configuration to access the `ClusterIP`, `LoadBalancer`, or `NodePort`. | `false` | + +## Usage + +To use the Spectro Kubernetes Dashboard pack, you have to add it to your cluster profile. Spectro Kubernetes Dashboard +supports several public cloud and data center cloud environments. To learn more, refer to [Clusters](/clusters). + +Use the following information to find the Kubernetes Dashboard pack. + +- **Pack Type**: Monitoring +- **Registry**: Public Repo +- **Pack Name**: Spectro Kubernetes Dashboard +- **Pack Version**: 2.7.0 or higher + +Spectro Kubernetes Dashboard has the following Access options. + +
+ +- **Proxied**: This option is useful for access to the Kubernetes Dashboard from anywhere and leverages the Spectro + Proxy pack, which gets installed automatically. The Service resource for the Kubernetes Dashboard will be configured + as ClusterIP and is only accessible through the proxy. To learn more, check out the [Spectro Proxy](frp.md) guide. + +- **Direct**: This option is meant for a private configuration where a proxy is not implemented or not desired. The + Service resource for the Kubernetes Dashboard will be configured as LoadBalancer, which you can access directly. This + option requires you to be on a network that can reach the IP address given to the LoadBalancer service. + +## Terraform + +You can reference the Spectro Proxy pack in Terraform with a data resource. + +
+ +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s-dashboard" { + name = "spectro-k8s-dashboard" + version = "2.7.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Microsoft Access Control Using Kubernetes RBAC](https://learn.microsoft.com/en-us/azure/aks/azure-ad-rbac?toc=https%3A%2F%2Fdocs.micro[…]icrosoft.com%2Fen-us%2Fazure%2Fbread%2Ftoc.json&tabs=portal) + +- [Terraform Data Resource](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/pack) diff --git a/docs/docs-content/integrations/trident.md b/docs/deprecated/integrations/trident.md similarity index 100% rename from docs/docs-content/integrations/trident.md rename to docs/deprecated/integrations/trident.md diff --git a/docs/docs-content/integrations/ubuntu.md b/docs/deprecated/integrations/ubuntu.md similarity index 100% rename from docs/docs-content/integrations/ubuntu.md rename to docs/deprecated/integrations/ubuntu.md diff --git a/docs/deprecated/integrations/vault.md b/docs/deprecated/integrations/vault.md new file mode 100644 index 0000000000..2bad5981a8 --- /dev/null +++ b/docs/deprecated/integrations/vault.md @@ -0,0 +1,156 @@ +--- +sidebar_label: "Vault" +title: "Vault" +description: "Integration of the Vault add on into Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/vault/blobs/sha256:1abda0173be1fd4ddfeccd2ff15089edd38a25e433ad7bb562a770d92992c7af?type=image.webp" +tags: ["packs", "vault", "security"] +--- + +[Vault](https://www.vaultproject.io/) helps secure, store, and tightly control access to tokens, passwords, +certificates, encryption keys for protecting secrets, and other sensitive data using a UI, CLI, or HTTP API. + +Vault integration has the following components: + +- Vault server +- UI (optional). +- [Agent injector](https://www.vaultproject.io/docs/platform/k8s/injector/) (optional). + +## Versions Supported + + + + + +### Prerequisites + +- A Kubernetes cluster with Kubernetes version 1.22 or later. + +### Parameters + +The table lists commonly used parameters you can configure when adding this pack. + +| Parameters | Description | Default | +| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | +| `charts.vault.server.ingress` | Enable ingress traffic to the Vault server. If you want to enable ingress traffic, make sure that `charts.server.serviceType` is set to `"ClusterIP"` or is left empty. | `False` | +| `charts.vault.global.tlsDisable` | Disable TLS for end-to-end encrypted transport. | `True` | +| `charts.vault.agent.enabled` | Enable vault agent injection to inject secrets into the pods. | `-` | +| `charts.vault.server.ha` | Enable high-availability mode to protect against outages by running multiple Vault servers. For more information, refer to [Vault documentation](https://developer.hashicorp.com/vault/docs/internals/high-availability). | `false` | +| `charts.vault.server.dataStorage` | Controls the size, location, storage class of the persistent storage used by the Vault. | | +| `charts.vault.server.dev` | Enable dev server mode. The dev server mode skips most setup required before you can begin to use a Vault server, including initialization and unseal, and stores all data in-memory. For more details about dev server mode, refer to [Vault documentation](https://developer.hashicorp.com/vault/docs/concepts/dev-server). | `False` | +| `charts.vault.server.dev.devRootToken` | If you enabled dev server mode, this parameter specifies the root token for your Vault server. Root token has unlimited privileges and can do anything in Vault. | `"root"` | + +:::warning + +Never operate a dev mode server in production. It is insecure and loses data on every restart. + +::: + +### Usage + +HashiCorp provides many uses cases for Vault. For examples, refer to +[HashiCorp Vault documentation](https://developer.hashicorp.com/vault/docs/use-cases). + +#### Initialize and Unseal Vault + +If you enabled dev server mode, you do not need to initialize Vault and it is already unsealed. Use the root token you +configured in the `values.yaml` file to sign in to Vault directly. + +Before any operation can be performed on Vault, you need to initialize the first root token and keys that can be used to +unseal Vault. You can do so by following these steps: + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. Navigate to the left **Main Menu** and select **Clusters**. + +3. Select the cluster that has Vault installed to view its details page. + +4. Download the cluster **kubeconfig** file. + +5. Set up your local kubectl environment to use the **kubeconfig** file you downloaded. Review the + [Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide for additional guidance. + +6. You need to get the Vault namespace and application name. Issue the following command to get the unique values. + +
+ + ```shell + VAULT_NAMESPACE=$(kubectl get pods --selector app.kubernetes.io/name=vault --all-namespaces --output jsonpath='{.items[0].metadata.namespace}') && \ + APP_NAME=$(echo "$VAULT_NAMESPACE" | sed 's/-ns$//') + ``` + +7. Set up port forwarding by issuing the following command so you can access the Vault UI: + + ``` + kubectl port-forward $APP_NAME 8200:8200 --namespace $VAULT_NAMESPACE + ``` + +8. Open your browser and access the Vault UI at `https://localhost:8200/ui`. You will receive a warning due to using a + self-signed certificate, but you can ignore this warning. Follow the prompts on the UI to initialize your root token. + +:::tip + +If you do not want to use the Vault UI, you can also initialize and unseal Vault using the Vault CLI or API. For more +information, refer to +[Vault documentation](https://developer.hashicorp.com/vault/docs/platform/k8s/helm/run#initialize-and-unseal-vault). + +::: + +#### Storage + +In a production Vault server, backend storage is on a data persistent layer, is untrusted and only stores encrypted +data. In a dev mode Vault server, all data is stored in-memory and will be erased when Vault restarts. + +##### RKE2 + +When using Vault with the RKE2 distribution of Kubernetes in Palette Edge, you must explicitly specify a storage class +for the Vault server. To specify a storage class, change the value of the field +`charts.vault.server.dataStorage.storageClass` in `values.yaml` for the Vault pack in your cluster profile from `null` +to a storage class that meets your needs. Refer to +[Kubernetes documentation on storage classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) for more +details. + +### Terraform + +You can reference the Vault pack in Terraform with a data resource: + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "pack-info" { + name = "vault" + version = "0.22.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +
+ + + +:::warning + +All versions of the manifest-based pack less than v0.22.x are considered deprecated. Upgrade to a newer version to take +advantage of new features. + +::: + + + +
+ +## References + +- [Vault Agent injector](https://www.vaultproject.io/docs/platform/k8s/injector/) + +- [Injecting Vault Secrets Into Kubernetes Pods via a Sidecar - Blog](https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar/) + +- [Vault Agent Injector Examples](https://www.vaultproject.io/docs/platform/k8s/injector/examples/) + +- [Vault on Kubernetes Guide](https://www.vaultproject.io/docs/platform/k8s/helm/run) diff --git a/docs/docs-content/integrations/vsphere-csi.md b/docs/deprecated/integrations/vsphere-csi.md similarity index 100% rename from docs/docs-content/integrations/vsphere-csi.md rename to docs/deprecated/integrations/vsphere-csi.md diff --git a/docs/deprecated/integrations/vsphere-volume.md b/docs/deprecated/integrations/vsphere-volume.md new file mode 100644 index 0000000000..b3001834e2 --- /dev/null +++ b/docs/deprecated/integrations/vsphere-volume.md @@ -0,0 +1,49 @@ +--- +sidebar_label: "vSphere-Volume" +title: "vSphere Volume" +description: "vSphere volume storage add on into Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/csi-vsphere-volume/blobs/sha256:2cd106b353cb492d4647a1562fe59db6a1aeb792333900fe4e15237f899298b5?type=image.webp" +tags: ["packs", "vSphere-Volume", "storage"] +--- + +vSphere volume virtualizes SAN/NAS arrays, enabling an efficient operational model optimized for virtualized +environments and centered on the application instead of the infrastructure There are two types of provisioners for +vSphere storage classes: + +- CSI provisioner: csi.vsphere.vmware.com +- vCP provisioner: kubernetes.io/vsphere-volume + +## Versions Supported + + + + +- **1.0.0** + + + + +## Parameters + +| Name | Supported Values | Default Value | Description | +| -------------- | -------------------------------------- | ------------- | ---------------------------------------------------------------------------------------- | +| diskformat | thin, zeroedthick and eagerzeroedthick | zeroedthick | The storage account type to use | +| datastore | Datastore Name | | If specified, the volume will be created on the datastore specified in the storage class | +| isDefaultClass | true, false | true | Flag to denote if this StorageClass will be the default | + +## Troubleshooting + +Storage classes created by Spectro will be with the name "spectro-storage-class" and can be fetched from kubectl using +the following CLI command: + +```bash +kubectl get storageclass +``` + +## References + +- [vSphere Storage Class](https://kubernetes.io/docs/concepts/storage/storage-classes/#vsphere) diff --git a/docs/docs-content/byoos/byoos.md b/docs/docs-content/byoos/byoos.md index 78ab742b0e..96b1797c80 100644 --- a/docs/docs-content/byoos/byoos.md +++ b/docs/docs-content/byoos/byoos.md @@ -21,6 +21,4 @@ compatibility with your existing applications. The OS you bring can be commercia - [Create Images with Image Builder](../byoos/image-builder.md) -- [BYOOS Pack](../integrations/byoos.md) - -
+- diff --git a/docs/docs-content/byoos/image-builder.md b/docs/docs-content/byoos/image-builder.md index 878ad89a80..0c769dfe89 100644 --- a/docs/docs-content/byoos/image-builder.md +++ b/docs/docs-content/byoos/image-builder.md @@ -247,44 +247,47 @@ create the image. help you identify the correct value to provide. In the example output below, the tag values `distribution_version` and `distribution` are used to determine the correct values for the YAML. - ```shell hideClipboard - ==> amazon-ebs.{{user `build_name`}}: Creating AMI tags - amazon-ebs.{{user `build_name`}}: Adding tag: "build_date": "2023-05-10T17:19:37Z" - amazon-ebs.{{user `build_name`}}: Adding tag: "build_timestamp": "1683739177" - amazon-ebs.{{user `build_name`}}: Adding tag: "kubernetes_cni_version": "v1.2.0" - amazon-ebs.{{user `build_name`}}: Adding tag: "source_ami": "" - amazon-ebs.{{user `build_name`}}: Adding tag: "containerd_version": "1.6.20" - amazon-ebs.{{user `build_name`}}: Adding tag: "distribution_release": "Enterprise" - + amazon-ebs.{{user `build_name`}}: Adding tag: "distribution": "rhel" - amazon-ebs.{{user `build_name`}}: Adding tag: "image_builder_version": "" - amazon-ebs.{{user `build_name`}}: Adding tag: "kubernetes_version": "v1.24.11" - + amazon-ebs.{{user `build_name`}}: Adding tag: "distribution_version": "8 - ``` - - In this example, the YAML is updated to point to the RHEL image created earlier. Use the table below to learn more - about each variable. - - | **Parameter** | **Description** | **Type** | - | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | - | `osImageOverride` | The ID of the image to use as the base OS layer. This is the image ID as assigned in the infrastructure environment it belongs to. Example: `ami-0f4804aff4cf9c5a2`. | string | - | `osName` | The name of the OS distribution. Example: `rhel`. | string | - | `osVersion` | The version of the OS distribution. Example: `8` | string | - - ```yaml - pack: - osImageOverride: "ami-0f4804aff4cf9c5a2" - osName: "rhel" - osVersion: "8" - ``` - - :::info + ```shell hideClipboard + ==> amazon-ebs.{{user `build_name`}}: Creating AMI tags + amazon-ebs.{{user `build_name`}}: Adding tag: "build_date": "2023-05-10T17:19:37Z" + amazon-ebs.{{user `build_name`}}: Adding tag: "build_timestamp": "1683739177" + amazon-ebs.{{user `build_name`}}: Adding tag: "kubernetes_cni_version": "v1.2.0" + amazon-ebs.{{user `build_name`}}: Adding tag: "source_ami": "" + amazon-ebs.{{user `build_name`}}: Adding tag: "containerd_version": "1.6.20" + amazon-ebs.{{user `build_name`}}: Adding tag: "distribution_release": "Enterprise" + + amazon-ebs.{{user `build_name`}}: Adding tag: "distribution": "rhel" + amazon-ebs.{{user `build_name`}}: Adding tag: "image_builder_version": "" + amazon-ebs.{{user `build_name`}}: Adding tag: "kubernetes_version": "v1.24.11" + + amazon-ebs.{{user `build_name`}}: Adding tag: "distribution_version": "8 + ``` + + In this example, the YAML is updated to point to the RHEL image created earlier. Use the table below to learn more + about each variable. + + | **Parameter** | **Description** | **Type** | + | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | + | `osImageOverride` | The ID of the image to use as the base OS layer. This is the image ID as assigned in the infrastructure environment it belongs to. Example: `ami-0f4804aff4cf9c5a2`. | string | + | `osName` | The name of the OS distribution. Example: `rhel`. | string | + | `osVersion` | The version of the OS distribution. Example: `8` | string | + + ```yaml + pack: + osImageOverride: "ami-0f4804aff4cf9c5a2" + osName: "rhel" + osVersion: "8" + ``` + + + +:::info + +Depending on what platform you are targeting, the value you provide for `osImageOverride` may differ. For example, for +AWS, the value is the AMI ID. For vSphere, the value is VM template path and name. Refer to the +section of the BYOOS page for examples. - Depending on what platform you are targeting, the value you provide for `osImageOverride` may differ. For example, - for AWS, the value is the AMI ID. For vSphere, the value is VM template path and name. Refer to the - [Reference Custom Image](../integrations/byoos.md?edge-non-edge=Non-Edge#reference-custom-image) section of the - BYOOS page for examples. +::: - ::: + ![View of the cluster profile wizard](/clusters_byoos_image-builder_cluster-profile-byoos-yaml.webp) diff --git a/docs/docs-content/byoos/usecases/vmware/konvoy.md b/docs/docs-content/byoos/usecases/vmware/konvoy.md index e25d442f97..63ce2fdef5 100644 --- a/docs/docs-content/byoos/usecases/vmware/konvoy.md +++ b/docs/docs-content/byoos/usecases/vmware/konvoy.md @@ -9,8 +9,9 @@ sidebar_position: 10 tags: ["operating system", "byoos", "profiles", "konvoy", "vmware"] --- + This guide provides instructions for building a custom image using Red Hat Linux Enterprise (RHEL) with Konvoy. The -guide assumes that you have a basic understanding of VMware vSphere, RHEL and [Konvoy](../../../integrations/konvoy.md). +guide assumes that you have a basic understanding of VMware vSphere, RHEL and . You will use the [Konvoy image builder](https://github.com/mesosphere/konvoy-image-builder) project to build the custom RHEL image with Konvoy. The custom image will be used to deploy a Kubernetes cluster on VMware vSphere. @@ -186,9 +187,10 @@ instructions on how to build the custom RHEL with Konvoy image. + 7. Review the **images/common.yaml** file and modify the file if necessary. The **common.yaml** file is where you - specify the Kubernetes version. Refer to the [Konvoy](../../../integrations/konvoy.md) pack reference page to learn - about supported Konvoy versions. + specify the Kubernetes version. Refer to the pack reference page to learn about + supported Konvoy versions. ```yaml hideClipboard {2} --- @@ -329,9 +331,10 @@ instructions on how to build the custom RHEL with Konvoy image. + 7. Review the **images/common.yaml** file and modify the file if necessary. The **common.yaml** file is where you - specify the Kubernetes version. Refer to the[Konvoy](../../../integrations/konvoy.md) pack reference page to learn - about supported Konvoy versions. + specify the Kubernetes version. Refer to the pack reference page to learn about + supported Konvoy versions. ```yaml hideClipboard {2} --- @@ -441,11 +444,12 @@ instructions on how to build the custom RHEL with Konvoy image. ## Usage with Cluster Profile + To use the custom RHEL with Konvoy image, create a -[cluster profile](../../../profiles/cluster-profiles/create-cluster-profiles/create-full-profile.md) and use the -[BYOOS](../../../integrations/byoos.md) pack to reference the custom RHEL with Konvoy image. Specify the vSphere path to -the custom RHEL with Konvoy image in the pack's YAML file. The following example YAML content demonstrates how to use -the custom RHEL with Konvoy image in a cluster profile. +[cluster profile](../../../profiles/cluster-profiles/create-cluster-profiles/create-full-profile.md) and use the pack to reference the custom RHEL with +Konvoy image. Specify the vSphere path to the custom RHEL with Konvoy image in the pack's YAML file. The following +example YAML content demonstrates how to use the custom RHEL with Konvoy image in a cluster profile. + ```yaml hideClipboard {2} pack: diff --git a/docs/docs-content/byoos/usecases/vmware/rhel-pxk.md b/docs/docs-content/byoos/usecases/vmware/rhel-pxk.md index 7235872c95..caa6b7f0c9 100644 --- a/docs/docs-content/byoos/usecases/vmware/rhel-pxk.md +++ b/docs/docs-content/byoos/usecases/vmware/rhel-pxk.md @@ -274,30 +274,32 @@ want to create a FIPS-compliant image or a non-FIPS-compliant image. --> vsphere-iso.vsphere: rhel-8-kube-v1.27.11 ``` + + 14. The custom RHEL image with PXK is now built and available in the VMware vSphere environment. You can use this image - to deploy a Kubernetes cluster. To use the image, create a cluster profile with and select the - [BYOOS pack](../../../integrations/byoos.md). Refer to the custom image in the cluster profile when populating the - image details. You need to refer to the VM template path of the image. - - ```yaml hideClipboard - pack: - osImageOverride: "/Datacenter/vm/sp-docs/rhel-8-kube-v1.27.11" - osName: "rhel" - osVersion: "8.8" - ``` + to deploy a Kubernetes cluster. To use the image, create a cluster profile with and select the . Refer to the custom image in the cluster profile when populating the image details. You need to refer to the VM template path of the image. + + ```yaml hideClipboard + pack: + osImageOverride: "/Datacenter/vm/sp-docs/rhel-8-kube-v1.27.11" + osName: "rhel" + osVersion: "8.8" + ``` + + Using the following image, take note of the three numbers highlighted in the image name. - Using the following image, take note of the three numbers highlighted in the image name. + 1. The BYOOS pack is selected as the operating system layer. + 2. The custom RHEL image template is specified in the `osImageOverride` field. + 3. The Kubernetes version is set to `1.27.11`, the same version specified in the `kubernetes.json` file. - 1. The BYOOS pack is selected as the operating system layer. - 2. The custom RHEL image template is specified in the `osImageOverride` field. - 3. The Kubernetes version is set to `1.27.11`, the same version specified in the `kubernetes.json` file. + ![A cluster profile using a custom RHEL image](/byoos_vmware_rhewl-pxk_cluster-profile.webp) - ![A cluster profile using a custom RHEL image](/byoos_vmware_rhewl-pxk_cluster-profile.webp) + Complete the remaining steps in the + [cluster profile creation process](../../../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md). + Use the cluster profile to deploy a Kubernetes cluster in your VMware vSphere environment with the custom RHEL + image. - Complete the remaining steps in the - [cluster profile creation process](../../../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md). - Use the cluster profile to deploy a Kubernetes cluster in your VMware vSphere environment with the custom RHEL - image. + @@ -504,30 +506,35 @@ want to create a FIPS-compliant image or a non-FIPS-compliant image. --> vsphere-iso.vsphere: rhel-8-kube-v1.27.11 ``` + + 14. The custom RHEL image with PXK is now built and available in the VMware vSphere environment. You can use this image to deploy a Kubernetes cluster. To use the image, create a cluster profile with and select the - [BYOOS pack](../../../integrations/byoos.md). Refer to the custom image in the cluster profile when populating the - image details. You need to refer to the VM template path of the image. - - ```yaml hideClipboard - pack: - osImageOverride: "/Datacenter/vm/sp-docs/rhel-8-kube-v1.27.11" - osName: "rhel" - osVersion: "8.8" - ``` - Using the following image, take note of the three numbers highlighted in the image name. + . Refer to the custom image in the + cluster profile when populating the image details. You need to refer to the VM template path of the image. + + ```yaml hideClipboard + pack: + osImageOverride: "/Datacenter/vm/sp-docs/rhel-8-kube-v1.27.11" + osName: "rhel" + osVersion: "8.8" + ``` + + Using the following image, take note of the three numbers highlighted in the image name. + + 1. The BYOOS pack is selected as the operating system layer. + 2. The custom RHEL image template is specified in the `osImageOverride` field. + 3. The Kubernetes version is set to `1.27.11`, the same version specified in the `kubernetes.json` file. - 1. The BYOOS pack is selected as the operating system layer. - 2. The custom RHEL image template is specified in the `osImageOverride` field. - 3. The Kubernetes version is set to `1.27.11`, the same version specified in the `kubernetes.json` file. + ![A cluster profile using a custom RHEL image](/byoos_vmware_rhewl-pxk_cluster-profile-non-fips.webp) - ![A cluster profile using a custom RHEL image](/byoos_vmware_rhewl-pxk_cluster-profile-non-fips.webp) + Complete the remaining steps in the + [cluster profile creation process](../../../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md). + Use the cluster profile to deploy a Kubernetes cluster in your VMware vSphere environment with the custom RHEL + image. - Complete the remaining steps in the - [cluster profile creation process](../../../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md). - Use the cluster profile to deploy a Kubernetes cluster in your VMware vSphere environment with the custom RHEL - image. + diff --git a/docs/docs-content/clusters/cluster-management/cluster-rbac.md b/docs/docs-content/clusters/cluster-management/cluster-rbac.md index c7d984b843..826f16f8f6 100644 --- a/docs/docs-content/clusters/cluster-management/cluster-rbac.md +++ b/docs/docs-content/clusters/cluster-management/cluster-rbac.md @@ -130,9 +130,10 @@ To create a role binding the role must exist inside the host cluster. You can us [default cluster roles](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) provided by Kubernetes. The alternative to default cluster roles is to create a role by using a manifest in the cluster profile. + If you have OpenID Connect (OIDC) configured at the Kubernetes layer of your cluster profile, you can create a role binding that maps individual users or groups assigned within the OIDC provider's configuration to a role. To learn more, -review [Use RBAC with OIDC](../../integrations/kubernetes-generic.md#configure-custom-oidc). +review . ### Enablement diff --git a/docs/docs-content/clusters/cluster-management/kubeconfig.md b/docs/docs-content/clusters/cluster-management/kubeconfig.md index 2dbfbcdb68..f0dfc9f886 100644 --- a/docs/docs-content/clusters/cluster-management/kubeconfig.md +++ b/docs/docs-content/clusters/cluster-management/kubeconfig.md @@ -81,7 +81,7 @@ The access you have as a user to the kubeconfig files for a cluster depends on t ::: -- Is the [Spectro Proxy](../../integrations/frp.md) enabled for the cluster? +- Is the enabled for the cluster? Use the tables below to help you identify which project role you need to access the kubeconfig file for a cluster. diff --git a/docs/docs-content/clusters/cluster-management/monitoring/deploy-monitor-stack.md b/docs/docs-content/clusters/cluster-management/monitoring/deploy-monitor-stack.md index 62fa7fee0b..5a560afb30 100644 --- a/docs/docs-content/clusters/cluster-management/monitoring/deploy-monitor-stack.md +++ b/docs/docs-content/clusters/cluster-management/monitoring/deploy-monitor-stack.md @@ -13,15 +13,17 @@ The monitoring stack you will deploy uses the open-source tool, The monitoring stack is a centralized server or aggregation spot to which all other clusters will forward metrics. The monitoring stack is a dedicated Kubernetes cluster for monitoring and metrics aggregation in your Palette environment. + + The monitoring stack uses a server-client architecture. The monitoring stack uses the -[Prometheus Operator](../../../integrations/prometheus-operator.md) pack to deploy all the dependencies the Prometheus + pack to deploy all the dependencies the Prometheus server requires. The server exposes an API endpoint for all other clients to forward metrics. The clients are Kubernetes -clusters with the [Prometheus Agent](../../../integrations/prometheus-agent.md) pack installed and configured. +clusters with the pack installed and configured. Use the following steps to deploy a monitoring stack, and learn how to configure a host cluster to forward metrics to the monitoring stack. -
+ :::warning @@ -107,10 +109,13 @@ You can choose to deploy the monitoring stack with or without authentication. 10. Next, click on the **Presets** button to expand the options drawer. + + 11. Scroll down the presets option menu and enable **Remote Monitoring**. Confirm your changes. You can enable several - options to expand the functionality of the monitoring stack. Review the - [Prometheus Operator](../../../integrations/prometheus-operator.md) pack documentation to learn more about the - available options. +options to expand the functionality of the monitoring stack. Review the + pack documentation to +learn more about the available options. + 12. Confirm your changes by selecting **Confirm & Create**. @@ -131,8 +136,8 @@ You can choose to deploy the monitoring stack with or without authentication. - **Pack Type**: Monitoring - **Registry**: Public Repo - - **Pack Name**: Spectrocloud Grafana Dashboards - - **Pack Version**: 1.0.X or newer + - **Pack Name**: Spectro Grafana Dashboards + - **Pack Version**: 4.0.X or newer 18. Use the default values. Confirm your changes by selecting **Confirm & Create**. @@ -296,19 +301,23 @@ charts: 16. Next, update the `prometheus.service.type` parameter to `ClusterIP`. -
+
- ```yaml - charts: - kube-prometheus-stack: - prometheus: - service: - type: ClusterIP - ``` + ```yaml + charts: + kube-prometheus-stack: + prometheus: + service: + type: ClusterIP + ``` + + 17. Confirm your changes by selecting **Confirm & Create**. You can enable several options to expand the functionality - of the monitoring stack. Review the [Prometheus Operator](../../../integrations/prometheus-operator.md) pack - documentation to learn more about the available options. +of the monitoring stack. Review the + pack documentation to +learn more about the available options. + 18. Click on **Add New Pack**. diff --git a/docs/docs-content/clusters/cluster-management/monitoring/monitoring.md b/docs/docs-content/clusters/cluster-management/monitoring/monitoring.md index b4b3177780..44271a7578 100644 --- a/docs/docs-content/clusters/cluster-management/monitoring/monitoring.md +++ b/docs/docs-content/clusters/cluster-management/monitoring/monitoring.md @@ -11,24 +11,31 @@ understand the resource utilization of the cluster. The workload metrics Palette offer a limited ability to review past values. Administrators who want more information or a better understanding of their cluster metrics should consider using a dedicated monitoring system. -Several Packs are available in the [monitoring](../../../integrations/integrations.mdx) category that you can use to add -additional monitoring capabilities to your cluster and help you get answers to questions. For a more robust and scalable -solution, we recommend creating a dedicated monitoring stack for your environment. You can deploy a monitoring stack -that uses [Prometheus](https://prometheus.io/) to collect metrics from all clusters in your environment. +Several Packs are available in the monitoring category that you can use to add additional monitoring capabilities to +your cluster and help you get answers to questions. For a more robust and scalable solution, we recommend creating a +dedicated monitoring stack for your environment. You can deploy a monitoring stack that uses +[Prometheus](https://prometheus.io/) to collect metrics from all clusters in your environment. To help you get started with deploying a monitoring stack to your Palette environment, check out the [Deploy Monitoring Stack](deploy-monitor-stack.md) and the [Enable Monitoring on Host Cluster](deploy-agent.md) guide. ## Resources + + - [Deploy Monitoring Stack](deploy-monitor-stack.md) - [Enable Monitoring on Host Cluster](deploy-agent.md) -- [Prometheus Operator Pack](../../../integrations/prometheus-operator.md) +- + + +- + + +- -- [Prometheus Agent Pack](../../../integrations/prometheus-agent.md) -- [Prometheus Cluster Metrics](../../../integrations/prometheus-cluster-metrics.md) +- -- [Spectro Cloud Grafana Dashboards](../../../integrations/grafana-spectrocloud-dashboards.md) + diff --git a/docs/docs-content/clusters/cluster-management/palette-webctl.md b/docs/docs-content/clusters/cluster-management/palette-webctl.md index a1722d37c1..11a843ac6d 100644 --- a/docs/docs-content/clusters/cluster-management/palette-webctl.md +++ b/docs/docs-content/clusters/cluster-management/palette-webctl.md @@ -31,7 +31,7 @@ files to and from a virtual machine using Secure Copy Protocol (SCP). guidance. - A host cluster that is either publicly accessible OR a private host cluster that has the - [Spectro Proxy](../../integrations/frp.md) installed. + installed. :::warning diff --git a/docs/docs-content/clusters/data-center/nutanix/create-manage-nutanix-cluster.md b/docs/docs-content/clusters/data-center/nutanix/create-manage-nutanix-cluster.md index daa88ede13..fe49f7669c 100644 --- a/docs/docs-content/clusters/data-center/nutanix/create-manage-nutanix-cluster.md +++ b/docs/docs-content/clusters/data-center/nutanix/create-manage-nutanix-cluster.md @@ -25,7 +25,8 @@ section guides you in creating and updating a Kubernetes cluster in a Nutanix cl [Create an Infrastructure Profile](../../../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md). At the **Cloud Type** step of profile creation, select **Nutanix** listed under the **Tech Preview**. Select the custom packs provided at the OS and Kubernetes layers. Palette provides out-of-the-box packs for the network and - storage profile layers, including the [**Nutanix CSI**](../../../integrations/nutanix-csi.md) storage pack. + storage profile layers, including the + storage pack. - A Nutanix Prism Central account with _Prism Admin_ role. diff --git a/docs/docs-content/clusters/data-center/nutanix/nutanix.md b/docs/docs-content/clusters/data-center/nutanix/nutanix.md index 7e2bbdc2b5..550abfd0d7 100644 --- a/docs/docs-content/clusters/data-center/nutanix/nutanix.md +++ b/docs/docs-content/clusters/data-center/nutanix/nutanix.md @@ -57,14 +57,14 @@ steps in Palette and their local environment. you configured it in the previous step. You must fill out the account name and account details. 4. Create a cluster profile by selecting Nutanix as the cloud type. - + When creating a Nutanix profile, you do not have to specify anything for the OS or Kubernetes layers. Palette provides out-of-the-box packs for the network and storage profile layers, including the - [**Nutanix CSI**](../../../integrations/nutanix-csi.md) storage pack. The **Nutanix CSI** pack is available when the - cloud is registered using the name `nutanix`. If you have custom packs, you can add them to Palette by adding your - registry. To learn how to add a pack registry, review - [Add a Custom Registry](/docs/docs-content/registries-and-packs/adding-a-custom-registry.md). - + storage pack. The **Nutanix CSI** + pack is available when the cloud is registered using the name `nutanix`. If you have custom packs, you can add them + to Palette by adding your registry. To learn how to add a pack registry, review [Add a Custom + Registry](/docs/docs-content/registries-and-packs/adding-a-custom-registry.md). + 5. Deploy a cluster by specifying Nutanix, listed under **Tech Preview**, as the cluster type. Select the cloud account you added and make any needed changes to the profile layers by using the YAML editor. At the **Cluster Config** step, customize the Cluster configuration and Node configuration YAML files by replacing any undefined variables in curly diff --git a/docs/docs-content/clusters/data-center/nutanix/register-nutanix-cloud.md b/docs/docs-content/clusters/data-center/nutanix/register-nutanix-cloud.md index a2509804b5..aa3b958ecc 100644 --- a/docs/docs-content/clusters/data-center/nutanix/register-nutanix-cloud.md +++ b/docs/docs-content/clusters/data-center/nutanix/register-nutanix-cloud.md @@ -118,10 +118,9 @@ Use the following steps to prepare to register your cloud with Palette. ::: -8. In **controlPlanePoolTemplate.yaml**, edit the KubeadmControlPlane object to enable the - [**Nutanix CSI**](../../../integrations/nutanix-csi.md) pack. Include a new line with the - `- systemctl enable --now iscsid` command below the `preKubeadmCommands:` line, keeping proper indentation as - illustrated below. +8. In **controlPlanePoolTemplate.yaml**, edit the KubeadmControlPlane object to enable the **Nutanix CSI** pack. Include + a new line with the `- systemctl enable --now iscsid` command below the `preKubeadmCommands:` line, keeping proper + indentation as illustrated below. ```bash preKubeadmCommands: @@ -131,10 +130,9 @@ Use the following steps to prepare to register your cloud with Palette. 9. In **workerPoolTemplate.yaml**, change `providerID` to `providerID: nutanix://${CLUSTER_NAME}-m1-mt-0` within the `NutanixMachineTemplate` object. -10. In **workerPoolTemplate.yaml**, edit the KubeadmConfigTemplate object to enable the - [**Nutanix CSI**](../../../integrations/nutanix-csi.md) pack. Include a new line with the - `- systemctl enable --now iscsid` command below the `preKubeadmCommands:` line, keeping proper indentation as - illustrated below. +10. In **workerPoolTemplate.yaml**, edit the KubeadmConfigTemplate object to enable the **Nutanix CSI** pack. Include a + new line with the `- systemctl enable --now iscsid` command below the `preKubeadmCommands:` line, keeping proper + indentation as illustrated below. ```bash preKubeadmCommands: @@ -229,8 +227,7 @@ Nutanix cloud to Palette. Alternatively, you can use an API platform such as [Po The CLOUD_TYPE variable value must be set as `nutanix`, as this value will be used in the following steps. Moreover, in the cloud registration API, set `name` as `nutanix`. Setting `name` as `nutanix` will make the - out-of-the-box [**Nutanix CSI**](../../../integrations/nutanix-csi.md) pack available to users when they create a - cluster profile in Palette. + out-of-the-box **Nutanix CSI** pack available to users when they create a cluster profile in Palette. ::: diff --git a/docs/docs-content/clusters/edge/edgeforge-workflow/edgeforge-workflow.md b/docs/docs-content/clusters/edge/edgeforge-workflow/edgeforge-workflow.md index f1ffde2fea..1449c22cbe 100644 --- a/docs/docs-content/clusters/edge/edgeforge-workflow/edgeforge-workflow.md +++ b/docs/docs-content/clusters/edge/edgeforge-workflow/edgeforge-workflow.md @@ -138,10 +138,13 @@ scenario, use the CLIs to help you with the customization. [Prepare User Data](/clusters/edge/edgeforge-workflow/prepare-user-data) guide to learn more about user data and when to use multiple user data files. + + - **Bring Your Own OS (BYOOS)**: For environments that require a different runtime OS, you can specify another OS - through the [BYOOS](/integrations/byoos) option. Follow the instructions in the - [Build Edge Artifacts](/clusters/edge/edgeforge-workflow/palette-canvos) guide to learn more about how you can - customize the OS used in an Edge deployment. +through the option. Follow the +instructions in the [Build Edge Artifacts](/clusters/edge/edgeforge-workflow/palette-canvos) guide to learn more about +how you can customize the OS used in an Edge deployment. + ## Resources diff --git a/docs/docs-content/clusters/edge/edgeforge-workflow/palette-canvos/palette-canvos.md b/docs/docs-content/clusters/edge/edgeforge-workflow/palette-canvos/palette-canvos.md index a228d3c758..50953775f2 100644 --- a/docs/docs-content/clusters/edge/edgeforge-workflow/palette-canvos/palette-canvos.md +++ b/docs/docs-content/clusters/edge/edgeforge-workflow/palette-canvos/palette-canvos.md @@ -326,8 +326,8 @@ customization. 15. Navigate to the left **Main Menu** and select **Profiles**. Click on the **Add Cluster Profile** button, and fill out the required basic information fields to create a cluster profile for Edge. -16. Add the following [BYOS Edge OS](../../../../integrations/byoos.md) pack to the OS layer in the **Profile Layers** - section. +16. Add the following pack to the OS + layer in the **Profile Layers** section. | **Pack Type** | **Registry** | **Pack Name** | **Pack Version** | | ------------- | ------------ | ------------- | ---------------- | @@ -788,8 +788,8 @@ git checkout v4.0.6 19. Navigate to the left **Main Menu** and select **Profiles**. Click on the **Add Cluster Profile** button, and fill out the required basic information fields to create a cluster profile for Edge. -20. Add the following [BYOS Edge OS](../../../../integrations/byoos.md) pack to the OS layer in the **Profile Layers** - section. +20. Add the following pack to the OS + layer in the **Profile Layers** section. | **Pack Type** | **Registry** | **Pack Name** | **Pack Version** | | ------------- | ------------ | ------------- | ---------------- | diff --git a/docs/docs-content/clusters/edge/edgeforge-workflow/prepare-user-data.md b/docs/docs-content/clusters/edge/edgeforge-workflow/prepare-user-data.md index 5eaeff51c3..c4b21bc425 100644 --- a/docs/docs-content/clusters/edge/edgeforge-workflow/prepare-user-data.md +++ b/docs/docs-content/clusters/edge/edgeforge-workflow/prepare-user-data.md @@ -279,10 +279,9 @@ file named **user-data**, which allows your cluster to use directories or files Kubernetes cluster. This setup is useful for scenarios where your applications are active in the cluster and need direct access to files or directories on the Edge host. -Several packs require you set up bind mounts in order to function. For example, the -[Portworx pack](../../../integrations/portworx.md) requires several folders to be mounted on Edge deployments. You can -use the `install.bind_mounts` parameter to specify folders to be mounted. For example, the following user data mounts -three folders required by Portworx from the Edge host to the cluster. + +Several packs require you set up bind mounts in order to function. For example, the requires several folders to be mounted on Edge deployments. You can use the `install.bind_mounts` parameter to specify folders to be mounted. For +example, the following user data mounts three folders required by Portworx from the Edge host to the cluster. ```yaml #cloud-config diff --git a/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md b/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md index 5ef71c8b80..a4b56565bd 100644 --- a/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md +++ b/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md @@ -207,9 +207,9 @@ node pool. ### Limitations -- In a multi-node cluster with [PXK-E](../../../integrations/kubernetes-edge.md) as its Kubernetes layer, you cannot - change custom Network Interface Card (NIC). When you add an Edge host to such a cluster, leave the NIC field as its - default value. +- In a multi-node cluster with as its Kubernetes + layer, you cannot change custom Network Interface Card (NIC). When you add an Edge host to such a cluster, leave the + NIC field as its default value. ### Prerequisites diff --git a/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/deploy-private-registry.md b/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/deploy-private-registry.md index bd47d5cd77..06a0764a19 100644 --- a/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/deploy-private-registry.md +++ b/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/deploy-private-registry.md @@ -83,49 +83,52 @@ to use a private registry for images other the provider images, refer to ::: -6. At the root level of YAML for your OS layer, add the `providerCredentials` field to provide the credentials you need - to authenticate with your registry. For more information about the `providerCredentials` field, refer to - [Bring Your Own OS (BYOOS)](../../../../integrations/byoos.md) pack page. The `providerCredentials.password` field - will be masked when you provide it in the YAML file. You can also use a macro to store your credentials instead of - providing it directly in the YAML file. For more information, refer to - [Macros Support](../../../cluster-management/macros.md): - - ```yaml {7-8} - pack: - content: - images: - - image: '{{.spectro.pack.edge-native-byoi.options.system.uri}}' - # - image: example.io/my-other-images/example:v1.0.0 - # - image: example.io/my-super-other-images/example:v1.0.0 - providerCredentials: - registry: - # - e.x. registry: registry-1.docker.io - user: user - password: ****** - certificates: | - -----BEGIN CERTIFICATE----- - MIIDVzCCAj+gAwIBAgIRANtGPo/hFkZtYRNw0KaeW54wDQYJKoZIhvcNAQELBQAw - ---------------------------------------------------------------- - 7OicCaV35lje5FSl0owu74ghAlCgMyAdKsJf615g1kKO4V5E2BMErd9Ibw== - -----END CERTIFICATE----- - - options: - system.uri: example.io/my-images/example-custom-os:v1.4.5 - ``` - -7. If you are updating an existing profile, click **Confirm changes**, and then click **Save changes** to publish the - new version of your cluster profile. If you are creating a new profile, click **Next layer** and finish configuring - the remaining layers. - -8. If you already have an active cluster that is using the original version of the cluster profile, update the cluster - so that it uses the new version of the cluster profile you just published. For more information about updating - clusters, refer to [Update a Cluster](../../../cluster-management/cluster-updates.md). This will trigger a full - cluster repave since it includes an update to the OS layer of the cluster. To learn more about cluster repave - behavior, refer to - [Repave Behavior and Configuration](../../../cluster-management/node-pool.md#repave-behavior-and-configuration). - - If you don't have an active cluster yet, deploy a new cluster with the profile you just created, and the cluster will - pull images from the private registry you specified. + + +6. At the root level of YAML for your OS layer, add the `providerCredentials` field to provide the credentials you need + to authenticate with your registry. For more information about the `providerCredentials` field, refer to + pack page. The + `providerCredentials.password` field will be masked when you provide it in the YAML file. You can also use a macro + to store your credentials instead of providing it directly in the YAML file. For more information, refer to + [Macros Support](../../../cluster-management/macros.md): + + + ```yaml {7-8} + pack: + content: + images: + - image: '{{.spectro.pack.edge-native-byoi.options.system.uri}}' + # - image: example.io/my-other-images/example:v1.0.0 + # - image: example.io/my-super-other-images/example:v1.0.0 + providerCredentials: + registry: + # - e.x. registry: registry-1.docker.io + user: user + password: ****** + certificates: | + -----BEGIN CERTIFICATE----- + MIIDVzCCAj+gAwIBAgIRANtGPo/hFkZtYRNw0KaeW54wDQYJKoZIhvcNAQELBQAw + ---------------------------------------------------------------- + 7OicCaV35lje5FSl0owu74ghAlCgMyAdKsJf615g1kKO4V5E2BMErd9Ibw== + -----END CERTIFICATE----- + + options: + system.uri: example.io/my-images/example-custom-os:v1.4.5 + ``` + +7. If you are updating an existing profile, click **Confirm changes**, and then click **Save changes** to publish the + new version of your cluster profile. If you are creating a new profile, click **Next layer** and finish configuring + the remaining layers. + +8. If you already have an active cluster that is using the original version of the cluster profile, update the cluster + so that it uses the new version of the cluster profile you just published. For more information about updating + clusters, refer to [Update a Cluster](../../../cluster-management/cluster-updates.md). This will trigger a full + cluster repave since it includes an update to the OS layer of the cluster. To learn more about cluster repave + behavior, refer to + [Repave Behavior and Configuration](../../../cluster-management/node-pool.md#repave-behavior-and-configuration). + + If you don't have an active cluster yet, deploy a new cluster with the profile you just created, and the cluster + will pull images from the private registry you specified. ## Validate diff --git a/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/local-registry.md b/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/local-registry.md index 1715d1541f..c2704b3279 100644 --- a/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/local-registry.md +++ b/docs/docs-content/clusters/edge/site-deployment/deploy-custom-registries/local-registry.md @@ -17,13 +17,13 @@ Installer ISO will also be loaded into the Harbor registry. For more information to [Build Content Bundle](../../edgeforge-workflow/palette-canvos/build-content-bundle.md) and [Build Edge Artifacts with Content Bundles](../../edgeforge-workflow/palette-canvos/palette-canvos.md). + If you enable the local Harbor registry on a cluster, the Palette agent will pull all images requested by the cluster from the Harbor registry. If your cluster uses any image that is not included in your cluster profile, you will need to instruct the Palette agent to not pull that image from the Harbor registry by disabling this behavior for certain namespaces. You can do this by giving a namespace the label `stylus.io/imageswap=disable`. For more information, refer -to -[Harbor Edge-Native Config pack](../../../../integrations/harbor-edge.md#enable-image-download-from-outside-of-harbor) -documentation. +to documentation. + :::preview @@ -69,9 +69,11 @@ documentation. - enable-admission-plugins=NamespaceLifecycle,ServiceAccount,NodeRestriction ``` + 6. Click **Add New Pack** and search for the **Harbor Edge Native Config** pack. Add the pack to your cluster profile. - For more information about the pack and its parameters, refer to - [Harbor Edge Native Config pack documentation](../../../../integrations/harbor-edge.md). + For more information about the pack and its parameters, refer to . + + 7. In the `harbor-config.storage` parameter, make sure you allocate enough storage in the `registry` field to store all your images. @@ -100,11 +102,14 @@ documentation. connection. Dismiss the warning, and you will be directed to Harbor's web UI. If you are using Google Chrome, you can click anywhere in your browser tab and type `thisisunsafe` using your keyboard to dismiss the warning. + + 6. Type in your credentials to log in to Harbor. The username is always `admin`. The password is what you configured - during cluster creation. If you don't know your password, refer to - [Retrieve Harbor Credentials](../../../../integrations/harbor-edge.md#retrieve-harbor-credentials) to retrieve your + during cluster creation. If you don't know your password, refer to to retrieve your password. + + 7. In the **Projects** view, select the **spectro-images** project. 8. Confirm that all images required by the cluster are stored in the project. diff --git a/docs/docs-content/clusters/edge/site-deployment/model-profile.md b/docs/docs-content/clusters/edge/site-deployment/model-profile.md index 33f029ef49..73c4fea4fb 100644 --- a/docs/docs-content/clusters/edge/site-deployment/model-profile.md +++ b/docs/docs-content/clusters/edge/site-deployment/model-profile.md @@ -62,35 +62,39 @@ needs. Refer to the EdgeForge [Build Images](../edgeforge-workflow/palette-canvos/palette-canvos.md) guide if you are missing a custom OS image. The following is an example configuration using a custom OS image. - ```yaml - pack: - content: - images: - - image: "{{.spectro.pack.edge-native-byoi.options.system.uri}}" - # - image: example.io/my-other-images/example:v1.0.0 - # - image: example.io/my-super-other-images/example:v1.0.0 - #drain: - #cordon: true - #timeout: 60 # The length of time to wait before giving up, zero means infinite - #gracePeriod: 60 # Period of time in seconds given to each pod to terminate gracefully. If negative, the default value specified in the pod will be used - #ignoreDaemonSets: true - #deleteLocalData: true # Continue even if there are pods using emptyDir (local data that will be deleted when the node is drained) - #force: true # Continue even if there are pods that do not declare a controller - #disableEviction: false # Force drain to use delete, even if eviction is supported. This will bypass checking PodDisruptionBudgets, use with caution - #skipWaitForDeleteTimeout: 60 # If pod DeletionTimestamp older than N seconds, skip waiting for the pod. Seconds must be greater than 0 to skip. - - options: - system.uri: example.io/my-images/example-custom-os:v1.4.5 - ``` - - :::info - - You can customize the node drainage behavior and specify additional images that you may have created that are part - of the content bundle. Specify any additional image required by the cluster profile in the `images` section. Add an - `- image: ` entry for each image you need to specify. Refer to the [BYOOS Pack](../../../integrations/byoos.md) - resource to learn more about the pack details. - - ::: + ```yaml + pack: + content: + images: + - image: "{{.spectro.pack.edge-native-byoi.options.system.uri}}" + # - image: example.io/my-other-images/example:v1.0.0 + # - image: example.io/my-super-other-images/example:v1.0.0 + #drain: + #cordon: true + #timeout: 60 # The length of time to wait before giving up, zero means infinite + #gracePeriod: 60 # Period of time in seconds given to each pod to terminate gracefully. If negative, the default value specified in the pod will be used + #ignoreDaemonSets: true + #deleteLocalData: true # Continue even if there are pods using emptyDir (local data that will be deleted when the node is drained) + #force: true # Continue even if there are pods that do not declare a controller + #disableEviction: false # Force drain to use delete, even if eviction is supported. This will bypass checking PodDisruptionBudgets, use with caution + #skipWaitForDeleteTimeout: 60 # If pod DeletionTimestamp older than N seconds, skip waiting for the pod. Seconds must be greater than 0 to skip. + + options: + system.uri: example.io/my-images/example-custom-os:v1.4.5 + ``` + + + +:::info + +You can customize the node drainage behavior and specify additional images that you may have created that are part +of the content bundle. Specify any additional image required by the cluster profile in the `images` section. Add an +`- image: ` entry for each image you need to specify. Refer to the resource to learn more about the +pack details. + +::: + + 11. Specify any cloud-init stages in your OS pack. Cloud-init stages allow you to configure your OS declaratively. For more information about cloud-init stages, refer to [Cloud-init Stages](../edge-configuration/cloud-init.md). @@ -162,9 +166,9 @@ YAML file to set up Edge host users, install other OS packages, install certific You now have a cluster profile you can use for deploying Edge hosts. + Consider creating additional profiles with out-of-the-box packs for monitoring, security, authentication, or other -capabilities. If you need remote access to the cluster, consider adding the -[Spectro Proxy](../../../integrations/frp.md) pack to one of the add-on profiles. +capabilities. If you need remote access to the cluster, consider adding the pack to one of the add-on profiles. Optionally, add additional Helm or OCI registries and include applications hosted in those registries in add-on profiles. Check out the guide for adding a [Helm](../../../registries-and-packs/registries/helm-charts.md) or diff --git a/docs/docs-content/clusters/public-cloud/aws/eks.md b/docs/docs-content/clusters/public-cloud/aws/eks.md index 44175858f7..428e5773b4 100644 --- a/docs/docs-content/clusters/public-cloud/aws/eks.md +++ b/docs/docs-content/clusters/public-cloud/aws/eks.md @@ -239,8 +239,10 @@ To use custom OIDC, you need to do the following: more information and to learn about other available helper applications, you can visit [OIDC Identity Provider authentication for Amazon EKS](https://aws.amazon.com/blogs/containers/introducing-oidc-identity-provider-authentication-amazon-eks/). + - Configure OIDC in the Kubernetes pack YAML file. Refer to steps for Amazon EKS in the - [Configure Custom OIDC](../../../integrations/kubernetes-generic.md#configure-custom-oidc) guide. + guide. + - Map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes role to users and groups, refer to [Create Role Bindings](../../cluster-management/cluster-rbac.md#create-role-bindings). Refer to diff --git a/docs/docs-content/enterprise-version/install-palette/install-on-kubernetes/palette-helm-ref.md b/docs/docs-content/enterprise-version/install-palette/install-on-kubernetes/palette-helm-ref.md index 3c3bd9a1b6..7abbae97a3 100644 --- a/docs/docs-content/enterprise-version/install-palette/install-on-kubernetes/palette-helm-ref.md +++ b/docs/docs-content/enterprise-version/install-palette/install-on-kubernetes/palette-helm-ref.md @@ -406,11 +406,11 @@ ingress: ### Spectro Proxy + You can specify a reverse proxy server that clusters deployed through Palette can use to facilitate network connectivity -to the cluster's Kubernetes API server. Host clusters deployed in private networks can use the -[Spectro Proxy pack](../../../integrations/frp.md) to expose the cluster's Kubernetes API to downstream clients that are -not in the same network. Check out the [Reverse Proxy](../../system-management/reverse-proxy.md) documentation to learn -more about setting up a reverse proxy server for Palette. +to the cluster's Kubernetes API server. Host clusters deployed in private networks can use the pack to expose the cluster's Kubernetes API to downstream clients that are not in the same network. Check out the [Reverse +Proxy](../../system-management/reverse-proxy.md) documentation to learn more about setting up a reverse proxy server for +Palette. | **Parameters** | **Description** | **Type** | **Default value** | | ----------------- | -------------------------------------------------------------------------------------------- | -------- | ----------------- | diff --git a/docs/docs-content/enterprise-version/system-management/reverse-proxy.md b/docs/docs-content/enterprise-version/system-management/reverse-proxy.md index d8c6e7c128..69aeb6f5ec 100644 --- a/docs/docs-content/enterprise-version/system-management/reverse-proxy.md +++ b/docs/docs-content/enterprise-version/system-management/reverse-proxy.md @@ -13,9 +13,8 @@ You can configure a reverse proxy for Palette. The reverse proxy can be used by network. Host clusters deployed in a private network are not accessible from the public internet or by users in different networks. You can use a reverse proxy to access the cluster's Kubernetes API server from a different network. -When you configure reverse proxy server for Palette, clusters that use the -[Spectro Proxy pack](../../integrations/frp.md) will use the reverse proxy server address in the kubeconfig file. -Clusters not using the Spectro Proxy pack will use the default cluster address in the kubeconfig file. + +When you configure reverse proxy server for Palette, clusters that use the pack will use the reverse proxy server address in the kubeconfig file. Clusters not using the Spectro Proxy pack will use the default cluster address in the kubeconfig file. Use the following steps to configure a reverse proxy server for Palette. @@ -206,8 +205,9 @@ Output 204 ``` + You now have a Spectro Proxy server that you can use to access Palette clusters deployed in a different network. Make -sure you add the [Spectro Proxy pack](../../integrations/frp.md) to the clusters you want to access using the Spectro +sure you add the pack to the clusters you want to access using the Spectro Proxy server. ## Validate diff --git a/docs/docs-content/integrations/antrea.md b/docs/docs-content/integrations/antrea.md new file mode 100644 index 0000000000..c2a7d189ab --- /dev/null +++ b/docs/docs-content/integrations/antrea.md @@ -0,0 +1,63 @@ +--- +sidebar_label: "Antrea" +title: "Antrea" +description: "Antrea CNI network pack for Palette Kubernetes Clusters" +type: "integration" +category: ["network", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/antrea/blobs/sha256:3c5704caf6652c63374282cbf413f8e73a77c4efbc49f375c19c73f8e2ec4148?type=image.webp" +tags: ["packs", "antrea", "cni", "network"] +--- + +Palette supports Antrea controller network interface (CNI) for VMware Kubernetes clusters. Antrea CNI enables each pod +to have exclusive IP addresses from the subnet with direct accessibility. + +Antrea leverages [Open vSwitch](https://www.openvswitch.org/) to implement pod networking and security features. Open +vSwitch enables Antrea to implement Kubernetes network policies efficiently. + +## Supported Versions + + + + + + + +## Troubleshooting + +If routing problems occur or some hosts cannot communicate outside their subnet, this indicates overlapping IP addresses +or conflicting CIDR IPs. + +Ensure you have provided a non-overlapping IP address for your pod network in Palette's Kubernetes manifest using the +`podCIDR` parameter. The CIDR IP specified with the `podCIDR` parameter in the Kubernetes manifest always takes +precedence. + +If you wish to use Antrea CIDRs and have deployed a cluster using Palette, ensure that you have done the following: + +- Removed any value for `podCIDR` and `serviceCIDR` in the Kubernetes manifest. +- Provided a non-overlapping IP address for your pod network. + +## Terraform + +You can reference the Antrea CNI pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "antrea" { + name = "antrea" + version = "1.9.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Antrea Service of type LoadBalancer](https://antrea.io/docs/v1.9.0/docs/service-loadbalancer) +- [MetalLB](https://metallb.universe.tf) +- [Antrea](https://antrea.io/) +- [Antrea IPAM Capabilities](https://antrea.io/docs/v1.6.1/docs/antrea-ipam/) +- [Using MetalLB with Antrea](https://antrea.io/docs/v1.9.0/docs/service-loadbalancer/#using-metallb-with-antrea) diff --git a/docs/docs-content/integrations/argo-cd.md b/docs/docs-content/integrations/argo-cd.md index a2968d64a0..34069bf2a8 100644 --- a/docs/docs-content/integrations/argo-cd.md +++ b/docs/docs-content/integrations/argo-cd.md @@ -10,43 +10,18 @@ logoUrl: "https://registry.spectrocloud.com/v1/argo-cd/blobs/sha256:647cd3df6fec tags: ["packs", "argo-cd", "system app"] --- -[Argo CD](https://argo-cd.readthedocs.io/en/stable/) is a declarative, GitOps continuous delivery tool for Kubernetes. -Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application -state. Argo CD automates the deployment of the desired application states in the specified target environments. -Application deployments can track updates to branches, tags, or pinned to a specific version of manifests at a Git -commit. Start using Argo CD with Palette today by consuming this pack. +## Terraform -## Prerequisites +You can reference the Argo CD pack in Terraform with the following data resource. -- Kubernetes 1.7+ +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} -## Version Supported - - - - -- **3.3.5** - - - - - -- **3.2.6** - - - - -## Notable Parameters - -| Parameter | Description | -| ---------------------------- | ---------------------------------------------------------------------------------------------------- | -| global.image.repository | The repository that is the source of truth. | -| global.image.tag | The image tag to pull. | -| global.image.imagePullPolicy | If defined, a imagePullPolicy applied to all ArgoCD deployments. Defaults to ` IfNotPresent` | -| global.securityContext | A list of security contexts | -| imagePullSecrets | If defined, uses a Secret to pull an image from a private Docker registry or repository. | -| hostAliases | A list of mapping between IP and hostnames that will be injected as entries in the pod's hosts files | - -## References - -- [Argo CD](https://argo-cd.readthedocs.io/en/stable/) +data "spectrocloud_pack" "argo_cd" { + name = "argo-cd" + version = "5.46.8" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/aws-autoscaler.md b/docs/docs-content/integrations/aws-cluster-autoscaler.md similarity index 79% rename from docs/docs-content/integrations/aws-autoscaler.md rename to docs/docs-content/integrations/aws-cluster-autoscaler.md index b5ed8d4df4..c0c1f43596 100644 --- a/docs/docs-content/integrations/aws-autoscaler.md +++ b/docs/docs-content/integrations/aws-cluster-autoscaler.md @@ -10,13 +10,7 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/aws-cluster-autoscaler/blobs/ tags: ["packs", "aws-cluster-autoscaler", "system app", "eks"] --- -Palette supports auto scaling for Amazon Elastic Kubernetes Service (EKS) host clusters through the AWS Cluster -Autoscaler pack. - -The Cluster Autoscaler pack monitors the cluster workload and utilizes -[Amazon EC2 Auto Scaling Groups](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) -to dynamically provision or shut down nodes, maximizing the cluster's performance and making it more resilient to -failures. The Kubernetes clusters are resized under the following conditions: +The Kubernetes EKS clusters are resized under the following conditions: - Scale-up: The Cluster Autoscaler triggers a scale-up operation if insufficient cluster resources lead to multiple pod failures. The pods become eligible for scheduling on the new nodes. The Cluster Autoscaler checks for pod failures @@ -29,18 +23,6 @@ failures. The Kubernetes clusters are resized under the following conditions: threshold based on CPU and memory utilization. In scenarios where the node is underutilized, the Cluster Autoscaler migrates the pods from underutilized nodes to other available nodes and then shuts down the underutilized nodes. -## Versions Supported - - - - - -### Prerequisites - -- An EKS host cluster with Kubernetes 1.24.x or higher. - -- Permission to create an IAM policy in the AWS account you use with Palette. - :::warning Existing cluster profiles that use the manifest-based Cluster Autoscaler pack version 1.28.x or earlier cannot be @@ -49,16 +31,13 @@ version of the pack from the cluster profile and then add the new one. ::: -### Parameters +## Versions Supported + + -| **Parameter** | **Description** | **Default Value** | **Required** | -| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------ | -| `charts.cluster-autoscaler.awsRegion` | The AWS region where the resources will be deployed. | `us-east-1` | Yes | -| `charts.cluster-autoscaler.autoDiscovery.clusterName` | This parameter enables autodiscovery within the EKS host cluster. | `{{ .spectro.system.cluster.name }}` | Yes | -| `charts.cluster-autoscaler.cloudProvider` | The cloud provider where the autoscaler will be deployed. | `aws` | Yes | -| `charts.cluster-autoscaler.extraArgs.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | + -### Usage +## Create IAM Policy The Helm-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the @@ -162,7 +141,7 @@ Use the following steps to create the IAM policy and deploy the Cluster Autoscal ::: -#### Resize the Cluster +## Resize the Cluster In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce @@ -198,19 +177,7 @@ and the pod rescheduling event. -### Prerequisites - -- An EKS host cluster with Kubernetes 1.28.x or higher. - -- Permission to create an IAM policy in the AWS account you use with Palette. - -### Parameters - -| **Parameter** | **Description** | **Default Value** | **Required** | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | - -### Usage +## Create IAM Policy The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the @@ -306,7 +273,7 @@ Use the following steps to create the IAM policy and deploy the Cluster Autoscal ::: -#### Resize the Cluster +## Resize the Cluster In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce @@ -342,19 +309,7 @@ and the pod rescheduling event. -### Prerequisites - -- An EKS host cluster with Kubernetes 1.27.x or higher. - -- Permission to create an IAM policy in the AWS account you use with Palette. - -### Parameters - -| **Parameter** | **Description** | **Default Value** | **Required** | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | - -### Usage +## Create IAM Policy The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the @@ -450,7 +405,7 @@ Use the following steps to create the IAM policy and deploy the Cluster Autoscal ::: -#### Resize the Cluster +## Resize the Cluster In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce @@ -486,19 +441,7 @@ and the pod rescheduling event. -### Prerequisites - -- An EKS host cluster with Kubernetes 1.26.x or higher. - -- Permission to create an IAM policy in the AWS account you use with Palette. - -### Parameters - -| **Parameter** | **Description** | **Default Value** | **Required** | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | - -### Usage +## Create IAM Policy The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the @@ -594,7 +537,7 @@ Use the following steps to create the IAM policy and deploy the Cluster Autoscal ::: -#### Resize the Cluster +## Resize the Cluster In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce @@ -630,19 +573,7 @@ and the pod rescheduling event. -### Prerequisites - -- An EKS host cluster with Kubernetes 1.19.x or higher. - -- Permission to create an IAM policy in the AWS account you use with Palette. - -### Parameters - -| **Parameter** | **Description** | **Default Value** | **Required** | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ------------ | -| `manifests.aws-cluster-autoscaler.expander` | Indicates which Auto Scaling Group (ASG) to expand. Options are `random`, `most-pods`, and `least-waste`. `random` scales up a random ASG. `most-pods` scales up the ASG that will schedule the most amount of pods. `least-waste` scales up the ASG that will waste the least amount of CPU/MEM resources. | `least-waste` | Yes | - -### Usage +## Create IAM Policy The manifest-based Cluster Autoscaler pack is available for Amazon EKS host clusters. To deploy the pack, you must first define an IAM policy in the AWS account associated with Palette. This policy allows the Cluster Autoscaler to scale the @@ -738,7 +669,7 @@ Use the following steps to create the IAM policy and deploy the Cluster Autoscal ::: -#### Resize the Cluster +## Resize the Cluster In this example, you will resize the worker pool nodes to better understand the scaling behavior of the Cluster Autoscaler pack. First, you will create a cluster with large-sized worker pool instances. Then, you will manually reduce @@ -772,17 +703,6 @@ and the pod rescheduling event. - - -:::warning - -All versions less than version 1.22.x are considered deprecated. Upgrade to a newer version to take advantage of new -features. - -::: - - - ## Troubleshooting @@ -821,11 +741,3 @@ data "spectrocloud_pack_simple" "aws-cluster-autoscaler" { registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -## References - -- [Cluster Autoscaler on AWS](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) - -- [Amazon EKS Autoscaling](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html) - -- [AWS IAM Authenticator Plugin](https://github.com/kubernetes-sigs/aws-iam-authenticator) diff --git a/docs/docs-content/integrations/cloudanix.md b/docs/docs-content/integrations/cloudanix.md index 2d175d66ec..f555231822 100644 --- a/docs/docs-content/integrations/cloudanix.md +++ b/docs/docs-content/integrations/cloudanix.md @@ -12,73 +12,11 @@ logoUrl: "https://cloudanix-assets.s3.amazonaws.com/static/cloudanix-logo-p.png" tags: ["packs", "cloudanix", "security"] --- -The Cloudanix pack is an add-on security pack that provides a dashboard to help you detect threats and unusual behavior -in your Kubernetes clusters. Cloudanix detects the following. - -- Files added or modified in sensitive directories - -- SSH into a container - -- Modifications to shell configuration files - -- Attempts to read sensitive files that contain credential information - -- Crypto mining - -The Cloudanix dashboard provides an interactive interface that displays the mapping between threat events and associated -container, pod, and node workloads. Additionally, Cloudanix identifies the user who initiated an activity identified as -a threat and the command that was used. - -You can also start Jira workflows and target specific workloads from the Cloudanix dashboard. - ## Versions Supported - - - - -## Prerequisites - -- CPUs: 0.5 -- Memory: 256 MiB -- Kubernetes 1.19.x to 1.25.x -- Kernel version 4.5 and higher + -## Parameters - -The Cloudanix pack has the following parameters, which are auto-filled based on Palette user information. - -| Name | Description | -| ------------------- | -------------------------------------------------------------------------- | -| `userEmail` | The email address of the user who created the cluster and cluster profile. | -| `partnerIdentifier` | A Cloudanix unique identifier for Spectro Cloud. | -| `organizationId` | The organization tenant ID in Palette. | -| `userName` | Palette user name. | -| `accountName` | Palette cloud account name. | -| `accountType` | Cloud account type such as AWS or GCP, Azure, or others. | -| `accountId` | The user's cloud account ID. | -| `clusterName` | The name of the cluster. | -| `clusterIdentifier` | The cluster's unique identifier. | -| `clusterDomain` | The Palette cloud account type such as AWS, GCP, Azure, or others. | - -## Usage - -This Helm Chart installs four Cloudanix services to enable container security capabilities: - -
- -- **config-cron**: A job that runs periodically in a Kubernetes cluster to maintain the configuration of Cloudanix - inventory and threat services. -- **misconfig-cron**: A job that captures Kubernetes misconfigurations and displays them on the Cloudanix dashboard. -- **inventory-service**: An inventory service that detects any new Kubernetes resources and displays them on the - Cloudanix dashboard. -- **threat-service**: A threat service that exports threat events and affected Kubernetes resources, which are visible - on the Cloudanix dashboard. - -From the **Workloads** page, click the **Risks** tab to view a list of failed threat rules. You can exclude resources, -such as pods and containers, from the risk findings. - -
+ ### Kubernetes 1.25 and higher @@ -114,18 +52,14 @@ As a final step, apply the cluster profile to your cluster. ## Terraform ```hcl -data "spectrocloud_registry" "public_registry" { - name = "Public Repo" +data "spectrocloud_registry" "public_add_on_repo" { + name = "Spectro Addon Repo" } data "spectrocloud_pack_simple" "cloudanix" { - name = "cloudanix" - version = "0.0.6" - type = "helm" - registry_uid = data.spectrocloud_registry.public_registry.id + name = "cloudanix" + version = "0.0.2" + type = "helm" + registry_uid = data.spectrocloud_registry.public_add_on_repo.id } ``` - -## References - -- [Cloudanix Documentation](https://www.cloudanix.com/docs/introduction) diff --git a/docs/docs-content/integrations/cni-azure.md b/docs/docs-content/integrations/cni-azure.md new file mode 100644 index 0000000000..3bcabe5315 --- /dev/null +++ b/docs/docs-content/integrations/cni-azure.md @@ -0,0 +1,75 @@ +--- +sidebar_label: "Azure CNI" +title: "Azure CNI" +description: "Azure CNI network pack for Palette AKS Clusters" +hide_table_of_contents: true +type: "integration" +category: ["network", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "azure-cni", "cni", "network"] +--- + +## Versions Supported + + + + + +:::warning + +Make sure to use Azure CNI with the Windows Operating System as the kubenet CNI is not available for the Windows +environment. + +::: + +### Azure CNI Policy Support + +Network Policy is a Kubernetes specification that defines access policies for communication between pods. By default, +Azure AKS cluster pods can send and receive traffic without limitations. However, to ensure security, rules to control +traffic flow can be defined. Network Policies define an ordered set of rules to send and receive traffic and applies +them to a collection of pods that match one or more label selectors. Palette supports Network Policies to be included as +part of a wider manifest that also creates a deployment or service. Palette leverages two Network Policies from Azure +CNI: + +- **azure**: Azure's own implementation, called + [Azure Network Policy](https://learn.microsoft.com/en-us/azure/virtual-network/kubernetes-network-policies). + +- **calico**: An open-source network and network security solution developed by [Tigera](https://www.tigera.io/). + +- **none**: No network policy is applied. Use this option if you do not want to apply any network policy. + +Update the pack YAML's `networkPolicy` field to apply the desired network policy. The default value is `calico`. + +```yaml +pack: + networkPolicy: "none" +``` + +:::tip + +If you are comparing Azure Network Policy with other Network Policy engines, refer to the +[Differences between Network Policy engines: Cilium, Azure NPM, and Calico](https://learn.microsoft.com/en-us/azure/aks/use-network-policies#differences-between-network-policy-engines-cilium-azure-npm-and-calico). + +::: + + + + + +## Terraform + +Use the following Terraform snippet to reference the Azure CNI pack in your Terraform template. Update the version +number as needed. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "calico" { + name = "cni-azure" + version = "1.4.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/cni-calico.md b/docs/docs-content/integrations/cni-calico.md new file mode 100644 index 0000000000..a169f69bf9 --- /dev/null +++ b/docs/docs-content/integrations/cni-calico.md @@ -0,0 +1,214 @@ +--- +sidebar_label: "Calico" +title: "Calico" +description: "Reference documentation for the Calico pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["network", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/cni-calico/blobs/sha256:9a08103ccd797857a81b6ce55fa4f84a48bcb2bddfc7a4ff27878819c87e1e30?type=image.webp" +tags: ["packs", "calico", "network"] +--- + +:::warning + +Limitations: AWS, VMWare supports IP-in-IP encapsulation type. Azure supports VXLAN encapsulation type. + +::: + +## Versions Supported + + + + + +### Create Bind Mounts for Edge Deployments + +In Edge deployments, Calico requires a bind mount on the host machine. Without the bind mount, it's possible for the +Calico pods to be stuck in the init state. Use the following example to create a bind mount from `/var/lib/calico` on +the Edge host. When you build an installer ISO with the `bind_mounts` block, the folders specified in the block will be +mounted. For more information about building the installer ISO, refer to +[Build Installer ISO](../clusters/edge/edgeforge-workflow/palette-canvos/build-installer-iso.md). + +```yaml +#cloud-config +stylus: + site: + debug: true + insecureSkipVerify: false + paletteEndpoint: api.console.spectrocloud.com + name: edge-appliance-1 + caCerts: + - | + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + +install: + bind_mounts: + - /var/lib/calico +``` + + + + + +### Create Bind Mounts for Edge Deployments + +In Edge deployments, Calico requires a bind mount on the host machine. Without the bind mount, it's possible for the +Calico pods to be stuck in the init state. Use the following example to create a bind mount from `/var/lib/calico` on +the Edge host. When you build an installer ISO with the `bind_mounts` block, the folders specified in the block will be +mounted. For more information about building the installer ISO, refer to +[Build Installer ISO](../clusters/edge/edgeforge-workflow/palette-canvos/build-installer-iso.md). + +```yaml +#cloud-config +stylus: + site: + debug: true + insecureSkipVerify: false + paletteEndpoint: api.console.spectrocloud.com + name: edge-appliance-1 + caCerts: + - | + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + +install: + bind_mounts: + - /var/lib/calico +``` + + + + +### Create Bind Mounts for Edge Deployments + +In Edge deployments, Calico requires a bind mount on the host machine. Without the bind mount, it's possible for the +Calico pods to be stuck in the init state. Use the following example to create a bind mount from `/var/lib/calico` on +the Edge host. When you build an installer ISO with the `bind_mounts` block, the folders specified in the block will be +mounted. For more information about building the installer ISO, refer to +[Build Installer ISO](../clusters/edge/edgeforge-workflow/palette-canvos/build-installer-iso.md). + +```yaml +#cloud-config +stylus: + site: + debug: true + insecureSkipVerify: false + paletteEndpoint: api.console.spectrocloud.com + name: edge-appliance-1 + caCerts: + - | + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + +install: + bind_mounts: + - /var/lib/calico +``` + + + + + +### Create Bind Mounts for Edge Deployments + +In Edge deployments, Calico requires a bind mount on the host machine. Without the bind mount, it's possible for the +Calico pods to be stuck in the init state. Use the following example to create a bind mount from `/var/lib/calico` on +the Edge host. When you build an installer ISO with the `bind_mounts` block, the folders specified in the block will be +mounted. For more information about building the installer ISO, refer to +[Build Installer ISO](../clusters/edge/edgeforge-workflow/palette-canvos/build-installer-iso.md). + +```yaml +#cloud-config +stylus: + site: + debug: true + insecureSkipVerify: false + paletteEndpoint: api.console.spectrocloud.com + name: edge-appliance-1 + caCerts: + - | + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + +install: + bind_mounts: + - /var/lib/calico +``` + + + + + +### Create Bind Mounts for Edge Deployments + +In Edge deployments, Calico requires a bind mount on the host machine. Without the bind mount, it's possible for the +Calico pods to be stuck in the init state. Use the following example to create a bind mount from `/var/lib/calico` on +the Edge host. When you build an installer ISO with the `bind_mounts` block, the folders specified in the block will be +mounted. For more information about building the installer ISO, refer to +[Build Installer ISO](../clusters/edge/edgeforge-workflow/palette-canvos/build-installer-iso.md). + +```yaml {14-16} +#cloud-config +stylus: + site: + debug: true + insecureSkipVerify: false + paletteEndpoint: api.console.spectrocloud.com + name: edge-appliance-1 + caCerts: + - | + -----BEGIN CERTIFICATE----- + + -----END CERTIFICATE----- + +install: + bind_mounts: + - /var/lib/calico +``` + + + + + +All versions below version 3.23.x are deprecated. + + + + + +## Troubleshooting + +The following are some tips to troubleshoot issues with the Calico CNI. + +- A daemon set is installed, the calico-node pod should be deployed on all the nodes in the cluster to provide + networking. + +- For any issues with networking, check the logs of the `calico-node` and `calico-kube-controller` pods on the cluster. + +## Terraform + +Use the following Terraform snippet to reference the Calico CNI pack in your Terraform template. + +```hcl + +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "calico" { + name = "cni-calico" + version = "3.27.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Calico Documentation](https://docs.tigera.io/calico/latest/reference) diff --git a/docs/docs-content/integrations/cni-cilium-oss.md b/docs/docs-content/integrations/cni-cilium-oss.md new file mode 100644 index 0000000000..9931b6b8d7 --- /dev/null +++ b/docs/docs-content/integrations/cni-cilium-oss.md @@ -0,0 +1,128 @@ +--- +sidebar_label: "Cilium" +title: "Cilium" +description: "Cilium network pack for Spectro Cloud Palette" +hide_table_of_contents: true +type: "integration" +category: ["network", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/cni-cilium/blobs/sha256:dbc239ac739ea2939ef41dd0743b82281bc82c360326cd7c536f73f0053e2cd2?type=image.webp" +tags: ["packs", "cilium", "network"] +--- + +## Versions Supported + + + + +:::warning + +If you are using Bring Your Own Operating System (BYOOS), then HWE (Hardware Enabled) Kernel or a Kernel that supports +[eBPF](https://ebpf.io/) modules needs to be provisioned. + +::: + +## Troubleshooting + +### Scenario - I/O Timeout Error on VMware + +If you are deploying a cluster to a VMware environment using the VXLAN tunnel protocol, you may encounter I/O timeout +errors. This is due to a known bug in the VXMNET3 adapter that results in VXLAN traffic being dropped. You can learn +more about this issue in Cilium's [GitHub issue #21801](https://github.com/cilium/cilium/issues/21801). + +You can work around the issue by using one of the two following methods: + +- Option 1: Set a different tunnel protocol in the Cilium configuration. You can set the tunnel protocol to `geneve`. + + ```yaml + charts: + cilium: + tunnelProtocol: "geneve" + ``` + +- Option 2: Modify the Operating System (OS) layer of your cluster profile to automatically disable UDP Segmentation + Offloading (USO). + + ```yaml + kubeadmconfig: + preKubeadmCommands: + # Disable hardware segmentation offloading due to VMXNET3 issue + - | + install -m 0755 /dev/null /usr/lib/networkd-dispatcher/routable.d/10-disable-offloading + cat < /usr/lib/networkd-dispatcher/routable.d/10-disable-offloading + #!/bin/sh + ethtool -K eth0 tx-udp_tnl-segmentation off + ethtool -K eth0 tx-udp_tnl-csum-segmentation off + ethtool --offload eth0 rx off tx off + EOF + systemctl restart systemd-networkd + ``` + + + + + +## Prerequisite + +:::warning + +If you are using Bring Your Own Operating System (BYOOS), then HWE (Hardware Enabled) Kernel or a Kernel that supports +[eBPF](https://ebpf.io/) modules needs to be provisioned. + +::: + +## Troubleshooting + +### Scenario - I/O Timeout Error on VMware + +If you are deploying a cluster to a VMware environment using the VXLAN tunnel protocol, you may encounter I/O timeout +errors. This is due to a known bug in the VXMNET3 adapter that results in VXLAN traffic being dropped. You can learn +more about this issue in Cilium's [GitHub issue #21801](https://github.com/cilium/cilium/issues/21801). + +You can work around the issue by using one of the two following methods: + +- Option 1: Set a different tunnel protocol in the Cilium configuration. You can set the tunnel protocol to `geneve`. + + ```yaml + charts: + cilium: + tunnelProtocol: "geneve" + ``` + +- Option 2: Modify the Operating System (OS) layer of your cluster profile to automatically disable UDP Segmentation + Offloading (USO). + + ```yaml + kubeadmconfig: + preKubeadmCommands: + # Disable hardware segmentation offloading due to VMXNET3 issue + - | + install -m 0755 /dev/null /usr/lib/networkd-dispatcher/routable.d/10-disable-offloading + cat < /usr/lib/networkd-dispatcher/routable.d/10-disable-offloading + #!/bin/sh + ethtool -K eth0 tx-udp_tnl-segmentation off + ethtool -K eth0 tx-udp_tnl-csum-segmentation off + ethtool --offload eth0 rx off tx off + EOF + systemctl restart systemd-networkd + ``` + + + + + +## Terraform + +You can reference the Cilium pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack" "cilium" { + name = "cni-cilium-oss" + version = "1.15.3" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/cni-flannel.md b/docs/docs-content/integrations/cni-flannel.md new file mode 100644 index 0000000000..6a1424663c --- /dev/null +++ b/docs/docs-content/integrations/cni-flannel.md @@ -0,0 +1,244 @@ +--- +sidebar_label: "Flannel" +title: "Flannel" +description: "Flannel CNI pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["network", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/cni-flannel/blobs/sha256:24e56da9fc207788ba520cd00e31af042cfc9b00a3c21a5ad40a4dd592500589?type=image.webp" +tags: ["packs", "flannel", "cni"] +--- + +## Versions Supported + + + + +### Change the Backend + +If you need to change the backend type or update the backend port due to firewall or other restrictions, you can do so +by updating the pack YAML. The parameters `charts.flannel.backend` and `charts.flannel.backendPort` can be used to +change the default behavior. Refer to the official +[backend documentation](https://github.com/flannel-io/flannel/blob/v0.23.0/Documentation/backends.md) to learn more +about supported backends. + +```yaml +charts: + flannel: + backend: "vxlan" + backendPort: 8472 +``` + +### Change MTU + +By default, Flannel will use the Maximum Transmission Unit (MTU) of the host interface. If you need to change the MTU, +you can do so by updating the pack YAML. The parameter `charts.flannel.mtu` can be used to change the MTU value. + +```yaml +charts: + flannel: + mtu: 1500 +``` + +### VXLAN Configuration + +Additional parameters can be used to configure the VXLAN backend. The VXLAN configuration is commented out by default in +the pack YAML. Uncomment the parameters you want to use and update the values as needed. Refer to the +[VXLAN backend documentation](https://github.com/flannel-io/flannel/blob/v0.23.0/Documentation/backends.md) for +additional guidance. + +```yaml hideClipboard +charts: + flannel: + VXLAN Configs: + #VXLAN Identifier to be used. On Linux default is 1. + vni: 1 + #Enable VXLAN Group Based Policy (Default false) + GBP: false + #Enable direct routes (default is false) + directRouting: false + #MAC prefix to be used on Windows. (Defaults is 0E-2A) + macPrefix: "0E-2A" + ? Wireguard Configs + + #UDP listen port used with IPv6 + backendPortv6: 51821 + #Pre shared key to use + psk: 0 + #IP version to use on Wireguard + tunnelMode: "separate" + #Persistent keep interval to use + keepaliveInterval: 0 +``` + + + + +### Change the Backend + +If you need to change the backend type or update the backend port due to firewall or other restrictions, you can do so +by updating the pack YAML. The parameters `charts.flannel.backend` and `charts.flannel.backendPort` can be used to +change the default behavior. Refer to the official +[backend documentation](https://github.com/flannel-io/flannel/blob/v0.22.3/Documentation/backends.md) to learn more +about supported backends. + +```yaml +charts: + flannel: + backend: "vxlan" + backendPort: 8472 +``` + +### Change MTU + +By default, Flannel will use the Maximum Transmission Unit (MTU) of the host interface. If you need to change the MTU, +you can do so by updating the pack YAML. The parameter `charts.flannel.mtu` can be used to change the MTU value. + +```yaml +charts: + flannel: + mtu: 1500 +``` + +### VXLAN Configuration + +Additional parameters can be used to configure the VXLAN backend. The VXLAN configuration is commented out by default in +the pack YAML. Uncomment the parameters you want to use and update the values as needed. Refer to the +[VXLAN backend documentation](https://github.com/flannel-io/flannel/blob/v0.22.3/Documentation/backends.md) for +additional guidance. + +```yaml hideClipboard +charts: + flannel: + VXLAN Configs: + #VXLAN Identifier to be used. On Linux default is 1. + vni: 1 + #Enable VXLAN Group Based Policy (Default false) + GBP: false + #Enable direct routes (default is false) + directRouting: false + #MAC prefix to be used on Windows. (Defaults is 0E-2A) + macPrefix: "0E-2A" + ? Wireguard Configs + + #UDP listen port used with IPv6 + backendPortv6: 51821 + #Pre shared key to use + psk: 0 + #IP version to use on Wireguard + tunnelMode: "separate" + #Persistent keep interval to use + keepaliveInterval: 0 +``` + + + + +### Change the Backend + +If you need to change the backend type or update the backend port due to firewall or other restrictions, you can do so +by updating the pack YAML. The parameters `charts.flannel.backend` and `charts.flannel.backendPort` can be used to +change the default behavior. Refer to the official +[backend documentation](https://github.com/flannel-io/flannel/blob/v0.21.5/Documentation/backends.md) to learn more +about supported backends. + +```yaml +manifests: + flannel: + backend: "vxlan" + backendPort: 8472 +``` + +### Change MTU + +By default, Flannel will use the Maximum Transmission Unit (MTU) of the host interface. If you need to change the MTU, +you can do so by updating the pack YAML. The parameter `charts.flannel.mtu` can be used to change the MTU value. + +```yaml +manifests: + flannel: + mtu: 1500 +``` + + + + +### Prerequisites + +- Kubernetes version 1.22 or later. + +## Parameters + +The following table lists commonly used parameters for Flannel version 0.20.x. Refer to the pack YAML file for the +complete list of parameters. + +| Parameter | Description | Default | +| ---------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| `manifests.flannel.flannelNetwork` | The IPv4 CIDR range to assign to the pod network. This should match the Kubernetes `PodCIDR`. | `192.168.0.0/16` | +| `manifests.flannel.cniPluginsImage` | The image used for installing the core-cni-plugins through the _initContainer_. | `gcr.io/spectro-images-public/release/cni-plugins/cni-plugins:v1.2.0` | +| `manifests.flannel.image_cni.repository` | The Flannel CNI image repository. | `docker.io/flannel/flannel-cni-plugin` | + +## Usage + +### Change the Backend + +If you need to change the backend type or update the backend port due to firewall or other restrictions, you can do so +by updating the pack YAML. The parameters `charts.flannel.backend` and `charts.flannel.backendPort` can be used to +change the default behavior. Refer to the official +[backend documentation](https://github.com/flannel-io/flannel/blob/v0.21.5/Documentation/backends.md) to learn more +about supported backends. + +```yaml +manifests: + flannel: + backend: "vxlan" + backendPort: 8472 +``` + +### Change MTU + +By default, Flannel will use the Maximum Transmission Unit (MTU) of the host interface. If you need to change the MTU, +you can do so by updating the pack YAML. The parameter `charts.flannel.mtu` can be used to change the MTU value. + +```yaml +manifests: + flannel: + mtu: 1500 +``` + + + + +:::warning + +All versions less than v0.20.x are considered deprecated. Upgrade to a newer version to take advantage of new features. + +::: + + + + +## Terraform + +Use the following Terraform snippet to reference the Flannel CNI pack in your Terraform template. Replace the version +number with the version you want to use. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "flannel" { + name = "cni-flannel" + version = "0.23.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## Reference + +- [Flannel Documentation](https://github.com/flannel-io/flannel/tree/master?tab=readme-ov-file#how-it-works) + +- [Configuration Options](https://github.com/flannel-io/flannel/blob/master/Documentation/configuration.md) diff --git a/docs/docs-content/integrations/csi-aws-ebs.md b/docs/docs-content/integrations/csi-aws-ebs.md new file mode 100644 index 0000000000..6d5c9fa2de --- /dev/null +++ b/docs/docs-content/integrations/csi-aws-ebs.md @@ -0,0 +1,118 @@ +--- +sidebar_label: "AWS-EBS" +title: "AWS EBS" +description: "AWS EBS CSI pack for AWS Clusters" +type: "integration" +category: ["storage", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "aws-ebs", "storage"] +--- + +## Versions Supported + + + + + +### KMS Encryption Policy + +If you want to use KMS encryption, you must attach the following IAM policy to the Palette IAM role that is used to +create the cluster. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": ["kms:GenerateDataKeyWithoutPlaintext", "kms:CreateGrant"], + "Resource": "*" + } + ] +} +``` + + + + + +If you want to use KMS encryption, you must attach the following IAM policy to the Palette IAM role that is used to +create the cluster. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": ["kms:GenerateDataKeyWithoutPlaintext", "kms:CreateGrant"], + "Resource": "*" + } + ] +} +``` + + + + + +If you want to use KMS encryption, you must attach the following IAM policy to the Palette IAM role that is used to +create the cluster. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": ["kms:GenerateDataKeyWithoutPlaintext", "kms:CreateGrant"], + "Resource": "*" + } + ] +} +``` + + + + + +If you want to use KMS encryption, you must attach the following IAM policy to the Palette IAM role that is used to +create the cluster. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": ["kms:GenerateDataKeyWithoutPlaintext", "kms:CreateGrant"], + "Resource": "*" + } + ] +} +``` + + + + +## Terraform + +Use the following Terraform snippet to reference the AWS EBS CSI pack in your Terraform template. Update the version +number as needed. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "aws-ebs-csi" { + name = "csi-aws-ebs" + version = "1.30.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-aws-efs.md b/docs/docs-content/integrations/csi-aws-efs.md new file mode 100644 index 0000000000..614f246183 --- /dev/null +++ b/docs/docs-content/integrations/csi-aws-efs.md @@ -0,0 +1,681 @@ +--- +sidebar_label: "AWS EFS" +title: "AWS EFS" +description: "AWS EFS storage add on into Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/csi-aws-efs/blobs/sha256:5d1eb98bb847489f341beda1407c14442854ab8e5910d0cc8da1a63636057927?type=image.webp" +tags: ["packs", "aws-efs", "storage"] +--- + +## Versions Supported + + + + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy. + +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC, +as shown in the following output, when you use the `kubectl describe pvc` command. + +```bash +kubectl describe pvc my-efs-volume +``` + +```shell hideClipboard +Name: efs +Namespace: default +StorageClass: aws-efs +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: +``` + + + + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy. + +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC, +as shown in the following output, when you use the `kubectl describe pvc` command. + +```bash +kubectl describe pvc my-efs-volume +``` + +```shell hideClipboard +Name: efs +Namespace: default +StorageClass: aws-efs +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: +``` + + + + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy. + +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC, +as shown in the following output, when you use the `kubectl describe pvc` command. + +```bash +kubectl describe pvc my-efs-volume +``` + +```shell hideClipboard +Name: efs +Namespace: default +StorageClass: aws-efs +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: +``` + + + + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy. + +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC, +as shown in the following output, when you use the `kubectl describe pvc` command. + +```bash +kubectl describe pvc my-efs-volume +``` + +```shell hideClipboard +Name: efs +Namespace: default +StorageClass: aws-efs +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: +``` + + + + + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy. + +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC, +as shown in the following output, when you use the `kubectl describe pvc` command. + +```bash +kubectl describe pvc my-efs-volume +``` + +```shell hideClipboard +Name: efs +Namespace: default +StorageClass: aws-efs +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: +``` + + + + + +## Prerequisites + +- Create the Identity and Access Management (IAM) role that allows the driver to manage AWS EFS access points. The + [Introducing Amazon EFS CSI dynamic provisioning](https://aws.amazon.com/blogs/containers/introducing-efs-csi-dynamic-provisioning/) + blog provides information on `EFSCSIControllerIAMPolicy`. + +- An AWS EFS file system is available. Check out the guide + [Create your Amazon EFS file system](https://docs.aws.amazon.com/efs/latest/ug/gs-step-two-create-efs-resources.html) + if you need additional guidance. + +- Create your EKS cluster using static provisioning. Static provisioning requires you to create a virtual private cloud + (VPC), subnets, route tables, internet gateway and NAT gateways in the AWS console. + + You can use the same VPC or a different one for EFS: + + - Using the same VPC for EFS ensures EFS is reachable from your EKS cluster. We recommend using the same VPC because + it doesn't require peering. + + - If you use a different VPC for EFS, you need to peer the VPC with the VPC on which the EKS cluster is + running.

+ +- The security group associated with your EFS file system must have an inbound rule that allows Network File System + (NFS) traffic (port 2049) from the CIDR for your cluster's VPC. + +## Parameters + +The table lists commonly used parameters you can configure when adding this pack. + +| Parameter | Description | Default | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | +| storageClassName | AWS Volume type to be used. | spectro-storage-class | +| isDefaultClass | Toggle for Default class. | true | +| fileSystemId | The file system under which access points are created. Create the file system prior to this setup. This is a required field and needs to be set to a pre-created AWS EFS volume. Other values can use the default setting. | Set this to an AWS EFS volume you have already created. | +| provisioningMode | Type of volume provisioned by AWS EFS. For now, this is the only access point supported. | efs-ap | +| directoryPerms | Directory permissions for Access Point root directory creation. | 700 | +| gidRangeStart | Starting range of the Portable Operating System Interface (POSIX) group Id to be applied for access point root directory creation (optional). | 1000 | +| gidRangeEnd | End range of the POSIX group Id (optional). | 2000 | +| basePath | Path under which access points for dynamic provisioning is created. If this parameter is not specified, access points are created under the root directory of the file system. | `/base_efs` | + +## Usage + +There are two ways to add AWS EFS to Palette: + +- Add EFS as a CSI layer in AWS/EKS. +- Add EFS as an Add-on layer, which will create a new storage class using the AWS EFS file system. + +### Policy Information + +You must create a policy that allows you to use EFS from your IAM account. You can use the following JSON to create the +policy.

+ +```yaml +{ + "Version": "2012-10-17", + "Statement": + [ + { + "Effect": "Allow", + "Action": ["elasticfilesystem:DescribeAccessPoints", "elasticfilesystem:DescribeFileSystems"], + "Resource": "*", + }, + { + "Effect": "Allow", + "Action": ["elasticfilesystem:CreateAccessPoint"], + "Resource": "*", + "Condition": { "StringLike": { "aws:RequestTag/efs.csi.aws.com/cluster": "true" } }, + }, + { + "Effect": "Allow", + "Action": "elasticfilesystem:DeleteAccessPoint", + "Resource": "*", + "Condition": { "StringEquals": { "aws:ResourceTag/efs.csi.aws.com/cluster": "true" } }, + }, + ], +} +``` + +### Storage Class + +Palette creates storage classes named _spectro-storage-class_. You can view a list of storage classes using this kubectl +command: + +
+ +```bash +kubectl get storageclass +``` + +### PersistentVolumeClaim + +A PersistentVolumeClaim (PVC) is a request made by a pod for a certain amount of storage from the cluster. It acts as a +link between the pod and the storage resource, allowing the pod to use the storage. You can learn details about a PVC by +using the `kubectl describe pvc` command, as the following example output shows.
+ +```bash +kubectl describe pvc my-efs-volume +``` + +```yaml + +Name: efs + +Namespace: default + +StorageClass: aws-efs + +Status: Pending + +Volume: + +Labels: + +Annotations: kubectl.kubernetes.io/last-applied-configuration: +{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.kubernetes.io/ +storage-class":"aws-efs"},"name":"..."} + +volume.beta.kubernetes.io/storage-class: aws-efs + +Finalizers: [kubernetes.io/pvc-protection] + +Capacity: + +Access Modes: + +Events: +| Type | Reason | Age | From | Message | +| ------- | ------------------ | ------------------ | --------------------------- | ------------------------ | +| Warning | ProvisioningFailed | 43s (x12 over 11m) | persistentvolume-controller | no volume plugin matched | +Mounted By: + +``` + +
+
+ +## Troubleshooting + +Some basic troubleshooting steps you can take if you receive errors in your pods when mounting an Amazon EFS volume in +your Amazon EKS cluster are to verify you have the following: + +If you encounter some issues when mounting an Amazon EFS volume in your Amazon EKS cluster, start by reviewing the items +below: + +- Ensure you have an Amazon EFS file system created with a mount target in each of the worker node subnets. +- A valid EFS storage class definition is created and using the `efs.csi.aws.com` provisioner. +- A valid PersistentVolumeClaim (PVC) definition and PersistentVolume definition. This is not necessary if you are using + dynamic provisioning. +- The Amazon EFS CSI driver is installed in the cluster. + +### Common Issues + +The following list provides more specific details to help you troubleshoot issues when mounting an Amazon EFS volume. + +:::tip + +The CSI driver pod logs are also available to help you determine the cause of the mount failures. If the volume is +failing to mount, use `efs-plugin` logs to help you debug. Use the following command to view the logs. + +```shell +kubectl logs --namespace kube-system --label app=efs-csi-node --containe efs-plugin +``` + +::: + +- **Mount Targets:** Verify the mount targets are configured correctly. Be sure to create the EFS mount targets in each + Availability Zone where the EKS worker nodes are running. + +- **Allow NFS Traffic:** Verify the security group associated with your EFS file system and worker nodes allows NFS + traffic. The security group that's associated with your EFS file system must have an inbound rule that allows NFS + traffic (port 2049) from the CIDR for your cluster's VPC. The security group that's associated with your worker nodes + where the pods are failing to mount the EFS volume must have an outbound rule that allows NFS traffic (port 2049) to + the EFS file system. + +- **Subdirectories:** If you are mounting the pod to a subdirectory, verify the subdirectory is created in your EFS file + system. When you add sub paths in persistent volumes, the EFS CSI driver does not create the subdirectory path in the + EFS file system as part of the mount operation. Subdirectories must be present before you start the mount operation. + +- **DNS server:** Confirm the cluster's Virtual Private Cloud (VPC) uses the Amazon DNS server. + +- **Permissions:** Verify you have `iam` mount options in the Persistent Volume (PV) definition when using a restrictive + file system policy. In some cases, the EFS file system policy is configured to restrict mount permissions to specific + IAM roles. In this case, the EFS mount helper in the EFS CSI driver requires the `-o iam` mount option during the + mount operation. Include the **spec.mountOptions** property in the Persistent Volume (PV) definition to specify the + mount options. + + ```bash + spec: + mountOptions: + - iam + ``` + +- **IAM role:** Verify the Amazon EFS CSI driver controller service account associates with the correct IAM role and the + IAM role has the required permissions. Use the following command to view the service account annotation. + + ```bash + kubectl describe sa efs-csi-controller-sa --namespace kube-system + ``` + + The output should look similar to the following: + + ```bash + eks.amazonaws.com/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EFS_CSI_Driver_Policy + ``` + +- **Driver Pods:** Verify the EFS CSI driver pods are active. Issue the following command to display a list of + controller pods and node pods active in your cluster. + + ```bash + kubectl get all --label app.kubernetes.io/name=aws-efs-csi-driver --namespace kube-system + ``` + +- **File System Not Mounting:** Verify the EFS mount operation from the EC2 worker node where the pod is failing to + mount the file system. Log in to the Amazon EKS worker node where the pod is scheduled. Then, use the EFS mount helper + to try to manually mount the EFS file system to the worker node. Use the following command to mount the EFS file + system. + + ```bash + sudo mount -types -efs -options tls file-system-dns-name efs-mount-point/ + ``` + +Check out the +[Amazon EFS](https://aws.amazon.com/premiumsupport/knowledge-center/eks-troubleshoot-efs-volume-mount-issues/) +troubleshooting guide for more information. + +## Terraform + +You can reference the AWS EFS pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "csi-aws-efs" { + name = "aws-efs" + version = "1.7.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +## References + +- [Amazon EFS CSI Driver](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html) + +- [Amazon Elastic File System](https://aws.amazon.com/efs/) + +- [Amazon EFS Tutorial and Examples](https://github.com/aws-samples/amazon-efs-tutorial) + +- [IAM Policy Example](https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/docs/example-iam-policy.json) + +- [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/)
diff --git a/docs/docs-content/integrations/csi-azure.md b/docs/docs-content/integrations/csi-azure.md new file mode 100644 index 0000000000..1da269e2da --- /dev/null +++ b/docs/docs-content/integrations/csi-azure.md @@ -0,0 +1,41 @@ +--- +sidebar_label: "Azure Disk" +title: "Azure Disk" +description: "Azure Disk storage add on into Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/csi-azure/blobs/sha256:0787b7943741181181823079533cd363884a28aa0651715ea43408bdc77a5c51?type=image.webp" +tags: ["packs", "azure-disk", "storage"] +--- + +## Versions Supported + + + + + + + + + + + +## Terraform + +Use the following Terraform snippet to reference the Azure Disk CSI pack in your Terraform template. Update the version +number as needed. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "azure-disk-csi" { + name = "csi-azure" + version = "1.30.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-gcp-driver.md b/docs/docs-content/integrations/csi-gcp-driver.md new file mode 100644 index 0000000000..1108be23ea --- /dev/null +++ b/docs/docs-content/integrations/csi-gcp-driver.md @@ -0,0 +1,42 @@ +--- +sidebar_label: "GCE-Persistent-Disk" +title: "GCE Persistent Disk" +description: "GCE Persistent Disk storage pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "storage", "gce-persistent-disk"] +--- + +## Versions Supported + + + + + + + + + + + + + +## Terraform + +Use the following Terraform snippet to reference the GCE Persistent Disk pack in your Terraform code. + +```hcl + +data "spectrocloud_registry" "palette_registry_oci" { + name = "Palette Registry" +} + +data "spectrocloud_pack_simple" "cs-gcp-driver" { + name = "csi-gcp-driver" + version = "1.13.2" + type = "helm" + registry_uid = data.spectrocloud_registry.palette_registry_oci.id +} +``` diff --git a/docs/docs-content/integrations/csi-longhorn-addon.md b/docs/docs-content/integrations/csi-longhorn-addon.md new file mode 100644 index 0000000000..cf82b57ea9 --- /dev/null +++ b/docs/docs-content/integrations/csi-longhorn-addon.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Longhorn" +title: "Longhorn" +description: "Longhorn pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "longhorn", "storage"] +--- + + + +## Terraform + +Use the following Terraform snippet to reference the Longhorn pack in your Terraform template. Update the version number +as needed. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "csi-longhorn-addon" { + name = "csi-longhorn" + version = "1.6.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-longhorn.md b/docs/docs-content/integrations/csi-longhorn.md new file mode 100644 index 0000000000..1432360443 --- /dev/null +++ b/docs/docs-content/integrations/csi-longhorn.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Longhorn" +title: "Longhorn" +description: "Longhorn pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "longhorn", "storage"] +--- + + + +## Terraform + +Use the following Terraform snippet to reference the Longhorn pack in your Terraform template. Update the version number +as needed. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "csi-longhorn" { + name = "csi-longhorn" + version = "1.5.1" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-nfs-subdir-external.md b/docs/docs-content/integrations/csi-nfs-subdir-external.md new file mode 100644 index 0000000000..3f0039f395 --- /dev/null +++ b/docs/docs-content/integrations/csi-nfs-subdir-external.md @@ -0,0 +1,40 @@ +--- +sidebar_label: "nfs-subdir-External" +title: "Kubernetes NFS Subdir External Provisionerl" +description: "NFS-Subdir-External Provisioner pack in Spectro Cloud" +type: "integration" +category: ["storage", "amd64"] +hide_table_of_contents: true +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/csi-nfs-subdir-external/blobs/sha256:4b40eb85382d04dc4dcfc174b5e288b963b6201f6915e14b07bd8a5c4323b51b?type=image.webp" +tags: ["packs", "nfs-subdir-external", "storage"] +--- + +## Versions Supported + + + + + + + + + +## Terraform + +Use the following Terraform snippet to reference the NFS-Subdir-External Provisioner pack in your Terraform template. +Update the version number as needed. + +```hcl +data "spectrocloud_registry" "community_registry" { + name = "Palette Community Registry" +} + + +data "spectrocloud_pack_simple" "csi-nfs-subdir-external" { + name = "csi-nfs-subdir-external" + version = "4.0.13" + type = "helm" + registry_uid = data.spectrocloud_registry.community_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-portworx-generic.md b/docs/docs-content/integrations/csi-portworx-generic.md new file mode 100644 index 0000000000..e59f321001 --- /dev/null +++ b/docs/docs-content/integrations/csi-portworx-generic.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Portworx /w Operator" +title: "Portworx Operator" +description: "Portworx storage CSI for all use cases" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "portworx", "storage"] +--- + + + +## Terraform + +Use the following Terraform code to interact with the Portworx Operator pack in your Terraform scripts. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "portworx-operator" { + name = "csi-portworx-generic" + version = "3.0.0" + type = "operator-instance" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-rook-ceph-addon.md b/docs/docs-content/integrations/csi-rook-ceph-addon.md new file mode 100644 index 0000000000..1181b6f1c6 --- /dev/null +++ b/docs/docs-content/integrations/csi-rook-ceph-addon.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "rook-ceph" +title: "Rook Ceph" +description: "Rook is an open-source cloud-native storage orchestrator that provides the platform, framework, and support for Ceph +storage to natively integrate with cloud-native environments. Ceph is a distributed storage system that provides file, +block, and object storage and is deployed in large-scale production clusters." +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "rook-ceph", "storage"] +--- + + + +## Terraform + +```hcl +data "spectrocloud_registry" "registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "csi-rook-ceph" { + name = "csi-rook-ceph-addon" + version = "1.14.0" + type = "helm" + registry_uid = data.spectrocloud_registry.registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-rook-ceph.md b/docs/docs-content/integrations/csi-rook-ceph.md new file mode 100644 index 0000000000..d08f6f6cdf --- /dev/null +++ b/docs/docs-content/integrations/csi-rook-ceph.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "rook-ceph" +title: "Rook Ceph" +description: "Rook is an open-source cloud-native storage orchestrator that provides the platform, framework, and support for Ceph +storage to natively integrate with cloud-native environments. Ceph is a distributed storage system that provides file, +block, and object storage and is deployed in large-scale production clusters." +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "rook-ceph", "storage"] +--- + + + +## Terraform + +```hcl +data "spectrocloud_registry" "registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "csi-rook-ceph" { + name = "csi-rook-ceph" + version = "1.14.0" + type = "helm" + registry_uid = data.spectrocloud_registry.registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-trident-addon.md b/docs/docs-content/integrations/csi-trident-addon.md new file mode 100644 index 0000000000..ddfa98a5a2 --- /dev/null +++ b/docs/docs-content/integrations/csi-trident-addon.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Astra Trident Addon" +title: "Astra Trident Addon" +description: "Learn abou the Astra Trident pack." +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64", "community"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "trident", "storage"] +--- + + + +## Terraform + +You can retrieve details about the Astra Trident pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "astra-trident" { + name = "csi-trident-addon" + version = "23.01.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/csi-trident.md b/docs/docs-content/integrations/csi-trident.md new file mode 100644 index 0000000000..165643574a --- /dev/null +++ b/docs/docs-content/integrations/csi-trident.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Astra Trident" +title: "Astra Trident" +description: "Learn abou the Astra Trident pack." +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64", "community"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "trident", "storage"] +--- + + + +## Terraform + +You can retrieve details about the Astra Trident pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "astra-trident" { + name = "csi-trident" + version = "23.01.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/dex.md b/docs/docs-content/integrations/dex.md index 6b96370670..536149e744 100644 --- a/docs/docs-content/integrations/dex.md +++ b/docs/docs-content/integrations/dex.md @@ -6,7 +6,6 @@ type: "integration" hide_table_of_contents: true category: ["authentication", "amd64"] sidebar_class_name: "hide-from-sidebar" -logoUrl: "https://registry.spectrocloud.com/v1/dex/blobs/sha256:78e381fe12509ed94c7c19cd6f6fc4e896ec66485364644dc1a40229fcf9d90d?type=image.webp" tags: ["packs", "dex", "security"] --- @@ -16,7 +15,7 @@ to the cluster through any identity provider that dex supports. ## Versions Supported - + diff --git a/docs/docs-content/integrations/edge-k3s.md b/docs/docs-content/integrations/edge-k3s.md new file mode 100644 index 0000000000..163d2b7382 --- /dev/null +++ b/docs/docs-content/integrations/edge-k3s.md @@ -0,0 +1,326 @@ +--- +sidebar_label: "K3s" +title: "K3s" +description: "Learn about the K3s pack in Palette Edge and how you can use it within your Kubernetes clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/edge-k3s/blobs/sha256:5b7f8a80330d6938056848905238efbbd085e2f0f86fd03d7be10ccdabf791c7?type=image.webp" +tags: ["packs", "kubernetes", "k3s", "edge"] +--- + +K3s is available for Edge host deployments as well as virtual clusters that you can create from cluster groups. Refer to +the +[Create an Infrastructure Profile](../profiles/cluster-profiles/create-cluster-profiles/create-infrastructure-profile.md) +guide and the [Create and Manage Cluster Groups](../clusters/cluster-groups/create-cluster-group.md) guide for more +information. + +:::info + +In order to use K3s as part of an Edge deployment, you need to go through the EdgeForge process and specify K3s as your +intended Kubernetes distribution when you build your OS image. For more information, refer to the +[EdgeForge Workflow](../clusters/edge/edgeforge-workflow/edgeforge-workflow.md) guide. + +::: + +### Support Lifecycle + +We support different Kubernetes distributions such as K3s, Microk8s, and RKE2 until their official EOL. The EOL is set +by the respective owner. Once we stop supporting the minor version, we initiate the deprecation process. Refer to the +[Kubernetes Support Lifecycle](kubernetes-support.md#palette-extended-kubernetes-support) guide to learn more. + +:::warning + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the [Kubernetes Upgrades](kubernetes-support.md#kubernetes-upgrades) +section. + +::: + +## Versions Supported + + + + + +## Configure OIDC Identity Provider for Edge + +You can modify the configuration file to configure your Edge cluster to use an OpenID Connect (OIDC) Identity Provider +(IDP) for authentication. You can use a custom third-party IDP, such as Okta, or use Palette as your IDP. + +When you add the K3s pack to a cluster profile, Palette displays the OIDC IDP options listed below: + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to +specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + . This + setting displays in the YAML file as `none`. + + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to use kubectl CLI to access cluster. This setting + displays in the YAML file as `palette`. When you select **Palette**, all you have to do to enable OIDC for your + cluster is create role bindings to configure authorization. You do not need to provide extra parameters such as + `oidc-issuer-url` as you need to when you configure a custom OIDC provider. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +:::warning + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +To configure a custom OIDC IDP, choose **Custom** when adding the K3s pack to your profile, and then follow these steps: + +1. Add the following OIDC parameters to the `kube-apiserver-arg` section of your configuration file for your Kubernetes + layer when creating a cluster profile. + + ```yaml + cluster: + config: + kube-apiserver-arg: + - oidc-issuer-url="provider URL" + - oidc-client-id="client-id" + - oidc-groups-claim="groups" + - oidc-username-claim="email" + ``` + +2. Add the following `clientConfig` section that contains OIDC parameters to your Kubernetes YAML file and replace the + placeholders with your third-party OIDC IDP details. The `clientConfig` section must be placed at the root level of + the YAML file. + ```yaml + clientConfig: + oidc-issuer-url: "OIDC-ISSUER-URL" + oidc-client-id: "OIDC-CLIENT-ID" + oidc-client-secret: "OIDC-CLIENT-SECRET" + oidc-extra-scope: profile,email,openid + ``` + +After you have configured the IDP for authentication, you can proceed to create role bindings to configure authorization +in your cluster. Refer to [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings) +for more guidance. + +## Configure OIDC Identity Provider for Palette Virtual Clusters + +If you are using K3s in a virtual cluster inside of a cluster group, you can also configure OIDC for your cluster. Refer +to [Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md) for +more guidance. + +## Add a Certificate for Reverse Proxy + + +You can use a reverse proxy with a K3s Kubernetes cluster. The reverse proxy allows you to connect to the cluster API of +a Palette-managed Kubernetes cluster in private networks or clusters configured with private API endpoints. For more +information, refer to the pack guide. + + + + + + +## Configure OIDC Identity Provider for Edge + +You can modify the configuration file to configure your Edge cluster to use an OpenID Connect (OIDC) Identity Provider +(IDP) for authentication. You can use a custom third-party IDP, such as Okta, or use Palette as your IDP. + +When you add the K3s pack to a cluster profile, Palette displays the OIDC IDP options listed below: + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to +specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + . This + setting displays in the YAML file as `none`. + + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to use kubectl CLI to access cluster. This setting + displays in the YAML file as `palette`. When you select **Palette**, all you have to do to enable OIDC for your + cluster is create role bindings to configure authorization. You do not need to provide extra parameters such as + `oidc-issuer-url` as you need to when you configure a custom OIDC provider. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +:::warning + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +To configure a custom OIDC IDP, choose **Custom** when adding the K3s pack to your profile, and then follow these steps: + +1. Add the following OIDC parameters to the `kube-apiserver-arg` section of your configuration file for your Kubernetes + layer when creating a cluster profile. + + ```yaml + cluster: + config: + kube-apiserver-arg: + - oidc-issuer-url="provider URL" + - oidc-client-id="client-id" + - oidc-groups-claim="groups" + - oidc-username-claim="email" + ``` + +2. Add the following `clientConfig` section that contains OIDC parameters to your Kubernetes YAML file and replace the + placeholders with your third-party OIDC IDP details. The `clientConfig` section must be placed at the root level of + the YAML file. + ```yaml + clientConfig: + oidc-issuer-url: "OIDC-ISSUER-URL" + oidc-client-id: "OIDC-CLIENT-ID" + oidc-client-secret: "OIDC-CLIENT-SECRET" + oidc-extra-scope: profile,email,openid + ``` + +After you have configured the IDP for authentication, you can proceed to create role bindings to configure authorization +in your cluster. Refer to [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings) +for more guidance. + +## Configure OIDC Identity Provider for Palette Virtual Clusters + +If you are using K3s in a virtual cluster inside of a cluster group, you can also configure OIDC for your cluster. Refer +to [Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md) for +more guidance. + +## Add a Certificate for Reverse Proxy + + +You can use a reverse proxy with a K3s Kubernetes cluster. The reverse proxy allows you to connect to the cluster API of +a Palette-managed Kubernetes cluster in private networks or clusters configured with private API endpoints. For more +information, refer to the pack guide. + + + + + +## Configure OIDC Identity Provider for Edge + +You can modify the configuration file to configure your Edge cluster to use an OpenID Connect (OIDC) Identity Provider +(IDP) for authentication. You can use a custom third-party IDP, such as Okta, or use Palette as your IDP. + +When you add the K3s pack to a cluster profile, Palette displays the OIDC IDP options listed below: + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + + + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to +specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + . This + setting displays in the YAML file as `none`. + + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to use kubectl CLI to access cluster. This setting + displays in the YAML file as `palette`. When you select **Palette**, all you have to do to enable OIDC for your + cluster is create role bindings to configure authorization. You do not need to provide extra parameters such as + `oidc-issuer-url` as you need to when you configure a custom OIDC provider. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure + OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose + **OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more + information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +:::warning + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +To configure a custom OIDC IDP, choose **Custom** when adding the K3s pack to your profile, and then follow these steps: + +1. Add the following OIDC parameters to the `kube-apiserver-arg` section of your configuration file for your Kubernetes + layer when creating a cluster profile. + + ```yaml + cluster: + config: + kube-apiserver-arg: + - oidc-issuer-url="provider URL" + - oidc-client-id="client-id" + - oidc-groups-claim="groups" + - oidc-username-claim="email" + ``` + +2. Add the following `clientConfig` section that contains OIDC parameters to your Kubernetes YAML file and replace the + placeholders with your third-party OIDC IDP details. The `clientConfig` section must be placed at the root level of + the YAML file. + + ```yaml + clientConfig: + oidc-issuer-url: "OIDC-ISSUER-URL" + oidc-client-id: "OIDC-CLIENT-ID" + oidc-client-secret: "OIDC-CLIENT-SECRET" + oidc-extra-scope: profile,email,openid + ``` + +After you have configured the IDP for authentication, you can proceed to create role bindings to configure authorization +in your cluster. Refer to [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings) +for more guidance. + +## Configure OIDC Identity Provider for Palette Virtual Clusters + +If you are using K3s in a virtual cluster inside of a cluster group, you can also configure OIDC for your cluster. Refer +to [Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md) for +more guidance. + +## Add a Certificate for Reverse Proxy + + +You can use a reverse proxy with a K3s Kubernetes cluster. The reverse proxy allows you to connect to the cluster API of +a Palette-managed Kubernetes cluster in private networks or clusters configured with private API endpoints. For more +information, refer to the pack guide. + + + + + + +## Terraform + +You can retrieve details about the K3s pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "edge-k3s" + version = "1.27.5" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/edge-k8s.md b/docs/docs-content/integrations/edge-k8s.md new file mode 100644 index 0000000000..8da96a3d94 --- /dev/null +++ b/docs/docs-content/integrations/edge-k8s.md @@ -0,0 +1,1165 @@ +--- +sidebar_label: "Palette eXtended Kubernetes - Edge" +title: "Palette eXtended Kubernetes - Edge" +description: + "Learn about the Palette eXtended Kubernetes - Edge pack and how you can use it your host clusters in an edge + environment." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/k8s-dashboard/blobs/sha256:2de5d88b2573af42d4cc269dff75744c4174ce47cbbeed5445e51a2edd8b7429?type=image.webp" +tags: ["packs", "kubernetes", "pxke", "edge"] +--- + +The Palette eXtended Kubernetes - Edge (PXK-E) pack supports Kubernetes clusters set up on Edge hosts installed in +isolated locations like grocery stores, restaurants, and similar locations, versus a data center or cloud environment. +We offer PXK-E as a core pack in Palette. + +### PXK and Palette VerteX + +The PXK-E used in [Palette VerteX](../vertex/vertex.md) is compiled and linked with our +[NIST-certified FIPS crypto module](../legal-licenses/compliance.md#fips-140-2). PXK-E is by default enabled with +[Ubuntu Pro](https://ubuntu.com/pro) with FIPS mode enabled. Additionally, the Operating System (OS) is hardened based +on the NIST-800 standard. Refer to the +[Build Edge Artifacts](../clusters/edge/edgeforge-workflow/palette-canvos/fips.md) guide to learn more on how to build +the PXK-E image with FIPS mode enabled. + +The combined usage of PXK-E and Palette VerteX provides a secure and FIPS-compliant experience as the Kubernetes +distribution, OS, and management platform VerteX is FIPS-compliant. + +### Support Lifecycle + +We support PXK-E for N-3 Kubernetes minor versions for a duration of 14 months. The duration exceeds the official EOL by +four months. Once we stop supporting the minor version, we initiate the deprecation process. Refer to the +[Kubernetes Support Lifecycle](kubernetes-support.md#palette-extended-kubernetes-support) guide to learn more. + +:::warning + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the [Kubernetes Upgrades](kubernetes-support.md#kubernetes-upgrades) +section. + +Review our [Maintenance Policy](maintenance-policy.md) to learn about pack update and deprecation schedules. + +::: + +## Versions Supported + + + + + +## Custom Kubernetes Configuration + + +The Kubernetes configuration file is where you can do the following: + +- Manually configure a third-party OIDC IDP. For more information, check out . + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +The PXK-E Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + + +```yaml +pack: + palette: + config: + oidc: + identityProvider: +``` + +Below is an example of a Kubernetes configuration file. + +```yaml +cluster: + config: | + clusterConfiguration: + apiServer: + extraArgs: + advertise-address: "0.0.0.0" + anonymous-auth: "true" + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + authorization-mode: RBAC,Node + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + disable-admission-plugins: AlwaysAdmit + enable-admission-plugins: AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction + profiling: "false" + secure-port: "6443" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + extraVolumes: + - hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + name: audit-log + pathType: DirectoryOrCreate + - hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + name: audit-policy + pathType: File + readOnly: true + timeoutForControlPlane: 10m0s + controllerManager: + extraArgs: + feature-gates: RotateKubeletServerCertificate=true + pod-eviction-timeout: 1m0s + profiling: "false" + terminated-pod-gc-threshold: "25" + use-service-account-credentials: "true" + dns: {} + kubernetesVersion: v1.26.4 + etcd: + local: + dataDir: "/etc/kubernetes/etcd" + extraArgs: + listen-client-urls: "https://0.0.0.0:2379" + networking: + podSubnet: 192.168.0.0/16 + serviceSubnet: 192.169.0.0/16 + scheduler: + extraArgs: + profiling: "false" + initConfiguration: + localAPIEndpoint: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + joinConfiguration: + discovery: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 +stages: + initramfs: + - sysctl: + vm.overcommit_memory: 1 + kernel.panic: 10 + kernel.panic_on_oops: 1 + commands: + - ln -s /etc/kubernetes/admin.conf /run/kubeconfig + files: + - path: /etc/hosts + permission: "0644" + content: | + 127.0.0.1 localhost + - path: "/etc/kubernetes/audit-policy.yaml" + owner_string: "root" + permission: 0600 + content: | + apiVersion: audit.k8s.io/v1 + kind: Policy + rules: + - level: None + users: ["system:kube-proxy"] + verbs: ["watch"] + resources: + - group: "" # core + resources: ["endpoints", "services", "services/status"] + - level: None + users: ["system:unsecured"] + namespaces: ["kube-system"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["configmaps"] + - level: None + users: ["kubelet"] # legacy kubelet identity + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + userGroups: ["system:nodes"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + users: + - system:kube-controller-manager + - system:kube-scheduler + - system:serviceaccount:kube-system:endpoint-controller + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["endpoints"] + - level: None + users: ["system:apiserver"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["namespaces", "namespaces/status", "namespaces/finalize"] + - level: None + users: ["cluster-autoscaler"] + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["configmaps", "endpoints"] + # Don't log HPA fetching metrics. + - level: None + users: + - system:kube-controller-manager + verbs: ["get", "list"] + resources: + - group: "metrics.k8s.io" + # Don't log these read-only URLs. + - level: None + nonResourceURLs: + - /healthz* + - /version + - /swagger* + # Don't log events requests. + - level: None + resources: + - group: "" # core + resources: ["events"] + # node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes + - level: Request + users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + - level: Request + userGroups: ["system:nodes"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + # deletecollection calls can be large, don't log responses for expected namespace deletions + - level: Request + users: ["system:serviceaccount:kube-system:namespace-controller"] + verbs: ["deletecollection"] + omitStages: + - "RequestReceived" + # Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, + # so only log at the Metadata level. + - level: Metadata + resources: + - group: "" # core + resources: ["secrets", "configmaps"] + - group: authentication.k8s.io + resources: ["tokenreviews"] + omitStages: + - "RequestReceived" + # Get repsonses can be large; skip them. + - level: Request + verbs: ["get", "list", "watch"] + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for known APIs + - level: RequestResponse + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for all other requests. + - level: Metadata + omitStages: + - "RequestReceived" +pack: + palette: + config: + oidc: + identityProvider: palette +``` + +### Configure OIDC Identity Provider + +The OIDC IDP feature offers the convenience of managing OIDC at the Kubernetes layer. The OIDC IDP feature is +particularly useful for environments that do not have their own IDP configured. In this scenario, you can leverage +Palette as an IDP without having to configure a third-party IDP. We also support the ability to take advantage of other +OIDC providers by making it possible for you to configure OIDC at the tenant level. For additional flexibility, if you +wish to use a different IDP than the one configured at the tenant level, you can select a different IDP by adding the +OIDC configuration to your cluster profile. + +When you add the PXK-E pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + + + +You can create a role binding that maps individual users or groups assigned within the OIDC provider's configuration to +a role. To learn more, review +. You can also +configure OIDC for virtual clusters. For guidance, refer to +[Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + . This + setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure +OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose +**OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more +information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + +:::info + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +### Configure Custom OIDC + +Follow these steps to configure a third-party OIDC IDP. + +1. Add the following OIDC parameters to the `apiServer.extraArgs` section of your Kubernetes YAML file when creating a + cluster profile. + + ```yaml + cluster: + config: | + clusterConfiguration: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Add the following `clientConfig` section that contains OIDC parameters to your Kubernetes configuration file. + + ```yaml + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + +3. Provide third-party OIDC IDP details. + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + + + + + +## Custom Kubernetes Configuration + + +The Kubernetes configuration file is where you can do the following: + +- Manually configure a third-party OIDC IDP. For more information, check out . + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +The PXK-E Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + + +```yaml +pack: + palette: + config: + oidc: + identityProvider: +``` + +Below is an example of a Kubernetes configuration file. + +```yaml +cluster: + config: | + clusterConfiguration: + apiServer: + extraArgs: + advertise-address: "0.0.0.0" + anonymous-auth: "true" + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + authorization-mode: RBAC,Node + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + disable-admission-plugins: AlwaysAdmit + enable-admission-plugins: AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction + profiling: "false" + secure-port: "6443" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + extraVolumes: + - hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + name: audit-log + pathType: DirectoryOrCreate + - hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + name: audit-policy + pathType: File + readOnly: true + timeoutForControlPlane: 10m0s + controllerManager: + extraArgs: + feature-gates: RotateKubeletServerCertificate=true + pod-eviction-timeout: 1m0s + profiling: "false" + terminated-pod-gc-threshold: "25" + use-service-account-credentials: "true" + dns: {} + kubernetesVersion: v1.26.4 + etcd: + local: + dataDir: "/etc/kubernetes/etcd" + extraArgs: + listen-client-urls: "https://0.0.0.0:2379" + networking: + podSubnet: 192.168.0.0/16 + serviceSubnet: 192.169.0.0/16 + scheduler: + extraArgs: + profiling: "false" + initConfiguration: + localAPIEndpoint: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + joinConfiguration: + discovery: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 +stages: + initramfs: + - sysctl: + vm.overcommit_memory: 1 + kernel.panic: 10 + kernel.panic_on_oops: 1 + commands: + - ln -s /etc/kubernetes/admin.conf /run/kubeconfig + files: + - path: /etc/hosts + permission: "0644" + content: | + 127.0.0.1 localhost + - path: "/etc/kubernetes/audit-policy.yaml" + owner_string: "root" + permission: 0600 + content: | + apiVersion: audit.k8s.io/v1 + kind: Policy + rules: + - level: None + users: ["system:kube-proxy"] + verbs: ["watch"] + resources: + - group: "" # core + resources: ["endpoints", "services", "services/status"] + - level: None + users: ["system:unsecured"] + namespaces: ["kube-system"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["configmaps"] + - level: None + users: ["kubelet"] # legacy kubelet identity + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + userGroups: ["system:nodes"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + users: + - system:kube-controller-manager + - system:kube-scheduler + - system:serviceaccount:kube-system:endpoint-controller + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["endpoints"] + - level: None + users: ["system:apiserver"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["namespaces", "namespaces/status", "namespaces/finalize"] + - level: None + users: ["cluster-autoscaler"] + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["configmaps", "endpoints"] + # Don't log HPA fetching metrics. + - level: None + users: + - system:kube-controller-manager + verbs: ["get", "list"] + resources: + - group: "metrics.k8s.io" + # Don't log these read-only URLs. + - level: None + nonResourceURLs: + - /healthz* + - /version + - /swagger* + # Don't log events requests. + - level: None + resources: + - group: "" # core + resources: ["events"] + # node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes + - level: Request + users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + - level: Request + userGroups: ["system:nodes"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + # deletecollection calls can be large, don't log responses for expected namespace deletions + - level: Request + users: ["system:serviceaccount:kube-system:namespace-controller"] + verbs: ["deletecollection"] + omitStages: + - "RequestReceived" + # Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, + # so only log at the Metadata level. + - level: Metadata + resources: + - group: "" # core + resources: ["secrets", "configmaps"] + - group: authentication.k8s.io + resources: ["tokenreviews"] + omitStages: + - "RequestReceived" + # Get repsonses can be large; skip them. + - level: Request + verbs: ["get", "list", "watch"] + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for known APIs + - level: RequestResponse + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for all other requests. + - level: Metadata + omitStages: + - "RequestReceived" +pack: + palette: + config: + oidc: + identityProvider: palette +``` + +### Configure OIDC Identity Provider + +The OIDC IDP feature offers the convenience of managing OIDC at the Kubernetes layer. The OIDC IDP feature is +particularly useful for environments that do not have their own IDP configured. In this scenario, you can leverage +Palette as an IDP without having to configure a third-party IDP. We also support the ability to take advantage of other +OIDC providers by making it possible for you to configure OIDC at the tenant level. For additional flexibility, if you +wish to use a different IDP than the one configured at the tenant level, you can select a different IDP by adding the +OIDC configuration to your cluster profile. + +When you add the PXK-E pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + + + +You can create a role binding that maps individual users or groups assigned within the OIDC provider's configuration to +a role. To learn more, review +. You can also +configure OIDC for virtual clusters. For guidance, refer to +[Configure OIDC for a Virtual Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + . This + setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure +OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose +**OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more +information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + +:::info + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +### Configure Custom OIDC + +Follow these steps to configure a third-party OIDC IDP. + +1. Add the following OIDC parameters to the `apiServer.extraArgs` section of your Kubernetes YAML file when creating a + cluster profile. + + ```yaml + cluster: + config: | + clusterConfiguration: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Add the following `clientConfig` section that contains OIDC parameters to your Kubernetes configuration file. + + ```yaml + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + +3. Provide third-party OIDC IDP details. + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + + + + + +## Custom Kubernetes Configuration + + +The Kubernetes configuration file is where you can do the following: + +- Manually configure a third-party OIDC IDP. For more information, check out . + +- Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more + information, refer to the guide. + +The PXK-E Kubeadm configuration is updated to dynamically enable OIDC based on your IDP selection by adding the +`identityProvider` parameter. + + +```yaml +pack: + palette: + config: + oidc: + identityProvider: +``` + +Below is an example of a Kubernetes configuration file. + +```yaml +cluster: + config: | + clusterConfiguration: + apiServer: + extraArgs: + advertise-address: "0.0.0.0" + anonymous-auth: "true" + audit-log-maxage: "30" + audit-log-maxbackup: "10" + audit-log-maxsize: "100" + audit-log-path: /var/log/apiserver/audit.log + audit-policy-file: /etc/kubernetes/audit-policy.yaml + authorization-mode: RBAC,Node + default-not-ready-toleration-seconds: "60" + default-unreachable-toleration-seconds: "60" + disable-admission-plugins: AlwaysAdmit + enable-admission-plugins: AlwaysPullImages,NamespaceLifecycle,ServiceAccount,NodeRestriction + profiling: "false" + secure-port: "6443" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + extraVolumes: + - hostPath: /var/log/apiserver + mountPath: /var/log/apiserver + name: audit-log + pathType: DirectoryOrCreate + - hostPath: /etc/kubernetes/audit-policy.yaml + mountPath: /etc/kubernetes/audit-policy.yaml + name: audit-policy + pathType: File + readOnly: true + timeoutForControlPlane: 10m0s + controllerManager: + extraArgs: + feature-gates: RotateKubeletServerCertificate=true + pod-eviction-timeout: 1m0s + profiling: "false" + terminated-pod-gc-threshold: "25" + use-service-account-credentials: "true" + dns: {} + kubernetesVersion: v1.26.4 + etcd: + local: + dataDir: "/etc/kubernetes/etcd" + extraArgs: + listen-client-urls: "https://0.0.0.0:2379" + networking: + podSubnet: 192.168.0.0/16 + serviceSubnet: 192.169.0.0/16 + scheduler: + extraArgs: + profiling: "false" + initConfiguration: + localAPIEndpoint: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 + joinConfiguration: + discovery: {} + nodeRegistration: + kubeletExtraArgs: + event-qps: "0" + feature-gates: RotateKubeletServerCertificate=true + protect-kernel-defaults: "true" + read-only-port: "0" + tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 +stages: + initramfs: + - sysctl: + vm.overcommit_memory: 1 + kernel.panic: 10 + kernel.panic_on_oops: 1 + commands: + - ln -s /etc/kubernetes/admin.conf /run/kubeconfig + files: + - path: /etc/hosts + permission: "0644" + content: | + 127.0.0.1 localhost + - path: "/etc/kubernetes/audit-policy.yaml" + owner_string: "root" + permission: 0600 + content: | + apiVersion: audit.k8s.io/v1 + kind: Policy + rules: + - level: None + users: ["system:kube-proxy"] + verbs: ["watch"] + resources: + - group: "" # core + resources: ["endpoints", "services", "services/status"] + - level: None + users: ["system:unsecured"] + namespaces: ["kube-system"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["configmaps"] + - level: None + users: ["kubelet"] # legacy kubelet identity + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + userGroups: ["system:nodes"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["nodes", "nodes/status"] + - level: None + users: + - system:kube-controller-manager + - system:kube-scheduler + - system:serviceaccount:kube-system:endpoint-controller + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["endpoints"] + - level: None + users: ["system:apiserver"] + verbs: ["get"] + resources: + - group: "" # core + resources: ["namespaces", "namespaces/status", "namespaces/finalize"] + - level: None + users: ["cluster-autoscaler"] + verbs: ["get", "update"] + namespaces: ["kube-system"] + resources: + - group: "" # core + resources: ["configmaps", "endpoints"] + # Don't log HPA fetching metrics. + - level: None + users: + - system:kube-controller-manager + verbs: ["get", "list"] + resources: + - group: "metrics.k8s.io" + # Don't log these read-only URLs. + - level: None + nonResourceURLs: + - /healthz* + - /version + - /swagger* + # Don't log events requests. + - level: None + resources: + - group: "" # core + resources: ["events"] + # node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes + - level: Request + users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + - level: Request + userGroups: ["system:nodes"] + verbs: ["update","patch"] + resources: + - group: "" # core + resources: ["nodes/status", "pods/status"] + omitStages: + - "RequestReceived" + # deletecollection calls can be large, don't log responses for expected namespace deletions + - level: Request + users: ["system:serviceaccount:kube-system:namespace-controller"] + verbs: ["deletecollection"] + omitStages: + - "RequestReceived" + # Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, + # so only log at the Metadata level. + - level: Metadata + resources: + - group: "" # core + resources: ["secrets", "configmaps"] + - group: authentication.k8s.io + resources: ["tokenreviews"] + omitStages: + - "RequestReceived" + # Get repsonses can be large; skip them. + - level: Request + verbs: ["get", "list", "watch"] + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for known APIs + - level: RequestResponse + resources: + - group: "" # core + - group: "admissionregistration.k8s.io" + - group: "apiextensions.k8s.io" + - group: "apiregistration.k8s.io" + - group: "apps" + - group: "authentication.k8s.io" + - group: "authorization.k8s.io" + - group: "autoscaling" + - group: "batch" + - group: "certificates.k8s.io" + - group: "extensions" + - group: "metrics.k8s.io" + - group: "networking.k8s.io" + - group: "policy" + - group: "rbac.authorization.k8s.io" + - group: "settings.k8s.io" + - group: "storage.k8s.io" + omitStages: + - "RequestReceived" + # Default level for all other requests. + - level: Metadata + omitStages: + - "RequestReceived" +pack: + palette: + config: + oidc: + identityProvider: palette +``` + +### Configure OIDC Identity Provider + +The OIDC IDP feature offers the convenience of managing OIDC at the Kubernetes layer. The OIDC IDP feature is +particularly useful for environments that do not have their own IDP configured. In this scenario, you can leverage +Palette as an IDP without having to configure a third-party IDP. We also support the ability to take advantage of other +OIDC providers by making it possible for you to configure OIDC at the tenant level. For additional flexibility, if you +wish to use a different IDP than the one configured at the tenant level, you can select a different IDP by adding the +OIDC configuration to your cluster profile. + +When you add the PXK-E pack to a cluster profile, Palette displays the OIDC IDP options listed below. + +All the options require you to map a set of users or groups to a Kubernetes RBAC role. To learn how to map a Kubernetes +role to users and groups, refer to +[Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + + + +You can create a role binding that maps individual users or groups assigned within the OIDC provider's configuration to +a role. To learn more, review + +. You can also +configure OIDC for virtual clusters. For guidance, refer to [Configure OIDC for a Virtual +Cluster](../clusters/palette-virtual-clusters/configure-oidc-virtual-cluster.md). + +- **None**: This setting does not require OIDC configuration for the cluster. It displays in the YAML file as `noauth`. + +- **Custom**: This is the default setting and does not require OIDC configuration. However, if desired, it allows you to + specify a third-party OIDC provider by configuring OIDC statements in the YAML file as described in + + . This + setting displays in the YAML file as `none`. + +- **Palette**: This setting makes Palette the IDP. Any user with a Palette account in the tenant and the proper + permissions to view and access the project's resources is able to log into the Kubernetes dashboard. This setting + displays in the YAML file as `palette`. + +- **Inherit from Tenant**: This setting allows you to apply RBAC to multiple clusters and requires you to configure +OpenID Connect (OIDC) in **Tenant Settings**. In Tenant Admin scope, navigate to **Tenant Settings** > **SSO**, choose +**OIDC**, and provide your third-party IDP details. This setting displays in the YAML file as `tenant`. For more +information, check out the [SSO Setup](../user-management/saml-sso/saml-sso.md) guide. + + +:::info + +If your IDP uses Security Assertion Markup Language (SAML) authentication, then the **Inherit from Tenant** option will +not work, and you will need to use the **Custom** option instead. This is because Kubernetes supports only OIDC +authentication and not SAML authentication. + +::: + +### Configure Custom OIDC + +Follow these steps to configure a third-party OIDC IDP. + +1. Add the following OIDC parameters to the `apiServer.extraArgs` section of your Kubernetes YAML file when creating a + cluster profile. + + ```yaml + cluster: + config: + clusterConfiguration: + apiServer: + extraArgs: + oidc-issuer-url: "provider URL" + oidc-client-id: "client-id" + oidc-groups-claim: "groups" + oidc-username-claim: "email" + ``` + +2. Add the following `kubeadmconfig.clientConfig` section that contains OIDC parameters to your Kubernetes YAML file. + + ```yaml + kubeadmconfig: + clientConfig: + oidc-issuer-url: "" + oidc-client-id: "" + oidc-client-secret: "" + oidc-extra-scope: profile,email,openid + ``` + +3. Provide third-party OIDC IDP details. + +### Use RBAC with OIDC + +You can create a role binding that uses individual users as the subject or specify a group name as the subject to map +many users to a role. The group name is the group assigned in the OIDC provider's configuration. Below is an example. To +learn more, review [Create Role Bindings](../clusters/cluster-management/cluster-rbac.md#create-role-bindings). + +Assume you created a group named `dev-east-2` within an OIDC provider. If you configure the host cluster's Kubernetes +pack with all the correct OIDC settings, you could then create a role binding for the `dev-east-2` group. + +In this example, Palette is used as the IDP, and all users in the `dev-east-2` would inherit the `cluster-admin` role. + +![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) + + + + +## Terraform + +You can reference Kubernetes in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "edge-k8s" { + name = "edge-k8s" + version = "1.29.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/edge-native-byoi.md b/docs/docs-content/integrations/edge-native-byoi.md new file mode 100644 index 0000000000..abebd7703a --- /dev/null +++ b/docs/docs-content/integrations/edge-native-byoi.md @@ -0,0 +1,45 @@ +--- +sidebar_label: "Edge Bring Your Own OS (BYOOS)" +title: "Edge Bring your own OS (BYOOS)" +description: "Bring Your Own OS (BYOOS) pack in Palette Edge." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/spectro-proxy/blobs/sha256:b6081bca439eeb01a8d43b3cb6895df4c088f80af978856ddc0da568e5c09365?type=image.webp" +tags: ["packs", "byoos", "operating system", "edge"] +--- + +## Versions Supported + + + + + +BYOOS enables you to use a custom OS for your Edge host. The custom OS must include all the Edge artifacts and provider +images required by the Edge Installer. Refer to the +[Build Edge Artifacts](../clusters/edge/edgeforge-workflow/palette-canvos/palette-canvos.md) guide for steps on how to +create a custom OS that includes all the required components for the Edge Installer. + +Next, select the BYOOS pack and fill out the required parameters during the cluster profile creation process. The +`system.uri` parameter specifies the location of the BYOOS image. + + + + +## Terraform + +You can retrieve details about the BYOOS Edge OS agent pack using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "byoos" { + name = "edge-native-byoi" + version = "1.0.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/edge-native-ubuntu.md b/docs/docs-content/integrations/edge-native-ubuntu.md new file mode 100644 index 0000000000..074f930093 --- /dev/null +++ b/docs/docs-content/integrations/edge-native-ubuntu.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "edge-native-ubuntu" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/edge-rke2.md b/docs/docs-content/integrations/edge-rke2.md new file mode 100644 index 0000000000..c816161eed --- /dev/null +++ b/docs/docs-content/integrations/edge-rke2.md @@ -0,0 +1,47 @@ +--- +sidebar_label: "RKE2" +title: "RKE2" +description: "RKE2 pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/kubernetes-rke2/blobs/sha256:47cde61005d9996f1571c132ba9f753982134a7a0d8e445e27001ab8519e6051?type=image.webp" +--- + +### Support Lifecycle + + +We support other Kubernetes distributions such as K3s, Microk8s, and RKE2 until their official EOL. The EOL is set by +the respective owner. Once we stop supporting the minor version, we initiate the deprecation process. Refer to the + + guide to learn more. + +:::warning + + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the +section. + +Review the to learn about pack +update and deprecation schedules. + +::: + + + +## Terraform + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "edge-rke2" + version = "1.29.5" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/external-dns.md b/docs/docs-content/integrations/external-dns.md index e4f0ee19e1..bd6fa7f460 100644 --- a/docs/docs-content/integrations/external-dns.md +++ b/docs/docs-content/integrations/external-dns.md @@ -6,48 +6,18 @@ type: "integration" hide_table_of_contents: true category: ["load balancers", "amd64"] sidebar_class_name: "hide-from-sidebar" -logoUrl: "https://registry.spectrocloud.com/v1/external-dns/blobs/sha256:1bfd6dceb0b50efee4068cd6321511f6b24be86e2d613e0a8206e716ba7aea3f?type=image.webp" tags: ["packs", "external-dns", "network"] --- -The integration helps configure public DNS servers with information about Kubernetes services to make them discoverable. - -## Prerequisites - -Providers have to be set up for this pack to get deployed and work seamlessly. For a list of supported providers and the -prerequisites to be set up, visit [providers](https://github.com/kubernetes-sigs/external-dns#status-of-providers) -section - ## Versions Supported - + -- **0.13.1** -- **0.12.2** - - - - -- **0.7.2** - - - - - -## Components - -Integration deploys the following components: - -- External DNS - -## ExternalDNS for Services on AWS Route53 Example +### AWS Route53 -### Setup prerequisites for AWS Route53 - -- Create the following IAM policy in the AWS account. This is needed for externalDNS to list and create Route53 - resources. +To use ExternalDNS with AWS Route53, you need to create an IAM policy and role with the following permissions. ```json { @@ -67,100 +37,77 @@ Integration deploys the following components: } ``` +You also need to meet the following prerequisites: + - Create an IAM role and associate the policy created above. Make a note of the role ARN which will be used in ExternalDNS deployment later -- Setup hosted zone in AWS Route53 + +- Setup hosted zone in AWS Route53. Use the following command to create a hosted zone in Route53 using the AWS CLI. + ```bash - # Create a DNS zone through AWS CLI aws route53 create-hosted-zone --name "external-dns-test.my-org.com." --caller-reference "external-dns-test-$(date +%s)" ``` -### Deploy ExternalDNS on the cluster - -- Add ExternalDNS pack to the desired profile and deploy it to the cluster. You may want to configure the following in - pack values.yaml - - - Configure AWS provider details (line #86) - - - Credentials, Zone Type - - AssumeRoleArn with the Role ARN created above - - - Configure txtOwnerId with the ID of the hosted zone created above (line #366) - ```bash - aws route53 list-hosted-zones-by-name --output json --dns-name "external-dns-test.my-org.com." | jq -r '.HostedZones[0].Id' - ``` - - Optionally change externalDNS policy and logLevel - -### Deploy Ingress Controller on the cluster - -- Deploy one of the Ingress Controller on the cluster - -### Deploy Applications with Ingress on the cluster - -- Add Prometheus-Operator addon to the same profile where ExternalDNS is added - - - Change serviceType to ClusterIP (line #408) - - Enable Ingress for the add-on packs. In this example, let us use Prometheus-Operator integration. Ingress config for - Grafana will look like the following: - - ```yaml - #Ingress config - ingress: - ## If true, Grafana Ingress will be created - ## - enabled: true + + - hosts: - - grafana.external-dns-test.my-org.com +### AWS Route53 - ## Path for grafana ingress - path: / - ``` +To use ExternalDNS with AWS Route53, you need to create an IAM policy and role with the following permissions. - When Prometheus-Operator gets deployed in the Cluster, Ingress resource for Grafana will also get created and will - look like +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": ["route53:ChangeResourceRecordSets"], + "Resource": ["arn:aws:route53:::hostedzone/*"] + }, + { + "Effect": "Allow", + "Action": ["route53:ListHostedZones", "route53:ListResourceRecordSets"], + "Resource": ["*"] + } + ] +} +``` - ```yaml - apiVersion: extensions/v1beta1 - kind: Ingress - metadata: - name: grafana-ingress - namespace: monitoring - spec: - rules: - - host: grafana.external-dns-test.my-org.com - http: - paths: - - backend: - serviceName: grafana - servicePort: 80 - path: / - status: - loadBalancer: - ingress: - - hostname: a9a2eadb64c8e4c2fb37a1f69afb0a30-330939473.us-west-2.elb.amazonaws.com - ``` +You also need to meet the following prerequisites: -### Verify ExternalDNS (Ingress example) +- Create an IAM role and associate the policy created above. Make a note of the role ARN which will be used in + ExternalDNS deployment later -- If all goes well, after 2 minutes, ExternalDNS would have inserted 2 records on your hosted zone +- Setup hosted zone in AWS Route53. Use the following command to create a hosted zone in Route53 using the AWS CLI. ```bash - aws route53 list-resource-record-sets --output json --hosted-zone-id "/hostedzone/ZEWFWZ4R16P7IB" \ - --query "ResourceRecordSets[?Name == 'grafana.external-dns-test.my-org.com.']|[?Type == 'A']" + aws route53 create-hosted-zone --name "external-dns-test.my-org.com." --caller-reference "external-dns-test-$(date +%s)" ``` -- After which, if you access http://grafana.external-dns-test.my-org.com on your browser, you will be able to view the - Grafana login page + + + ### Troubleshooting -- Make sure Ingress resource gets created for the Applications deployed and a LoadBalancer hostname / IP address is set - on the Ingress resource +- Make sure an _Ingress_ resource gets created for the applications deployed and a _LoadBalancer_ hostname or IP address + is set on the Ingress resource + - Check the `external-dns` pod for any issues with ExternalDNS not inserting records. If required, change `logLevel` to debug to see additional info on the logs -## References +## Terraform -- [External DNS Home](https://github.com/kubernetes-sigs/external-dns) -- [External DNS Helm Chart](https://github.com/bitnami/charts/tree/master/bitnami/external-dns) +You can reference the External DNS pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "palette_registry" { + name = "Palette Registry" +} + +data "spectrocloud_pack" "external-dns" { + name = "external-dns" + version = "0.13.6 + registry_uid = data.spectrocloud_registry.palette_registry.id +} +``` diff --git a/docs/docs-content/integrations/external-secrets-operator.md b/docs/docs-content/integrations/external-secrets-operator.md index ca263a2dd4..717b025ea1 100644 --- a/docs/docs-content/integrations/external-secrets-operator.md +++ b/docs/docs-content/integrations/external-secrets-operator.md @@ -10,40 +10,116 @@ logoUrl: "https://registry.spectrocloud.com/v1/external-secrets-operator/blobs/s tags: ["packs", "external-secrets-operator", "security"] --- -External Secrets Operator (ESO) is a Kubernetes operator that integrates external secret management systems like AWS -Secrets Manager, HashiCorp Vault, Google Secrets Manager, or Azure Key Vault. The operator reads information from -external APIs and automatically injects the values into a Kubernetes Secret. +## Versions Supported -You can use the External-Secrets-Operator Add-on pack as an authenticator in Palette. + + -:::info +#### Example Configuration -Starting from Palette version 3.1, Palette no longer supports upgrades to Kubernetes External Secrets since this is -reaching end of life. Migrate or switch to using External Secrets operator instead. +```yml +apiVersion: [external-secrets.io/v1beta1](http://external-secrets.io/v1beta1) +kind: ExternalSecret +metadata: + name: vault-example # Custom name +spec: + refreshInterval: "15s" + secretStoreRef: + name: vault-backend # Custom value + kind: SecretStore + target: + name: mysecretfoobar + data: + - secretKey: foobar + remoteRef: + key: secret/foo # custom value + property: my-value # custom value -::: +``` -## Versions Supported +```yml +apiVersion: external-secrets.io/v1beta1 +kind: SecretStore +metadata: + name: custom-name +spec: + provider: + vault: + server: "http://12.34.567.133:0000" # custom server end point + path: "secret" # custom path + version: "v2" # custom version + auth: + # points to a secret that contains a vault token + # https://www.vaultproject.io/docs/auth/token + tokenSecretRef: + name: "vault-token1" # Custom name and key + key: "token1" +--- +apiVersion: v1 +kind: Secret +metadata: + name: vault-token1 +data: + token: cm9vdA== # "root" # custome value +``` - + -- **0.7.1** -- **0.6.0** +#### Example Configuration - +```yml +apiVersion: [external-secrets.io/v1beta1](http://external-secrets.io/v1beta1) +kind: ExternalSecret +metadata: + name: vault-example # Custom name +spec: + refreshInterval: "15s" + secretStoreRef: + name: vault-backend # Custom value + kind: SecretStore + target: + name: mysecretfoobar + data: + - secretKey: foobar + remoteRef: + key: secret/foo # custom value + property: my-value # custom value - +``` -- **0.5.6** +```yml +apiVersion: external-secrets.io/v1beta1 +kind: SecretStore +metadata: + name: custom-name +spec: + provider: + vault: + server: "http://12.34.567.133:0000" # custom server end point + path: "secret" # custom path + version: "v2" # custom version + auth: + # points to a secret that contains a vault token + # https://www.vaultproject.io/docs/auth/token + tokenSecretRef: + name: "vault-token1" # Custom name and key + key: "token1" +--- +apiVersion: v1 +kind: Secret +metadata: + name: vault-token1 +data: + token: cm9vdA== # "root" # custome value +``` - -### Sample SecretStore + -
+#### Example Configuration ```yml apiVersion: [external-secrets.io/v1beta1](http://external-secrets.io/v1beta1) @@ -65,10 +141,6 @@ spec: ``` -### Sample ExternalSecret YAML file - -
- ```yml apiVersion: external-secrets.io/v1beta1 kind: SecretStore @@ -95,8 +167,21 @@ data: token: cm9vdA== # "root" # custome value ``` -## References +
+
+ +## Terraform + +You can reference the External Secrets Operator pack in Terraform with the following data resource. -- [Amazon IAM-Policy-Examples-ASM-Secrets](https://docs.aws.amazon.com/mediaconnect/latest/ug/iam-policy-examples-asm-secrets.html) +```hcl +data "spectrocloud_registry" "palette_registry" { + name = "Palette Registry" +} -- [External Secrets](https://github.com/external-secrets/external-secrets) +data "spectrocloud_pack" "external-secrets-operator" { + name = "external-secrets-operator" + version = "0.9.16" + registry_uid = data.spectrocloud_registry.palette_registry.id +} +``` diff --git a/docs/docs-content/integrations/falco.md b/docs/docs-content/integrations/falco.md index 15787d9a98..028b5d3563 100644 --- a/docs/docs-content/integrations/falco.md +++ b/docs/docs-content/integrations/falco.md @@ -6,27 +6,18 @@ hide_table_of_contents: true type: "integration" category: ["security", "amd64"] sidebar_class_name: "hide-from-sidebar" -logoUrl: "https://registry.spectrocloud.com/v1/falco/blobs/sha256:4e37461d0a31959ca8af65128329750ca3417e883e7e4ba17ee085b01a383a27?type=image.webp" tags: ["packs", "falco", "security"] --- -Falco integration is a behavioral activity monitor designed to detect anomalous activity in your applications. You can -use Falco to monitor the run-time security of your Kubernetes applications and internal components. - ## Versions Supported - + -- **1.16.3** - -- **1.0.11** -- **1.0.10** - @@ -37,6 +28,18 @@ use Falco to monitor the run-time security of your Kubernetes applications and i -## References +## Terraform + +You can reference the Falco pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "palette_registry" { + name = "Palette Registry" +} -- [Falco Helm Chart GitHub](https://github.com/falcosecurity/charts/tree/master/charts/falco) +data "spectrocloud_pack" "external-dns" { + name = "falco" + version = "2.0.18" + registry_uid = data.spectrocloud_registry.palette_registry.id +} +``` diff --git a/docs/docs-content/integrations/gatekeeper.md b/docs/docs-content/integrations/gatekeeper.md new file mode 100644 index 0000000000..2f34d9b333 --- /dev/null +++ b/docs/docs-content/integrations/gatekeeper.md @@ -0,0 +1,54 @@ +--- +sidebar_label: "OpenPolicyAgent" +title: "Open Policy Agent" +description: "OpenPolicyAgent security pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: + 'https://registry.dev.spectrocloud.com/v1/open-policy-agent/blobs/sha256:fcbad202dc9ca5e7a756562d8f9fc180ee77474034447dabc302d8a5a2bbe148?type=image.webp" + alt="OpenPolicyAgent logo' +tags: ["packs", "open-policy-agent", "security"] +--- + +## Versions Supported + + + + + + + + + +**3.7.0** + + + + + + + + + + + + + +## Terraform + +You can retrieve details about the Gatekeeper pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_addon_registry" { + name = "Spectro Addon Repo" +} + +data "spectrocloud_pack_simple" "gatekeeper" { + name = "gatekeeper" + version = "3.8.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_addon_registry.id +} +``` diff --git a/docs/docs-content/integrations/generic-byoi.md b/docs/docs-content/integrations/generic-byoi.md new file mode 100644 index 0000000000..2b1c7dee33 --- /dev/null +++ b/docs/docs-content/integrations/generic-byoi.md @@ -0,0 +1,60 @@ +--- +sidebar_label: "Bring Your Own OS (BYOOS)" +title: "Bring your own OS (BYOOS)" +description: "Bring Your Own OS (BYOOS) pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/spectro-proxy/blobs/sha256:b6081bca439eeb01a8d43b3cb6895df4c088f80af978856ddc0da568e5c09365?type=image.webp" +tags: ["packs", "byoos", "operating system"] +--- + +## Versions Supported + + + + + +## Reference Custom Image + +Different infrastructure providers have different ways of referencing custom images. The following table provides +examples of how to reference custom images for different infrastructure providers. + +| Provider | Example Image ID | osImageOverride Value | Notes | +| -------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| AWS | `ami-0f4804aff4cf9c5a2` | `ami-0f4804aff4cf9c5a2` | Ensure the AMI is available in the same region as the workload cluster. | +| Azure | `https://docs.blob.core.windows.net/vhds/ubuntu20-1243.vhd` | `https://docs.blob.core.windows.net/vhds/ubuntu20-1243.vhd` | You must reference the Azure blob URL of a Virtual Hard Disk (VHD). Image Gallery ID reference is not supported. | +| Vmware vSphere | `r_u-2004-0-k-1243-0-new.ova` | `path/to/template/r_u-2004-0-k-1243-0-new.ova` | Point to the path to where the custom template is located. Palette and VerteX expect OVAs to have the `r_u-` prefix. | +| Vmware vSphere | `rhel-8-kube-v1.27.11` | `path/to/template/rhel-8-kube-v1.27.11` | Point to the path to where the custom template is located. | + +Image creation tools are available to help you create custom OS images for the infrastructure provider you are using. +The following is a list of commonly used tools for creating a custom OS: + +- [AWS EC2 Image Builder](https://aws.amazon.com/image-builder/). + +- [Azure VM Image Builder](https://learn.microsoft.com/en-us/azure/virtual-machines/image-builder-overview?tabs=azure-powershell). + +- [HashiCorp Packer](https://developer.hashicorp.com/packer). + +- [Kubernetes Image Builder (KIB)](https://image-builder.sigs.k8s.io/introduction.html). + + + + +## Terraform + +You can retrieve details about the BYOOS pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "byoos" { + name = "generic-byoi" + version = "1.0.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/generic-vm-libvirt.md b/docs/docs-content/integrations/generic-vm-libvirt.md index 2f8a63d580..0294efeb66 100644 --- a/docs/docs-content/integrations/generic-vm-libvirt.md +++ b/docs/docs-content/integrations/generic-vm-libvirt.md @@ -10,52 +10,30 @@ logoUrl: "https://registry.spectrocloud.com/v1/generic-vm-libvirt/blobs/sha256:2 tags: ["packs", "generic-vm-libvirt", "system app"] --- -Generic-VM-Libvirt is a Palette Add-on pack used to simplify deploying the virtual machine applications from a cluster -profile or a system profile. Generic-VM-Libvirt extracts all Terraform constructs inside the pack and exposes nothing -but the values. Users will then have the ability to modify the add-on pack for the different applications. +## Versions Supported -## Version Supported - - + -- **1.0.2** -- **1.0.0** - - - - -
- -## Configuring Palette Generic VM Libvirt Add-on +### Configure VM Libvirt Add-on To configure the Generic-VM-Libvirt add-on pack for the application cluster, begin by editing the manifest namespace value. -`cluster-{{ .spectro.system.cluster.uid }}` - -**Example** - ```yaml -namespace: jet-system +namespace: cluster-{{ .spectro.system.cluster.uid }} ``` If multiple instances of this pack have to be deployed on the cluster for different virtual machine applications, then -modify '`spectrocloud.com/display-name`' and '`releaseNameOverride`' with distinctive names to make it unique across all -the packs in the cluster. - -
+modify `spectrocloud.com/display-name` and `releaseNameOverride` with distinctive names to make it unique across all the +packs in the cluster. ```yaml spectrocloud.com/display-name: vm-app-1 releaseNameOverride: ``` -
- -## Generic-VM-Libvirt Pack Manifest - -
+### Generic-VM-Libvirt Pack Manifest ```yaml pack: @@ -174,14 +152,12 @@ charts: # echo "I am post exec" ``` -## Virtual Machine Hooks +### Virtual Machine Hooks The Generic-VM-Libvirt pack supports various hooks, while deploying VM applications and supports multiple use-cases of customizing workflow, as customers require. -
- -## Using preExecCmd and postExecCmd +#### preExecCmd and postExecCmd The **preExecCmd** and **postExecCmd** commands will be executed in every pod reconciliation. The loop runs at approximately a 2-minute interval. @@ -189,8 +165,6 @@ approximately a 2-minute interval. If you want to run the command or script only, whenever the virtual machine is getting created or after the virtual machine is destroyed, use **preVMInitCmd** and **postVMInitCmd**, respectively. -
- ```yaml preExecCmd: "bash /var/files/pre-exec.sh" ``` @@ -199,17 +173,13 @@ preExecCmd: "bash /var/files/pre-exec.sh" postExecCmd: "bash /var/files/pre-exec.sh" ``` -
- -## Using preVMInitCmd and postVMInitCmd +#### preVMInitCmd and postVMInitCmd The **preVMInitCmd** command is executed, only when the virtual machine is being created or recreated. Likewise, the **postVMInitCmd** command is executed only after the virtual machine is created or recreated. **Note**: These commands will not be executed in each reconciliation. -
- ```yaml preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" ``` @@ -218,42 +188,30 @@ preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" postVMInitCmd: "echo 'Ooho! VM is created.'" ``` -
- -## Using preVMDestroyCmd +### preVMDestroyCmd Any command or script provided in this virtual machine hook will execute before the VM gets destroyed. It will be executed only when the VM is being deleted. A virtual machine deletion can happen for any reason, like changing anything in cloud-init or removing the pack from the profile. -
- ```yaml preVMDestroyCmd: "" ``` -
- :::info During a first-time deployment, preVMDestroyCmd will not be invoked. However, if there is any change in cloud-init, then the VM resource will be recreated, preVMDestroyCmd will be invoked before deleting the VM, and once preVMDestroyCmd is executed successfully, only then will the VM resource be deleted. -
-
Once the virtual machine is deleted and before another virtual machine is created, preVMInitCmd will be invoked. ::: -
- -## Files +### Files Files presented in this section will be added to the pod, where the pre-and-post exec hooks are executed. -
- ```yaml files: - name: pre-exec.sh @@ -270,16 +228,12 @@ extraDomainHclConfig: | } ``` -
- -## Mounts +### Mounts Mount the data inside the existing configuration maps or secrets into the pod as files, where pre-and-post hooks are executed. This allows the data present in the configuration map or the secrets file to be accessible while running pre-and-post exec hooks. -
- ```yaml mounts: configMap: @@ -294,16 +248,12 @@ mounts: path: /data/system-config-2 ``` -
- -## Environment Variables +### Environment Variables The ENVS section can inject data inside the existing config maps or secrets into the pod as environment variables, where pre-and post-hooks are executed so that data present in the config map or the secret file can be accessed while running pre-and-post exec hooks. -
- ```yaml envs: configMap: @@ -316,6 +266,22 @@ envs: dataKey: "db.password" ``` -## References +
+
+ +## Terraform -- [Libvirt Apps](https://libvirt.org/apps.html) +You can retrieve details about the Generic-VM-Libvirt pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "gatekeeper" { + name = "generic-vm-libvirt" + version = "1.0.6" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/generic-vm-vsphere.md b/docs/docs-content/integrations/generic-vm-vsphere.md index 2fae567fda..cf54d59677 100644 --- a/docs/docs-content/integrations/generic-vm-vsphere.md +++ b/docs/docs-content/integrations/generic-vm-vsphere.md @@ -6,56 +6,34 @@ hide_table_of_contents: true type: "integration" category: ["system app", "amd64"] sidebar_class_name: "hide-from-sidebar" -logoUrl: "https://registry.spectrocloud.com/v1/generic-vm-vsphere/blobs/sha256:3b121dca3cbc7fed0153d3e1c8c3df20076ec200e091085a3a281ba08cb2261e?type=image.webp" tags: ["packs", "generic-vm-vsphere", "system app"] --- -Generic-VM-vSphere is a Palette Add-on pack used to simplify deploying the virtual machine resource from a cluster -profile or a system profile. Generic-VM-vSphere extracts all Terraform constructs inside the pack and exposes nothing -but the values. Users will then have the ability to modify the add-on pack for the different applications. +## Versions Supported -
- -## Version Supported - - + -- **1.0.4** -- **1.0.0** - - - - -
- -## Configuring Generic-VM-vSphere +### Configure Generic-VM-vSphere To configure the Generic-VM-vSphere Add-on pack for the application cluster, the namespace value should be as follows: -`cluster-{{ .spectro.system.cluster.uid }}`
+`cluster-{{ .spectro.system.cluster.uid }}` ```yaml namespace: cluster-{{ .spectro.system.cluster.uid }} ``` If multiple instances of this pack has to be deployed on the cluster for different virtual machine applications, then -modify '`spectrocloud.com/display-name`' and '`releaseNameOverride`' with different names to make it unique across all -the packs in the cluster. - -
+modify `spectrocloud.com/display-name` and `releaseNameOverride` with different names to make it unique across all the +packs in the cluster. ```yaml spectrocloud.com/display-name: vm-app-1 releaseNameOverride: ``` -
-
- -## Generic-VM-vSphere Pack Manifest - -
+### Generic-VM-vSphere Pack Manifest ```yaml pack: @@ -196,26 +174,24 @@ charts: # echo "I am post exec" ``` -## Virtual Machine Hooks +### Virtual Machine Hooks The Generic-VM-vSphere pack supports various hooks while deploying VM applications and supports multiple use-cases of customizing workflow, as customers require. -
- -## Using extraVMHclConfig +#### extraVMHclConfig The extraVMHclConfig command can be used to provide an extra configuration in the virtual machine and the configuration file should be provided in HashiCorp Configuration Language (HCL) format. -```terraform -# extraVMHclConfig: | -# cdrom { -# client_device = true -# } +```hcl +extraVMHclConfig: | + cdrom { + client_device = true + } ``` -## Using preExecCmd and postExecCmd +#### preExecCmd and postExecCmd The **preExecCmd** and **postExecCmd** commands will be executed in every pod reconciliation. The loop runs at approximately a 2-minute interval. @@ -223,8 +199,6 @@ approximately a 2-minute interval. **preExecCMD** and **postVMInitCmd** are used to execute commands or scripts prior to virtual machine creation and after virtual machine creation respectively. -
- ```yaml preExecCmd: "bash /var/files/pre-exec.sh" ``` @@ -233,16 +207,16 @@ preExecCmd: "bash /var/files/pre-exec.sh" postExecCmd: "bash /var/files/pre-exec.sh" ``` -
- -## Using preVMInitCmd and postVMInitCmd +#### preVMInitCmd and postVMInitCmd The **preVMInitCmd** command is executed, only when the virtual machine is being created or recreated. Likewise, the **postVMInitCmd** command is executed only after the virtual machine is created or recreated. -**Note**: These commands will not be executed in each reconciliation. +:::info + +These commands will not be executed in each reconciliation. -
+::: ```yaml preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" @@ -252,45 +226,32 @@ preVMInitCmd: "echo 'Hey! Hang on tight. I am gonna create a VM.'" postVMInitCmd: "echo 'Ooho! VM is created.'" ``` -
- -## Using preVMDestroyCmd +#### preVMDestroyCmd Any command or script provided in this virtual machine hook will execute before the virtual machine is destroyed. It will be executed only when the VM is getting deleted. A virtual machine deletion can happen for any reason, like changing anything in cloud-init or removing the pack from the profile. -
- ```yaml preVMDestroyCmd: "" ``` -
- :::info -During a first-time deployment, preVMDestroyCmd won't be invoked. However, if there is any change in cloud-init, -then the VM resource will be recreated, preVMDestroyCmd will be invoked before deleting the VM, and once preVMDestroyCmd -is executed successfully, only then the VM resource will be deleted. +During a first-time deployment, `preVMDestroyCmd` won't be invoked. However, if there is any change in cloud-init, then +the VM resource will be recreated, preVMDestroyCmd will be invoked before deleting the VM, and once preVMDestroyCmd is +executed successfully, only then the VM resource will be deleted. -
-
-Once the VM is deleted and before another virtual machine is created, preVMInitCmd will be invoked. +Once the VM is deleted and before another virtual machine is created, `preVMInitCmd` will be invoked. ::: -
-
- -## Mounts +### Mounts Mount the data inside the existing configuration map or secret into the pod as files, where pre-and-post hooks are executed. This allows the data present in the configuration map or the secrets file to be accessible while running pre-and-post exec hooks. -
- ```yaml mounts: configMap: @@ -305,16 +266,12 @@ mounts: # path: /data/system-config-2 ``` -
- -## Environment Variables +### Environment Variables The ENVS section can inject data inside the existing config maps or secrets into the pod as environment variables, where pre-and post-hooks are executed so that data present in the config map or the secret file can be accessed while running pre-and-post exec hooks. -
- ```yaml envs: configMap: @@ -327,14 +284,10 @@ envs: # dataKey: "db.password" ``` -
- -## Files +### Files Files present in this section will be added to the pod and will be accessible while executing pre-and-post execution -hooks and absolute file path would be '/var/files/\'. - -
+hooks and absolute file path would be `/var/files/file_name`. ```yaml files: @@ -348,4 +301,22 @@ files: # echo "I am post exec" ``` -
+
+
+ +## Terraform + +You can retrieve details about the Generic-VM-Libvirt pack by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "gatekeeper" { + name = "generic-vm-vsphere" + version = "1.0.10" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/gke-csi-gcp-driver.md b/docs/docs-content/integrations/gke-csi-gcp-driver.md new file mode 100644 index 0000000000..894e1a4487 --- /dev/null +++ b/docs/docs-content/integrations/gke-csi-gcp-driver.md @@ -0,0 +1,42 @@ +--- +sidebar_label: "GKE GCE-Persistent-Disk" +title: "GKE GCE Persistent Disk" +description: "GCE Persistent Disk storage pack in Spectro Cloud for GKE" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "storage", "gce-persistent-disk"] +--- + +## Versions Supported + + + + + + + + + + + + + +## Terraform + +Use the following Terraform snippet to reference the GCE Persistent Disk for GKE pack in your Terraform code. + +```hcl + +data "spectrocloud_registry" "palette_registry_oci" { + name = "Palette Registry" +} + +data "spectrocloud_pack_simple" "cs-gcp-driver" { + name = "gke-csi-gcp-driver" + version = "1.0.0" + type = "helm" + registry_uid = data.spectrocloud_registry.palette_registry_oci.id +} +``` diff --git a/docs/docs-content/integrations/harbor-edge-native-config.md b/docs/docs-content/integrations/harbor-edge-native-config.md new file mode 100644 index 0000000000..4c1a03b4f2 --- /dev/null +++ b/docs/docs-content/integrations/harbor-edge-native-config.md @@ -0,0 +1,312 @@ +--- +sidebar_label: "harbor-edge" +title: "Harbor Edge Native Config" +description: "Harbor Edge Native Config pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["system-app", "registry"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/harbor/blobs/sha256:5cf19a83449d41a6eb2398194dd4563d31d371074375255ba8a2fc4feff4ef33?type=image.webp" +tags: ["packs", "harbor-edge-native-config", "system-app"] +--- + +## Versions Supported + + + + +The Harbor Edge-Native Config pack is a system application pack. When you provision a cluster with a profile that +includes this pack, Palette automatically chooses the latest version of Harbor supported by Palette to install on the +cluster. You cannot manually choose a version of this pack. + +:::preview + +::: + +## Enable Harbor to Protect Against Outage + +You can use Harbor in an Edge cluster that is connected to external networks. Harbor stores all container images +downloaded from the internet and future image pulls from the cluster will be from the local harbor registry. If your +cluster experiences an internet outage, it can still reboot containers or add new nodes using images stored locally in +Harbor. For more information, refer to +[Deploy a Cluster with a Local Harbor Registry](../clusters/edge/site-deployment/deploy-custom-registries/local-registry.md). + +## Log in to Harbor Web UI + +With Harbor enabled on your Edge cluster, you can log in to Harbor via its web UI. By default, the Harbor service is +accessible as a NodePort-type service with HTTPS enabled on port `30003`. You can use the following steps to log in to +Harbor via the web UI. + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. From the left **Main Menu**, navigate to **Clusters**. Choose your Edge cluster. + +3. Navigate to the **Nodes** tab, in the **Private Ips** column, you can find the IP addresses of your Edge hosts. + +4. Ensure you have network access to your Edge hosts. Open a new tab in your browser and navigate to + `https://NODE_IP:30003` and replace `NODE_IP` with any IP address in your cluster. NodePort-type services are exposed + on the same port on all nodes in your cluster. If you changed the HTTPS port in the configurations, replace the port + with the HTTPS port you used. + +5. If you didn't provide a certificate or used a self-signed certificate, your browser might warn you about an unsafe + connection. Dismiss the warning, and you will be directed to Harbor's web UI. If you use Google Chrome, you can click + anywhere in your browser tab and type `this is unsafe` using your keyboard to dismiss the warning. + +6. Type in `admin` as the username and your password to log in to Harbor. If you don't know your password, refer to + [Retrieve Harbor Credentials](#retrieve-harbor-credentials) to retrieve your password. + +## Retrieve Harbor Credentials + +During cluster creation, Palette creates two secrets that store the password used to authenticate the `admin` user in +Harbor and the X509 certificate used for TLS. You can access both of these credentials using the following steps: + +1. Configure kubectl to access your Kubernetes cluster. For more information, refer to + [Access a Cluster with CLI](../clusters/cluster-management/palette-webctl.md). + +2. Depending on the credential you want to retrieve, use the commands described below. + + + + +1. Issue the command `kubectl get namespaces` to get all namespaces. Look for a namespace called `cluster-CLUSTER-ID`, + where `CLUSTER-ID` is a string of alphanumeric characters. This is the namespace where the secret for your Harbor + password is stored. + +2. Issue the following command to get the password of your Harbor user. Replace `CLUSTER-ID-NAMESPACE` with the + namespace you identified in the previous step. This command outputs your password. + +```shell +kubectl get secret registry-info --namespace CLUSTER-ID-NAMESPACE --output jsonpath="{.data.SPECTRO_USER_PASSWORD}" | base64 --decode +``` + + + + +Issue the following command to retrieve the certificate. + +```shell +kubectl get secret harbor-tls --namespace harbor --output jsonpath="{.data.tls\.crt}" | base64 --decode +``` + + + + +Issue the following command to retrieve the private key. + +```shell +kubectl get secret harbor-tls --namespace harbor --output jsonpath="{.data.tls\.key}" | base64 --decode +``` + + + + +## Push and Pull Images to Harbor + +You can use the following steps to push images to and pull images from the Harbor registry. + +:::info + +If you didn't provide a certificate or are using a self-signed certificate, Docker will refuse to connect to the +registry unless you configure Docker to trust the certificate authority or use a insecure connection for your Harbor +registry. You can configure Docker to use a insecure connection by adding a line +`"insecure-registries": ["REGISTRY_URL"]` in your Docker `daemon.json` file. For more information about `daemon.json`, +refer to [Docker documentation](https://docs.docker.com/config/daemon/). + +::: + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. From the left **Main Menu**, navigate to **Clusters**. Choose your Edge cluster. + +3. Navigate to the **Nodes** tab, in the **Private Ips** column, you can find the IP addresses of your Edge hosts. + +4. Ensure you have network access to your Edge hosts. Log in to Harbor from your command-line interface. The following + example uses Docker, but you can use any other image management tool. Replace `NODE_IP` with the IP address of any of + the nodes and replace `HARBOR_PASSWORD` with the password of your Harbor user. If you don't know your password, refer + to [Retrieve Harbor Credentials](#retrieve-harbor-credentials). + + ```shell + docker login NODE_IP:30003 --user admin --password HARBOR_PASSWORD + ``` + +5. After a successful login, you can start to pull and push images. + + + + To pull an image from the Harbor registry, issue the following command. + +```shell +docker pull REGISTRY_URL/PROJECT_NAME/IMAGE_NAME:TAG +``` + +For example, the following command pulls the image for `kube-vip` from the Harbor registry. + +```shell +docker pull 10.10.137.220:30003/spectro-images/gcr.io/spectro-images-public/kube-vip/kube-vip:v0.6.3 +``` + + + + + To push an image to the Harbor registry, first tag the image with your registry URL. + +```shell +docker tag LOCAL_IMAGE:LOCAL_IMAGE_TAG REGISTRY_URL/PROJECT_NAME/IMAGE_NAME:TAG +``` + +After tagging the image, you can push it to the Harbor registry. + +```shell +docker push REGISTRY_URL/PROJECT_NAME/IMAGE_NAME:TAG +``` + +For example, the following commands tag the local image `alpine:latest` and push it to the Harbor registry. + +``` +docker tag alpine:latest 10.10.137.220:30003/spectro-images/alpine:latest +docker push 10.10.137.220:30003/spectro-images/alpine:latest +``` + + + + +## Enable Image Download from Outside of Harbor + +If a cluster is configured with the Harbor Edge-Native Config pack, it will assume that all images will be stored in +Harbor once they are initially downloaded. However, it is important to note that only the images that are part of the +cluster profile and managed by Palette will be stored in the Harbor registry. Any images not managed by Palette will not +be available in the Harbor registry. + +This can cause issues if you want to use images that are not managed by Palette in your cluster. Harbor will not store +those images because they are not part of your cluster profile and were not requested by Palette. However, the Palette +agent in your Edge host will still try to pull those images from Harbor, resulting in ImagePullBackOff errors. + +You can apply the label `stylus.io/imageswap=disable` to a namespace, which instructs the Palette agent to not pull +images from the Harbor registry. You can do this when you create the namespace, or apply the label to existing +namespaces. As long as a namespace has the label, the Palette agent will not attempt to pull images in the namespace +from the Harbor registry. + +You can apply a label to a namespace by editing the pack YAML in the cluster's profile or use `kubectl` to add the label +through the command-line. + + + + +1. Connect to the cluster via `kubectl`. For more information, refer to + [Access Cluster with kubectl](../clusters/cluster-management/palette-webctl.md). + +2. Apply the `stylus.io/imageswap=disable` label to the namespace you plan to deploy resources in. Replace + `namespace-name` with the name of your namespace. + + ```shell + kubectl label namespace namespace-name stylus.io/imageswap=disable + ``` + +3. Deploy the resources into the namespace. Since the namespace has the label `stylus.io/imageswap=disable`, the Palette + agent will pull the image from registiries you specify instead of from the Harbor registry. + + If you already deployed the resources before applying the label, you will need to trigger another image pull action + as the label will only apply to subsequent image pulls after it has been applied. You can do this by issuing the + `kubectl apply` command again to reapply the manifest. Or use the `kubectl delete` command to delete the resource and + wait for it to be re-created. + + + + + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. From the left **Main Menu**, click on **Profiles**. + +3. Select the profile you are using to deploy your cluster. + +4. Click on **Add Manifest** to add a new manifest to your cluster profile containing the namespaces you plan to deploy + resources to. Create a namespace if needed, and apply the label `stylus.io/imageswap=disable` to the namespace. Refer + to [Profile Customizations](../profiles/profile-customization.md) for more information on how to apply labels to + namespaces. For example, the following pack YAML creates a namespaced called `"wordpress"` and applies the label + `stylus.io/imageswap=disable` to the namespace. + + ```yaml + pack: + namespace: "wordpress" + + namespaceLabels: + "wordpress": "stylus.io/imageswap=disable" + ``` + +5. Deploy the resources into the namespace. Since the namespace has the label `stylus.io/imageswap=disable`, the Palette + agent will pull the image from registiries you specify instead of from the Harbor registry. + +## Troubleshooting + +### Scenario - Harbor DB Pod Fails to Start + +When you start a cluster with the Harbor pack, the **harbor-database** pod might fail to start and get stuck on the +**CrashLoopBackoff** state. It's possible that this is due to known issue with the Harbor pack related to file +permissions. The workaround is to delete the pod and a new pod will be automatically created. + +#### Debug Steps + +1. Issue the following command to identify the pods with names that start with `harbor-database`. + +```shell +kubectl get pods --namespace harbor --output wide +``` + +2. Delete the pod you identified in the previous step. Replace `POD_NAME` with the name of the pods. If there are + multiple pods, use the command for each pod. + +```shell +kubectl delete pod POD_NAME --namespace harbor +``` + + + + +## Troubleshooting + +### Scenario - Harbor DB Pod Fails to Start + +When you start a cluster with the Harbor pack, the **harbor-database** pod might fail to start and get stuck on the +**CrashLoopBackoff** state. It's possible that this is due to known issue with the Harbor pack related to file +permissions. The workaround is to delete the pod and a new pod will be automatically created. + +#### Debug Steps + +1. Issue the following command to identify the pods with names that start with `harbor-database`. + +```shell +kubectl get pods --namespace harbor --output wide +``` + +2. Delete the pod you identified in the previous step. Replace `POD_NAME` with the name of the pods. If there are + multiple pods, use the command for each pod. + +```shell +kubectl delete pod POD_NAME --namespace harbor +``` + +### Scenario - Cluster Stuck in the Provisioning State + +A cluster may get stuck in the provisioning state if it uses Longhorn as its storage layer. If this happens, remove the +cluster and try again. + + + + +## Terraform + +You can reference the Harbor Edge-Native Config pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "harbor-edge-native-config" { + name = "harbor-edge-native-config" + version = "1.0.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/heartbeat.md b/docs/docs-content/integrations/heartbeat.md index 2c36159582..093836382c 100644 --- a/docs/docs-content/integrations/heartbeat.md +++ b/docs/docs-content/integrations/heartbeat.md @@ -10,21 +10,18 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/heartbeat/blobs/sha256:19fec6 tags: ["packs", "heart-beat", "monitoring"] --- -Heartbeat is a lightweight daemon installed to a remote server for periodically checking the status of the services and -determine whether they are currently available and reachable. Heartbeat is useful to verify that your service level -agreements are met during the service uptime. +## Terraform -## Versions Supported +You can reference the Heartbeat pack in Terraform with the following data resource. - +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} - - -**1.0.0** - - - - -## References - -- [Heartbeat Reference Documentation](https://www.elastic.co/guide/en/beats/heartbeat/current/index.html) +data "spectrocloud_pack" "heartbeat" { + name = "heartbeat" + version = "1.0.0" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/hello-universe.md b/docs/docs-content/integrations/hello-universe.md index e1240677bd..af03dac30c 100644 --- a/docs/docs-content/integrations/hello-universe.md +++ b/docs/docs-content/integrations/hello-universe.md @@ -10,87 +10,12 @@ logoUrl: "https://raw.githubusercontent.com/spectrocloud/pack-central/main/packs tags: ["packs", "hello-universe", "app-services"] --- -[Hello Universe](https://github.com/spectrocloud/hello-universe) is a demo web application utilized to help users learn -more about [Palette](https://docs.spectrocloud.com/introduction) and its features. - -You can deploy it using two preset configurations: - -- A standalone front-end application. It provides a click counter that is saved locally and displays Spectro Cloud - themed images. -- A three-tier application with a front-end tier, API server, and PostgreSQL database. It provides a click counter that - is saved in the deployed database and displays Spectro Cloud themed images. You can read more about this configuration - on the Hello Universe - [README](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#reverse-proxy-with-kubernetes). - :::info The three-tier application configuration is only supported by version 1.1.2 of the pack. ::: -## Versions Supported - - - - - -## Prerequisites - -- A Palette account. - -- A cluster profile where the Hello Universe pack can be integrated. - -- A Palette cluster with port `:8080` available. If port 8080 is not available, you can set a different port in the - **values.yaml** file. - -- If you are using the **Enable Hello Universe API** preset, you will need the `:3000` port available on your cluster - too. Check out the [Usage](#usage) section for further details. - -- Ensure sufficient CPU resources within the cluster to allocate a minimum of 500 milliCPU and a maximum of 500 milliCPU - per replica. - -## Parameters - -The following parameters are applied to the **hello-universe.yaml** manifest through the **values.yaml** file. Users do -not need to take any additional actions regarding these parameters. - -| **Parameter** | **Description** | **Default Value** | **Required** | -| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------------ | -| `manifests.namespace` | The namespace in which the application will be deployed. | `hello-universe` | Yes | -| `manifests.images.hellouniverse` | The [`hello-universe`](https://github.com/spectrocloud/hello-universe) application image that will be utilized to create the front-end containers. | `ghcr.io/spectrocloud/hello-universe:1.1.2`/ `ghcr.io/spectrocloud/hello-universe:1.1.2-proxy` | Yes | -| `manifests.images.hellouniverseapi` | The [`hello-universe-api`](https://github.com/spectrocloud/hello-universe-api) application image that will be utilized to create the API containers. | `ghcr.io/spectrocloud/hello-universe-api:1.0.12` | No | -| `manifests.images.hellouniversedb` | The [`hello-universe-db`](https://github.com/spectrocloud/hello-universe-db) application image that will be utilized to create the database containers. | `ghcr.io/spectrocloud/hello-universe-db:1.0.2` | No | -| `manifests.apiEnabled` | The flag that indicates whether to deploy the UI application as standalone or together with the API server. | `false` | Yes | -| `manifests.port` | The cluster port number on which the service will listen for incoming traffic. | `8080` | Yes | -| `manifests.replicas` | The number of Pods to be created. | `1` | Yes | -| `manifests.dbPassword` | The base64 encoded database password to connect to the API database. | `REPLACE_ME` | No | -| `manifests.authToken` | The base64 encoded auth token for the API connection. | `REPLACE_ME` | No | - -## Usage - -The Hello Universe pack has two presets that you can select: - -- **Disable Hello Universe API** configures Hello Universe as a standalone frontend application. This is the default - configuration of the pack. -- **Enable Hello Universe API** configures Hello Universe as a three-tier application with a frontend, API server, and - Postgres database. - -To utilize the Hello Universe pack, create either a -[full Palette cluster profile](https://docs.spectrocloud.com/profiles/cluster-profiles/create-cluster-profiles/create-full-profile) -or an -[add-on Palette cluster profile](https://docs.spectrocloud.com/profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/) -and add the pack to your profile. You can select the preset you wish to deploy on the cluster profile creation page. - -If your infrastructure provider does not offer a native load balancer solution, such as VMware and MAAS, the -[MetalLB](https://docs.spectrocloud.com/integrations/metallb) pack must be included to the cluster profile to help the -LoadBalancer service specified in the manifest obtain an IP address. - -After defining the cluster profile, use it to deploy a new cluster or attach it as an add-on profile to an existing -cluster. - -Once the cluster status displays **Running** and **Healthy**, access the Hello Universe application through the exposed -service URL along with the displayed port number. - ## Terraform You can reference the Hello Universe pack in Terraform with the following data resource. @@ -105,75 +30,3 @@ data "spectrocloud_pack" "hellouniverse" { registry_uid = data.spectrocloud_registry.community_registry.id } ``` - - - - - -## Prerequisites - -- A Palette account. - -- A cluster profile where the Hello Universe pack can be integrated. - -- A Palette cluster with port `:8080` available. If port 8080 is not available, you can set a different port in the - **values.yaml** file. - -- Ensure sufficient CPU resources within the cluster to allocate a minimum of 100 milliCPU and a maximum of 200 milliCPU - per replica. - -## Parameters - -The following parameters are applied to the **hello-universe.yaml** manifest through the **values.yaml** file. Users do -not need to take any additional actions regarding these parameters. - -| **Parameter** | **Description** | **Default Value** | **Required** | -| --------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------- | ------------ | -| `manifests.namespace` | The namespace in which the application will be deployed. | `hello-universe` | No | -| `manifests.images.hello-universe` | The application image that will be utilized to create the containers. | `ghcr.io/spectrocloud/hello-universe:1.1.1` | No | -| `manifests.port` | The cluster port number on which the service will listen for incoming traffic. | `8080` | No | -| `manifests.replicas` | The number of Pods to be created. | `1` | No | - -## Usage - -To utilize the Hello Universe pack, create either a -[full Palette cluster profile](../profiles/cluster-profiles/create-cluster-profiles/create-full-profile.md) or an -[add-on Palette cluster profile](../profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/create-addon-profile.md) -and add the pack to your profile. - -If your infrastructure provider does not offer a native load balancer solution, such as VMware and MAAS, the -[MetalLB](./metallb.md) pack must be included to the cluster profile to help the LoadBalancer service specified in the -manifest obtain an IP address. - -After defining the cluster profile, use it to deploy a new cluster or attach it as an add-on profile to an existing -cluster. - -Once the cluster status displays **Running** and **Healthy**, access the Hello Universe application through the exposed -service URL along with the displayed port number. - -## Terraform - -You can reference the Hello Universe pack in Terraform with the following data resource. - -```hcl -data "spectrocloud_registry" "community_registry" { - name = "Palette Registry" -} -data "spectrocloud_pack" "hellouniverse" { - name = "hello-universe" - version = "1.1.1" - registry_uid = data.spectrocloud_registry.community_registry.id -} -``` - - - - - -## References - -- [Hello Universe GitHub Repository](https://github.com/spectrocloud/hello-universe) - -- [Deploy a Custom Pack Tutorial](../tutorials/profiles/deploy-pack.md) - -- [Registries and Packs](../registries-and-packs/registries-and-packs.md) diff --git a/docs/docs-content/integrations/istio.md b/docs/docs-content/integrations/istio.md index be0c9df945..69dc493f1e 100644 --- a/docs/docs-content/integrations/istio.md +++ b/docs/docs-content/integrations/istio.md @@ -10,29 +10,29 @@ logoUrl: "https://registry.spectrocloud.com/v1/istio/blobs/sha256:c80cf596d48592 tags: ["packs", "istio", "network"] --- -This Integration aims to automate and simplify the rollout of the various Istio components which helps with service mesh -use cases. - ## Versions Supported - + -- **1.14.3** -- **1.14.1** - - +## Pack Components - +The integration deploys the Istio Operator with the 'demo' profile which deploys the following components: -- **1.6.2** +- Istiod +- Istio Ingress Gateway +- Istio Egress Gateway +- Grafana +- Prometheus +- Istio Tracing +- Kiali - + -## Contents +## Pack Components The integration deploys the Istio Operator with the 'demo' profile which deploys the following components: @@ -44,10 +44,22 @@ The integration deploys the Istio Operator with the 'demo' profile which deploys - Istio Tracing - Kiali -## References + + + + +## Terraform -- [Istio Home](https://istio.io) +You can reference the Istio pack in Terraform with the following data resource. -- [Istio Documentation](https://istio.io/latest/docs) +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} -- [Istio Operator GitHub](https://github.com/istio/operator) +data "spectrocloud_pack" "istio" { + name = "istio" + version = "1.20.1" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/k8s-dashboard.md b/docs/docs-content/integrations/k8s-dashboard.md new file mode 100644 index 0000000000..49998681ad --- /dev/null +++ b/docs/docs-content/integrations/k8s-dashboard.md @@ -0,0 +1,501 @@ +--- +sidebar_label: "Kubernetes Dashboard" +title: "Kubernetes Dashboard" +description: + "Learn how to manage Kubernetes clusters and applications deployed in them by using the Kubernetes Dashboard + Monitoring pack." +type: "integration" +hide_table_of_contents: true +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/k8s-dashboard/blobs/sha256:2de5d88b2573af42d4cc269dff75744c4174ce47cbbeed5445e51a2edd8b7429?type=image.webp" +tags: ["packs", "kubernetes-dashboard", "monitoring"] +--- + +## Versions Supported + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + + +The Kubernetes Dashboard pack requires the pack, which serves as a reverse proxy to expose the Kubernetes dashboard. You must configure the Spectro Proxy pack. + +When connected to the cluster remotely, issue the following command to establish a connection to deploy the Kubernetes +Dashboard on port 8080. + + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret \ +$(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + + +The Kubernetes Dashboard pack requires the pack, which serves as a reverse proxy to expose the Kubernetes dashboard. You must configure the Spectro Proxy pack. + +When connected to the cluster remotely, issue the following command to establish a connection to deploy the Kubernetes +Dashboard on port 8080. + + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret $(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + + +The Kubernetes Dashboard pack requires the pack, which serves as a reverse proxy to expose the Kubernetes dashboard. You must configure the Spectro Proxy pack. + +When connected to the cluster remotely, issue the following command to establish a connection to deploy the Kubernetes +Dashboard on port 8080. + + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret $(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + +When connected to the cluster remotely, run the following command to establish a connection to to deploy the Kubernetes +Dashboard on port 80. + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret $(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + + +The Kubernetes Dashboard pack requires the pack, which serves as a reverse proxy to expose the Kubernetes dashboard. You must configure the Spectro Proxy pack. + +When connected to the cluster remotely, run the following command to establish a connection to to deploy the Kubernetes +Dashboard on port 80. + + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret $(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +:::warning + +Starting with Kubernetes Dashboard version 2.7.0, the **Connect** button is no longer available. For an optimized +experience, we recommend you use the pre-configured version of this dashboard, called Spectro Kubernetes Dashboard pack. +To learn more about it and start using it, check out the [Spectro Kubernetes Dashboard](spectro-k8s-dashboard.md) guide. + +::: + +## Access Kubernetes Dashboard + + +The Kubernetes Dashboard pack requires the pack, which serves as a reverse proxy to expose the Kubernetes dashboard. You must configure the Spectro Proxy pack. + +When connected to the cluster remotely, run the following command to establish a connection to to deploy the Kubernetes +Dashboard on port 80. + + +```bash +kubectl port-forward -namespace kubernetes-dashboard service/kubernetes-dashboard 8080:443 +``` + +To access Kubernetes Dashboard, navigate to `https://localhost:8080` in a browser of your choice. + +From the Dashboard login page, run the following command from the terminal window to obtain the bearer token: + +```bash +kubectl -namespace kubernetes-dashboard describe secret $(kubectl -namespace kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}') +``` + +The following example shows the command output with the token value. + +```yaml +Name: kubernetes-dashboard-token-h4lnf +Namespace: kubernetes-dashboard +Labels: +Annotations: kubernetes.io/service-account.name: kubernetes-dashboard + kubernetes.io/service-account.uid: 00e729f1-6638-4e68-8df5-afa2e2e38095 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1029 bytes +namespace: 20 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ilg1bTg3RWM4Y1c3NnhkQ3dXbXNDUXQydVpYQklRUWoxa1BaS0ctVkVTSDQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1oNGxuZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwZTcyOWYxLTY2MzgtNGU2OC04ZGY1LWFmYTJlMmUzODA5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.JU4GOJNjGpkHabUyxBt_2rvtXNjpR3w238BF2oMCQUNf_ZkUGSMeAAgIKxbAuk62dtJNDaRh5yAZ9J5KthMcU6k4qVmodUOJdlvigBVNjTDEhPM-sqJus62HMtwjpvm0CX-aP_A_BqHs2yJ3OgXSX0uHmkUO1FMoZSVaRpOvx7f5bPswxd87L3npuZt4p-NJIX32-DGjBnxdANAHcWil3YHIUbDgQIdjDfN6stGU_JByvzfCJpNCWWDinr772W7iZ3uA28F8uGS0ZMd1E5e1moEFBY8BM015Qxg2Y_k7lmv9S8GMkBJyTiJNiqnwLwfsiE1ycE4Tgq_vuQfFToIMNw +``` + +## Configure Ingress + +Use the following steps to configure ingress for the Kubernetes Dashboard pack. + +1. Ensure the `service.type` parameter is set to "ClusterIP". + +2. To enable ingress, set the `ingress.enabled` parameter to "true". + +3. Set ingress rules, such as annotations, path, hosts, and any other rules. + +This allows you to access the Kubernetes Dashboard in hostname or IP format using the IP address that the ingress +controller exposes. + +Typically you would point a DNS CNAME record to the ingress controller IP. Talk to your system administrator to learn +more about which hostname to use. + +## Configure LoadBalancer + +Use the `service.loadBalancerIP` and `service.externalPort` parameters to connect to the Kubernetes Dashboard. + +## Troubleshooting + +### Scenario - Kubernetes Dashboard not Accessible + +If the Kubernetes Dashboard is not accessible, check the dashboard pod for errors and ensure the dashboard service is in +the **Running** state. + + + + + +## Terraform + +You can reference the Kubernetes Dashboard pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack" "k8s-dashboard" { + name = "k8s-dashboard" + version = "2.7.0" + type = "monitoring" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kong.md b/docs/docs-content/integrations/kong.md index 369b5fb7d2..52f0129a54 100644 --- a/docs/docs-content/integrations/kong.md +++ b/docs/docs-content/integrations/kong.md @@ -10,33 +10,18 @@ logoUrl: "https://registry.spectrocloud.com/v1/kong/blobs/sha256:600f20583f85cca tags: ["packs", "kong", "network"] --- -The Kong integration is an Ingress Controller for Kubernetes that configures ingress with a load balancer. You can use -the Kong as an application load balancer for your application. +## Terraform -## Version Supported +You can reference the Kong pack in Terraform with the following data resource. - +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} - - -- **2.13.1** - - - - - -- **1.4.0** - - - - - -## Components - -The integration adds the Kong Ingress Controller, which exposes a Kubernetes service of type LoadBalancer. - -## References - -- [Kong Ingress Controller Documentation ](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers) - -- [Kong GitHub](https://github.com/Kong/kubernetes-ingress-controller) +data "spectrocloud_pack" "kong" { + name = "kong" + version = "2.38.0" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubebench.md b/docs/docs-content/integrations/kubebench.md index 26a00e2d45..2b3bbbc7cb 100644 --- a/docs/docs-content/integrations/kubebench.md +++ b/docs/docs-content/integrations/kubebench.md @@ -10,24 +10,18 @@ logoUrl: https://registry-addon.spectrocloud.com/v1/kube-bench/blobs/sha256:28c2 tags: ["packs", "kube-bench", "security"] --- -Palette executes kube-bench, a CIS Benchmark scanner by Aqua Security, for every Kubernetes pack to ensure the control -plane and worker nodes are configured securely. It is available as an Add-on layer within Palette. +## Terraform -kube-bench runs against a series of checks specified in a `controls` YAML file. For more information on how to write -tests and config files, refer to the [controls](https://github.com/aquasecurity/kube-bench/blob/main/docs/controls.md) -section. +You can reference the Kube-bench pack in Terraform with the following data resource. -## Versions Supported +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} - - - - -- **0.6.8** - - - - -## References - -- [kube-bench GitHub](https://github.com/aquasecurity/kube-bench/blob/main/docs/running.md#running-kube-bench) +data "spectrocloud_pack" "kubebench" { + name = "kubebench" + version = "1.16.7" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubehunter.md b/docs/docs-content/integrations/kubehunter.md index ea72bf5784..7205631391 100644 --- a/docs/docs-content/integrations/kubehunter.md +++ b/docs/docs-content/integrations/kubehunter.md @@ -10,22 +10,18 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/kubehunter/blobs/sha256:6b6b9 tags: ["packs", "kube-hunter", "security"] --- -Kube Hunter is an open-source tool that hunts for security issues in your Kubernetes clusters. It’s designed to increase -awareness and visibility of the security controls in Kubernetes environments. Kube-hunter probes a domain or address -range for open Kubernetes-related ports, and tests for any configuration issues that leave your cluster exposed to -attackers. It can be run on a machine in the cluster, and select the option to probe all the local network interfaces. +## Terraform -## Versions Supported +You can reference the Kube-hunter pack in Terraform with the following data resource. - +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} - - -**1.0.3** - - - - -## References - -- [kube-hunter GitHub](https://github.com/aquasecurity/kube-hunter/) +data "spectrocloud_pack" "kubehunter" { + name = "kubehunter" + version = "1.0.3" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-aks.md b/docs/docs-content/integrations/kubernetes-aks.md new file mode 100644 index 0000000000..2e6a18b2be --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-aks.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Kubernetes" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + + + +## Terraform + +You can retrieve details about the Kubernetes pack for AWS EKS by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-aks" + version = "1.29" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-custom.md b/docs/docs-content/integrations/kubernetes-custom.md new file mode 100644 index 0000000000..e9d84362bd --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-custom.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Kubernetes" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + + + +## Terraform + +You can retrieve details about the Kubernetes pack for custom clouds by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-custom" + version = "1.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-eks.md b/docs/docs-content/integrations/kubernetes-eks.md new file mode 100644 index 0000000000..890a8d771f --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-eks.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Kubernetes" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + + + +## Terraform + +You can retrieve details about the Kubernetes pack for AWS EKS by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-eks" + version = "1.29" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-gke.md b/docs/docs-content/integrations/kubernetes-gke.md new file mode 100644 index 0000000000..f29d38e990 --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-gke.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Kubernetes" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + + + +## Terraform + +You can retrieve details about the Kubernetes pack for AWS EKS by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-gke" + version = "1.29" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-konvoy.md b/docs/docs-content/integrations/kubernetes-konvoy.md new file mode 100644 index 0000000000..2435d68af5 --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-konvoy.md @@ -0,0 +1,45 @@ +--- +sidebar_label: "Kubernetes Konvoy" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + +## Versions Supported + + + + +Refer to the to learn how to create a +custom image for RHEL and Konvoy. + + + + +Refer to the to learn how to create a +custom image for RHEL and Konvoy. + + + + + +## Terraform + +You can retrieve details about the Kubernetes pack for Tencent TKE by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-konvoy" + version = "1.27.6" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-microk8s.md b/docs/docs-content/integrations/kubernetes-microk8s.md new file mode 100644 index 0000000000..62998151d7 --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-microk8s.md @@ -0,0 +1,173 @@ +--- +sidebar_label: "MicroK8s" +title: "MicroK8s" +description: "MicroK8s pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/kubernetes-microk8s/blobs/sha256:b971b64f62e2e67b0a166316f96e6f4211aacea6e28459bb89275e8882ade985?type=image.webp" +tags: ["packs", "microk8s", "kubernetes"] +--- + +## Support Lifecycle + +We support different Kubernetes distributions, such as MicroK8s, K3s, and RKE2, until their official End-of-Life (EOL). +The EOL is set by the respective owner. Once we stop supporting the minor version, we initiate the deprecation process. +Refer to the [Kubernetes Support Lifecycle](kubernetes-support.md#other-kubernetes-distributions) guide to learn more. + +:::preview + +::: + +## Versions Supported + + + + + + + +## Container Network Interface (CNI) + +MicroK8s clusters use the [Calico CNI](https://microk8s.io/docs/change-cidr) by default. However, this default +installation was disabled due to Palette's requirement for a CNI layer to be present in the cluster profiles. This way, +users can choose their preferred CNI layer during the cluster profile creation. + +## Upgrade Strategy + +The upgrade strategy describes how to replace existing control plane nodes with new ones during upgrades. + +You can specify the upgrade strategy during cluster profile creation by editing the value of the `upgradeStrategy` +parameter in the MicroK8s pack YAML file displayed under the **Pack Details** section. + +:::warning + +Before upgrading your cluster, review the [Known Issues](../release-notes/known-issues.md) and the +[Kubernetes Upgrades](kubernetes-support.md#kubernetes-upgrades) pages to learn about the limitations associated with +MicroK8s upgrades. + +::: + +The MicroK8s pack supports three types of upgrade strategies: + +- `InPlaceUpgrade` - Performs an in-place upgrade of the control plane. For clusters with one control plane and one + worker node, `InPlaceUpgrade` temporarily shuts down the API server. + +- `RollingUpgrade` - The default upgrade strategy that deletes the current control plane node before creating a new one. + +- `SmartUpgrade` - Performs an in-place upgrade of the control plane on clusters with fewer than three control plane + nodes, and a rolling upgrade on clusters with three or more control plane nodes. + + + + + +## Container Network Interface (CNI) + +MicroK8s clusters use the [Calico CNI](https://microk8s.io/docs/change-cidr) by default. However, this default +installation was disabled due to Palette's requirement for a CNI layer to be present in the cluster profiles. This way, +users can choose their preferred CNI layer during the cluster profile creation. + +## Upgrade Strategy + +The upgrade strategy describes how to replace existing control plane nodes with new ones during upgrades. + +You can specify the upgrade strategy during cluster profile creation by editing the value of the `upgradeStrategy` +parameter in the MicroK8s pack YAML file displayed under the **Pack Details** section. + +:::warning + +Before upgrading your cluster, review the [Known Issues](../release-notes/known-issues.md) and the +[Kubernetes Upgrades](kubernetes-support.md#kubernetes-upgrades) pages to learn about the limitations associated with +MicroK8s upgrades. + +::: + +The MicroK8s pack supports three types of upgrade strategies: + +- `InPlaceUpgrade` - Performs an in-place upgrade of the control plane. For clusters with one control plane and one + worker node, `InPlaceUpgrade` temporarily shuts down the API server. + +- `RollingUpgrade` - The default upgrade strategy that deletes the current control plane node before creating a new one. + +- `SmartUpgrade` - Performs an in-place upgrade of the control plane on clusters with fewer than three control plane + nodes, and a rolling upgrade on clusters with three or more control plane nodes. + + + + +## Terraform + +You can reference the MicroK8s pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack" "k8s" { + name = "kubernetes-microk8s" + version = "1.27" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-rke2.md b/docs/docs-content/integrations/kubernetes-rke2.md new file mode 100644 index 0000000000..f203c3f339 --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-rke2.md @@ -0,0 +1,47 @@ +--- +sidebar_label: "RKE2" +title: "RKE2" +description: "RKE2 pack in Palette" +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64", "fips"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.dev.spectrocloud.com/v1/kubernetes-rke2/blobs/sha256:47cde61005d9996f1571c132ba9f753982134a7a0d8e445e27001ab8519e6051?type=image.webp" +--- + +### Support Lifecycle + + +We support other Kubernetes distributions such as K3s, Microk8s, and RKE2 until their official EOL. The EOL is set by +the respective owner. Once we stop supporting the minor version, we initiate the deprecation process. Refer to the + + guide to learn more. + +:::warning + + +Once you upgrade your cluster to a new Kubernetes version, you will not be able to downgrade. We recommend that, before +upgrading, you review the information provided in the +section. + +Review the to learn about pack +update and deprecation schedules. + +::: + + + +## Terraform + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-rke2" + version = "1.29.5-rke2r1-build20240515" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes-support.md b/docs/docs-content/integrations/kubernetes-support.md index 0ba8448548..9af0507ad3 100644 --- a/docs/docs-content/integrations/kubernetes-support.md +++ b/docs/docs-content/integrations/kubernetes-support.md @@ -38,10 +38,11 @@ version, we initiate the deprecation process. You can learn more about our depre ## Palette eXtended Kubernetes Support -We support CNCF Kubernetes, [Palette eXtended Kubernetes (PXK)](./kubernetes.md) and -[Palette eXtended Kubernetes Edge (PXK-E)](./kubernetes-edge.md) for N-3 Kubernetes minor versions for a duration of 14 + +We support CNCF Kubernetes, [Palette eXtended Kubernetes (PXK)](./kubernetes.md) and for N-3 Kubernetes minor versions for a duration of 14 months. The duration exceeds the official EOL by four months. Once we stop supporting the minor version, we initiate the deprecation process. + The diagram below illustrates the support lifecycle of a Kubernetes version. A deprecated Kubernetes version will no longer receive updates. diff --git a/docs/docs-content/integrations/kubernetes-tke.md b/docs/docs-content/integrations/kubernetes-tke.md new file mode 100644 index 0000000000..40076f0785 --- /dev/null +++ b/docs/docs-content/integrations/kubernetes-tke.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Kubernetes" +title: "Kubernetes" +description: "Learn about the Kubernetes pack and how you can use it with your host clusters." +hide_table_of_contents: true +type: "integration" +category: ["kubernetes", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "kubernetes"] +--- + + + +## Terraform + +You can retrieve details about the Kubernetes pack for Tencent TKE by using the following Terraform code. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "k8s" { + name = "kubernetes-eks" + version = "1.24.4" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubernetes.md b/docs/docs-content/integrations/kubernetes.md index 905870e905..3e1e8fe3ef 100644 --- a/docs/docs-content/integrations/kubernetes.md +++ b/docs/docs-content/integrations/kubernetes.md @@ -60,11 +60,12 @@ We also offer Palette eXtended Kubernetes Edge (PXK-E) for Edge deployments. Ref ### PXK and Palette VerteX + The PXK used in [Palette VerteX](../vertex/vertex.md) is compiled and linked with our [NIST-certified FIPS crypto module](../legal-licenses/compliance.md#fips-140-2) PXK is by default enabled with [Ubuntu Pro](https://ubuntu.com/pro) with FIPS mode enabled. Additionally, the Operating System (OS) is hardened based -on the NIST-800 standard. However, if you use a different OS through the [BYOOS](./byoos.md) pack, then you are -responsible for ensuring FIPS compliance and hardening of the OS. +on the NIST-800 standard. However, if you use a different OS through the pack, then you are responsible for ensuring FIPS compliance and hardening of the OS. + The combined usage of PXK and Palette VerteX provides a secure and FIPS-compliant experience as the Kubernetes distribution, OS, and management platform VerteX is FIPS-compliant. @@ -77,45 +78,10 @@ four months. Once we stop supporting the minor version, we initiate the deprecat ## Versions Supported - + -## Prerequisites - -- A minimum of 4 CPU and 4 GB Memory. - -- Operating System (OS) dependencies as listed in the table. - - | OS Distribution | OS Version | Supports Kubernetes 1.29.x | - | --------------- | ---------- | -------------------------- | - | CentOS | 7.7 | ✅ | - | Ubuntu | 22.04 | ✅ | - | Ubuntu | 20.04 | ❌ | - | Ubuntu | 18.04 | ❌ | - -## Parameters - -| Parameter | Description | -| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | -| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | -| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | -| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | -| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | -| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | -| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | -| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | -| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | -| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | -| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | -| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | -| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | -| `cloud.maas.customEndpoint` | The custom MAAS API or DNS endpoint URL to use for the PXK cluster. This parameter is only available for MAAS. | -| `cloud.maas.customEndpointPort` | The custom MAAS API or DNS endpoint port to use for the PXK cluster. This parameter is only available for MAAS. Default value is `6443`. | - -## Usage - The Kubeadm configuration file is where you can do the following: - Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take @@ -134,7 +100,7 @@ The Kubeadm configuration file is where you can do the following: [Configure Custom OIDC](#configure-custom-oidc). - Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more - information, refer to the [Spectro Proxy](frp.md) guide. + information, refer to the guide. ### Change Cluster DNS Service Domain @@ -449,40 +415,6 @@ cloud: -## Prerequisites - -- A minimum of 4 CPU and 4 GB Memory. - -- Operating System (OS) dependencies as listed in the table. - - | OS Distribution | OS Version | Supports Kubernetes 1.28.x | - | --------------- | ---------- | -------------------------- | - | CentOS | 7.7 | ✅ | - | Ubuntu | 22.04 | ✅ | - | Ubuntu | 20.04 | ❌ | - -## Parameters - -| Parameter | Description | -| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | -| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | -| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | -| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | -| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | -| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | -| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | -| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | -| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | -| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | -| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | -| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | -| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | -| `cloud.maas.customEndpoint` | The custom MAAS API or DNS endpoint URL to use for the PXK cluster. This parameter is only available for MAAS. | -| `cloud.maas.customEndpointPort` | The custom MAAS API or DNS endpoint port to use for the PXK cluster. This parameter is only available for MAAS. Default value is `6443`. | - -## Usage - The Kubeadm configuration file is where you can do the following: - Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take @@ -501,7 +433,7 @@ The Kubeadm configuration file is where you can do the following: [Configure Custom OIDC](#configure-custom-oidc). - Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more - information, refer to the [Spectro Proxy](frp.md) guide. + information, refer to the guide. ### Change Cluster DNS Service Domain @@ -816,38 +748,6 @@ cloud: -## Prerequisites - -- A minimum of 4 CPU and 4 GB Memory. - -- Operating System (OS) dependencies as listed in the table. - - | OS Distribution | OS Version | Supports Kubernetes 1.27.x | - | --------------- | ---------- | -------------------------- | - | CentOS | 7.7 | ✅ | - | Ubuntu | 22.04 | ✅ | - | Ubuntu | 20.04 | ❌ | - -## Parameters - -| Parameter | Description | -| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `pack.podCIDR` | The CIDR range for Pods in the cluster. This should match the networking layer property. Default: `192.168.0.0/16` | -| `pack.serviceClusterIpRange` | The CIDR range for services in the cluster. This should not overlap with any IP ranges assigned to nodes or pods. Default: `10.96.0.0/12` | -| `pack.serviceDomain` | The cluster DNS service domain. Default: `cluster.local`. To change the default, you must add this parameter to the Kubernetes YAML file at cluster creation and specify the cluster DNS service domain to use. This value cannot be changed after cluster creation is complete. Refer to the [Change Cluster DNS Service Domain](kubernetes.md?versions=k8s_v1.27#change-cluster-dns-service-domain) section. | -| `pack.palette.config.dashboard.identityProvider` | Dynamically enabled OpenID Connect (OIDC) Identity Provider (IDP) setting based on your UI selection when you add the PXK pack to your profile. This parameter appears in the YAML file after you make a selection. Refer to [Configure OIDC Identity Provider](kubernetes.md#configure-oidc-identity-provider). | -| `kubeadmconfig.apiServer.extraArgs` | A list of additional apiServer flags you can set. | -| `kubeadmconfig.apiServer.extraVolumes` | A list of additional volumes to mount on the apiServer. | -| `kubeadmconfig.controllerManager.extraArgs` | A list of additional ControllerManager flags to set. | -| `kubeadmconfig.scheduler.extraArgs` | A list of additional Kube scheduler flags to set. | -| `kubeadmconfig.kubeletExtraArgs` | A list of kubelet arguments to set and copy to the nodes. | -| `kubeadmconfig.files` | A list of additional files to copy to the nodes. | -| `kubeadmconfig.preKubeadmCommands` | A list of additional commands to invoke **before** running kubeadm commands. | -| `kubeadmconfig.postKubeadmCommands` | A list of additional commands to invoke **after** running kubeadm commands. | -| `kubeadmconfig.clientConfig` | Settings to manually configure OIDC-based authentication when you choose a third-party (Custom) IDP. Refer to [Configure Custom OIDC](#configure-custom-oidc). | - -## Usage - The Kubeadm configuration file is where you can do the following: - Change the default `podCIDR` and `serviceClusterIpRange` values. CIDR IPs specified in the configuration file take @@ -866,7 +766,7 @@ The Kubeadm configuration file is where you can do the following: [Configure Custom OIDC](#configure-custom-oidc). - Add a certificate for the Spectro Proxy pack if you want to use a reverse proxy with a Kubernetes cluster. For more - information, refer to the [Spectro Proxy](frp.md) guide. + information, refer to the guide. ### Change Cluster DNS Service Domain @@ -1151,16 +1051,6 @@ In this example, Palette is used as the IDP, and all users in the `dev-east-2` w ![A subject of the type group is assigned as the subject in a RoleBinding](/clusters_cluster-management_cluster-rbac_cluster-subject-group.webp) - - - - -:::warning - -All versions less than v1.27.x are considered deprecated. Upgrade to a newer version to take advantage of new features. - -::: - @@ -1180,13 +1070,3 @@ data "spectrocloud_pack_simple" "k8s" { registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -## Resources - -- [Kubernetes](https://kubernetes.io/) - -- [Kubernetes Documentation](https://kubernetes.io/docs/concepts/overview/) - -- [Image Swap with Palette](../clusters/cluster-management/image-swap.md) - -- [RHEL and PXK for Vmware](../byoos/usecases/vmware/rhel-pxk.md) diff --git a/docs/docs-content/integrations/kubevious.md b/docs/docs-content/integrations/kubevious.md index d0bc28d298..5583405c13 100644 --- a/docs/docs-content/integrations/kubevious.md +++ b/docs/docs-content/integrations/kubevious.md @@ -10,28 +10,74 @@ logoUrl: "https://registry.spectrocloud.com/v1/kubevious/blobs/sha256:5e33d7b51b tags: ["packs", "kubevious", "monitoring"] --- -Kubevious integration provides a graphical interface that renders easy to understand, application-centric Kubernetes -configurations. - ## Versions Supported - + -- **1.0.10** +## Components + +This integration deploys the following components: + +- Deployment +- MySql DB +- UI +- Parser + +## Configure Ingress + +Follow the steps below to configure Ingress on Kubevious, according to the corresponding version. + +1. Within the manifest, find the kubevious section **user** > **interface** > **service** > **type** and confirm/change, + according to the Kubevious version as listed in the table below. + + | **Versions** | **Parameters** | **Action** | + | ------------ | -------------------------------- | -------------------------------------------------------------------- | + | **1.0.10** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.8.15** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.5.9** | ui: svcType: **LoadBalancer** | Change kubevious.ui.svcType from **LoadBalancer** to **Cluster IP**. | + +2. Configure Ingress + - Enable Ingress; change enabled from _false_ to **true**. + - Set Ingress rules like annotations, path, hosts, etc. + +With these configuration changes, you can access the Kubevious service on the Ingress Controller LoadBalancer +hostname/IP. -- **0.8.15** +## Components - - +This integration deploys the following components: + +- Deployment +- MySql DB +- UI +- Parser + +## Configure Ingress + +Follow the steps below to configure Ingress on Kubevious, according to the corresponding version. + +1. Within the manifest, find the kubevious section **user** > **interface** > **service** > **type** and confirm/change, + according to the Kubevious version as listed in the table below. + + | **Versions** | **Parameters** | **Action** | + | ------------ | -------------------------------- | -------------------------------------------------------------------- | + | **1.0.10** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.8.15** | ui: service: type: **ClusterIP** | Confirm that it states **ClusterIP**. | + | **0.5.9** | ui: svcType: **LoadBalancer** | Change kubevious.ui.svcType from **LoadBalancer** to **Cluster IP**. | + +2. Configure Ingress + - Enable Ingress; change enabled from _false_ to **true**. + - Set Ingress rules like annotations, path, hosts, etc. -- **0.5.9** +With these configuration changes, you can access the Kubevious service on the Ingress Controller LoadBalancer +hostname/IP. - + ## Components @@ -42,9 +88,9 @@ This integration deploys the following components: - UI - Parser -## Ingress +## Configure Ingress -Follow the steps below to configure Ingress on Kubevious, according to the corresponding version +Follow the steps below to configure Ingress on Kubevious, according to the corresponding version. 1. Within the manifest, find the kubevious section **user** > **interface** > **service** > **type** and confirm/change, according to the Kubevious version as listed in the table below. @@ -62,6 +108,21 @@ Follow the steps below to configure Ingress on Kubevious, according to the corre With these configuration changes, you can access the Kubevious service on the Ingress Controller LoadBalancer hostname/IP. -## References + + -- [Kubevious GitHub](https://github.com/kubevious/kubevious) +## Terraform + +You can reference the Kubevious pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "kubevious" { + name = "kubevious" + version = "1.0.10" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/kubevirt.md b/docs/docs-content/integrations/kubevirt.md index 8720256c09..81eb5eed8d 100644 --- a/docs/docs-content/integrations/kubevirt.md +++ b/docs/docs-content/integrations/kubevirt.md @@ -10,55 +10,18 @@ logoUrl: "https://registry.spectrocloud.com/v1/kubevirt/blobs/sha256:185e7a7658c tags: ["packs", "kubevirt", "system app"] --- -KubeVirt is a virtual machine management add-on for Kubernetes clusters. Create predefine virtual machines using -KubeVirt, and Palette will provision KubeVirt as an Add-on Pack to manage the VM resources within the orchestrator. - -
- -## Version Supported - - - - -**0.51.0** - - - - -**0.55.0** - - - - -
-
- -## Notable Parameters - -```yaml -manifests: - KubeVirt-operator: - # Enable Emulation (when no nested virtualization enabled) - useEmulation: true - KubeVirt-cr: - contents: | - apiVersion: KubeVirt.io/v1 - kind: KubeVirt - metadata: - name: KubeVirt - namespace: KubeVirt - spec: - certificateRotateStrategy: {} - configuration: - developerConfiguration: - featureGates: [] - customizeComponents: {} - imagePullPolicy: IfNotPresent - workloadUpdateStrategy: {} +## Terraform + +You can reference the Kubevirt pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "kubevirt" { + name = "kubevirt" + version = "0.59.0" + type = "manifest" + registry_uid = data.spectrocloud_registry.public_registry.id +} ``` - -## References - -- [Installing KubeVirt on Kubernetes](https://kubevirt.io/user-guide/cluster_admin/installation/#installing-kubevirt-on-kubernetes) - -- [GitHub KubeVirt](https://github.com/KubeVirt/KubeVirt/releases/tag/v0.51.0) diff --git a/docs/docs-content/integrations/kubewatch.md b/docs/docs-content/integrations/kubewatch.md index cfd0684789..61c004e626 100644 --- a/docs/docs-content/integrations/kubewatch.md +++ b/docs/docs-content/integrations/kubewatch.md @@ -10,32 +10,18 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/kubewatch/blobs/sha256:a277fb tags: ["packs", "kube-watch", "monitoring"] --- -Kubewatch is a Kubernetes watcher that currently publishes notification to available collaboration hubs/notification -channels. It is run in the k8s cluster for monitoring resource changes and event notifications are obtained through -webhooks. The supported webhooks are: - -- slack -- hipchat -- mattermost -- flock -- webhook -- smtp - -## Usage: - -kubewatch [flags] kubewatch [command] - -## Versions Supported - - - - - -**1.0.7** - - - - -## References - -- [kube-watch GitHub](https://github.com/robusta-dev/kubewatch) +## Terraform + +You can reference the Kubewatch pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "kubewatch" { + name = "kubewatch" + version = "1.0.7" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/lb-citrix-adc.md b/docs/docs-content/integrations/lb-citrix-adc.md new file mode 100644 index 0000000000..ec4bb84208 --- /dev/null +++ b/docs/docs-content/integrations/lb-citrix-adc.md @@ -0,0 +1,27 @@ +--- +sidebar_label: "Citrix IPAM" +title: "Citrix IPAM" +description: "Citrix IPAM Load Balancer pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["load balancers", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/lb-citrix-adc/blobs/sha256:17f8ebc0dc69d329a39e5d27fc0ce3574034d18ab1776fabda396c5403b0bd86?type=image.webp" +tags: ["packs", "citrix-ipam", "network"] +--- + +## Terraform + +You can reference the Citrix ADC pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "citrix" { + name = "lb-citrix-adc" + version = "1.7.6" + type = "manifest" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/lb-metallb-helm.md b/docs/docs-content/integrations/lb-metallb-helm.md new file mode 100644 index 0000000000..069d2e770f --- /dev/null +++ b/docs/docs-content/integrations/lb-metallb-helm.md @@ -0,0 +1,142 @@ +--- +sidebar_label: "MetalLB Helm" +title: "MetalLB Helm" +description: "MetalLB Load Balancer pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["load balancers", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/lb-metallb/blobs/sha256:3d09a1eab856a03d5b821062dcd1da624256e8f1e2ede404d88cb088d3adb945?type=image.webp" +tags: ["packs", "metallb", "network"] +--- + +## Versions Supported + + + + + +## Configure IP Address Range + +Helm-based MetalLB default gives you an L2 address pool by default. It has two sections, +`charts:metallb-full:configuration` and `charts:metallb-full:metallb`, as shown in the following examples. + +Use the `charts:metallb-full:configuration` parameter section to set resource types that MetalLB supports. The pack +default gives you an L2 address pool. To set up a more advanced scenario, you can use the other resource types provided +in the pack. The pack includes a commented-out example for each resource. + +```yaml +charts: + metallb-full: + configuration: + ipaddresspools: + first-pool: + spec: + addresses: + - 192.168.10.0/24 + avoidBuggyIPs: true + autoAssign: true + + l2advertisements: + default: + spec: + ipAddressPools: + - first-pool + + bgpadvertisements: {} + bgppeers: {} + communities: {} + bfdprofiles: {} +``` + +The `charts:metallb-full:metallb` parameter section provides access to all the options of the base chart that installs +MetalLB. You don’t need to change anything unless you want to install MetalLB in Free Range Routing (FRR) mode. To use +FRR mode, set the option to `true`, as the example shows. + +```yaml +charts: + metallb-full: + metallb: + speaker: + frr: + enabled: true +``` + +## Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must add the following labels to the MetalLB namespace. +These labels allow the speaker pods to come up successfully. Otherwise, depending on the Kubernetes version, the speaker +pods may get blocked by security policies. + +- `pod-security.kubernetes.io/enforce: privileged` +- `pod-security.kubernetes.io/audit: privileged` +- `pod-security.kubernetes.io/warn: privileged` + +The following example shows how to update the pack YAML with the required labels. + +```yaml {13-15} +pack: + content: + images: + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/controller:v0.13.11 + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/speaker:v0.13.11 + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/frr:8.5.2 + charts: + - repo: https://metallb.github.io/metallb + name: metallb + version: 0.13.11 + namespace: metallb-system + namespaceLabels: + "metallb-system": + "pod-security.kubernetes.io/warn=privileged,pod-security.kubernetes.io/audit=privileged,pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" +``` + +Refer to the [Profile Customization](../profiles/profile-customization.md) page to learn more about additional namespace +labels and annotations. + +## Troubleshooting + +### Scenario - Controller and Speaker Pods Are Not Assigning New IP Addresses + +If controller and speaker pods are not assigning new IP addresses that you provided in the MetalLB pack, it is likely +pods in existing deployments do not have the latest configMap file. + +IP addresses you specify in MetalLB pack values go into a configMap called `config` in the `metallb-system` namespace. +The MetalLB controller and speakers use the configMap as a volume mount. + +Any changed IP addresses will get updated in the configMap. You can confirm this by issuing the following command. + +```bash +kubectl describe cm config --namespace metallb-system +``` + +Since the controller and speaker pods are using a previous copy of the configMap, existing deployments are unaware of +the changes made to configMap. + +To ensure updated addresses are reflected in the configMap, you need to restart the controller and speaker pods so they +fetch the new configMap and start assigning new addresses correctly. Issue the commands below to restart the controller +and speaker. + +```bash +kubectl rollout restart deploy controller --namespace metallb-system +kubectl rollout restart ds speaker --namespace metallb-system +``` + + + + +## Terraform + +You can reference the MetalLB pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "MetalLB-Helm" { + name = "lb-metallb-helm" + version = "0.13.7" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/lb-metallb.md b/docs/docs-content/integrations/lb-metallb.md new file mode 100644 index 0000000000..cbaf24f490 --- /dev/null +++ b/docs/docs-content/integrations/lb-metallb.md @@ -0,0 +1,168 @@ +--- +sidebar_label: "MetalLB" +title: "MetalLB" +description: "MetalLB Load Balancer pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["load balancers", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/lb-metallb/blobs/sha256:3d09a1eab856a03d5b821062dcd1da624256e8f1e2ede404d88cb088d3adb945?type=image.webp" +tags: ["packs", "metallb", "network"] +--- + +## Versions Supported + + + + + +## Configure IP Address Range + +The _lb-metallb_ manifest-based pack supports direct configuration of an L2 IP address set. You can set either a range +of addresses or use CIDR format, such as `192.168.250.48/29`. A more advanced MetalLB configuration, such as Border +Gateway Protocol (BGP) routing requires you to write your own manifests and add them to the Palette cluster profile. + +The example shows the syntax used to set an address range. + +```yaml +manifests: + metallb: + images: + controller: "" + speaker: "" + namespace: "metallb-system" + avoidBuggyIps: true + addresses: + - 192.168.250.48-192.168.250.55 +``` + +## Airgap Palette and VerteX + +In the context of an airgap Palette or VerteX installation, you must add the following labels to the MetalLB namespace. +These labels allow the speaker pods to come up successfully. Otherwise, depending on the Kubernetes version, the speaker +pods may get blocked by security policies. + +- `pod-security.kubernetes.io/enforce: privileged` +- `pod-security.kubernetes.io/audit: privileged` +- `pod-security.kubernetes.io/warn: privileged` + +The following example shows how to update the pack YAML with the required labels. + +```yaml {13-15} +pack: + content: + images: + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/controller:v0.13.11 + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/speaker:v0.13.11 + - image: gcr.io/spectro-images-public/packs/metallb/0.13.11/frr:8.5.2 + charts: + - repo: https://metallb.github.io/metallb + name: metallb + version: 0.13.11 + namespace: metallb-system + namespaceLabels: + "metallb-system": + "pod-security.kubernetes.io/warn=privileged,pod-security.kubernetes.io/audit=privileged,pod-security.kubernetes.io/enforce=privileged,pod-security.kubernetes.io/enforce-version=v{{ + .spectro.system.kubernetes.version | substr 0 4 }}" +``` + +Refer to the [Profile Customization](../profiles/profile-customization.md) page to learn more about additional namespace +labels and annotations. + +## Troubleshooting + +### Scenario - Controller and Speaker Pods Are Not Assigning New IP Addresses + +If controller and speaker pods are not assigning new IP addresses that you provided in the MetalLB pack, it is likely +pods in existing deployments do not have the latest configMap file. + +IP addresses you specify in MetalLB pack values go into a configMap called `config` in the `metallb-system` namespace. +The MetalLB controller and speakers use the configMap as a volume mount. + +Any changed IP addresses will get updated in the configMap. You can confirm this by issuing the following command. + +```bash +kubectl describe cm config --namespace metallb-system +``` + +Since the controller and speaker pods are using a previous copy of the configMap, existing deployments are unaware of +the changes made to configMap. + +To ensure updated addresses are reflected in the configMap, you need to restart the controller and speaker pods so they +fetch the new configMap and start assigning new addresses correctly. Issue the commands below to restart the controller +and speaker. + +```bash +kubectl rollout restart deploy controller --namespace metallb-system +kubectl rollout restart ds speaker --namespace metallb-system +``` + + + + + +## Configure IP Address Range + +The _lb-metallb_ manifest-based pack supports direct configuration of an L2 IP address set. You can set either a range +of addresses or use CIDR format, such as `192.168.250.48/29`. A more advanced MetalLB configuration, such as Border +Gateway Protocol (BGP) routing requires you to write your own manifests and add them to the Palette cluster profile. + +The example shows the syntax used to set an address range. + +```yaml +manifests: + metallb: + images: + controller: "" + speaker: "" + namespace: "metallb-system" + avoidBuggyIps: true + addresses: + - 192.168.250.48-192.168.250.55 +``` + +## Troubleshooting + +### Scenario - Controller and Speaker Pods Are Not Assigning New IP Addresses + +If controller and speaker pods are not assigning new IP addresses that you provided in the MetalLB pack, it is likely +pods in existing deployments do not have the latest configMap file. + +IP addresses you specify in MetalLB pack values go into a configMap called `config` in the `metallb-system` namespace. +The MetalLB controller and speakers use the configMap as a volume mount. + +Any changed IP addresses will get updated in the configMap. You can confirm this by issuing the following command. + +```bash +kubectl describe cm config --namespace metallb-system +``` + +Since the controller and speaker pods are using a previous copy of the configMap, existing deployments are unaware of +the changes made to configMap. + +To ensure updated addresses are reflected in the configMap, you need to restart the controller and speaker pods so they +fetch the new configMap and start assigning new addresses correctly. Issue the commands below to restart the controller +and speaker. + +```bash +kubectl rollout restart deploy controller --namespace metallb-system +kubectl rollout restart ds speaker --namespace metallb-system +``` + + + + +## Terraform + +You can reference the MetalLB pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "MetalLB" { + name = "lb-metallb" + version = "0.13.5" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/nginx.md b/docs/docs-content/integrations/nginx.md index 10d55cf71b..fadcfb033f 100644 --- a/docs/docs-content/integrations/nginx.md +++ b/docs/docs-content/integrations/nginx.md @@ -10,69 +10,181 @@ logoUrl: "https://registry.spectrocloud.com/v1/nginx/blobs/sha256:a36bf7e8023f01 tags: ["packs", "nginx", "network"] --- -Ingress resource(s) in Kubernetes helps provide Service(s) externally-reachable URLs, load balance traffic, terminate -SSL / TLS, and offer name-based virtual hosting. NGINX integration is an -[Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers) responsible for -fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional -frontends to help handle the traffic. - ## Versions Supported - + -- **1.4.0** +## Components + +Integration creates the following components: + +- Ingress Controller. +- Default Backend. + +## Default SSL Certificate + +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. + +1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ``` -- **1.3.0** +## Components - +Integration creates the following components: - +- Ingress Controller. +- Default Backend. + +## Default SSL Certificate -- **1.2.5** +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. -
+1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ``` - **1.2.4** +
-
+ - **1.2.3** +## Components -
+Integration creates the following components: - **1.2.1** (deprecated) +- Ingress Controller. +- Default Backend. -
+## Default SSL Certificate - **1.2.0** (deprecated) +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. + +1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ```
-- **1.0.4** +## Components + +Integration creates the following components: + +- Ingress Controller. +- Default Backend. + +## Default SSL Certificate + +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. + +1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ``` -- **0.26.1** +## Components - +Integration creates the following components: - +- Ingress Controller. +- Default Backend. + +## Default SSL Certificate + +NGINX Ingress controller provides an option to set a default SSL certificate to be used for requests that do not match +any of the configured server names. The default certificate will also be used for ingress tls: sections that do not have +a secretName option. Below steps will come in handy to set the default certificate. -- **0.43.0** +1. Create a secret with key and certificate + ```bash + kubectl -n kube-system create secret tls ingress-tls --cert server.crt --key server.key + ``` +2. Edit Nginx ingress pack values to include extraArgs.default-ssl-certificate section which will reference the secret + created above + ```bash + charts: + nginx-ingress: + fullnameOverride: "nginx-ingress" + controller: + ... + ... + extraArgs: + default-ssl-certificate: "kube-system/ingress-tls" + ``` -
+ ## Components @@ -104,11 +216,22 @@ a secretName option. Below steps will come in handy to set the default certifica default-ssl-certificate: "kube-system/ingress-tls" ``` -## Troubleshooting + + +
+ +## Terraform -For basic troubleshooting, refer the below troubleshooting guide: -https://github.com/kubernetes/ingress-nginx/blob/master/docs/troubleshooting.md +You can reference the nginx pack in Terraform with the following data resource. -## References +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} -- [Nginx Ingress Controller](https://www.nginx.com/products/nginx-ingress-controller/) +data "spectrocloud_pack" "nginx" { + name = "nginx" + version = "1.10.0" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ngrok-ingress-controller.md b/docs/docs-content/integrations/ngrok-ingress-controller.md new file mode 100644 index 0000000000..e45426f459 --- /dev/null +++ b/docs/docs-content/integrations/ngrok-ingress-controller.md @@ -0,0 +1,97 @@ +--- +sidebar_label: "ngrok" +title: "ngrok" +description: "Learn about using ngrok Kubernetes Ingress to access applications in Palette." +hide_table_of_contents: true +type: "integration" +category: ["ingress", "amd64", "community"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ngrok-ingress-controller/blobs/sha256:a723399d53d716c5441d57d021a7975d961e5b7db79ccb2bc10f7524ba7e67c1?type=image.webp" +tags: ["packs", "ngrok", "network", "kubernetes"] +--- + +## Versions Supported + + + + + +## Configure Ingress Service Definition + +To use the ngrok Ingress Controller pack, first create a new +[add-on cluster profile](../profiles/cluster-profiles/create-cluster-profiles/create-addon-profile/create-addon-profile.md), +search for the **ngrok Ingress Controller** pack, and overwrite the default pack configuration with your API key and +authentication token like the following example YAML content: + +```yaml +charts: + kubernetes-ingress-controller: + ... + credentials: + apiKey: API_KEY + authtoken: AUTHTOKEN +``` + +Next, you must create an ingress service definition for your application, which requires a new manifest layer. Click on +the **Add Manifest** button to create a new manifest layer. + +The following YAML content demonstrates an example ingress service where the ngrok Ingress Controller creates a new edge +to route traffic on your ngrok subdomain `example.com` to an existing `example-app` deployed on your Kubernetes cluster +in Palette. + +```yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: example-ingress + namespace: ngrok-ingress-controller +spec: + ingressClassName: ngrok + rules: + - host: example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: example-app + port: + number: 80 +``` + +Once you have defined the ngrok Ingress Controller pack, you can add it to an existing cluster profile, as an add-on +profile, or as a new add-on layer to a deployed cluster. + +:::warning + +If you have a free ngrok account, you can only have one ngrok agent active at a time. This means that you will need to +set the number of replicas to `1` to ensure that your ngrok agent operates properly. + +```yaml +charts: + kubernetes-ingress-controller: + replicaCount: 1 +``` + +::: + + + + + +## Terraform + +You can reference the ngrok Ingress Controller pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack_simple" "ngrok-ingress" { + name = "ngrok-ingress-controller" + version = "0.9.0" + type = "operator-instance" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/nutanix-csi.md b/docs/docs-content/integrations/nutanix-csi.md index f69b71549b..c1f6f6d0c6 100644 --- a/docs/docs-content/integrations/nutanix-csi.md +++ b/docs/docs-content/integrations/nutanix-csi.md @@ -10,49 +10,13 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/nutanix-csi/blobs/sha256:7944 tags: ["packs", "Nutanix", "Storage"] --- -The Nutanix Container Storage Interface (CSI) pack provides persistent storage for stateful applications. The pack -consists of two Helm charts - **nutanix-csi-storage** and **nutanix-cloud-provider**. - -The Nutanix Container Storage Interface (CSI) Volume Driver chart leverages Nutanix Volumes and Nutanix Files to provide -scalable and persistent storage for applications. - -The Nutanix Cloud Provider chart is a plugin that allows the integration of the Nutanix Acropolis Hypervisor (AHV) -platform with Kubernetes by implementing a node controller function. - ## Versions Supported -- 2.6.6 - -## Prerequisites - -- A Nutanix Prism Central account. - -- A Nutanix Prism Element cluster created. - -- A Nutanix cloud registered with Palette with the name `nutanix`. For more information, refer to - [Register Nutanix Cloud](../clusters/data-center/nutanix/register-nutanix-cloud.md). - -- The cluster must use Kubernetes version 1.20 or higher. + -## Parameters + -The table below lists commonly used parameters you can configure when adding the Nutanix CSI pack. Review the Nutanix -CSI Pack README for a complete list of parameters. - -| **Parameter** | **Description** | **Default** | -| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------- | -| `nutanix-cloud-provider.createConfig` | Creates a config for the Nutanix Cloud Provider. The existing config will be used if this parameter is set as `false`. | `true` | -| `nutanix-cloud-provider.configName` | Name of the ConfigMap for the Nutanix Cloud Provider config. | `nutanix-config` | -| `nutanix-cloud-provider.createSecret` | Creates a secret for the Nutanix Cloud Provider. The existing secret will be used if this parameter is set as `false`. | `true` | -| `nutanix-cloud-provider.enableCustomLabeling` | Adds additional and custom Nutanix labels to nodes. | `false` | -| `nutanix-cloud-provider.topologyDiscovery.type` | Defines how topology will be discovered (Prism or Categories). | `Prism` | -| `nutanix-cloud-provider.podAnnotations` | Adds annotations to the Cloud Provider Pod. | `{}` | -| `nutanix-csi-storage.volumeClass` | Activates the Nutanix Volumes Storage Class. | `false` | -| `nutanix-csi-storage.volumeClassName` | Name of the Nutanix Volumes Storage Class. | `nutanix-volume` | -| `nutanix-csi-storage.volumeClassRetention` | Retention policy for the Volumes Storage Class (Delete or Retain). | `Delete` | -| `nutanix-csi-storage.fileClass` | Activates Nutanix Files Storage Class. | `false` | - -## Usage +## Configure Storage Container Palette provides a default Volume storage class called `spectro-storage-class` to allow applications requiring volumes to access persistent volumes. This storage class is created by the Nutanix CSI pack. @@ -66,8 +30,10 @@ showcases an example configuration with a storage container named **test-contain storageContainer: "test-container" ``` +## Configure ISCSI Data Services IP Address + Nutanix Volumes utilize an Internet Small Computer System Interface (iSCSI) data service IP address to provide access to -cluster storage. In the Prism Element UI, go to the **Cluster Details** page and configure the iSCSI Data services IP +cluster storage. In the Prism Element UI, go to the **Cluster Details** page and configure the ISCSI data services IP address as described in the [Adding an ISCSI Data Services IP Address](https://portal.nutanix.com/page/documents/details?targetId=Volumes-Guide:vol-cluster-details-modify-wc-t.html) guide. @@ -80,6 +46,10 @@ registration process. ::: + + + + ## Terraform You can reference the Nutanix CSI pack in Terraform with the following data resource. @@ -88,16 +58,10 @@ You can reference the Nutanix CSI pack in Terraform with the following data reso data "spectrocloud_registry" "public_registry" { name = "Public Repo" } -data "spectrocloud_pack_simple" "nutanix-csi" { +data "spectrocloud_pack" "nutanix-csi" { name = "nutanix-csi" version = "2.6.6" type = "helm" registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -## References - -- [Nutanix Documentation](https://www.nutanixbible.com) -- [Nutanix Cloud Controller Manager on GitHub](https://github.com/nutanix-cloud-native/cloud-provider-nutanix) -- [Nutanix CSI Volume Driver Documentation](https://portal.nutanix.com/page/documents/details?targetId=CSI-Volume-Driver-v2_6:CSI-Volume-Driver-v2_6) diff --git a/docs/docs-content/integrations/open-policy-agent.md b/docs/docs-content/integrations/open-policy-agent.md new file mode 100644 index 0000000000..99ad881248 --- /dev/null +++ b/docs/docs-content/integrations/open-policy-agent.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "OpenPolicyAgent" +title: "Open Policy Agent" +description: "OpenPolicyAgent security pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["security", "amd64", "arm64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: + 'https://registry.dev.spectrocloud.com/v1/open-policy-agent/blobs/sha256:fcbad202dc9ca5e7a756562d8f9fc180ee77474034447dabc302d8a5a2bbe148?type=image.webp" + alt="OpenPolicyAgent logo' +tags: ["packs", "open-policy-agent", "security"] +--- + +## Terraform + +You can reference the Open Policy Agent pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "open-policy-agent" { + name = "open-policy-agent" + version = "3.15.1" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/outcold-monitoring.md b/docs/docs-content/integrations/outcold-monitoring.md new file mode 100644 index 0000000000..45456036e1 --- /dev/null +++ b/docs/docs-content/integrations/outcold-monitoring.md @@ -0,0 +1,27 @@ +--- +sidebar_label: "Outcold Solutions" +title: "Outcold Solutions" +description: "Outcold Solutions - Monitoring pack in Spectro Cloud" +hide_table_of_contents: true +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/outcold-monitoring/blobs/sha256:3140960d1f39649ad821cfc59450d3c164079b03d15387b2e638eae07442af41?type=image.webp" +tags: ["packs", "outcold-monitoring", "monitoring"] +--- + +## Terraform + +You can reference the Outcold Solutions pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "community_registry" { + name = "Palette Registry" +} +data "spectrocloud_pack" "outcold" { + name = "outcold-monitoring" + version = "5.0.0" + type = "manifest" + registry_uid = data.spectrocloud_registry.community_registry.id +} +``` diff --git a/docs/docs-content/integrations/packs.mdx b/docs/docs-content/integrations/packs.mdx new file mode 100644 index 0000000000..0433ef8494 --- /dev/null +++ b/docs/docs-content/integrations/packs.mdx @@ -0,0 +1,11 @@ +--- +sidebar_label: "Pack Information" +title: "Pack Information" +description: "Learn about packs that Palette offers and choose from Pallette packs." +hide_table_of_contents: true +sidebar_class_name: "hide-from-sidebar" +icon: "teams" +tags: ["packs"] +--- + + diff --git a/docs/docs-content/integrations/permission-manager.md b/docs/docs-content/integrations/permission-manager.md index 0ebc2d653c..c81ffbdb4a 100644 --- a/docs/docs-content/integrations/permission-manager.md +++ b/docs/docs-content/integrations/permission-manager.md @@ -10,33 +10,18 @@ logoUrl: "https://registry.spectrocloud.com/v1/permission-manager/blobs/sha256:1 tags: ["packs", "permission-manager", "security"] --- -This integration provides a graphical user interface for RBAC management in Kubernetes. You can create users, assign -namespaces/permissions, and distribute Kubeconfig YAML files quickly. - ## Versions Supported - + -- **1.0.0** - - - - -## Configuration - -| Name | Supported Value | Description | -| ------------ | -------------------------- | ------------------------------------------------------------------ | -| namespace | Any valid namespace string | The namespace under which this integration should be deployed onto | -| authPassword | | Login password for the web interface | - -## Customizing the permission templates +## Customize Permission Templates Create a ClusterRole starting with `template-namespaced-resources___` or `template-cluster-resources___` and apply it to the cluster. Permission manager will honor any custom resources with this naming convention and will populate on the user interface. -## Ingress +## Configure Ingress Follow below steps to configure Ingress on Permission Manager @@ -45,9 +30,23 @@ Follow below steps to configure Ingress on Permission Manager - Enable Ingress; Change enabled from false to "true" - Set Ingress rules like annotations, path, hosts, etc. -With these config changes, you can access Permission manager service on the Ingress Controller LoadBalancer hostname / -IP +With these config changes, you can access Permission manager service on the Ingress Controller LoadBalancer hostname/IP. -## References +
+
-- [Permission Manager GitHub](https://github.com/sighupio/permission-manager) +## Terraform + +You can reference the Permission Manager pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "permission-manager" { + name = "permission-manager" + version = "1.0.0" + type = "manifest" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/portworx-add-on.md b/docs/docs-content/integrations/portworx-add-on.md new file mode 100644 index 0000000000..8cca604c95 --- /dev/null +++ b/docs/docs-content/integrations/portworx-add-on.md @@ -0,0 +1,29 @@ +--- +sidebar_label: "Portworx /w Operator Add-on" +title: "Portworx Operator Add-on" +description: "Portworx storage CSI for all use cases" +hide_table_of_contents: true +type: "integration" +category: ["storage", "amd64"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "portworx", "storage"] +--- + + + +## Terraform + +Use the following Terraform code to interact with the Portworx Operator pack in your Terraform scripts. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "portworx-operator" { + name = "csi-portworx-add-on" + version = "3.0.0" + type = "operator-instance" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/prismacloud.md b/docs/docs-content/integrations/prismacloud.md index 66879f8bbc..89c98d5532 100644 --- a/docs/docs-content/integrations/prismacloud.md +++ b/docs/docs-content/integrations/prismacloud.md @@ -10,21 +10,18 @@ logoUrl: "https://registry.dev.spectrocloud.com/v1/prismacloud/blobs/sha256:9ddb tags: ["packs", "prismacloud", "security"] --- -Prisma Cloud Compute is a cloud workload protection platform (CWPP) offering protection for hosts, containers, and -server-less deployments in any cloud, and across the software lifecycle. Prisma Cloud Compute is cloud-native and -API-enabled. It can protect tenant workloads, regardless of the underlying compute technology or the cloud deployment. - -## Versions Supported - - - - - -**20.9.0** - - - - -## References - -- [Prisma Cloud Compute Documentation](https://docs.paloaltonetworks.com/prisma/prisma-cloud) +## Terraform + +You can reference the Prisma Cloud Compute pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} +data "spectrocloud_pack" "prisma" { + name = "prismacloud" + version = "20.09.0" + type = "manifest" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/prometheus-agent.md b/docs/docs-content/integrations/prometheus-agent.md index f1404b62de..65f5f02059 100644 --- a/docs/docs-content/integrations/prometheus-agent.md +++ b/docs/docs-content/integrations/prometheus-agent.md @@ -10,30 +10,13 @@ logoUrl: "https://registry.spectrocloud.com/v1/prometheus-operator/blobs/sha256: tags: ["packs", "prometheus-agent", "monitoring"] --- -Prometheus is an open-source monitoring and alerting system that is designed to collect and analyze metrics from various -systems and services. - -Prometheus is built around a time-series database that stores metrics data. It uses a flexible querying language called -PromQL to extract and process metrics data. Prometheus also has a powerful alerting system that can be used to send -notifications when specific conditions are met. - -Prometheus can be used to monitor a wide range of systems and services, including servers, containers, databases, and -applications. It can be deployed in a variety of environments, including on-prem, cloud, and hybrid setups. - -The Prometheus Agent pack works in tandem with the [Prometheus Operator pack](prometheus-operator.md). Check out the -guides [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) and -[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) to learn how to create a -monitoring stack with Prometheus for your Palette environment. - ## Versions Supported -**19.0.X** + -## Prerequisites + -- A host cluster that has the [Prometheus Operator pack](prometheus-operator.md) installed. - -## Parameters +## Configure the Prometheus Agent Pack The Prometheus agent supports all the parameters exposed by the Prometheus Helm Chart. Refer to the [Prometheus Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus#configuration) @@ -41,8 +24,6 @@ documentation for details. From a Palette perspective, you must provide a value for the `remoteWrite.url` parameter shown in the following example. -
- ```yaml charts: prometheus: @@ -60,8 +41,6 @@ The following image displays a host cluster with the Prometheus Operator pack in ![A view of the cluster details page with a highlighted box around the Prometheus service URL](/integrations_prometheus-agent_cluster-detail-view.webp) -
- :::warning The Prometheus server URL must be in the format `http://HOST:PORT/api/v1/write`. Example: @@ -72,8 +51,6 @@ The Prometheus server URL must be in the format `http://HOST:PORT/api/v1/write`. If the Prometheus server is configured with authentication, add the authentication parameters. Replace `` and `` with the actual credential values. -
- ```yaml charts: prometheus: @@ -86,13 +63,7 @@ charts: password: ``` -## Usage - -The Prometheus agent pack works out-of-the-box and only requires you to provide a Prometheus server URL. Add the -Prometheus agent pack to a cluster profile to get started with Prometheus. You can create a new cluster profile that has -the Prometheus agent as an add-on pack or you can update an existing cluster profile by adding the Prometheus agent -pack. For guidance, review -[Update a Cluster Profile](../profiles/cluster-profiles/modify-cluster-profiles/update-cluster-profile.md). +## Access the Grafana Dashboard Log in to the Grafana dashboard to view and create dashboards. You can find the Grafana dashboard URL by reviewing the details of the Kubernetes cluster hosting the Prometheus server. Use the URL exposed by the @@ -116,8 +87,6 @@ The following dashboards are available by default: - Kubernetes/Views/Pods: A view of all the pods in a node with the Prometheus agent installed. -
- :::info Use the filters to narrow down the information displayed. All Palette dashboards include the **project** and **cluster** @@ -128,27 +97,23 @@ filter. We encourage you to check out the [Grafana](https://grafana.com/tutorials/) tutorials and learning resources to learn more about Grafana. +
+ +
+ ## Terraform -You can retrieve details about the Prometheus agent pack by using the following Terraform code. +You can reference the Prometheus Agent pack in Terraform with the following data resource. ```hcl data "spectrocloud_registry" "public_registry" { name = "Public Repo" } -data "spectrocloud_pack_simple" "pack-info" { +data "spectrocloud_pack" "prometheus" { name = "prometheus-agent" version = "19.0.2" type = "helm" registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -# References - -- [Prometheus Operator pack](prometheus-operator.md) - -- [Prometheus Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus#configuration) - -- [Grafana Tutorials](https://grafana.com/tutorials/) diff --git a/docs/docs-content/integrations/prometheus-operator.md b/docs/docs-content/integrations/prometheus-operator.md index e7ba20dbd4..c085669ba8 100644 --- a/docs/docs-content/integrations/prometheus-operator.md +++ b/docs/docs-content/integrations/prometheus-operator.md @@ -10,24 +10,6 @@ logoUrl: "https://registry.spectrocloud.com/v1/prometheus-operator/blobs/sha256: tags: ["packs", "prometheus-operator", "monitoring"] --- -Prometheus is an open-source monitoring system that is designed to collect and analyze metrics from various sources, -such as applications, servers, and networks. It is widely used in the DevOps world to monitor the health and performance -of applications and infrastructure. Prometheus stores metrics in a time-series database and provides a query language -for analyzing the data. It also includes a powerful alerting system that can notify operators when thresholds are -breached. - -The Prometheus Operator is a tool that simplifies the deployment and management of Prometheus in a Kubernetes cluster. -It automates tasks such as configuring Prometheus, creating and managing Prometheus rules and alerts and scaling -Prometheus instances based on demand. The Operator uses Kubernetes custom resources to define and manage Prometheus -instances and related resources, such as ServiceMonitors, which enable Prometheus to discover and monitor services -running in the cluster. - -You can use the Prometheus Operator to create a monitoring stack that other host clusters point to and forward metrics -to. Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to -learn how to create a monitoring stack with Prometheus for your Palette environment. - -
- :::info We recommend you use version v44.3.x or greater moving forward for a simplified and improved user experience when @@ -39,74 +21,13 @@ more about the remote monitoring feature. ## Versions Supported -
- - + -## Prerequisites - -- Kubernetes v1.16 or greater. - -- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the - monitoring stack have 1.5x to 2x the minimum required size: - - Recommended size: - - - 8 CPU - - 16 GB Memory - - 20 GB Storage - - As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider - increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the - following resources from the monitoring stack: - - Each added agent: - - - 0.1 CPU - - 250 MiB Memory - - 1 GB Storage - - Refer to the - [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) - documentation for additional guidance. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
- -## Usage - Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to learn how to create a monitoring stack with Prometheus for your Palette environment. -
- -#### Airgap Palette and VerteX +## Airgap Palette and VerteX In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require @@ -120,13 +41,11 @@ charts: - grafana-piechart-panel ``` -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -147,9 +66,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -159,9 +76,7 @@ port 80. Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -170,17 +85,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -190,15 +101,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different object storage for event data. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -#### Remote Monitoring +## Remote Monitoring You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ @@ -214,24 +123,18 @@ about configuration options. To get started with remote monitoring, check out the [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. -
+## Palette Resources Monitoring -#### Palette Resources Monitoring - -You can access internal Palette metrics in Grafana by adding the -[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the -[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + +You can access internal Palette metrics in Grafana by adding the pack to all your client clusters. Refer to the [Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + -
- -#### Persistent Storage +## Persistent Storage You can configure the Prometheus Operator to use persistent storage. To enable persistent storage add the following code snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. -
- ```yaml kube-prometheus-stack: prometheus: @@ -248,7 +151,7 @@ kube-prometheus-stack: storage: 5Gi ``` -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -265,69 +168,10 @@ The Prometheus Operator pack installs the following dependencies: -## Prerequisites - -- Kubernetes v1.16 or greater. - -- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the - monitoring stack have 1.5x to 2x the minimum required size: - - Recommended size: - - - 8 CPU - - 16 GB Memory - - 20 GB Storage - - As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider - increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the - following resources from the monitoring stack: - - Each added agent: - - - 0.1 CPU - - 250 MiB Memory - - 1 GB Storage - - Refer to the - [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) - documentation for additional guidance. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
- -## Usage - Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to learn how to create a monitoring stack with Prometheus for your Palette environment. -
- -#### Airgap Palette and VerteX +## Airgap Palette and VerteX In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require @@ -341,13 +185,11 @@ charts: - grafana-piechart-panel ``` -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -368,9 +210,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -380,9 +220,7 @@ port 80. Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -391,17 +229,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -411,15 +245,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different object storage for event data. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -#### Remote Monitoring +## Remote Monitoring You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ @@ -435,24 +267,18 @@ about configuration options. To get started with remote monitoring, check out the [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. -
- -#### Palette Resources Monitoring - -You can access internal Palette metrics in Grafana by adding the -[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the -[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. +## Palette Resources Monitoring -
+ +You can access internal Palette metrics in Grafana by adding the pack to all your client clusters. Refer to the [Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + -#### Persistent Storage +## Persistent Storage You can configure the Prometheus Operator to use persistent storage. To enable persistent storage, add the following code snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. -
- ```yaml kube-prometheus-stack: prometheus: @@ -469,7 +295,7 @@ kube-prometheus-stack: storage: 5Gi ``` -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -486,69 +312,10 @@ The Prometheus Operator pack installs the following dependencies: -## Prerequisites - -- Kubernetes v1.16 or greater. - -- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the - monitoring stack have 1.5x to 2x the minimum required size: - - Recommended size: - - - 8 CPU - - 16 GB Memory - - 20 GB Storage - - As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider - increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the - following resources from the monitoring stack: - - Each added agent: - - - 0.1 CPU - - 250 MiB Memory - - 1 GB Storage - - Refer to the - [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) - documentation for additional guidance. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
- -## Usage - Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to learn how to create a monitoring stack with Prometheus for your Palette environment. -
- -#### Airgap Palette and VerteX +## Airgap Palette and VerteX In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require @@ -562,13 +329,11 @@ charts: - grafana-piechart-panel ``` -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -589,9 +354,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -601,9 +364,7 @@ port 80. Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -612,17 +373,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -632,15 +389,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different object storage for event data. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -#### Remote Monitoring +## Remote Monitoring You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ @@ -650,30 +405,26 @@ service. Use the generated service URL to provide other Kubernetes clusters with The remote monitoring feature is configured with defaults to help you consume this feature out-of-the-box. You can change any configuration related to remote monitoring to fine-tune settings for your environment. -Refer to the [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write/) resource to learn more + +Refer to the resource to learn more about the available configuration options. + To get started with remote monitoring, check out the [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. -
- -#### Palette Resources Monitoring - -You can access internal Palette metrics in Grafana by adding the -[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the -[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. +## Palette Resources Monitoring -
+ +You can access internal Palette metrics in Grafana by adding the pack to all your client clusters. Refer to the [Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + -#### Persistent Storage +## Persistent Storage You can configure the Prometheus Operator to use persistent storage. To enable persistent storage add the following code snippet to the `kube-prometheus-stack.prometheus.prometheusSpec.storageSpec` configuration block in the pack's YAML configuration file. The code snippet below creates a Persistent Volume Claim (PVC) for the Prometheus Operator. -
- ```yaml kube-prometheus-stack: prometheus: @@ -690,7 +441,7 @@ kube-prometheus-stack: storage: 5Gi ``` -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -707,69 +458,10 @@ The Prometheus Operator pack installs the following dependencies: -## Prerequisites - -- Kubernetes v1.16 or greater. - -- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the - monitoring stack have 1.5x to 2x the minimum required size: - - Recommended size: - - - 8 CPU - - 16 GB Memory - - 20 GB Storage - - As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider - increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the - following resources from the monitoring stack: - - Each added agent: - - - 0.1 CPU - - 250 MiB Memory - - 1 GB Storage - - Refer to the - [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) - documentation for additional guidance. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
- -## Usage - Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to learn how to create a monitoring stack with Prometheus for your Palette environment. -
- -#### Airgap Palette and VerteX +## Airgap Palette and VerteX In the context of an airgap Palette or VerteX installation, you must remove the `grafana-piechart-panel` plugin. This plugin is not included by default and requires an internet connection to download. The monitoring stack doesn't require @@ -783,13 +475,11 @@ charts: - grafana-piechart-panel ``` -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -810,9 +500,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -822,9 +510,7 @@ port 80. Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -833,17 +519,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -853,15 +535,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different object storage for event data. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -#### Remote Monitoring +## Remote Monitoring You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ @@ -877,17 +557,14 @@ about configuration options. To get started with remote monitoring, check out the [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. -
- -#### Palette Resources Monitoring +## Palette Resources Monitoring -You can access internal Palette metrics in Grafana by adding the -[Prometheus Cluster Metrics](prometheus-cluster-metrics.md) pack to all your client clusters. Refer to the + +You can access internal Palette metrics in Grafana by adding the pack to all your client clusters. Refer to the [Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md) guide to learn more. + -
- -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -904,75 +581,14 @@ The Prometheus Operator pack installs the following dependencies: -## Prerequisites - -- Kubernetes v1.16 or greater. - -- The minimum required size for the Prometheus server is 4 CPU, 8 GB Memory, and 10 GB Storage. We recommend the - monitoring stack have 1.5x to 2x the minimum required size: - - Recommended size: - - - 8 CPU - - 16 GB Memory - - 20 GB Storage. - - As new clusters with the Prometheus agent are added to your environment, review the resource utilization and consider - increasing resources if needed. As the Prometheus documentation recommends, each additional agent requires the - following resources from the monitoring stack: - - Each added agent: - - - 0.1 CPU - - 250 MiB Memory - - 1 GB Storage. - - Refer to the - [Prometheus Operational aspects](https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects) - documentation for additional guidance. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
- -## Usage - Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to learn how to create a monitoring stack with Prometheus for your Palette environment. -
- -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -993,9 +609,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -1005,9 +619,7 @@ port 80. Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -1016,17 +628,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -1036,15 +644,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store By default, Thanos Ruler event data is saved in object storage specified for Thanos, but you can specify a different object storage for event data. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -#### Remote Monitoring +## Remote Monitoring You can configure the Prometheus server to accept metrics from Prometheus agents and become a centralized aggregation point for all Kubernetes metrics. Enabling this feature will expose port 9090 of the _prometheus-operator-prometheus_ @@ -1060,7 +666,7 @@ configuration options. To get started with remote monitoring, check out the [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) guide. -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -1076,45 +682,14 @@ The Prometheus Operator pack installs the following dependencies: -## Prerequisites - -- Kubernetes v1.16 or greater. - -## Parameters - -The Prometheus operator supports all the parameters exposed by the kube-prometheus-stack Helm Chart. Refer to the -[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) -documentation for details. - -The Prometheus Operator pack has one parameter you must initialize `grafana.adminPassword`: - -
- -```yaml -charts: - kube-prometheus-stack: - grafana: - adminPassword: "" -``` - -Use the `grafana.adminPassword` parameter to assign a password to the Grafana admin user `admin`. - -Additional parameters you should be aware of can be found by expanding the **Presets** options. You can modify the -preset settings when you create the profile or when you deploy the cluster and review the cluster profile. - -![A view of the pack's preset drawer expanded with radio buttons](/integrations_prometheus-operator_operator-preset-view-expanded.webp) - -Review the usage section below to learn more about each preset option. - -
+Check out the guide [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) to +learn how to create a monitoring stack with Prometheus for your Palette environment. -#### Email Alerts +## Email Alerts You can configure the Prometheus server to send email alerts to a set of contacts. Toggle the **Email Alerts** button to enable email alerting. Update the `alertmanager.config.receivers` settings with all the required email setting values. -
- ```yaml charts: kube-prometheus-stack: @@ -1135,9 +710,7 @@ charts: Refer to the [Prometheus Alertmanager Configuration](https://prometheus.io/docs/alerting/latest/configuration/) documentation to learn more about Alertmanager. -
- -#### Grafana Ingress +## Grafana Ingress You can enable an ingress endpoint for Grafana that will deploy an NGINX ingress controller. This feature can be used to enable HTTPS and require authentication for all Prometheus API requests. @@ -1146,9 +719,7 @@ If you do not enable the ingress option, by default a service with a load balanc Toggle the **Enable** button to enable the use of Ingress. -
- -#### Thanos SideCar +## Thanos SideCar [Thanos](https://prometheus-operator.dev/docs/platform/thanos/) is an open-source system for running large-scale, distributed, and highly available Prometheus setups. Thanos allows Prometheus to store data for extended periods in @@ -1157,17 +728,13 @@ horizontally without the risk of using up local storage space. Toggle the **Enable** button to enable the use of Thanos. -
- -#### Object Store +## Object Store Select the Thanos object storage type you will use. Review the `thanos.objstoreConfig` parameters to configure the use of object storage with Thanos. Refer to the [Thanos Object Storage](https://github.com/thanos-io/thanos/blob/main/docs/storage.md) documentation to learn more about how to configure each object storage. -
- ```yaml charts: kube-prometheus-stack: @@ -1177,15 +744,13 @@ charts: objstoreConfig: ``` -#### Thanos Ruler Object Store +## Thanos Ruler Object Store You can specify a different object storage to store the Thanos Ruler event data. Defaults to the object storage specified for Thanos. Refer to the [Thanos Ruler](https://prometheus-operator.dev/docs/platform/thanos/#thanos-ruler) resource to learn more. -
- -### Dependencies +## Dependencies The Prometheus Operator pack installs the following dependencies: @@ -1199,44 +764,21 @@ The Prometheus Operator pack installs the following dependencies:
- - -All versions less than v40.x.x are considered deprecated. Upgrade to a newer version to take advantage of the new -features. - - -
## Terraform -You can retrieve details about the Prometheus operator pack by using the following Terraform code. - -
+You can reference the Prometheus Operator pack in Terraform with the following data resource. ```hcl data "spectrocloud_registry" "public_registry" { name = "Public Repo" } -data "spectrocloud_pack_simple" "pack-info" { +data "spectrocloud_pack" "prometheus-operator" { name = "prometheus-opeartor" - version = "45.4.0" + version = "57.0.1" type = "helm" registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -## References - -- [Deploy Monitoring Stack](../clusters/cluster-management/monitoring/deploy-monitor-stack.md) - -- [Prometheus Operator GitHub](https://github.com/coreos/prometheus-operator) - -- [Prometheus Remote Write Tuning](https://prometheus.io/docs/practices/remote_write) - -- [Thanos & Prometheus](https://prometheus-operator.dev/docs/platform/thanos/) - -- [Prometheus FAQ](https://prometheus.io/docs/introduction/faq) - -- [Prometheus Cluster Metrics](prometheus-cluster-metrics.md) diff --git a/docs/docs-content/integrations/spectro-cluster-metrics.md b/docs/docs-content/integrations/spectro-cluster-metrics.md new file mode 100644 index 0000000000..9c5d972bc9 --- /dev/null +++ b/docs/docs-content/integrations/spectro-cluster-metrics.md @@ -0,0 +1,45 @@ +--- +sidebar_label: "Spectro Cluster Metrics" +title: "Spectro Cluster Metrics" +description: "Use the Spectro Cluster Metrics addon pack to expose Palette resource metrics" +type: "integration" +hide_table_of_contents: true +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/prometheus-operator/blobs/sha256:64589616d7f667e5f1d7e3c9a39e32c676e03518a318924e123738693e104ce0?type=image.webp" +tags: ["packs", "spectro-cluster-metrics", "monitoring"] +--- + +## Versions Supported + + + + + +You can learn how to add the Prometheus Cluster Metrics to your cluster by following the steps outlined in the +[Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md). + + +Use the pack to access the metric data through Grafana dashboards. + + + + + + +## Terraform + +You can reference the Spectro Cluster Metrics pack in Terraform with the following data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack" "cluster-metrics" { + name = "spectro-cluster-metrics" + version = "3.4.1" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/spectro-grafana-dashboards.md b/docs/docs-content/integrations/spectro-grafana-dashboards.md new file mode 100644 index 0000000000..d2b3897997 --- /dev/null +++ b/docs/docs-content/integrations/spectro-grafana-dashboards.md @@ -0,0 +1,45 @@ +--- +sidebar_label: "Spectro Cloud Grafana Dashboards" +title: "Spectro Cloud Grafana Dashboards" +description: "Learn more about the Spectro Cloud Grafana dashboard and how to use it." +type: "integration" +category: ["monitoring", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/spectrocloud-grafana-dashboards/blobs/sha256:a48c9929480a8c463e409e7563279f97d80e674c5cc91cb81c47454aea2c203d?type=image.webp" +tags: ["packs", "spectrocloud-grafana-dashboards", "monitoring"] +--- + +## Versions Supported + + + + +You can learn how to add the Spectro Cloud Grafana Dashboards pack to your cluster by following the steps outlined in +the [Enable Monitoring on Host Cluster](../clusters/cluster-management/monitoring/deploy-agent.md). + +:::warning + +Pods without the defined attributes `request` and `limit` will not display metrics data in the Grafana out-of-the-box +Kubernetes Pods dashboard. + +::: + + + + +## Terraform + +You can reference the Spectro Cloud Grafana Dashboards pack in Terraform with the following data resource. + +```terraform hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack" "spectro-cloud-grafana-dashboards" { + name = "spectrocloud-grafana-dashboards" + version = "1.0.0" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/spectro-k8s-dashboard.md b/docs/docs-content/integrations/spectro-k8s-dashboard.md index 10c0c2081b..45cd55d604 100644 --- a/docs/docs-content/integrations/spectro-k8s-dashboard.md +++ b/docs/docs-content/integrations/spectro-k8s-dashboard.md @@ -12,81 +12,18 @@ logoUrl: "https://registry.spectrocloud.com/v1/k8s-dashboard/blobs/sha256:2de5d8 tags: ["packs", "spectro-k8s-dashboard", "monitoring"] --- -Spectro Kubernetes Dashboard is a web-based UI for Kubernetes clusters that auto-enables the Kubernetes Dashboard using -secure ports and conveniently includes the [Spectro Proxy](frp.md) pack. - ## Versions Supported -**2.7.x** - -
- -## Prerequisites - -- Outbound internet connectivity for port 443 is allowed so that you and your applications can connect with the - [Spectro Proxy](frp.md) reverse proxy. - -- Users or groups must be mapped to a Kubernetes RBAC role, either a _Role_ or a _ClusterRole_. You can create a custom - role through a manifest and use Palette's roleBinding feature to associate users or groups with the role. Refer to the - [Create a Role Binding](../clusters/cluster-management/cluster-rbac.md#create-role-bindings) guide to learn more. - -## Parameters - - - -| Parameter | Description | Default | -| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | -| `namespace` | The Kubernetes namespace to install the dashboard. | `kubernetes-dashboard` | -| `ClusterRole` | The ClusterRole to assign to the Spectro Kubernetes Dashboard. | `read-only` | -| `certDuration` | Self-signed certificate duration in hours. | 8760h (365d) | -| `certRenewal` | Self-signed certificate renewal in hours | 720h (30d) | -| `enableInsecureLogin` | RBAC ensures secure login. | `false` | -| `serviceType` | The service type for the dashboard. Supported values are `ClusterIP`, `LoadBalancer`, and `NodePort`. | `ClusterIP` | -| `skipLogin` | Enables or disables the skip login option on the Spectro Kubernetes Dashboard. | `false` | -| `enableInsecureLogin` | Enables non-Secure Sockets Layer (SSL) login. Dashboard login is always restricted to HTTP(S) + localhost or HTTPS and external domain. | `false` | -| `ingress.enabled` | Ingress configuration to access the `ClusterIP`, `LoadBalancer`, or `NodePort`. | `false` | + + -## Usage - -To use the Spectro Kubernetes Dashboard pack, you have to add it to your cluster profile. Spectro Kubernetes Dashboard -supports several public cloud and data center cloud environments. To learn more, refer to [Clusters](/clusters). - -Use the following information to find the Kubernetes Dashboard pack. - -- **Pack Type**: Monitoring -- **Registry**: Public Repo -- **Pack Name**: Spectro Kubernetes Dashboard -- **Pack Version**: 2.7.0 or higher - -Spectro Kubernetes Dashboard has the following Access options. - -
- -- **Proxied**: This option is useful for access to the Kubernetes Dashboard from anywhere and leverages the Spectro - Proxy pack, which gets installed automatically. The Service resource for the Kubernetes Dashboard will be configured - as ClusterIP and is only accessible through the proxy. To learn more, check out the [Spectro Proxy](frp.md) guide. - -- **Direct**: This option is meant for a private configuration where a proxy is not implemented or not desired. The - Service resource for the Kubernetes Dashboard will be configured as LoadBalancer, which you can access directly. This - option requires you to be on a network that can reach the IP address given to the LoadBalancer service. +
+
## Terraform You can reference the Spectro Proxy pack in Terraform with a data resource. -
- ```hcl data "spectrocloud_registry" "public_registry" { name = "Public Repo" @@ -94,14 +31,8 @@ data "spectrocloud_registry" "public_registry" { data "spectrocloud_pack_simple" "k8s-dashboard" { name = "spectro-k8s-dashboard" - version = "2.7.0" + version = "2.7.1" type = "helm" registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -## References - -- [Microsoft Access Control Using Kubernetes RBAC](https://learn.microsoft.com/en-us/azure/aks/azure-ad-rbac?toc=https%3A%2F%2Fdocs.micro[…]icrosoft.com%2Fen-us%2Fazure%2Fbread%2Ftoc.json&tabs=portal) - -- [Terraform Data Resource](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/pack) diff --git a/docs/docs-content/integrations/spectro-proxy.md b/docs/docs-content/integrations/spectro-proxy.md new file mode 100644 index 0000000000..182d6f98ed --- /dev/null +++ b/docs/docs-content/integrations/spectro-proxy.md @@ -0,0 +1,302 @@ +--- +sidebar_label: "Spectro Proxy" +title: "Spectro Proxy" +description: "Fast Reverse Proxy Authentication pack in Spectro Cloud-Spectro Proxy" +hide_table_of_contents: true +type: "integration" +category: ["authentication", "amd64", "fips", "network"] +sidebar_class_name: "hide-from-sidebar" +tags: ["packs", "spectro-proxy", "network"] +--- + +Spectro Proxy is a pack that enables the use of a reverse proxy with a Kubernetes cluster. The reverse proxy allows you +to connect to the cluster API of a Palette-managed Kubernetes cluster in private networks or clusters configured with +private API endpoints. The reverse proxy managed by Spectro Cloud is also known as the forward reverse proxy (FRP). + +The reverse proxy has a server component and a client component. The reverse proxy server is publicly available and +managed by Spectro Cloud. The client is deployed inside your Palette-managed Kubernetes cluster and connects to the +reverse proxy server. When you add the Spectro Proxy pack to a cluster profile, a couple of things happen: + +- Palette injects the reverse proxy server's SSL certificate into the cluster. This allows the cluster to trust the + reverse proxy server. + +- The kubeconfig file is updated with the reverse proxy address instead of pointing directly to the cluster's API + address. The following is an example of a kubeconfig file where the `server` attribute points to the reverse proxy. + + ```hideClipboard yaml {4-5} + apiVersion: v1 + clusters: + - cluster: + certificate-authority-data: LS...... + server: https://cluster-61a578b5259452b88941a1.proxy.spectrocloud.com:443 + name: example-server + contexts: + # The remainder configuration is omitted for brevity. + ``` + +- Any requests to the Kubernetes API server, such as kubectl commands, will be routed to the reverse proxy. The reverse + proxy forwards the request to the intended client, which is the cluster's API server. The cluster's API server + authenticates the request and replies with the proper response. + +You can attach this pack to a cluster profile. For more information, refer to +[Cluster Profiles](../profiles/cluster-profiles/cluster-profiles.md). The pack installs the Spectro Proxy client in the +workload clusters and configures the cluster's API server to point to a managed proxy server. + +:::info + +This pack can be combined with the +[Kubernetes dashboard](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/) pack to expose the +Kubernetes dashboard. To learn more about exposing the Kubernetes dashboard, check out the +[Enable Kubernetes Dashboard](../clusters/cluster-management/kubernetes-dashboard.md) guide. + +::: + +## Network Connectivity + +The host cluster's network configuration defines who can access the host cluster from a network perspective. If a user +is in the same network as the cluster, the user may be able to access the host cluster without needing a forward proxy. +However, if the user is on a different network, the host cluster's network configuration may limit the user's ability to +connect to the host cluster and may require the use of a forward proxy. + +:::warning + +The Spectro Proxy pack does not support Edge deployments in airgapped environments where the Edge host does not have +outbound access to the internet. + +::: + +From a network configuration perspective, a cluster can be in a private or a public network. Host clusters deployed in a +network that does not allow inbound internet access are considered private. Whereas the clusters deployed in a network +with both inbound and outbound access to the internet are considered public. The following are the three possible +network connectivity scenarios: + +- The cluster and the user are in the same private network. + +- The cluster and the user are in different private networks. + +- The cluster is in a public network. + +![An overview of the three different connectivity scenarios](/integrations_frp_conection_overview.webp) + +The following table summarizes the network connectivity requirements for each scenario and whether the Spectro Proxy is +required. + +| **Scenario** | **Description** | **Requires Spectro Proxy?** | +| -------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------- | +| Private cluster in the same network | The cluster is deployed with a private endpoint, and the user is also in the same network. | ❌ | +| Private cluster in a different network | The cluster is deployed with a private endpoint, and the user is in a different network. | ✅ | +| Public cluster in a different network | The cluster is deployed with a public endpoint, and the user is in a different network. | ❌ | + +To learn more about how the Spectro Proxy interacts with clusters in a public or private network environment and when +the Spectro Proxy is required, select the tab that matches your use case. + + + + + +Networks labeled as private do not allow inbound internet access. Inbound network requests to the network are allowed +only if the connection originated from the internal network. If you are in a different network than the cluster, you can +connect to the cluster's API server through the Spectro Proxy. The Spectro Proxy allows you to connect to the cluster's +API server although you are not in the same network as the cluster. + +:::warning + +Users that are in a different network than the cluster require the Spectro Proxy server to connect to the cluster's API +server. Otherwise, requests to the cluster's API server will fail due to a lack of network connectivity. + +::: + +The Spectro Proxy client is installed by the Spectro Proxy pack. The client is deployed in the cluster and connects to +the Spectro Proxy server. The Spectro Proxy server is a managed service that is publicly available and managed by +Spectro Cloud. The Spectro Proxy server forwards the request to the cluster's API server. The cluster's API server +authenticates the request and replies with the proper response. + +The kubeconfig files generated for the host cluster are updated with the Spectro Proxy server's address. When you or +other users issue a kubectl command, the request is routed to the Spectro Proxy server. The following is an example of a +kubeconfig file where the SSL certificate and server address attribute point to the Spectro Proxy. + +The following diagram displays the network connection flow of a user attempting to connect to a cluster with private +endpoints. The user is in a different network than the cluster. + +1. The user issues a kubectl command to the cluster's API server. + +2. The request is routed to the Spectro Proxy server. The Spectro Proxy client inside the host cluster has an + established connection with the cluster's API server. + +3. The Spectro Proxy server forwards the request to the cluster's API server located in a different network. The + cluster's API server authenticates the request and replies with the proper response. + +![Private cluster in a different network.](/integrations_frp_conection_private-different-network.webp) + +Depending on what type of infrastructure provider you are deploying the host cluster in, you may have to specify the +Spectro Proxy server's SSL certificate in the Kubernetes cluster's configuration. + + + + + +Networks labeled as private do not allow inbound internet access. Inbound network requests to the network are allowed +only if the connection originated from the internal network. If you are in the same network as the cluster, you can +connect directly to the cluster's API server. The term "same network" means that from a network perspective, requests +can reach the cluster's API server without having to traverse the internet. + +:::info + +Users in the same network as the cluster do not require the Spectro Proxy server to connect to the cluster's API server. + +::: + +![Private cluster in the same network.](/integrations_frp_conection_private-same-network.webp) + + + + + +Clusters deployed in a network with both inbound and outbound access to the internet are considered public. + +:::info + +Clusters deployed in a public network do not require the Spectro Proxy to connect to the cluster's API server. + +::: + +When a cluster has public endpoints, you can query the cluster's Kubernetes API server from any network with internet +access. The following diagram displays the network connection flow of a user attempting to connect to a cluster with +public endpoints. Any user with access to the internet can connect to the cluster's API server. + +![A public cluster connection path](/integrations_frp_conection_public_connection.webp) + + + + + +--- + +## Versions Supported + + + + +To use this pack, you have to add it to your cluster profile. You can also add the Spectro Proxy pack when you create +the cluster profile. Check out the +[Create Cluster Profile](../profiles/cluster-profiles/create-cluster-profiles/create-cluster-profiles.md) guide to learn +more about cluster profile creation. + +The kubeconfig file generated for the host cluster is updated with the Spectro Proxy server's address. Refer to the +[Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide to learn how to download the +kubeconfig file and access the cluster. + +:::warning + +If this pack is added as a Day-2 operation, meaning not during the cluster creation process, you will have to +re-download the kubeconfig file to pick up the new configuration changes. This will also result in the Kubernetes +control plane nodes getting repaved. + +::: + + + + + +To use this pack, you have to add it to your cluster profile. You can also add the Spectro Proxy pack when you create +the cluster profile. Check out the +[Create Cluster Profile](../profiles/cluster-profiles/create-cluster-profiles/create-cluster-profiles.md) guide to learn +more about cluster profile creation. + +The kubeconfig file generated for the host cluster is updated with the Spectro Proxy server's address. Refer to the +[Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide to learn how to download the +kubeconfig file and access the cluster. + +:::warning + +Be aware that if this pack is added as a Day-2 operation, meaning not during the cluster creation process, you will have +to re-download the kubeconfig file to pick up the new configuration changes. This will also result in Kubernetes control +plane nodes getting repaved. + +::: + + + + + +To use this pack, you have to add it to your cluster profile. You can also add the Spectro Proxy pack when you create +the cluster profile. Check out the +[Create Cluster Profile](../profiles/cluster-profiles/create-cluster-profiles/create-cluster-profiles.md) guide to learn +more about cluster profile creation. + +The kubeconfig file generated for the host cluster is updated with the Spectro Proxy server's address. Refer to the +[Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide to learn how to download the +kubeconfig file and access the cluster. + +:::warning + +Be aware that if this pack is added as a Day-2 operation, meaning not during the cluster creation process, you will have +to re-download the kubeconfig file to pick up the new configuration changes. This will also result in Kubernetes control +plane nodes getting repaved. + +::: + + + + + +To use this pack, you have to add it to your cluster profile. You can also add the Spectro Proxy pack when you create +the cluster profile. Check out the +[Create Cluster Profile](../profiles/cluster-profiles/create-cluster-profiles/create-cluster-profiles.md) guide to learn +more about cluster profile creation. + +The kubeconfig file generated for the host cluster is updated with the Spectro Proxy server's address. Refer to the +[Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide to learn how to download the +kubeconfig file and access the cluster. + +:::warning + +Be aware that if this pack is added as a Day-2 operation, meaning not during the cluster creation process, you will have +to re-download the kubeconfig file to pick up the new configuration changes. This will also result in Kubernetes control +plane nodes getting repaved. + +::: + + + + +## Troubleshooting + +Troubleshooting scenarios related to the Spectro Proxy. + +### x509 Unknown Authority Error + +If you encounter an x509 unknown authority error when deploying a cluster with the Spectro Proxy. + +```hideClipboard shell +Unable to connect to connect the server: X509: certiticate signed by unknown authorit signed by +``` + +The workaround for this error is to wait a few moments for all the kubeconfig configurations to get propagated to +Palette. The Palette cluster agent sends the original kubeconfig to Palette, followed by the modified kubeconfig +containing the reverse proxy settings. If you attempt to open up a web shell session or interact with cluster API during +the initialization process, you will receive an x509 error. Once Palette receives the kubeconfig file containing the +cluster's reverse proxy configurations from the cluster agent, the x509 errors will disappear. + +## Terraform + +You can reference the Spectro Proxy pack in Terraform with a data resource. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "spectro-proxy" { + name = "spectro-proxy" + version = "1.5.3" + type = "operator-instance" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` + +# References + +- [Enable Kubernetes Dashboard](../clusters/cluster-management/kubernetes-dashboard.md) + +- [Terraform Data Resource](https://registry.terraform.io/providers/spectrocloud/spectrocloud/latest/docs/data-sources/pack) diff --git a/docs/docs-content/integrations/ubuntu-aks.md b/docs/docs-content/integrations/ubuntu-aks.md new file mode 100644 index 0000000000..96d64d6f67 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-aks.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-aks" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-aws.md b/docs/docs-content/integrations/ubuntu-aws.md new file mode 100644 index 0000000000..cd41fcdac6 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-aws.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-aws" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-azure.md b/docs/docs-content/integrations/ubuntu-azure.md new file mode 100644 index 0000000000..755d393670 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-azure.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-azure" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-edge.md b/docs/docs-content/integrations/ubuntu-edge.md new file mode 100644 index 0000000000..4593d857b6 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-edge.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-edge" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-gcp.md b/docs/docs-content/integrations/ubuntu-gcp.md new file mode 100644 index 0000000000..bd814978f4 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-gcp.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-gcp" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-libvirt.md b/docs/docs-content/integrations/ubuntu-libvirt.md new file mode 100644 index 0000000000..6a71090c54 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-libvirt.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-libvirt" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-maas.md b/docs/docs-content/integrations/ubuntu-maas.md new file mode 100644 index 0000000000..8228f87911 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-maas.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-maas" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-openstack.md b/docs/docs-content/integrations/ubuntu-openstack.md new file mode 100644 index 0000000000..c4d26b25e6 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-openstack.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-openstack" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/ubuntu-vsphere.md b/docs/docs-content/integrations/ubuntu-vsphere.md new file mode 100644 index 0000000000..4a5fdd0158 --- /dev/null +++ b/docs/docs-content/integrations/ubuntu-vsphere.md @@ -0,0 +1,30 @@ +--- +sidebar_label: "Ubuntu" +title: "Ubuntu" +description: "Choose Ubuntu Operating System pack in Palette." +hide_table_of_contents: true +type: "integration" +category: ["operating system", "amd64"] +sidebar_class_name: "hide-from-sidebar" +logoUrl: "https://registry.spectrocloud.com/v1/ubuntu-vsphere/blobs/sha256:09a727f9005b79c69d8e60e12ce130880c63131315b49e7fb4cc44e53d34dc7a?type=image.webp" +tags: ["packs", "ubuntu", "operating system"] +--- + + + +## Terraform + +You can reference Ubuntu in Terraform with the following code snippet. + +```hcl +data "spectrocloud_registry" "public_registry" { + name = "Public Repo" +} + +data "spectrocloud_pack_simple" "ubuntu" { + name = "ubuntu-vsphere" + version = "22.04" + type = "helm" + registry_uid = data.spectrocloud_registry.public_registry.id +} +``` diff --git a/docs/docs-content/integrations/vault.md b/docs/docs-content/integrations/vault.md index 2bad5981a8..45eb5788a0 100644 --- a/docs/docs-content/integrations/vault.md +++ b/docs/docs-content/integrations/vault.md @@ -10,48 +10,78 @@ logoUrl: "https://registry.spectrocloud.com/v1/vault/blobs/sha256:1abda0173be1fd tags: ["packs", "vault", "security"] --- -[Vault](https://www.vaultproject.io/) helps secure, store, and tightly control access to tokens, passwords, -certificates, encryption keys for protecting secrets, and other sensitive data using a UI, CLI, or HTTP API. +## Versions Supported -Vault integration has the following components: + + -- Vault server -- UI (optional). -- [Agent injector](https://www.vaultproject.io/docs/platform/k8s/injector/) (optional). +HashiCorp provides documentation for many uses cases for Vault. For examples, refer to +[HashiCorp Vault documentation](https://developer.hashicorp.com/vault/docs/use-cases). -## Versions Supported +#### Initialize and Unseal Vault - +If you enabled dev server mode, you do not need to initialize Vault and it is already unsealed. Use the root token you +configured in the `values.yaml` file to sign in to Vault directly. - +Before any operation can be performed on Vault, you need to initialize the first root token and keys that can be used to +unseal Vault. You can do so by following these steps: -### Prerequisites +1. Log in to [Palette](https://console.spectrocloud.com). -- A Kubernetes cluster with Kubernetes version 1.22 or later. +2. Navigate to the left **Main Menu** and select **Clusters**. -### Parameters +3. Select the cluster that has Vault installed to view its details page. -The table lists commonly used parameters you can configure when adding this pack. +4. Download the cluster **kubeconfig** file. -| Parameters | Description | Default | -| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `charts.vault.server.ingress` | Enable ingress traffic to the Vault server. If you want to enable ingress traffic, make sure that `charts.server.serviceType` is set to `"ClusterIP"` or is left empty. | `False` | -| `charts.vault.global.tlsDisable` | Disable TLS for end-to-end encrypted transport. | `True` | -| `charts.vault.agent.enabled` | Enable vault agent injection to inject secrets into the pods. | `-` | -| `charts.vault.server.ha` | Enable high-availability mode to protect against outages by running multiple Vault servers. For more information, refer to [Vault documentation](https://developer.hashicorp.com/vault/docs/internals/high-availability). | `false` | -| `charts.vault.server.dataStorage` | Controls the size, location, storage class of the persistent storage used by the Vault. | | -| `charts.vault.server.dev` | Enable dev server mode. The dev server mode skips most setup required before you can begin to use a Vault server, including initialization and unseal, and stores all data in-memory. For more details about dev server mode, refer to [Vault documentation](https://developer.hashicorp.com/vault/docs/concepts/dev-server). | `False` | -| `charts.vault.server.dev.devRootToken` | If you enabled dev server mode, this parameter specifies the root token for your Vault server. Root token has unlimited privileges and can do anything in Vault. | `"root"` | +5. Set up your local kubectl environment to use the **kubeconfig** file you downloaded. Review the + [Access Cluster with CLI](../clusters/cluster-management/palette-webctl.md) guide for additional guidance. -:::warning +6. You need to get the Vault namespace and application name. Issue the following command to get the unique values. + +
-Never operate a dev mode server in production. It is insecure and loses data on every restart. + ```shell + VAULT_NAMESPACE=$(kubectl get pods --selector app.kubernetes.io/name=vault --all-namespaces --output jsonpath='{.items[0].metadata.namespace}') && \ + APP_NAME=$(echo "$VAULT_NAMESPACE" | sed 's/-ns$//') + ``` + +7. Set up port forwarding by issuing the following command so you can access the Vault UI: + + ``` + kubectl port-forward $APP_NAME 8200:8200 --namespace $VAULT_NAMESPACE + ``` + +8. Open your browser and access the Vault UI at `https://localhost:8200/ui`. You will receive a warning due to using a + self-signed certificate, but you can ignore this warning. Follow the prompts on the UI to initialize your root token. + +:::tip + +If you do not want to use the Vault UI, you can also initialize and unseal Vault using the Vault CLI or API. For more +information, refer to +[Vault documentation](https://developer.hashicorp.com/vault/docs/platform/k8s/helm/run#initialize-and-unseal-vault). ::: -### Usage +#### Storage + +In a production Vault server, backend storage is on a data persistent layer, is untrusted and only stores encrypted +data. In a dev mode Vault server, all data is stored in-memory and will be erased when Vault restarts. + +##### RKE2 -HashiCorp provides many uses cases for Vault. For examples, refer to +When using Vault with the RKE2 distribution of Kubernetes in Palette Edge, you must explicitly specify a storage class +for the Vault server. To specify a storage class, change the value of the field +`charts.vault.server.dataStorage.storageClass` in `values.yaml` for the Vault pack in your cluster profile from `null` +to a storage class that meets your needs. Refer to +[Kubernetes documentation on storage classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) for more +details. + +
+ + + +HashiCorp provides documentation for many uses cases for Vault. For examples, refer to [HashiCorp Vault documentation](https://developer.hashicorp.com/vault/docs/use-cases). #### Initialize and Unseal Vault @@ -113,9 +143,13 @@ to a storage class that meets your needs. Refer to [Kubernetes documentation on storage classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) for more details. + + +
+ ### Terraform -You can reference the Vault pack in Terraform with a data resource: +Use the following Terraform code snippet to reference the Vault pack. ```hcl data "spectrocloud_registry" "public_registry" { @@ -124,33 +158,8 @@ data "spectrocloud_registry" "public_registry" { data "spectrocloud_pack_simple" "pack-info" { name = "vault" - version = "0.22.0" + version = "0.27.0" type = "helm" registry_uid = data.spectrocloud_registry.public_registry.id } ``` - -
- - - -:::warning - -All versions of the manifest-based pack less than v0.22.x are considered deprecated. Upgrade to a newer version to take -advantage of new features. - -::: - - - -
- -## References - -- [Vault Agent injector](https://www.vaultproject.io/docs/platform/k8s/injector/) - -- [Injecting Vault Secrets Into Kubernetes Pods via a Sidecar - Blog](https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar/) - -- [Vault Agent Injector Examples](https://www.vaultproject.io/docs/platform/k8s/injector/examples/) - -- [Vault on Kubernetes Guide](https://www.vaultproject.io/docs/platform/k8s/helm/run) diff --git a/docs/docs-content/release-notes/known-issues.md b/docs/docs-content/release-notes/known-issues.md index 65c82017d7..de22f28461 100644 --- a/docs/docs-content/release-notes/known-issues.md +++ b/docs/docs-content/release-notes/known-issues.md @@ -25,25 +25,25 @@ The following table lists all known issues that are currently active and affecti | When you install Palette Edge using an Edge Installer ISO with a RHEL 8 operating system on a Virtual Machine (VM) with insufficient video memory, the QR code in the registration screen does not display correctly. | Increase the video memory of your VM to 8 MB or higher. The steps to do this vary depending on the platform you use to deploy your VM. In vSphere, you can right click on the VM, click **Edit Settings** and adjust the video card memory in the **Video card** tab. | July 9, 2024 | Edge | | Custom Certificate Authority (CA) is not supported for accessing Azure AKS clusters. Using a custom CA prevents the `spectro-proxy` pack from working correctly with Azure AKS clusters. | No workaround is available. | July 9, 2024 | Packs, Clusters | | Manifests attached to an Infrastructure Pack, such as OS, Kubernetes, Network, or Storage, are not applied to the Edge cluster. This issue does not impact the infrastructure pack's YAML definition, which is applied to the cluster. | Specify custom configurations through an add-on pack or a custom manifest pack applied after the infrastructure packs. | Jul 9, 2024 | Edge, Packs | -| Clusters using Cilium and deployed to VMware environments with the VXLAN tunnel protocol may encounter an I/O timeout error. This issue is caused by the VXMNET3 adapter, which is dropping network traffic and resulting in VXLAN traffic being dropped. You can learn more about this issue in the [Cilium's GitHub issue #21801](https://github.com/cilium/cilium/issues/21801). | Review the [Cilium Troubleshooting](../integrations/cilium.md#io-timeout-error-on-vmware) section for workarounds. | June 27, 2024 | Packs, Clusters, Edge | +| Clusters using Cilium and deployed to VMware environments with the VXLAN tunnel protocol may encounter an I/O timeout error. This issue is caused by the VXMNET3 adapter, which is dropping network traffic and resulting in VXLAN traffic being dropped. You can learn more about this issue in the [Cilium's GitHub issue #21801](https://github.com/cilium/cilium/issues/21801). | Review the section for workarounds. | June 27, 2024 | Packs, Clusters, Edge | | [Sonobuoy](../clusters/cluster-management/compliance-scan.md#conformance-testing) scans fail to generate reports on airgapped Palette Edge clusters. | No workaround is available. | June 24, 2024 | Edge | | Clusters configured with OpenID Connect (OIDC) at the Kubernetes layer encounter issues when authenticating with the [non-admin Kubeconfig file](../clusters/cluster-management/kubeconfig.md#cluster-admin). Kubeconfig files using OIDC to authenticate will not work if the SSL certificate is set at the OIDC provider level. | Use the admin Kubeconfig file to authenticate with the cluster, as it does not use OIDC to authenticate. | June 21, 2024 | Clusters | | During the platform upgrade from Palette 4.3 to 4.4, Virtual Clusters may encounter a scenario where the pod `palette-controller-manager` is not upgraded to the newer version of Palette. The virtual cluster will continue to be operational, and this does not impact its functionality. | Refer to the [Controller Manager Pod Not Upgraded](../troubleshooting/palette-dev-engine.md#scenario---controller-manager-pod-not-upgraded) troubleshooting guide. | June 15, 2024 | Virtual Clusters | | Edge hosts with FIPS-compliant RHEL Operating System (OS) distribution may encounter the error where the `systemd-resolved.service` service enters the **failed** state. This prevents the nameserver from being configured, which will result in cluster deployment failure. | Refer to [TroubleShooting](../troubleshooting/edge.md#scenario---systemd-resolvedservice-enters-failed-state) for a workaround. | June 15, 2024 | Edge | | The GKE cluster's Kubernetes pods are failing to start because the Kubernetes patch version is unavailable. This is encountered during pod restarts or node scaling operations. | Deploy a new cluster and use a GKE cluster profile that does not contain a Kubernetes pack layer with a patch version. Migrate the workloads from the existing cluster to the new cluster. This is a breaking change introduced in Palette 4.4.0 | June 15, 2024 | Packs, Clusters | -| [MicroK8s](../integrations/microk8s.md) does not support multi-node control plane clusters. The upgrade strategy, `InPlaceUpgrade`, is the only option available for use. | No workaround is available. | June 15, 2024 | Packs | -| Clusters using [MicroK8s](../integrations/microk8s.md) as the Kubernetes distribution, the control plane node fails to upgrade when using the `InPlaceUpgrade` strategy for sequential upgrades, such as upgrading from version 1.25.x to version 1.26.x and then to version 1.27.x. | Refer to the [Control Plane Node Fails to Upgrade in Sequential MicroK8s Upgrades](../troubleshooting/pack-issues.md) troubleshooting guide for resolution steps. | June 15, 2024 | Packs | +| does not support multi-node control plane clusters. The upgrade strategy, `InPlaceUpgrade`, is the only option available for use. | No workaround is available. | June 15, 2024 | Packs | +| Clusters using as the Kubernetes distribution, the control plane node fails to upgrade when using the `InPlaceUpgrade` strategy for sequential upgrades, such as upgrading from version 1.25.x to version 1.26.x and then to version 1.27.x. | Refer to the [Control Plane Node Fails to Upgrade in Sequential MicroK8s Upgrades](../troubleshooting/pack-issues.md) troubleshooting guide for resolution steps. | June 15, 2024 | Packs | | Azure IaaS clusters are having issues with deployed load balancers and ingress deployments when using Kubernetes versions 1.29.0 and 1.29.4. Incoming connections time out as a result due to a lack of network path inside the cluster. Azure AKS clusters are not impacted. | Use a Kubernetes version lower than 1.29.0 | June 12, 2024 | Clusters | | OIDC integration with Virtual Clusters is not functional. All other operations related to Virtual Clusters are operational. | No workaround is available. | Jun 11, 2024 | Virtual Clusters | | Deploying self-hosted Palette or VerteX to a vSphere environment fails if vCenter has standalone hosts directly under a Datacenter. Persistent Volume (PV) provisioning fails due to an upstream issue with the vSphere Container Storage Interface (CSI) for all versions before v3.2.0. Palette and VerteX use the vSphere CSI version 3.1.2 internally. The issue may also occur in workload clusters deployed on vSphere using the same vSphere CSI for storage volume provisioning. | If you encounter the following error message when deploying self-hosted Palette or VerteX: `'ProvisioningFailed failed to provision volume with StorageClass "spectro-storage-class". Error: failed to fetch hosts from entity ComputeResource:domain-xyz` then use the following workaround. Remove standalone hosts directly under the Datacenter from vCenter and allow the volume provisioning to complete. After the volume is provisioned, you can add the standalone hosts back. You can also use a service account that does not have access to the standalone hosts as the user that deployed Palette. | May 21, 2024 | Self-Hosted | | Conducting cluster node scaling operations on a cluster undergoing a backup can lead to issues and potential unresponsiveness. | To avoid this, ensure no backup operations are in progress before scaling nodes or performing other cluster operations that change the cluster state | April 14, 2024 | Clusters | | Palette automatically creates an AWS security group for worker nodes using the format `-node`. If a security group with the same name already exists in the VPC, the cluster creation process fails. | To avoid this, ensure that no security group with the same name exists in the VPC before creating a cluster. | April 14, 2024 | Clusters | | K3s version 1.27.7 has been marked as _Deprecated_. This version has a known issue that causes clusters to crash. | Upgrade to a newer version of K3s to avoid the issue, such as versions 1.26.12, 1.28.5, and 1.27.11. You can learn more about the issue in the [K3s GitHub issue](https://github.com/k3s-io/k3s/issues/9047) page. | April 14, 2024 | Packs, Clusters | -| When deploying a multi-node AWS EKS cluster with the Container Network Interface (CNI) [Calico](../integrations/calico.md), the cluster deployment fails. | A workaround is to use the AWS VPC CNI in the interim while the issue is resolved. | April 14, 2024 | Packs, Clusters | +| When deploying a multi-node AWS EKS cluster with the Container Network Interface (CNI) , the cluster deployment fails. | A workaround is to use the AWS VPC CNI in the interim while the issue is resolved. | April 14, 2024 | Packs, Clusters | | If a Kubernetes cluster deployed onto VMware is deleted, and later re-created with the same name, the cluster creation process fails. The issue is caused by existing resources remaining inside the PCG, or the System PCG, that are not cleaned up during the cluster deletion process. | Refer to the [VMware Resources Remain After Cluster Deletion](../troubleshooting/pcg.md#scenario---vmware-resources-remain-after-cluster-deletion) troubleshooting guide for resolution steps. | April 14, 2024 | Clusters | | In a VMware environment, self-hosted Palette instances do not receive a unique cluster ID when deployed, which can cause issues during a node repave event, such as a Kubernetes version upgrade. Specifically, Persistent Volumes (PVs) and Persistent Volume Claims (PVCs) will experience start problems due to the lack of a unique cluster ID. | To resolve this issue, refer to the [Volume Attachment Errors Volume in VMware Environment](../troubleshooting/palette-upgrade.md#volume-attachment-errors-volume-in-vmware-environment) troubleshooting guide. | April 14, 2024 | Self-Hosted | | Day-2 operations related to infrastructure changes, such as modifying the node size and count, when using MicroK8s are not taking effect. | No workaround is available. | April 14, 2024 | Packs, Clusters | -| If a cluster that uses the Rook-Ceph pack experiences network issues, it's possible for the file mount to become and remain unavailable even after the network is restored. | This a known issue disclosed in the [Rook GitHub repository](https://github.com/rook/rook/issues/13818). To resolve this issue, refer to [Rook-Ceph](../integrations/rook-ceph.md#file-mount-becomes-unavailable-after-cluster-experiences-network-issues) pack documentation. | April 14, 2024 | Packs, Edge | +| If a cluster that uses the Rook-Ceph pack experiences network issues, it's possible for the file mount to become and remain unavailable even after the network is restored. | This a known issue disclosed in the [Rook GitHub repository](https://github.com/rook/rook/issues/13818). To resolve this issue, refer to pack documentation. | April 14, 2024 | Packs, Edge | | Edge clusters on Edge hosts with ARM64 processors may experience instability issues that cause cluster failures. | ARM64 support is limited to a specific set of Edge devices. Currently, Nvidia Jetson devices are supported. | April 14, 2024 | Edge | | During the cluster provisioning process of new edge clusters, the Palette webhook pods may not always deploy successfully, causing the cluster to be stuck in the provisioning phase. This issue does not impact deployed clusters. | Review the [Palette Webhook Pods Fail to Start](../troubleshooting/edge.md#scenario---palette-webhook-pods-fail-to-start) troubleshooting guide for resolution steps. | April 14, 2024 | Edge | diff --git a/docs/docs-content/release-notes/release-notes.md b/docs/docs-content/release-notes/release-notes.md index a0b334a6c0..37a976ef39 100644 --- a/docs/docs-content/release-notes/release-notes.md +++ b/docs/docs-content/release-notes/release-notes.md @@ -260,7 +260,7 @@ features and improvements. - The MicroK8s pack layer now exposes `bootCommands`, `preRunCommands` and `postRunCommands`. You can use these commands to customize and configure MicroK8s as needed. MicroK8s is delivered as a Technical Preview for AWS and Canonical MAAS in this release. To learn more, refer to the MicroK8s pack - [documentation](../integrations/microk8s.md). + . #### Improvements @@ -303,12 +303,13 @@ features and improvements. - An issue prevents RKE2 and Palette eXtended Kubernetes (PXK) on version 1.29.4 from operating correctly with Canonical MAAS. A temporary workaround is using a version lower than 1.29.4 when using MAAS.. -- [MicroK8s](../integrations/microk8s.md) does not support a multi-node cluster deployment and is limited to a - single-node cluster. As a result, the only supported upgrade strategy is `InPlaceUpgrade`. +- does not support a multi-node + cluster deployment and is limited to a single-node cluster. As a result, the only supported upgrade strategy is + `InPlaceUpgrade`. -- Clusters using [MicroK8s](../integrations/microk8s.md) as the Kubernetes distribution, the control plane node fails to - upgrade when using the `InPlaceUpgrade` strategy for sequential upgrades, such as upgrading from version 1.25.x to - version 1.26.x and then to version 1.27.x. Refer to the +- Clusters using as the Kubernetes + distribution, the control plane node fails to upgrade when using the `InPlaceUpgrade` strategy for sequential + upgrades, such as upgrading from version 1.25.x to version 1.26.x and then to version 1.27.x. Refer to the [Control Plane Node Fails to Upgrade in Sequential MicroK8s Upgrades](../troubleshooting/pack-issues.md) troubleshooting guide for resolution steps. diff --git a/docs/docs-content/troubleshooting/pack-issues.md b/docs/docs-content/troubleshooting/pack-issues.md index ef10fa6316..f9de25a8f9 100644 --- a/docs/docs-content/troubleshooting/pack-issues.md +++ b/docs/docs-content/troubleshooting/pack-issues.md @@ -12,10 +12,10 @@ The following are common scenarios that you may encounter when using Packs. ## Scenario - Control Plane Node Fails to Upgrade in Sequential MicroK8s Upgrades -In clusters that use [MicroK8s](../integrations/microk8s.md) as the Kubernetes distribution, there is a known issue when -using the `InPlaceUpgrade` strategy for sequential Kubernetes upgrades. For example, upgrading from version 1.25.x to -version 1.26.x and then to version 1.27.x may cause the control plane node to fail to upgrade. Use the following steps -to troubleshoot and resolve the issue. +In clusters that use as the +Kubernetes distribution, there is a known issue when using the `InPlaceUpgrade` strategy for sequential Kubernetes +upgrades. For example, upgrading from version 1.25.x to version 1.26.x and then to version 1.27.x may cause the control +plane node to fail to upgrade. Use the following steps to troubleshoot and resolve the issue. ### Debug Steps diff --git a/docs/docs-content/tutorials/cluster-deployment/pcg/deploy-app-pcg.md b/docs/docs-content/tutorials/cluster-deployment/pcg/deploy-app-pcg.md index 1825b70604..30809471eb 100644 --- a/docs/docs-content/tutorials/cluster-deployment/pcg/deploy-app-pcg.md +++ b/docs/docs-content/tutorials/cluster-deployment/pcg/deploy-app-pcg.md @@ -357,10 +357,12 @@ complete the core infrastructure stack. Next, click on the **Add New Pack** button to include add-on layers to your cluster profile. -Add the **MetalLB (Helm)** pack to your profile. The [MetalLB](../../../integrations/metallb.md) pack provides a -load-balancer implementation for your Kubernetes cluster, as VMware does not offer a load balancer solution natively. -The load balancer is required to help the _LoadBalancer_ service specified in the Hello Universe application manifest -obtain an IP address, so that you can access the application from your browser. +Add the **MetalLB (Helm)** pack to your profile. The + + pack provides a load-balancer +implementation for your Kubernetes cluster, as VMware does not offer a load balancer solution natively. The load +balancer is required to help the _LoadBalancer_ service specified in the Hello Universe application manifest obtain an +IP address, so that you can access the application from your browser. | Pack Name | Version | Layer | | --------------- | ------- | ------------- | @@ -498,10 +500,10 @@ overview of each file. | lb-metallb-helm | 0.13.x | Load Balancer | | hello-universe | 1.1.x | App Service | - The [MetalLB](../../../integrations/metallb.md) pack provides a load-balancer implementation for your Kubernetes - cluster, as VMware does not offer a load balancer solution natively. The load balancer is required to help the - _LoadBalancer_ service specified in the Hello Universe application manifest obtain an IP address, so that you can - access the application on your browser. + The pack provides a load-balancer + implementation for your Kubernetes cluster, as VMware does not offer a load balancer solution natively. The load + balancer is required to help the _LoadBalancer_ service specified in the Hello Universe application manifest obtain an + IP address, so that you can access the application on your browser. - **cluster.tf** - Configuration for the `spectrocloud_cluster_vsphere` resource. diff --git a/docs/docs-content/tutorials/edge/deploy-cluster.md b/docs/docs-content/tutorials/edge/deploy-cluster.md index 45cb7c9046..e765c750b4 100644 --- a/docs/docs-content/tutorials/edge/deploy-cluster.md +++ b/docs/docs-content/tutorials/edge/deploy-cluster.md @@ -705,7 +705,12 @@ section. ### Profile Layers -In the **Profile Layers** section, add the following [BYOS Edge OS](../../integrations/byoos.md) pack to the OS layer. + + +In the **Profile Layers** section, add the following + pack to the OS layer. + + | **Pack Type** | **Registry** | **Pack Name** | **Pack Version** | | ------------- | ------------ | ------------- | ---------------- | diff --git a/docs/docs-content/tutorials/profiles/deploy-pack.md b/docs/docs-content/tutorials/profiles/deploy-pack.md index ceeb14b2be..5207b7d69a 100644 --- a/docs/docs-content/tutorials/profiles/deploy-pack.md +++ b/docs/docs-content/tutorials/profiles/deploy-pack.md @@ -816,9 +816,9 @@ diagram. You can select any layer to make further edits or change the version if Next, proceed to include the add-on layers. Click on the **Add New Pack** button. + Add the Spectro Proxy pack to enable a reverse proxy to connect to the cluster's API. Adding this pack is _optional_, -but it will help connect your local machine to the cluster's API for debugging. Refer to the -[Spectro Proxy](../../integrations/frp.md) guide for more details. +but it will help connect your local machine to the cluster's API for debugging. Refer to the guide for more details. | **Pack Type** | **Registry** | **Pack Name** | **Pack Version** | | -------------- | ------------ | ------------- | ---------------- | @@ -1318,7 +1318,7 @@ deployment scripts. All you need to do is maintain the cluster profiles. To learn more about packs in Palette, we encourage you to check out the reference resources below. -- [Custom OS Pack](../../integrations/byoos.md) +- - [Add-on Packs](../../registries-and-packs/adding-add-on-packs.md) diff --git a/docs/docs-content/vertex/fips/fips-compliant-components.md b/docs/docs-content/vertex/fips/fips-compliant-components.md index 0d6d53e0f6..3e10354a68 100644 --- a/docs/docs-content/vertex/fips/fips-compliant-components.md +++ b/docs/docs-content/vertex/fips/fips-compliant-components.md @@ -49,20 +49,17 @@ resource to learn about our NIST certificate. ## FIPS-Compliant Kubernetes -Our customized version of Kubernetes is FIPS-compliant. Both -[Palette eXtended Kubernetes (PXK)](../../integrations/kubernetes.md) and -[Palette eXtended Kubernetes-Edge (PXK-E)](../../integrations/kubernetes-edge.md) are compiled with FIPS-compliant -compiler and libraries. - -
+ +Our customized version of Kubernetes is FIPS-compliant. Both and are compiled with FIPS-compliant compiler and libraries. :::info -Refer to the [Palette eXtended Kubernetes (PXK)](../../integrations/kubernetes.md) and -[Palette eXtended Kubernetes-Edge (PXK-E)](../../integrations/kubernetes-edge.md) documentation to learn more about the +Refer to the and + documentation to learn more about the each Kubernetes distribution. ::: + All PXK and PXKE components and supporting open-source components are compiled in their native programming language using language specific FIPS-compliant libraries and static linking. If the component is not available in the form of a diff --git a/docs/docs-content/vertex/install-palette-vertex/install-on-kubernetes/vertex-helm-ref.md b/docs/docs-content/vertex/install-palette-vertex/install-on-kubernetes/vertex-helm-ref.md index bb30447c36..9a88c9edf1 100644 --- a/docs/docs-content/vertex/install-palette-vertex/install-on-kubernetes/vertex-helm-ref.md +++ b/docs/docs-content/vertex/install-palette-vertex/install-on-kubernetes/vertex-helm-ref.md @@ -399,11 +399,11 @@ ingress: ## Spectro Proxy + You can specify a reverse proxy server that clusters deployed through Palette VerteX can use to facilitate network -connectivity to the cluster's Kubernetes API server. Host clusters deployed in private networks can use the -[Spectro Proxy pack](../../../integrations/frp.md) to expose the cluster's Kubernetes API to downstream clients that are -not in the same network. Check out the [Reverse Proxy](../../system-management/reverse-proxy.md) documentation to learn -more about setting up a reverse proxy server for Palette VerteX. +connectivity to the cluster's Kubernetes API server. Host clusters deployed in private networks can use the pack to expose the cluster's Kubernetes API to downstream clients that are not in the same network. Check out the [Reverse +Proxy](../../system-management/reverse-proxy.md) documentation to learn more about setting up a reverse proxy server for +Palette VerteX. | **Parameters** | **Description** | **Type** | **Default value** | | ----------------- | -------------------------------------------------------------------------------------------- | -------- | ----------------- | diff --git a/docs/docs-content/vertex/system-management/reverse-proxy.md b/docs/docs-content/vertex/system-management/reverse-proxy.md index 19cf7f95bb..e4007a8a72 100644 --- a/docs/docs-content/vertex/system-management/reverse-proxy.md +++ b/docs/docs-content/vertex/system-management/reverse-proxy.md @@ -13,9 +13,9 @@ You can configure a reverse proxy for Palette VerteX. The reverse proxy can be u private network. Host clusters deployed in a private network are not accessible from the public internet or by users in different networks. You can use a reverse proxy to access the cluster's Kubernetes API server from a different network. -When you configure reverse proxy server for Palette VerteX, clusters that use the -[Spectro Proxy pack](../../integrations/frp.md) will use the reverse proxy server address in the kubeconfig file. -Clusters not using the Spectro Proxy pack will use the default cluster address in the kubeconfig file. + +When you configure reverse proxy server for Palette VerteX, clusters that use the will use the reverse proxy server address in the kubeconfig file. Clusters not using the Spectro Proxy pack will use the default cluster address in the +kubeconfig file. Use the following steps to configure a reverse proxy server for Palette VerteX. @@ -208,8 +208,8 @@ Output ``` You now have a Spectro Proxy server that you can use to access Palette VerteX clusters deployed in a different network. -Make sure you add the [Spectro Proxy pack](../../integrations/frp.md) to the clusters you want to access using the -Spectro Proxy server. +Make sure you add the to the +clusters you want to access using the Spectro Proxy server. ## Validate diff --git a/docs/docs-content/vm-management/create-vmo-profile.md b/docs/docs-content/vm-management/create-vmo-profile.md index 27b614dcd0..0086d158f3 100644 --- a/docs/docs-content/vm-management/create-vmo-profile.md +++ b/docs/docs-content/vm-management/create-vmo-profile.md @@ -8,9 +8,9 @@ sidebar_position: 10 tags: ["vmo"] --- -The **Virtual Machine Orchestrator** pack conveniently includes several components and automatically installs the -[Spectro Proxy](../integrations/frp.md) pack when you use the default profile configuration. To learn about pack -components, refer to [Palette VMO](./vm-management.md). + +The **Virtual Machine Orchestrator** pack conveniently includes several components and automatically installs the pack when you use the default +profile configuration. To learn about pack components, refer to [Palette VMO](./vm-management.md). ## Limitations @@ -49,8 +49,8 @@ components, refer to [Palette VMO](./vm-management.md). 7. Review the **Access** configuration panel at right. The default setting is **Proxied**, which automatically adds the **Spectro Proxy** pack when you create the cluster, allowing access to the Spectro VM Dashboard from anywhere. Check - out the [Spectro Proxy](../integrations/frp.md) guide to learn more. Changing the default may require some additional - configuration. + out the guide to learn more. + Changing the default may require some additional configuration. The **Direct** option is intended for a private configuration where a proxy is not implemented or not desired. @@ -86,12 +86,11 @@ components, refer to [Palette VMO](./vm-management.md). 6. Locate the **Virtual Machine Orchestrator** pack and add it to your profile. + 7. Review the **Access** configuration panel at right. The default setting is **Proxied**, which automatically adds the **Spectro Proxy** pack when you create the cluster, allowing access to the Spectro VM Dashboard from anywhere. Changing the default may require some additional configuration. Check out the - [Spectro Proxy](../integrations/frp.md) guide to learn more - - The **Direct** option is intended for a private configuration where a proxy is not implemented or not desired. + guide to learn more. The **Direct** option is intended for a private configuration where a proxy is not implemented or not desired. 8. If you are using PKX-E, no change is required and you can skip this step. @@ -107,14 +106,16 @@ components, refer to [Palette VMO](./vm-management.md). criSocketContainerPath: /host/run/containerd/containerd.sock ``` + 9. If your cluster profile does include a load balancer such as MetalLB, no changes are required and you can skip this - step. For more information about MetalLB, refer to [MetalLB pack documentation](../integrations/metallb.md). + step. For more information about MetalLB, refer to the + If your cluster profile does not include a load balancer, update the services `charts.virtual-machine-orchestrator.kubevirt` and `charts.virtual-machine-orchestrator.cdi` to type ClusterIP in **values.yaml** for the VMO pack: - + @@ -133,9 +134,9 @@ components, refer to [Palette VMO](./vm-management.md). targetPort: 8443 ``` - + - + ```yaml {7} kubevirt: @@ -149,7 +150,7 @@ components, refer to [Palette VMO](./vm-management.md). targetPort: 8443 ``` - + diff --git a/docusaurus.config.js b/docusaurus.config.js index 0445fd74b1..d4271f5ae2 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -10,6 +10,7 @@ const { pluginPacksAndIntegrationsData } = require("./plugins/packs-integrations const { pluginImportFontAwesomeIcons } = require("./plugins/font-awesome"); import path from "path"; +import { Logger } from "sass"; /** @type {import('@docusaurus/types').Config} */ const config = { @@ -206,7 +207,10 @@ const config = { id: "enable-source-map", }, ], - pluginPacksAndIntegrationsData, + [ + pluginPacksAndIntegrationsData, + { repositories: ["Palette Registry", "Public Repo", "Spectro Addon Repo", "Palette Community Registry"] }, + ], pluginImportFontAwesomeIcons, function () { return { diff --git a/jest.config.js b/jest.config.js index b32519fcf4..14462d9e61 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,7 +4,7 @@ module.exports = { preset: "ts-jest", testEnvironment: "jsdom", moduleNameMapper: { - ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": `identity-obj-proxy`, + ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2|svg)$": `identity-obj-proxy`, }, testPathIgnorePatterns: [`node_modules`, `\\.cache`, `.*/build`, `visuals`], testEnvironment: `jsdom`, diff --git a/package-lock.json b/package-lock.json index 090f16c860..bcd98ede01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "spectro-cloud-docs", "version": "4.3.0", "dependencies": { + "@ant-design/icons": "^4.8.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@docusaurus/core": "^3.4.0", @@ -20,6 +21,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.0.0", "antd": "^5.6.2", + "axios-retry": "^3.8.0", "babel-plugin-macros": "^3.1.0", "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^1.0.1", @@ -27,11 +29,17 @@ "docusaurus-plugin-sass": "^0.2.5", "docusaurus-theme-openapi-docs": "^3.0.0-beta.10", "fuse.js": "^6.6.2", + "markdown-to-jsx": "^7.0.0", + "node-fetch": "^3.1.0", + "p-ratelimit": "^1.0.1", "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-markdown": "9.0.1", "react-select": "^5.8.0", - "sass": "^1.77.6" + "remark-gfm": "4.0.0", + "sass": "^1.77.6", + "semver": "^7.3.7" }, "devDependencies": { "@argos-ci/cli": "^2.0.1", @@ -94,8 +102,7 @@ }, "node_modules/@algolia/autocomplete-core": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", "@algolia/autocomplete-shared": "1.9.3" @@ -103,8 +110,7 @@ }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, @@ -114,8 +120,7 @@ }, "node_modules/@algolia/autocomplete-preset-algolia": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, @@ -126,8 +131,7 @@ }, "node_modules/@algolia/autocomplete-shared": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -135,29 +139,25 @@ }, "node_modules/@algolia/cache-browser-local-storage": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", - "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", + "license": "MIT", "dependencies": { "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/cache-common": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", - "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==" + "license": "MIT" }, "node_modules/@algolia/cache-in-memory": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", - "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", + "license": "MIT", "dependencies": { "@algolia/cache-common": "4.23.3" } }, "node_modules/@algolia/client-account": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", - "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", + "license": "MIT", "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/client-search": "4.23.3", @@ -166,8 +166,7 @@ }, "node_modules/@algolia/client-analytics": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", - "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", + "license": "MIT", "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/client-search": "4.23.3", @@ -177,8 +176,7 @@ }, "node_modules/@algolia/client-common": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", - "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", + "license": "MIT", "dependencies": { "@algolia/requester-common": "4.23.3", "@algolia/transporter": "4.23.3" @@ -186,8 +184,7 @@ }, "node_modules/@algolia/client-personalization": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", - "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", + "license": "MIT", "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/requester-common": "4.23.3", @@ -196,8 +193,7 @@ }, "node_modules/@algolia/client-search": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", - "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", + "license": "MIT", "dependencies": { "@algolia/client-common": "4.23.3", "@algolia/requester-common": "4.23.3", @@ -206,26 +202,22 @@ }, "node_modules/@algolia/events": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + "license": "MIT" }, "node_modules/@algolia/logger-common": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", - "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==" + "license": "MIT" }, "node_modules/@algolia/logger-console": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", - "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", + "license": "MIT", "dependencies": { "@algolia/logger-common": "4.23.3" } }, "node_modules/@algolia/recommend": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", - "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", + "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.23.3", "@algolia/cache-common": "4.23.3", @@ -242,29 +234,25 @@ }, "node_modules/@algolia/requester-browser-xhr": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", - "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", + "license": "MIT", "dependencies": { "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/requester-common": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", - "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==" + "license": "MIT" }, "node_modules/@algolia/requester-node-http": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", - "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", + "license": "MIT", "dependencies": { "@algolia/requester-common": "4.23.3" } }, "node_modules/@algolia/transporter": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", - "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", + "license": "MIT", "dependencies": { "@algolia/cache-common": "4.23.3", "@algolia/logger-common": "4.23.3", @@ -311,14 +299,15 @@ "license": "MIT" }, "node_modules/@ant-design/icons": { - "version": "5.2.6", + "version": "4.8.3", "license": "MIT", "dependencies": { - "@ant-design/colors": "^7.0.0", + "@ant-design/colors": "^6.0.0", "@ant-design/icons-svg": "^4.3.0", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "rc-util": "^5.31.1" + "lodash": "^4.17.15", + "rc-util": "^5.9.4" }, "engines": { "node": ">=8" @@ -329,9 +318,16 @@ } }, "node_modules/@ant-design/icons-svg": { - "version": "4.3.1", + "version": "4.4.2", "license": "MIT" }, + "node_modules/@ant-design/icons/node_modules/@ant-design/colors": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, "node_modules/@ant-design/react-slick": { "version": "1.0.2", "license": "MIT", @@ -371,9 +367,8 @@ }, "node_modules/@argos-ci/cli": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@argos-ci/cli/-/cli-2.1.0.tgz", - "integrity": "sha512-nbubtKVqtGt4VW0AhSDxBL3wryk1INC9Fv4Hk+BEI72nATjA7OMWqZKs/iVQp4iDbrk7ydnzy+0dSNN1m5WPYg==", "dev": true, + "license": "MIT", "dependencies": { "@argos-ci/core": "2.2.0", "commander": "^12.0.0", @@ -389,9 +384,8 @@ }, "node_modules/@argos-ci/cli/node_modules/@argos-ci/core": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@argos-ci/core/-/core-2.2.0.tgz", - "integrity": "sha512-T5W37CZ6HZjRcVAXuPj0wUB/Fm4VdwLvKpQL9yqSwiJganeNz7u8AFYJ30ujSUJS1jdUViW5TNnmsgDjuvGyTQ==", "dev": true, + "license": "MIT", "dependencies": { "@argos-ci/util": "2.0.0", "axios": "^1.6.8", @@ -407,18 +401,16 @@ }, "node_modules/@argos-ci/cli/node_modules/@argos-ci/util": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@argos-ci/util/-/util-2.0.0.tgz", - "integrity": "sha512-wnsNQOjcNfxOi8cHWSv8+GhzUeIitDJgjhuSNR9zrfHB0Y3nDVI57S/mHRo+EMAaWwghfbrxW1ypRCXVseN0GA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.0.0" } }, "node_modules/@argos-ci/cli/node_modules/axios": { "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -427,9 +419,8 @@ }, "node_modules/@argos-ci/cli/node_modules/boxen": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", "dev": true, + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", @@ -449,9 +440,8 @@ }, "node_modules/@argos-ci/cli/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -461,9 +451,8 @@ }, "node_modules/@argos-ci/cli/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" }, @@ -473,31 +462,17 @@ }, "node_modules/@argos-ci/cli/node_modules/commander": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/@argos-ci/cli/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@argos-ci/cli/node_modules/sharp": { "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", @@ -534,9 +509,8 @@ }, "node_modules/@argos-ci/cli/node_modules/update-notifier": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", - "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.1.1", "chalk": "^5.3.0", @@ -665,6 +639,13 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.23.6", "license": "MIT", @@ -712,6 +693,13 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.23.6", "license": "MIT", @@ -733,6 +721,13 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", "license": "MIT", @@ -748,6 +743,13 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.4", "license": "MIT", @@ -1903,6 +1905,13 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.23.3", "license": "MIT", @@ -2132,6 +2141,13 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "license": "MIT", @@ -2262,8 +2278,7 @@ }, "node_modules/@commitlint/cli": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", - "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", + "license": "MIT", "dependencies": { "@commitlint/format": "^19.3.0", "@commitlint/lint": "^19.2.2", @@ -2282,8 +2297,7 @@ }, "node_modules/@commitlint/cli/node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -2304,8 +2318,7 @@ }, "node_modules/@commitlint/cli/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -2315,16 +2328,14 @@ }, "node_modules/@commitlint/cli/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, "node_modules/@commitlint/cli/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2334,8 +2345,7 @@ }, "node_modules/@commitlint/cli/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2345,8 +2355,7 @@ }, "node_modules/@commitlint/cli/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -2359,8 +2368,7 @@ }, "node_modules/@commitlint/cli/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -2373,8 +2381,7 @@ }, "node_modules/@commitlint/cli/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2384,8 +2391,7 @@ }, "node_modules/@commitlint/cli/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -2395,8 +2401,7 @@ }, "node_modules/@commitlint/cli/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2406,8 +2411,7 @@ }, "node_modules/@commitlint/config-conventional": { "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", - "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "conventional-changelog-conventionalcommits": "^7.0.2" @@ -2418,8 +2422,7 @@ }, "node_modules/@commitlint/config-validator": { "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", - "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "ajv": "^8.11.0" @@ -2430,8 +2433,7 @@ }, "node_modules/@commitlint/ensure": { "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", - "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "lodash.camelcase": "^4.3.0", @@ -2446,16 +2448,14 @@ }, "node_modules/@commitlint/execute-rule": { "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", - "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/format": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", - "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "chalk": "^5.3.0" @@ -2466,8 +2466,7 @@ }, "node_modules/@commitlint/format/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2477,8 +2476,7 @@ }, "node_modules/@commitlint/is-ignored": { "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", - "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "semver": "^7.6.0" @@ -2487,21 +2485,9 @@ "node": ">=v18" } }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@commitlint/lint": { "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", - "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "license": "MIT", "dependencies": { "@commitlint/is-ignored": "^19.2.2", "@commitlint/parse": "^19.0.3", @@ -2514,8 +2500,7 @@ }, "node_modules/@commitlint/load": { "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", - "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "license": "MIT", "dependencies": { "@commitlint/config-validator": "^19.0.3", "@commitlint/execute-rule": "^19.0.0", @@ -2534,8 +2519,7 @@ }, "node_modules/@commitlint/load/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2545,8 +2529,7 @@ }, "node_modules/@commitlint/load/node_modules/cosmiconfig": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -2570,16 +2553,14 @@ }, "node_modules/@commitlint/message": { "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", - "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/parse": { "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", - "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "license": "MIT", "dependencies": { "@commitlint/types": "^19.0.3", "conventional-changelog-angular": "^7.0.0", @@ -2591,8 +2572,7 @@ }, "node_modules/@commitlint/read": { "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", - "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", + "license": "MIT", "dependencies": { "@commitlint/top-level": "^19.0.0", "@commitlint/types": "^19.0.3", @@ -2606,8 +2586,7 @@ }, "node_modules/@commitlint/read/node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -2628,8 +2607,7 @@ }, "node_modules/@commitlint/read/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -2639,16 +2617,14 @@ }, "node_modules/@commitlint/read/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, "node_modules/@commitlint/read/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2658,8 +2634,7 @@ }, "node_modules/@commitlint/read/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2669,8 +2644,7 @@ }, "node_modules/@commitlint/read/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -2683,8 +2657,7 @@ }, "node_modules/@commitlint/read/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -2697,8 +2670,7 @@ }, "node_modules/@commitlint/read/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2708,8 +2680,7 @@ }, "node_modules/@commitlint/read/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -2719,8 +2690,7 @@ }, "node_modules/@commitlint/read/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2730,8 +2700,7 @@ }, "node_modules/@commitlint/resolve-extends": { "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", - "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "license": "MIT", "dependencies": { "@commitlint/config-validator": "^19.0.3", "@commitlint/types": "^19.0.3", @@ -2746,8 +2715,7 @@ }, "node_modules/@commitlint/resolve-extends/node_modules/import-meta-resolve": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2755,8 +2723,7 @@ }, "node_modules/@commitlint/rules": { "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", - "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "license": "MIT", "dependencies": { "@commitlint/ensure": "^19.0.3", "@commitlint/message": "^19.0.0", @@ -2770,8 +2737,7 @@ }, "node_modules/@commitlint/rules/node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -2792,8 +2758,7 @@ }, "node_modules/@commitlint/rules/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -2803,16 +2768,14 @@ }, "node_modules/@commitlint/rules/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, "node_modules/@commitlint/rules/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -2822,8 +2785,7 @@ }, "node_modules/@commitlint/rules/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2833,8 +2795,7 @@ }, "node_modules/@commitlint/rules/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -2847,8 +2808,7 @@ }, "node_modules/@commitlint/rules/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -2861,8 +2821,7 @@ }, "node_modules/@commitlint/rules/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2872,8 +2831,7 @@ }, "node_modules/@commitlint/rules/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -2883,8 +2841,7 @@ }, "node_modules/@commitlint/rules/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -2894,16 +2851,14 @@ }, "node_modules/@commitlint/to-lines": { "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", - "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/top-level": { "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", - "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "license": "MIT", "dependencies": { "find-up": "^7.0.0" }, @@ -2913,8 +2868,7 @@ }, "node_modules/@commitlint/top-level/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==", + "license": "MIT", "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", @@ -2929,8 +2883,7 @@ }, "node_modules/@commitlint/top-level/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==", + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -2943,8 +2896,7 @@ }, "node_modules/@commitlint/top-level/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -2957,8 +2909,7 @@ }, "node_modules/@commitlint/top-level/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -2971,16 +2922,14 @@ }, "node_modules/@commitlint/top-level/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/@commitlint/top-level/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -2990,8 +2939,7 @@ }, "node_modules/@commitlint/types": { "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", - "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "license": "MIT", "dependencies": { "@types/conventional-commits-parser": "^5.0.0", "chalk": "^5.3.0" @@ -3002,8 +2950,7 @@ }, "node_modules/@commitlint/types/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -3051,13 +2998,11 @@ }, "node_modules/@docsearch/css": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", - "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" + "license": "MIT" }, "node_modules/@docsearch/react": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", - "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", @@ -3087,8 +3032,7 @@ }, "node_modules/@docusaurus/core": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", - "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", + "license": "MIT", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -3213,8 +3157,7 @@ }, "node_modules/@docusaurus/core/node_modules/css-declaration-sorter": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" }, @@ -3224,8 +3167,7 @@ }, "node_modules/@docusaurus/core/node_modules/css-minimizer-webpack-plugin": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "cssnano": "^6.0.1", @@ -3267,8 +3209,7 @@ }, "node_modules/@docusaurus/core/node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -3279,8 +3220,7 @@ }, "node_modules/@docusaurus/core/node_modules/cssnano": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" @@ -3298,8 +3238,7 @@ }, "node_modules/@docusaurus/core/node_modules/cssnano-preset-default": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", @@ -3341,8 +3280,7 @@ }, "node_modules/@docusaurus/core/node_modules/cssnano-utils": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3352,8 +3290,7 @@ }, "node_modules/@docusaurus/core/node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -3364,8 +3301,7 @@ }, "node_modules/@docusaurus/core/node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -3377,8 +3313,7 @@ }, "node_modules/@docusaurus/core/node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/core/node_modules/has-flag": { "version": "4.0.0", @@ -3389,8 +3324,7 @@ }, "node_modules/@docusaurus/core/node_modules/lilconfig": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -3398,25 +3332,13 @@ "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/@docusaurus/core/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@docusaurus/core/node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/core/node_modules/postcss-calc": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -3430,8 +3352,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-colormin": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -3447,8 +3368,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-convert-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -3462,8 +3382,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-discard-comments": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3473,8 +3392,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-discard-duplicates": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3484,8 +3402,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-discard-empty": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3495,8 +3412,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-discard-overridden": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3506,8 +3422,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-merge-longhand": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -3521,8 +3436,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-merge-rules": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -3538,8 +3452,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-minify-font-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3552,8 +3465,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-minify-gradients": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -3568,8 +3480,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-minify-params": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -3584,8 +3495,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-minify-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -3598,8 +3508,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-charset": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -3609,8 +3518,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3623,8 +3531,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-positions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3637,8 +3544,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3651,8 +3557,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3665,8 +3570,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3679,8 +3583,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-unicode": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -3694,8 +3597,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3708,8 +3610,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-normalize-whitespace": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3722,8 +3623,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-ordered-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -3737,8 +3637,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -3752,8 +3651,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-reduce-transforms": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -3766,8 +3664,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-svgo": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -3781,8 +3678,7 @@ }, "node_modules/@docusaurus/core/node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -3796,8 +3692,7 @@ "node_modules/@docusaurus/core/node_modules/react-loadable": { "name": "@docusaurus/react-loadable", "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", "dependencies": { "@types/react": "*" }, @@ -3805,23 +3700,9 @@ "react": "*" } }, - "node_modules/@docusaurus/core/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@docusaurus/core/node_modules/stylehacks": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -3845,8 +3726,7 @@ }, "node_modules/@docusaurus/core/node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -3869,20 +3749,14 @@ }, "node_modules/@docusaurus/core/node_modules/svgo/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, - "node_modules/@docusaurus/core/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", - "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", + "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -3895,16 +3769,14 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@docusaurus/cssnano-preset/node_modules/css-declaration-sorter": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" }, @@ -3914,8 +3786,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -3926,8 +3797,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/cssnano-preset-advanced": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", "dependencies": { "autoprefixer": "^10.4.19", "browserslist": "^4.23.0", @@ -3946,8 +3816,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/cssnano-preset-default": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", @@ -3989,8 +3858,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/cssnano-utils": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4000,8 +3868,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -4012,8 +3879,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -4025,18 +3891,15 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/cssnano-preset/node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-calc": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -4050,8 +3913,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-colormin": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -4067,8 +3929,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-convert-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -4082,8 +3943,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-comments": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4093,8 +3953,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-duplicates": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4104,8 +3963,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-empty": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4115,8 +3973,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-overridden": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4126,8 +3983,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-unused": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -4140,8 +3996,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-merge-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -4155,8 +4010,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-merge-longhand": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -4170,8 +4024,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-merge-rules": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -4187,8 +4040,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-minify-font-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4201,8 +4053,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-minify-gradients": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -4217,8 +4068,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-minify-params": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -4233,8 +4083,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-minify-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -4247,8 +4096,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-charset": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4258,8 +4106,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4272,8 +4119,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-positions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4286,8 +4132,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4300,8 +4145,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4314,8 +4158,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4328,8 +4171,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-unicode": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -4343,8 +4185,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4357,8 +4198,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-normalize-whitespace": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4371,8 +4211,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-ordered-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -4386,8 +4225,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-reduce-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4400,8 +4238,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -4415,8 +4252,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-reduce-transforms": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -4429,8 +4265,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-sort-media-queries": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", "dependencies": { "sort-css-media-queries": "2.2.0" }, @@ -4443,8 +4278,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-svgo": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -4458,8 +4292,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -4472,8 +4305,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-zindex": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -4483,16 +4315,14 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/sort-css-media-queries": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", "engines": { "node": ">= 6.3.0" } }, "node_modules/@docusaurus/cssnano-preset/node_modules/stylehacks": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -4506,8 +4336,7 @@ }, "node_modules/@docusaurus/cssnano-preset/node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -4530,8 +4359,7 @@ }, "node_modules/@docusaurus/logger": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", - "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -4542,8 +4370,7 @@ }, "node_modules/@docusaurus/logger/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" }, @@ -4556,8 +4383,7 @@ }, "node_modules/@docusaurus/logger/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4571,8 +4397,7 @@ }, "node_modules/@docusaurus/logger/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" }, @@ -4582,21 +4407,18 @@ }, "node_modules/@docusaurus/logger/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/@docusaurus/logger/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" } }, "node_modules/@docusaurus/logger/node_modules/supports-color": { "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" }, @@ -4606,8 +4428,7 @@ }, "node_modules/@docusaurus/lqip-loader": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/lqip-loader/-/lqip-loader-3.4.0.tgz", - "integrity": "sha512-F//Gjqcz925zLL1l3Y3XOtQvn927GBIr9ZouvzWF4jHNKuuHBqzOPSADF5O/cT3Vq1ucPWooyhPBxYcvSGF4SA==", + "license": "MIT", "dependencies": { "@docusaurus/logger": "3.4.0", "file-loader": "^6.2.0", @@ -4621,8 +4442,7 @@ }, "node_modules/@docusaurus/mdx-loader": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", - "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", + "license": "MIT", "dependencies": { "@docusaurus/logger": "3.4.0", "@docusaurus/utils": "3.4.0", @@ -4659,8 +4479,7 @@ }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", + "license": "MIT", "dependencies": { "@docusaurus/types": "3.4.0", "@types/history": "^4.7.11", @@ -4678,8 +4497,7 @@ "node_modules/@docusaurus/module-type-aliases/node_modules/react-loadable": { "name": "@docusaurus/react-loadable", "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", "dependencies": { "@types/react": "*" }, @@ -4689,8 +4507,7 @@ }, "node_modules/@docusaurus/plugin-client-redirects": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.4.0.tgz", - "integrity": "sha512-Pr8kyh/+OsmYCvdZhc60jy/FnrY6flD2TEAhl4rJxeVFxnvvRgEhoaIVX8q9MuJmaQoh6frPk94pjs7/6YgBDQ==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/logger": "3.4.0", @@ -4712,8 +4529,7 @@ }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", - "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/logger": "3.4.0", @@ -4743,8 +4559,7 @@ }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", - "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/logger": "3.4.0", @@ -4773,8 +4588,7 @@ }, "node_modules/@docusaurus/plugin-content-pages": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", - "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/mdx-loader": "3.4.0", @@ -4795,8 +4609,7 @@ }, "node_modules/@docusaurus/plugin-debug": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", - "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/types": "3.4.0", @@ -4815,8 +4628,7 @@ }, "node_modules/@docusaurus/plugin-google-analytics": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", - "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/types": "3.4.0", @@ -4833,8 +4645,7 @@ }, "node_modules/@docusaurus/plugin-google-gtag": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", - "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/types": "3.4.0", @@ -4852,8 +4663,7 @@ }, "node_modules/@docusaurus/plugin-google-tag-manager": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", - "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/types": "3.4.0", @@ -4870,8 +4680,7 @@ }, "node_modules/@docusaurus/plugin-ideal-image": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.4.0.tgz", - "integrity": "sha512-s8N/PRiv1R66UY+WX/2E9a+GjkRooXVcf0VJNEYA3yZ6c24Path15ivjmdMtKaSo/6OXYbejGlA4DJZ5TPLkCQ==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/lqip-loader": "3.4.0", @@ -4901,8 +4710,7 @@ }, "node_modules/@docusaurus/plugin-sitemap": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", - "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/logger": "3.4.0", @@ -4924,8 +4732,7 @@ }, "node_modules/@docusaurus/preset-classic": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", - "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/plugin-content-blog": "3.4.0", @@ -4985,8 +4792,7 @@ }, "node_modules/@docusaurus/theme-classic": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", - "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", + "license": "MIT", "dependencies": { "@docusaurus/core": "3.4.0", "@docusaurus/mdx-loader": "3.4.0", @@ -5031,8 +4837,7 @@ }, "node_modules/@docusaurus/theme-common": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", - "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", + "license": "MIT", "dependencies": { "@docusaurus/mdx-loader": "3.4.0", "@docusaurus/module-type-aliases": "3.4.0", @@ -5067,8 +4872,7 @@ }, "node_modules/@docusaurus/theme-search-algolia": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", - "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", + "license": "MIT", "dependencies": { "@docsearch/react": "^3.5.2", "@docusaurus/core": "3.4.0", @@ -5097,16 +4901,14 @@ }, "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@docusaurus/theme-translations": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", - "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", + "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -5117,8 +4919,7 @@ }, "node_modules/@docusaurus/types": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", + "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -5137,8 +4938,7 @@ }, "node_modules/@docusaurus/utils": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", - "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", + "license": "MIT", "dependencies": { "@docusaurus/logger": "3.4.0", "@docusaurus/utils-common": "3.4.0", @@ -5175,8 +4975,7 @@ }, "node_modules/@docusaurus/utils-common": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", - "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", + "license": "MIT", "dependencies": { "tslib": "^2.6.0" }, @@ -5194,8 +4993,7 @@ }, "node_modules/@docusaurus/utils-validation": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", - "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", + "license": "MIT", "dependencies": { "@docusaurus/logger": "3.4.0", "@docusaurus/utils": "3.4.0", @@ -5212,8 +5010,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -5227,8 +5024,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -5242,8 +5038,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -5257,8 +5052,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -5272,8 +5066,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -5287,8 +5080,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5302,8 +5094,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/babel-preset": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", @@ -5327,8 +5118,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/core": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5346,8 +5136,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" @@ -5362,8 +5151,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-jsx": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5383,8 +5171,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-svgo": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", @@ -5403,8 +5190,7 @@ }, "node_modules/@docusaurus/utils/node_modules/@svgr/webpack": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", @@ -5425,16 +5211,14 @@ }, "node_modules/@docusaurus/utils/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@docusaurus/utils/node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -5445,8 +5229,7 @@ }, "node_modules/@docusaurus/utils/node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -5457,8 +5240,7 @@ }, "node_modules/@docusaurus/utils/node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -5470,18 +5252,15 @@ }, "node_modules/@docusaurus/utils/node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/utils/node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "license": "CC0-1.0" }, "node_modules/@docusaurus/utils/node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -5502,16 +5281,6 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/@emnapi/runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.1.tgz", - "integrity": "sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==", - "dev": true, - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "license": "MIT", @@ -5746,9 +5515,8 @@ }, "node_modules/@eslint/js": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "devOptional": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -5839,10 +5607,8 @@ }, "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", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -5854,9 +5620,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5864,9 +5629,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5888,19 +5652,16 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "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", - "devOptional": true + "devOptional": true, + "license": "BSD-3-Clause" }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -5919,40 +5680,13 @@ "@img/sharp-libvips-darwin-arm64": "1.0.2" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" - } - }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", "cpu": [ "arm64" ], "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" @@ -5967,382 +5701,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", - "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", - "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.31", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", - "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.1.1" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, @@ -6879,31 +6237,6 @@ "node": ">=10" } }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -6915,11 +6248,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@jest/schemas": { "version": "29.6.3", "license": "MIT", @@ -7299,36 +6627,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/config/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/config/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/config/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@npmcli/map-workspaces": { "version": "3.0.4", "dev": true, @@ -7463,9 +6761,8 @@ }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.0.tgz", - "integrity": "sha512-n4znWfRinnUQF6TPyxs7EctSAA3yVSP4qlJP2YgI3g9d4Ae2n5F3XDOjbUluKRxPU3rfsgpOboI4O4VtPc6Ilg==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -7478,15 +6775,13 @@ }, "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^22.2.0" } @@ -7938,6 +7233,40 @@ "npm": ">=7.0.0" } }, + "node_modules/@redocly/openapi-core/node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@redocly/openapi-core/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/@redocly/openapi-core/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/@redocly/openapi-core/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", "license": "MIT", @@ -7962,9 +7291,8 @@ }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@semantic-release/changelog": { "version": "6.0.3", @@ -8066,6 +7394,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", "dev": true, + "license": "MIT", "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", @@ -8084,10 +7413,11 @@ } }, "node_modules/@semantic-release/github": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.0.4.tgz", - "integrity": "sha512-eHCfW3jlzax5OKd5nTovlvoCdg+b9YBa31M2JGT1KmzmJR3TIalu2ahVU+V/xATVeOx+S8fbCiPnBBgMlzH5Vw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.1.1.tgz", + "integrity": "sha512-sSmsBKGpAlTtXf9rUJf/si16p+FwPEsvsJRjl3KCwFP0WywaSpynvUhlYvE18n5rzkQNbGJnObAKIoo3xFMSjA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^6.0.0", "@octokit/plugin-paginate-rest": "^11.0.0", @@ -8233,6 +7563,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz", "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==", "dev": true, + "license": "MIT", "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", @@ -8265,9 +7596,8 @@ }, "node_modules/@semantic-release/npm/node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8317,9 +7647,8 @@ }, "node_modules/@semantic-release/npm/node_modules/execa": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.1.0.tgz", - "integrity": "sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", @@ -8343,9 +7672,8 @@ }, "node_modules/@semantic-release/npm/node_modules/figures": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, + "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -8358,9 +7686,8 @@ }, "node_modules/@semantic-release/npm/node_modules/get-stream": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, + "license": "MIT", "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -8374,9 +7701,8 @@ }, "node_modules/@semantic-release/npm/node_modules/human-signals": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", - "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -8394,9 +7720,8 @@ }, "node_modules/@semantic-release/npm/node_modules/is-stream": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8406,9 +7731,8 @@ }, "node_modules/@semantic-release/npm/node_modules/is-unicode-supported": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8416,22 +7740,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -8444,9 +7756,8 @@ }, "node_modules/@semantic-release/npm/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8454,25 +7765,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@semantic-release/npm/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -8482,9 +7778,8 @@ }, "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8492,11 +7787,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@semantic-release/release-notes-generator": { "version": "10.0.3", "dev": true, @@ -9273,8 +8563,7 @@ }, "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==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -9343,8 +8632,7 @@ }, "node_modules/@types/gtag.js": { "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.3", @@ -9409,9 +8697,8 @@ }, "node_modules/@types/jest": { "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -9615,8 +8902,7 @@ }, "node_modules/@types/sax": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -9695,9 +8981,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", - "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.15.0", @@ -9728,9 +9013,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", - "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "7.15.0", "@typescript-eslint/types": "7.15.0", @@ -9756,9 +9040,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", - "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.15.0", "@typescript-eslint/visitor-keys": "7.15.0" @@ -9773,9 +9056,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", - "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -9786,9 +9068,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", - "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "7.15.0", "@typescript-eslint/visitor-keys": "7.15.0", @@ -9814,9 +9095,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", - "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.15.0", "eslint-visitor-keys": "^3.4.3" @@ -9831,9 +9111,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9846,9 +9125,8 @@ }, "node_modules/@typescript-eslint/parser/node_modules/semver": { "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -9858,9 +9136,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", - "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.15.0", "@typescript-eslint/visitor-keys": "7.15.0" @@ -9875,9 +9152,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", - "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "7.15.0", "@typescript-eslint/utils": "7.15.0", @@ -9902,9 +9178,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", - "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -9915,9 +9190,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", - "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "7.15.0", "@typescript-eslint/visitor-keys": "7.15.0", @@ -9943,9 +9217,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9958,9 +9231,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -9970,9 +9242,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", - "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.15.0", @@ -9992,9 +9263,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", - "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.15.0", "eslint-visitor-keys": "^3.4.3" @@ -10279,8 +9549,7 @@ }, "node_modules/algoliasearch": { "version": "4.23.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", - "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", + "license": "MIT", "dependencies": { "@algolia/cache-browser-local-storage": "4.23.3", "@algolia/cache-common": "4.23.3", @@ -10301,8 +9570,7 @@ }, "node_modules/algoliasearch-helper": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz", - "integrity": "sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w==", + "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -10489,6 +9757,24 @@ "react-dom": ">=16.9.0" } }, + "node_modules/antd/node_modules/@ant-design/icons": { + "version": "5.3.7", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, "node_modules/any-promise": { "version": "1.3.0", "license": "MIT" @@ -10560,8 +9846,7 @@ }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", @@ -10628,9 +9913,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -10765,9 +10049,8 @@ }, "node_modules/array.prototype.findlast": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10837,9 +10120,8 @@ }, "node_modules/array.prototype.toreversed": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10849,9 +10131,8 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -10862,9 +10143,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -11020,8 +10300,6 @@ }, "node_modules/autoprefixer": { "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -11036,6 +10314,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-lite": "^1.0.30001599", @@ -11056,8 +10335,7 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -11097,6 +10375,24 @@ "follow-redirects": "^1.14.7" } }, + "node_modules/axios-retry": { + "version": "3.9.1", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" + } + }, + "node_modules/axios-retry/node_modules/is-retry-allowed": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "dev": true, @@ -11300,6 +10596,13 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.7", "license": "MIT", @@ -12509,8 +11812,6 @@ }, "node_modules/browserslist": { "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -12525,6 +11826,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -12648,36 +11950,6 @@ "semver": "^7.0.0" } }, - "node_modules/builtins/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/builtins/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/bundle-name": { "version": "3.0.0", "dev": true, @@ -12753,8 +12025,7 @@ }, "node_modules/call-bind": { "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", @@ -12842,8 +12113,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001627", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001627.tgz", - "integrity": "sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw==", "funding": [ { "type": "opencollective", @@ -12857,7 +12126,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/cardinal": { "version": "2.1.1", @@ -13752,8 +13022,7 @@ }, "node_modules/conventional-changelog-angular": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -13763,8 +13032,7 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -13794,6 +13062,14 @@ "node": ">=10" } }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "dev": true, @@ -13808,8 +13084,7 @@ }, "node_modules/conventional-commits-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "license": "MIT", "dependencies": { "is-text-path": "^2.0.0", "JSONStream": "^1.3.5", @@ -13825,8 +13100,7 @@ }, "node_modules/conventional-commits-parser/node_modules/is-text-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "license": "MIT", "dependencies": { "text-extensions": "^2.0.0" }, @@ -13836,8 +13110,7 @@ }, "node_modules/conventional-commits-parser/node_modules/meow": { "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "license": "MIT", "engines": { "node": ">=16.10" }, @@ -13847,16 +13120,14 @@ }, "node_modules/conventional-commits-parser/node_modules/split2": { "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/conventional-commits-parser/node_modules/text-extensions": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -14054,8 +13325,7 @@ }, "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==", + "license": "MIT", "dependencies": { "jiti": "^1.19.1" }, @@ -14202,6 +13472,44 @@ "node-fetch": "^2.6.12" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "license": "MIT", @@ -14296,33 +13604,6 @@ "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/css-minimizer-webpack-plugin": { "version": "4.2.2", "dev": true, @@ -14599,8 +13880,7 @@ }, "node_modules/dargs": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -14619,6 +13899,13 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "dev": true, @@ -14634,9 +13921,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -14651,9 +13937,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -14668,9 +13953,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -15255,8 +14539,7 @@ }, "node_modules/define-data-property": { "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", @@ -15388,8 +14671,7 @@ }, "node_modules/detect-libc": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -15758,6 +15040,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { "version": "7.2.0", "license": "MIT", @@ -15781,10 +15071,443 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark": { + "version": "3.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-label": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-title": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-encode": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/parse5": { "version": "6.0.1", "license": "MIT" }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-markdown": { + "version": "8.0.7", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/rehype-raw": { "version": "6.1.1", "license": "MIT", @@ -15798,6 +15521,33 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-parse": { + "version": "10.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-rehype": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/sass-loader": { "version": "13.3.2", "license": "MIT", @@ -15850,6 +15600,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-generated": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-is": { "version": "5.2.1", "license": "MIT", @@ -16054,9 +15812,8 @@ }, "node_modules/dotenv": { "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -16337,8 +16094,7 @@ }, "node_modules/electron-to-chromium": { "version": "1.4.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz", - "integrity": "sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==" + "license": "ISC" }, "node_modules/elliptic": { "version": "6.5.4", @@ -16542,8 +16298,7 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16569,9 +16324,8 @@ }, "node_modules/es-abstract": { "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -16629,8 +16383,7 @@ }, "node_modules/es-define-property": { "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" }, @@ -16640,8 +16393,7 @@ }, "node_modules/es-errors": { "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" } @@ -16672,9 +16424,8 @@ }, "node_modules/es-iterator-helpers": { "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -16701,9 +16452,8 @@ }, "node_modules/es-object-atoms": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -16713,9 +16463,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -16863,9 +16612,8 @@ }, "node_modules/eslint": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -17985,6 +17733,14 @@ "node": "*" } }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "dev": true, @@ -18994,17 +18750,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-n/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-n/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -19016,25 +18761,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-n/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "dev": true, @@ -19048,9 +18774,8 @@ }, "node_modules/eslint-plugin-react": { "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlast": "^1.2.4", @@ -19125,6 +18850,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "devOptional": true, @@ -20091,6 +19824,27 @@ "node": ">=0.4.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "5.0.0", "dev": true, @@ -20793,16 +20547,6 @@ "version": "0.4.1", "license": "MIT" }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", "license": "ISC", @@ -20829,19 +20573,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "license": "MIT", @@ -20859,10 +20590,6 @@ "node": ">=6" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/form-data": { "version": "4.0.0", "dev": true, @@ -20889,6 +20616,16 @@ "node": ">=0.4.x" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "license": "MIT", @@ -21110,6 +20847,34 @@ "node": ">=14" } }, + "node_modules/gaxios/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/gaxios/node_modules/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", @@ -21124,6 +20889,24 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/gaxios/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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gaxios/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "license": "MIT", @@ -21140,9 +20923,8 @@ }, "node_modules/get-east-asian-width": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -21152,8 +20934,7 @@ }, "node_modules/get-intrinsic": { "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", @@ -21203,9 +20984,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -21330,8 +21110,7 @@ }, "node_modules/git-raw-commits": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "license": "MIT", "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", @@ -21346,8 +21125,7 @@ }, "node_modules/git-raw-commits/node_modules/meow": { "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "license": "MIT", "engines": { "node": ">=16.10" }, @@ -21357,8 +21135,7 @@ }, "node_modules/git-raw-commits/node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -21784,8 +21561,7 @@ }, "node_modules/global-directory": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -21798,8 +21574,7 @@ }, "node_modules/global-directory/node_modules/ini": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -22547,8 +22322,7 @@ }, "node_modules/has-property-descriptors": { "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" }, @@ -22558,8 +22332,7 @@ }, "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==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -22598,8 +22371,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -22717,8 +22489,7 @@ }, "node_modules/hasown": { "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" }, @@ -23153,6 +22924,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/html-void-elements": { "version": "3.0.0", "license": "MIT", @@ -23442,8 +23221,7 @@ }, "node_modules/ignore": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -23965,9 +23743,8 @@ }, "node_modules/internal-slot": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -24090,9 +23867,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -24252,9 +24028,8 @@ }, "node_modules/is-data-view": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -24417,9 +24192,8 @@ }, "node_modules/is-in-ci": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", - "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", "dev": true, + "license": "MIT", "bin": { "is-in-ci": "cli.js" }, @@ -24552,9 +24326,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -24718,9 +24491,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -24797,8 +24569,7 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -24985,6 +24756,14 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "dev": true, @@ -26323,17 +26102,6 @@ "node": ">=0.10.0" } }, - "node_modules/jest-config-docusaurus/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-config-docusaurus/node_modules/make-dir": { "version": "3.1.0", "dev": true, @@ -26721,20 +26489,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/jest-config-docusaurus/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-config-docusaurus/node_modules/semver-diff": { "version": "3.1.1", "dev": true, @@ -27060,11 +26814,6 @@ "node": ">=8" } }, - "node_modules/jest-config-docusaurus/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/jest-config-docusaurus/node_modules/zwitch": { "version": "1.0.5", "dev": true, @@ -28142,17 +27891,6 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -28182,20 +27920,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -28207,11 +27931,6 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/jest-util": { "version": "29.7.0", "license": "MIT", @@ -29553,8 +29272,7 @@ }, "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==" + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -29566,18 +29284,15 @@ }, "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==" + "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==" + "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==" + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -29590,8 +29305,7 @@ }, "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==" + "license": "MIT" }, "node_modules/log-update": { "version": "5.0.1", @@ -29725,36 +29439,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/make-error": { "version": "1.3.6", "dev": true, @@ -29836,6 +29520,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/markdown-to-jsx": { + "version": "7.4.7", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/marked": { "version": "4.3.0", "dev": true, @@ -34543,11 +34237,9 @@ }, "node_modules/netlify-cli": { "version": "17.31.0", - "resolved": "https://registry.npmjs.org/netlify-cli/-/netlify-cli-17.31.0.tgz", - "integrity": "sha512-2YULK0AabMg8+xKzx1UL/MtXPQUuKuPEAH0jZwK3j/tvVwn7d6HFmWrjzl/ESh7sErUgh5KAyrcckyD/PmFEiw==", "dev": true, "hasInstallScript": true, - "hasShrinkwrap": true, + "license": "MIT", "dependencies": { "@bugsnag/js": "7.23.0", "@fastify/static": "7.0.4", @@ -34674,9 +34366,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -34687,27 +34378,24 @@ }, "node_modules/netlify-cli/node_modules/@babel/helper-string-parser": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -34720,9 +34408,8 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -34732,9 +34419,8 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -34746,27 +34432,24 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/netlify-cli/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, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -34776,9 +34459,8 @@ }, "node_modules/netlify-cli/node_modules/@babel/parser": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -34788,9 +34470,8 @@ }, "node_modules/netlify-cli/node_modules/@babel/types": { "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", - "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.6", "@babel/helper-validator-identifier": "^7.24.6", @@ -34802,18 +34483,16 @@ }, "node_modules/netlify-cli/node_modules/@bugsnag/browser": { "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.22.7.tgz", - "integrity": "sha512-70jFkWKscK2osm7bnFbPLevrzHClrygM3UcKetKs/l81Xuzlxnu1SS3onN5OUl9kd9RN4XMFr46Pv5jSqWqImQ==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/core": "^7.22.7" } }, "node_modules/netlify-cli/node_modules/@bugsnag/core": { "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.22.7.tgz", - "integrity": "sha512-9DPWBkkBjhFJc5dCFy/wVC3HE0Aw3ZiLJKjyAxgywSKbILgtpD+qT1Xe8sacWyxU92znamlZ8H8ziQOe7jhhbA==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/cuid": "^3.0.0", "@bugsnag/safe-json-stringify": "^6.0.0", @@ -34824,15 +34503,13 @@ }, "node_modules/netlify-cli/node_modules/@bugsnag/cuid": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.1.0.tgz", - "integrity": "sha512-U6vPVhFPLWLXQIGnmk/uPbyidB5xLVFfEdZDmmLbv41Be67re4mNsjMukHdUv669RXOWTDQNJ+bMODhuWpshkw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@bugsnag/js": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.23.0.tgz", - "integrity": "sha512-gnCpcv/v6p3CtbwwDuAjVYPPNq4NMVj4hp70MiB3OGJ+LmIS66CwElDiyvRMA8Ar6OzCF4joTeaNG5bD9cM41w==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/browser": "^7.22.7", "@bugsnag/node": "^7.23.0" @@ -34840,9 +34517,8 @@ }, "node_modules/netlify-cli/node_modules/@bugsnag/node": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.23.0.tgz", - "integrity": "sha512-eXA8/h+J2booEMlKsuRl1NAszebwm4KZ9zxCSg/xN4sw5boXia7kMifLf8QTqk+UBtIhNKBsyQQKHXbawKyE6Q==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/core": "^7.22.7", "byline": "^5.0.0", @@ -34854,24 +34530,21 @@ }, "node_modules/netlify-cli/node_modules/@bugsnag/safe-json-stringify": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/netlify-cli/node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -34881,9 +34554,8 @@ }, "node_modules/netlify-cli/node_modules/@dabh/diagnostics": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", "dev": true, + "license": "MIT", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -34892,9 +34564,8 @@ }, "node_modules/netlify-cli/node_modules/@dependents/detective-less": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-4.1.0.tgz", - "integrity": "sha512-KrkT6qO5NxqNfy68sBl6CTSoJ4SNDIS5iQArkibhlbGU4LaDukZ3q2HIkh8aUKDio6o4itU4xDR7t82Y2eP1Bg==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^6.0.1" @@ -34903,78 +34574,13 @@ "node": ">=14" } }, - "node_modules/netlify-cli/node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/netlify-cli/node_modules/@esbuild/darwin-arm64": { "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -34983,308 +34589,18 @@ "node": ">=12" } }, - "node_modules/netlify-cli/node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/netlify-cli/node_modules/@fastify/accept-negotiator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", - "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/@fastify/ajv-compiler": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", @@ -35293,9 +34609,8 @@ }, "node_modules/netlify-cli/node_modules/@fastify/ajv-compiler/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -35309,39 +34624,34 @@ }, "node_modules/netlify-cli/node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { "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/netlify-cli/node_modules/@fastify/error": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", - "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@fastify/fast-json-stringify-compiler": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", - "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stringify": "^5.7.0" } }, "node_modules/netlify-cli/node_modules/@fastify/merge-json-schemas": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" } }, "node_modules/netlify-cli/node_modules/@fastify/send": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.0.1.tgz", - "integrity": "sha512-8jdouu0o5d0FMq1+zCKeKXc1tmOQ5tTGYdQP3MpyF9+WWrZT1KCBdh6hvoEYxOm3oJG/akdE9BpehLiJgYRvGw==", "dev": true, + "license": "MIT", "dependencies": { "@lukeed/ms": "^2.0.1", "escape-html": "~1.0.3", @@ -35352,18 +34662,16 @@ }, "node_modules/netlify-cli/node_modules/@fastify/send/node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/@fastify/send/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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -35377,9 +34685,8 @@ }, "node_modules/netlify-cli/node_modules/@fastify/send/node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -35389,9 +34696,8 @@ }, "node_modules/netlify-cli/node_modules/@fastify/static": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@fastify/static/-/static-7.0.4.tgz", - "integrity": "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/accept-negotiator": "^1.0.0", "@fastify/send": "^2.0.0", @@ -35403,18 +34709,16 @@ }, "node_modules/netlify-cli/node_modules/@fastify/static/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/@fastify/static/node_modules/glob": { "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", @@ -35434,9 +34738,8 @@ }, "node_modules/netlify-cli/node_modules/@fastify/static/node_modules/minimatch": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -35449,45 +34752,39 @@ }, "node_modules/netlify-cli/node_modules/@fastify/static/node_modules/minipass": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/netlify-cli/node_modules/@humanwhocodes/momoa": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", - "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.10.0" } }, "node_modules/netlify-cli/node_modules/@iarna/toml": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/@import-maps/resolve": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@import-maps/resolve/-/resolve-1.0.1.tgz", - "integrity": "sha512-tWZNBIS1CoekcwlMuyG2mr0a1Wo5lb5lEHwwWvZo+5GLgr3e9LLDTtmgtCWEwBpXMkxn9D+2W9j2FY6eZQq0tA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@ioredis/commands": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -35502,15 +34799,13 @@ }, "node_modules/netlify-cli/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -35525,9 +34820,8 @@ }, "node_modules/netlify-cli/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -35542,9 +34836,8 @@ }, "node_modules/netlify-cli/node_modules/@jest/types": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -35558,18 +34851,16 @@ }, "node_modules/netlify-cli/node_modules/@jest/types/node_modules/@types/yargs": { "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/netlify-cli/node_modules/@jest/types/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -35582,9 +34873,8 @@ }, "node_modules/netlify-cli/node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", - "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" @@ -35598,9 +34888,8 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -35610,15 +34899,13 @@ }, "node_modules/netlify-cli/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -35628,24 +34915,21 @@ }, "node_modules/netlify-cli/node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/netlify-cli/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -35653,18 +34937,16 @@ }, "node_modules/netlify-cli/node_modules/@lukeed/ms": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.1.tgz", - "integrity": "sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -35682,9 +34964,8 @@ }, "node_modules/netlify-cli/node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -35695,9 +34976,8 @@ }, "node_modules/netlify-cli/node_modules/@mapbox/node-pre-gyp/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==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -35715,24 +34995,21 @@ }, "node_modules/netlify-cli/node_modules/@netlify/binary-info": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@netlify/binary-info/-/binary-info-1.0.0.tgz", - "integrity": "sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==", - "dev": true + "dev": true, + "license": "Apache 2" }, "node_modules/netlify-cli/node_modules/@netlify/blobs": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-7.3.0.tgz", - "integrity": "sha512-wN/kNTZo4xjlUM/C0WILOkJbe8p4AFquSGkZEIoIcgnsx5ikp2GyqGiq1WMLee7QdbnqeIV2g2hn/PjT324E5w==", "dev": true, + "license": "MIT", "engines": { "node": "^14.16.0 || >=16.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build": { "version": "29.50.0", - "resolved": "https://registry.npmjs.org/@netlify/build/-/build-29.50.0.tgz", - "integrity": "sha512-9/xFufOlqB5jydYnqqzO8N93YP2ZFJ6qAdRgo/JclJyxQ3yNBfVLzwWiY7FhKpT0p/laag0RJ/a8TNENwHhPhg==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/js": "^7.0.0", "@netlify/blobs": "^7.3.0", @@ -35811,9 +35088,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info": { "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@netlify/build-info/-/build-info-7.13.2.tgz", - "integrity": "sha512-smzhIgcms6Z/v2cct90l8ncBbnA5kvknj5/quhwyM6UHUycgMKFlA22qkB0KLj9shwL1Lkh7iQW751JwhSaP9g==", "dev": true, + "license": "MIT", "dependencies": { "@bugsnag/js": "^7.20.0", "@iarna/toml": "^2.2.5", @@ -35834,18 +35110,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/dot-prop": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", - "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^2.11.2" }, @@ -35858,9 +35132,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -35874,9 +35147,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -35889,18 +35161,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/read-pkg": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -35916,9 +35186,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/yaml": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -35928,9 +35197,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/ansi-escapes": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -35940,24 +35208,21 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -35967,9 +35232,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -35990,9 +35254,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/figures": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -36006,9 +35269,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -36022,18 +35284,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36043,9 +35303,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -36055,9 +35314,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/map-obj": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", - "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -36067,9 +35325,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/minimatch": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -36082,9 +35339,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -36097,9 +35353,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -36112,9 +35367,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-filter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, + "license": "MIT", "dependencies": { "p-map": "^5.1.0" }, @@ -36127,9 +35381,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-filter/node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -36142,9 +35395,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-limit": { "version": "4.0.0", - "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" }, @@ -36157,9 +35409,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-locate": { "version": "6.0.0", - "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" }, @@ -36172,9 +35423,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-map": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-6.0.0.tgz", - "integrity": "sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -36184,18 +35434,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/path-type": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36205,9 +35453,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -36220,9 +35467,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -36237,9 +35483,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36249,9 +35494,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -36261,9 +35505,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/cache-utils": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@netlify/cache-utils/-/cache-utils-5.1.5.tgz", - "integrity": "sha512-lMNdFmy2Yu3oVquSPooRDLxJ8QOsIX6X6vzA2pKz/9V2LQFJiqBukggXM+Rnqzk1regPpdJ0jK3dPGvOKaRQgg==", "dev": true, + "license": "MIT", "dependencies": { "cpy": "^9.0.0", "get-stream": "^6.0.0", @@ -36280,9 +35523,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/cache-utils/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -36299,18 +35541,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/cache-utils/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/cache-utils/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36320,9 +35560,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config": { "version": "20.15.4", - "resolved": "https://registry.npmjs.org/@netlify/config/-/config-20.15.4.tgz", - "integrity": "sha512-qH9kubtF4A53GJwem3BZGVaVRjBpnfeRrkC4Krz45yp4isdhI6mt6L0rDiSSkUl64uu3SQWWd1JapG+hzdhqNQ==", "dev": true, + "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", "chalk": "^5.0.0", @@ -36358,9 +35597,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/dot-prop": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", - "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^2.11.2" }, @@ -36373,9 +35611,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36385,9 +35622,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -36408,9 +35644,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/figures": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -36424,9 +35659,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -36440,18 +35674,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36461,9 +35693,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -36473,9 +35704,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/map-obj": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", - "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -36485,9 +35715,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -36500,9 +35729,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -36515,9 +35743,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/p-limit": { "version": "4.0.0", - "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" }, @@ -36530,9 +35757,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/p-locate": { "version": "6.0.0", - "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" }, @@ -36545,18 +35771,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/path-type": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36566,9 +35790,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -36578,9 +35801,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/config/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -36590,9 +35812,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler": { "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-12.1.1.tgz", - "integrity": "sha512-Jmq4JrWfTRdEJMgIrZt4kr6ETTCCVGupG6AgBwVZ6p93T7z9u9QBb4nkMDbCG6o9roGgUNlh2DtMG8HvD4zdUA==", "dev": true, + "license": "MIT", "dependencies": { "@import-maps/resolve": "^1.0.1", "@vercel/nft": "^0.27.0", @@ -36622,78 +35843,13 @@ "node": "^14.16.0 || >=16.0.0" } }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.2.tgz", - "integrity": "sha512-/c7hocx0pm14bHQlqUVKmxwdT/e5/KkyoY1W8F9lk/8CkE037STDDz8PXUP/LE6faj2HqchvDs9GcShxFhI78Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-arm": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.2.tgz", - "integrity": "sha512-G1ve3b4FeyJeyCjB4MX1CiWyTaIJwT9wAYE+8+IRA53YoN/reC/Bf2GDRXAzDTnh69Fpl+1uIKg76DiB3U6vwQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-arm64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.2.tgz", - "integrity": "sha512-SGZKngoTWVUriO5bDjI4WDGsNx2VKZoXcds+ita/kVYB+8IkSCKDRDaK+5yu0b5S0eq6B3S7fpiEvpsa2ammlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.2.tgz", - "integrity": "sha512-1wzzNoj2QtNkAYwIcWJ66UTRA80+RTQ/kuPMtEuP0X6dp5Ar23Dn566q3aV61h4EYrrgGlOgl/HdcqN/2S/2vg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/darwin-arm64": { "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.2.tgz", - "integrity": "sha512-ZyMkPWc5eTROcLOA10lEqdDSTc6ds6nuh3DeHgKip/XJrYjZDfnkCVSty8svWdy+SC1f77ULtVeIqymTzaB6/Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -36702,299 +35858,10 @@ "node": ">=12" } }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/darwin-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.2.tgz", - "integrity": "sha512-K4ZdVq1zP9v51h/cKVna7im7G0zGTKKB6bP2yJiSmHjjOykbd8DdhrSi8V978sF69rkwrn8zCyL2t6I3ei6j9A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.2.tgz", - "integrity": "sha512-4kbOGdpA61CXqadD+Gb/Pw3YXamQGiz9mal/h93rFVSjr5cgMnmJd/gbfPRm+3BMifvnaOfS1gNWaIDxkE2A3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.2.tgz", - "integrity": "sha512-ShS+R09nuHzDBfPeMUliKZX27Wrmr8UFp93aFf/S8p+++x5BZ+D344CLKXxmY6qzgTL3mILSImPCNJOzD6+RRg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-arm": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.2.tgz", - "integrity": "sha512-nnGXjOAv+7cM3LYRx4tJsYdgy8dGDGkAzF06oIDGppWbUkUKN9SmgQA8H0KukpU0Pjrj9XmgbWqMVSX/U7eeTA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-arm64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.2.tgz", - "integrity": "sha512-Hdu8BL+AmO+eCDvvT6kz/fPQhvuHL8YK4ExKZfANWsNe1kFGOHw7VJvS/FKSLFqheXmB3rTF3xFQIgUWPYsGnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-ia32": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.2.tgz", - "integrity": "sha512-m73BOCW2V9lcj7RtEMi+gBfHC6n3+VHpwQXP5offtQMPLDkpVolYn1YGXxOZ9hp4h3UPRKuezL7WkBsw+3EB3Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-loong64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.2.tgz", - "integrity": "sha512-84eYHwwWHq3myIY/6ikALMcnwkf6Qo7NIq++xH0x+cJuUNpdwh8mlpUtRY+JiGUc60yu7ElWBbVHGWTABTclGw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.2.tgz", - "integrity": "sha512-9siSZngT0/ZKG+AH+/agwKF29LdCxw4ODi/PiE0F52B2rtLozlDP92umf8G2GPoVV611LN4pZ+nSTckebOscUA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.2.tgz", - "integrity": "sha512-y0T4aV2CA+ic04ULya1A/8M2RDpDSK2ckgTj6jzHKFJvCq0jQg8afQQIn4EM0G8u2neyOiNHgSF9YKPfuqKOVw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.2.tgz", - "integrity": "sha512-x5ssCdXmZC86L2Li1qQPF/VaC4VP20u/Zm8jlAu9IiVOVi79YsSz6cpPDYZl1rfKSHYCJW9XBfFCo66S5gVPSA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-s390x": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.2.tgz", - "integrity": "sha512-NP7fTpGSFWdXyvp8iAFU04uFh9ARoplFVM/m+8lTRpaYG+2ytHPZWyscSsMM6cvObSIK2KoPHXiZD4l99WaxbQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.2.tgz", - "integrity": "sha512-giZ/uOxWDKda44ZuyfKbykeXznfuVNkTgXOUOPJIjbayJV6FRpQ4zxUy9JMBPLaK9IJcdWtaoeQrYBMh3Rr4vQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.2.tgz", - "integrity": "sha512-IeFMfGFSQfIj1d4XU+6lkbFzMR+mFELUUVYrZ+jvWzG4NGvs6o53ReEHLHpYkjRbdEjJy2W3lTekTxrFHW7YJg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.2.tgz", - "integrity": "sha512-48QhWD6WxcebNNaE4FCwgvQVUnAycuTd+BdvA/oZu+/MmbpU8pY2dMEYlYzj5uNHWIG5jvdDmFXu0naQeOWUoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/sunos-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.2.tgz", - "integrity": "sha512-90r3nTBLgdIgD4FCVV9+cR6Hq2Dzs319icVsln+NTmTVwffWcCqXGml8rAoocHuJ85kZK36DCteii96ba/PX8g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-arm64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.2.tgz", - "integrity": "sha512-sNndlsBT8OeE/MZDSGpRDJlWuhjuUz/dn80nH0EP4ZzDUYvMDVa7G87DVpweBrn4xdJYyXS/y4CQNrf7R2ODXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-ia32": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.2.tgz", - "integrity": "sha512-Ti2QChGNFzWhUNNVuU4w21YkYTErsNh3h+CzvlEhzgRbwsJ7TrWQqRzW3bllLKKvTppuF3DJ3XP1GEg11AfrEQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-x64": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.2.tgz", - "integrity": "sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/ajv": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -37008,19 +35875,17 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/ajv-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^8.0.1" } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/esbuild": { "version": "0.21.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.2.tgz", - "integrity": "sha512-LmHPAa5h4tSxz+g/D8IHY6wCjtIiFx8I7/Q0Aq+NmvtoYvyMnJU0KQJcqB6QH30X9x/W4CemgUtPgQDZFca5SA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -37055,9 +35920,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -37078,9 +35942,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -37094,9 +35957,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/get-port": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37106,18 +35968,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -37127,9 +35987,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37139,15 +35998,13 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/json-schema-traverse": { "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/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -37160,9 +36017,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -37175,9 +36031,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/p-timeout": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -37187,9 +36042,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/p-wait-for": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", "dev": true, + "license": "MIT", "dependencies": { "p-timeout": "^5.0.0" }, @@ -37202,18 +36056,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -37223,15 +36075,13 @@ }, "node_modules/netlify-cli/node_modules/@netlify/edge-functions": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@netlify/edge-functions/-/edge-functions-2.8.1.tgz", - "integrity": "sha512-BoAz/gCWHLn9DVugGViORbWFDqaqrB/JHM+9N+ahk7U6C3EwaFojnnGKCMrQ65f2YOi6Wwlue1ZZO+8mq43RZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@netlify/framework-info": { "version": "9.8.13", - "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.8.13.tgz", - "integrity": "sha512-ZZXCggokY/y5Sz93XYbl/Lig1UAUSWPMBiQRpkVfbrrkjmW2ZPkYS/BgrM2/MxwXRvYhc/TQpZX6y5JPe3quQg==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.12.0", "filter-obj": "^5.0.0", @@ -37250,9 +36100,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -37266,9 +36115,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -37282,15 +36130,13 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/json-schema-traverse": { "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/netlify-cli/node_modules/@netlify/framework-info/node_modules/p-filter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, + "license": "MIT", "dependencies": { "p-map": "^5.1.0" }, @@ -37303,9 +36149,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/p-limit": { "version": "4.0.0", - "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" }, @@ -37318,9 +36163,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/p-locate": { "version": "6.0.0", - "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" }, @@ -37333,9 +36177,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -37348,18 +36191,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/framework-info/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -37369,9 +36210,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/functions-utils": { "version": "5.2.70", - "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-5.2.70.tgz", - "integrity": "sha512-7SSLuLmvcyIs4vGVyp4K1Vs9fvwNMmpwjBSLOYqrC89rGKFA9zJ7QWgHxtoYF+7I1zf91vRQpz1oiir8kW9F1g==", "dev": true, + "license": "MIT", "dependencies": { "@netlify/zip-it-and-ship-it": "9.37.2", "cpy": "^9.0.0", @@ -37383,18 +36223,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/git-utils": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@netlify/git-utils/-/git-utils-5.1.1.tgz", - "integrity": "sha512-oyHieuTZH3rKTmg7EKpGEGa28IFxta2oXuVwpPJI/FJAtBje3UE+yko0eDjNufgm3AyGa8G77trUxgBhInAYuw==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^6.0.0", "map-obj": "^5.0.0", @@ -37408,9 +36246,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -37431,18 +36268,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37452,9 +36287,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/map-obj": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", - "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37464,9 +36298,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -37479,9 +36312,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -37494,18 +36326,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/git-utils/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -37515,9 +36345,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy/-/local-functions-proxy-1.1.1.tgz", - "integrity": "sha512-eXSsayLT6PMvjzFQpjC9nkg2Otc3lZ5GoYele9M6f8PmsvWpaXRhwjNQ0NYhQQ2UZbLMIiO2dH8dbRsT3bMkFw==", "dev": true, + "license": "MIT", "optionalDependencies": { "@netlify/local-functions-proxy-darwin-arm64": "1.1.1", "@netlify/local-functions-proxy-darwin-x64": "1.1.1", @@ -37535,12 +36364,11 @@ }, "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-darwin-arm64": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-darwin-arm64/-/local-functions-proxy-darwin-arm64-1.1.1.tgz", - "integrity": "sha512-lphJ9qqZ3glnKWEqlemU1LMqXxtJ/tKf7VzakqqyjigwLscXSZSb6fupSjQfd4tR1xqxA76ylws/2HDhc/gs+Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -37549,205 +36377,26 @@ "local-functions-proxy": "bin/local-functions-proxy" } }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-darwin-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-darwin-x64/-/local-functions-proxy-darwin-x64-1.1.1.tgz", - "integrity": "sha512-4CRB0H+dXZzoEklq5Jpmg+chizXlVwCko94d8+UHWCgy/bA3M/rU/BJ8OLZisnJaAktHoeLABKtcLOhtRHpxZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-freebsd-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-freebsd-arm64/-/local-functions-proxy-freebsd-arm64-1.1.1.tgz", - "integrity": "sha512-u13lWTVMJDF0A6jX7V4N3HYGTIHLe5d1Z2wT43fSIHwXkTs6UXi72cGSraisajG+5JFIwHfPr7asw5vxFC0P9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-freebsd-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-freebsd-x64/-/local-functions-proxy-freebsd-x64-1.1.1.tgz", - "integrity": "sha512-g5xw4xATK5YDzvXtzJ8S1qSkWBiyF8VVRehXPMOAMzpGjCX86twYhWp8rbAk7yA1zBWmmWrWNA2Odq/MgpKJJg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-linux-arm": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-linux-arm/-/local-functions-proxy-linux-arm-1.1.1.tgz", - "integrity": "sha512-YsTpL+AbHwQrfHWXmKnwUrJBjoUON363nr6jUG1ueYnpbbv6wTUA7gI5snMi/gkGpqFusBthAA7C30e6bixfiA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-linux-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-linux-arm64/-/local-functions-proxy-linux-arm64-1.1.1.tgz", - "integrity": "sha512-dPGu1H5n8na7mBKxiXQ+FNmthDAiA57wqgpm5JMAHtcdcmRvcXwJkwWVGvwfj8ShhYJHQaSaS9oPgO+mpKkgmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-linux-ia32": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-linux-ia32/-/local-functions-proxy-linux-ia32-1.1.1.tgz", - "integrity": "sha512-Ra0FlXDrmPRaq+rYH3/ttkXSrwk1D5Zx/Na7UPfJZxMY7Qo5iY4bgi/FuzjzWzlp0uuKZOhYOYzYzsIIyrSvmw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-linux-ppc64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-linux-ppc64/-/local-functions-proxy-linux-ppc64-1.1.1.tgz", - "integrity": "sha512-oXf1satwqwUUxz7LHS1BxbRqc4FFEKIDFTls04eXiLReFR3sqv9H/QuYNTCCDMuRcCOd92qKyDfATdnxT4HR8w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-linux-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-linux-x64/-/local-functions-proxy-linux-x64-1.1.1.tgz", - "integrity": "sha512-bS3u4JuDg/eC0y4Na3i/29JBOxrdUvsK5JSjHfzUeZEbOcuXYf4KavTpHS5uikdvTgyczoSrvbmQJ5m0FLXfLA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-openbsd-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-openbsd-x64/-/local-functions-proxy-openbsd-x64-1.1.1.tgz", - "integrity": "sha512-1xLef/kLRNkBTXJ+ZGoRFcwsFxd/B2H3oeJZyXaZ3CN5umd9Mv9wZuAD74NuMt/535yRva8jtAJqvEgl9xMSdA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "bin": { - "local-functions-proxy": "bin/local-functions-proxy" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-win32-ia32": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-win32-ia32/-/local-functions-proxy-win32-ia32-1.1.1.tgz", - "integrity": "sha512-4IOMDBxp2f8VbIkhZ85zGNDrZR4ey8d68fCMSOIwitjsnKav35YrCf8UmAh3UR6CNIRJdJL4MW1GYePJ7iJ8uA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "bin": { - "local-functions-proxy.exe": "bin/local-functions-proxy.exe" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/local-functions-proxy-win32-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@netlify/local-functions-proxy-win32-x64/-/local-functions-proxy-win32-x64-1.1.1.tgz", - "integrity": "sha512-VCBXBJWBujVxyo5f+3r8ovLc9I7wJqpmgDn3ixs1fvdrER5Ac+SzYwYH4mUug9HI08mzTSAKZErzKeuadSez3w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "bin": { - "local-functions-proxy.exe": "bin/local-functions-proxy.exe" - } - }, "node_modules/netlify-cli/node_modules/@netlify/node-cookies": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz", - "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==", "dev": true, + "license": "MIT", "engines": { "node": "^14.16.0 || >=16.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/open-api": { "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.33.1.tgz", - "integrity": "sha512-EP5nVae2sRSg8orieT/PvmykIUkPWr/Qzk2vj1QIUAPeMbR8JM3Aq+W/4fK9m0Yq+1CZ3sWeNy/r6nsxLqnXVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/@netlify/opentelemetry-utils": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.2.1.tgz", - "integrity": "sha512-A6nQBvUn/avHQopLOOjX8rY2eua//jufbx4NZZODACEHtfXAEmOjCoDe2m+cQPRq+jNa98nvCy/sJh2RwuCQog==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.0.0" }, @@ -37757,18 +36406,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/plugins-list": { "version": "6.80.0", - "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.80.0.tgz", - "integrity": "sha512-bCKLI51UZ70ziIWsf2nvgPd4XuG6m8AMCoHiYtl/BSsiaSBfmryZnTTqdRXerH09tBRpbPPwzaEgUJwyU9o8Qw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.14.0 || >=16.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/run-utils": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@netlify/run-utils/-/run-utils-5.1.1.tgz", - "integrity": "sha512-V2B8ZB19heVKa715uOeDkztxLH7uaqZ+9U5fV7BRzbQ2514DO5Vxj9hG0irzuRLfZXZZjp/chPUesv4VVsce/A==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^6.0.0" }, @@ -37778,9 +36425,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -37801,18 +36447,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -37822,9 +36466,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -37837,9 +36480,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -37852,9 +36494,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/run-utils/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -37864,9 +36505,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it": { "version": "9.37.2", - "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.37.2.tgz", - "integrity": "sha512-ZOibSzp4ICeNgBu66UjVnRkEUpxZ59OtvR2Wk0bZxU708jCgcYzyQfIXrWqDHNq3QTFjFpZVuhBe6CTSOZkPjg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.22.5", "@babel/types": "7.24.6", @@ -37912,9 +36552,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@netlify/serverless-functions-api": { "version": "1.18.5", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.18.5.tgz", - "integrity": "sha512-2/LCG0b7xPee9uVMh422h4TPQdT5/Uk4o2H9L//sKDp8PLlvEdJJkagmWqBOYDtGMId/aO5KyZ/iF/zRA7Nq5A==", "dev": true, + "license": "MIT", "dependencies": { "@netlify/node-cookies": "^0.1.0", "urlpattern-polyfill": "8.0.2" @@ -37925,18 +36564,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/execa": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -37957,9 +36594,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -37973,10 +36609,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/glob": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -37993,9 +36627,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/glob/node_modules/minimatch": { "version": "5.1.6", - "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" }, @@ -38005,18 +36638,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/human-signals": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -38026,9 +36657,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -38038,9 +36668,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/minimatch": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -38053,9 +36682,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -38068,9 +36696,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -38083,9 +36710,8 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -38098,18 +36724,16 @@ }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -38119,9 +36743,8 @@ }, "node_modules/netlify-cli/node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -38132,18 +36755,16 @@ }, "node_modules/netlify-cli/node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/netlify-cli/node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -38154,18 +36775,16 @@ }, "node_modules/netlify-cli/node_modules/@octokit/auth-token": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/netlify-cli/node_modules/@octokit/core": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -38181,9 +36800,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/endpoint": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -38194,9 +36812,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/graphql": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/request": "^8.3.0", "@octokit/types": "^13.0.0", @@ -38208,15 +36825,13 @@ }, "node_modules/netlify-cli/node_modules/@octokit/openapi-types": { "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@octokit/plugin-paginate-rest": { "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -38229,9 +36844,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/plugin-request-log": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" }, @@ -38241,9 +36855,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -38256,9 +36869,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/request": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.1", "@octokit/request-error": "^5.1.0", @@ -38271,9 +36883,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/request-error": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -38285,9 +36896,8 @@ }, "node_modules/netlify-cli/node_modules/@octokit/rest": { "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", "@octokit/plugin-paginate-rest": "11.3.1", @@ -38300,28 +36910,24 @@ }, "node_modules/netlify-cli/node_modules/@octokit/types": { "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^22.2.0" } }, "node_modules/netlify-cli/node_modules/@opentelemetry/api": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } }, "node_modules/netlify-cli/node_modules/@parcel/watcher": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.0.tgz", - "integrity": "sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -38350,34 +36956,13 @@ "@parcel/watcher-win32-x64": "2.4.0" } }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz", - "integrity": "sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/netlify-cli/node_modules/@parcel/watcher-darwin-arm64": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz", - "integrity": "sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -38390,154 +36975,13 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz", - "integrity": "sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz", - "integrity": "sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz", - "integrity": "sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz", - "integrity": "sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz", - "integrity": "sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz", - "integrity": "sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz", - "integrity": "sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/netlify-cli/node_modules/@parcel/watcher-wasm": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.0.tgz", - "integrity": "sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==", "bundleDependencies": [ "napi-wasm" ], "dev": true, + "license": "MIT", "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", @@ -38557,71 +37001,10 @@ "inBundle": true, "license": "MIT" }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz", - "integrity": "sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz", - "integrity": "sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz", - "integrity": "sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/netlify-cli/node_modules/@parcel/watcher/node_modules/detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -38631,9 +37014,8 @@ }, "node_modules/netlify-cli/node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -38641,18 +37023,16 @@ }, "node_modules/netlify-cli/node_modules/@pnpm/config.env-replace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.22.0" } }, "node_modules/netlify-cli/node_modules/@pnpm/network.ca-file": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", - "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -38662,9 +37042,8 @@ }, "node_modules/netlify-cli/node_modules/@pnpm/npm-conf": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.0.tgz", - "integrity": "sha512-roLI1ul/GwzwcfcVpZYPdrgW2W/drLriObl1h+yLF5syc8/5ULWw2ALbCHUWF+4YltIqA3xFSbG4IwyJz37e9g==", "dev": true, + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -38676,9 +37055,8 @@ }, "node_modules/netlify-cli/node_modules/@rollup/pluginutils": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, + "license": "MIT", "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" @@ -38689,9 +37067,8 @@ }, "node_modules/netlify-cli/node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -38701,9 +37078,8 @@ }, "node_modules/netlify-cli/node_modules/@sindresorhus/slugify": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", - "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" @@ -38717,9 +37093,8 @@ }, "node_modules/netlify-cli/node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -38729,9 +37104,8 @@ }, "node_modules/netlify-cli/node_modules/@sindresorhus/transliterate": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.5.0.tgz", - "integrity": "sha512-/sfSkoNelLq5riqNRp5uBjHIKBi1MWZk9ubRT1WiBQuTfmDf7BeQkph2DJzRB83QagMPHk2VDjuvpy0VuwyzdA==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "lodash.deburr": "^4.1.0" @@ -38745,9 +37119,8 @@ }, "node_modules/netlify-cli/node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -38757,9 +37130,8 @@ }, "node_modules/netlify-cli/node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -38769,48 +37141,41 @@ }, "node_modules/netlify-cli/node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@trysound/sax": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10.13.0" } }, "node_modules/netlify-cli/node_modules/@tsconfig/node10": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@tsconfig/node12": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@tsconfig/node14": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@tsconfig/node16": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/body-parser": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -38820,9 +37185,8 @@ }, "node_modules/netlify-cli/node_modules/@types/connect": { "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -38831,9 +37195,8 @@ }, "node_modules/netlify-cli/node_modules/@types/express": { "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -38845,9 +37208,8 @@ }, "node_modules/netlify-cli/node_modules/@types/express-serve-static-core": { "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -38858,93 +37220,81 @@ }, "node_modules/netlify-cli/node_modules/@types/http-cache-semantics": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/http-proxy": { "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/netlify-cli/node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/netlify-cli/node_modules/@types/istanbul-reports": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/netlify-cli/node_modules/@types/mime": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true, + "license": "MIT", "optional": true, "peer": true }, "node_modules/netlify-cli/node_modules/@types/node": { "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/netlify-cli/node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/qs": { "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true, + "license": "MIT", "optional": true, "peer": true }, "node_modules/netlify-cli/node_modules/@types/range-parser": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true, + "license": "MIT", "optional": true, "peer": true }, "node_modules/netlify-cli/node_modules/@types/retry": { "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/serve-static": { "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -38954,15 +37304,13 @@ }, "node_modules/netlify-cli/node_modules/@types/yargs-parser": { "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/@types/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -38970,9 +37318,8 @@ }, "node_modules/netlify-cli/node_modules/@vercel/nft": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.2.tgz", - "integrity": "sha512-7LeioS1yE5hwPpQfD3DdH04tuugKjo5KrJk3yK5kAI3Lh76iSsK/ezoFQfzuT08X3ZASQOd1y9ePjLNI9+TxTQ==", "dev": true, + "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", "@rollup/pluginutils": "^4.0.0", @@ -38996,9 +37343,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/archive-type": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-6.0.1.tgz", - "integrity": "sha512-PB3NeJL8xARZt52yDBupK0dNPn8uIVQDe15qNehUpoeeLWCZyAOam4vGXnoZGz2N9D1VXtjievJuCsXam2TmbQ==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^18.5.0" }, @@ -39008,9 +37354,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress/-/decompress-9.0.1.tgz", - "integrity": "sha512-9Lvlt6Qdpo9SaRQyRIXCo3lgU++eMZ68lzgjcTwtuKDrlwT635+5zsHZ1yrSx/Blc5IDuVLlPkBPj5CZkx+2+Q==", "dev": true, + "license": "MIT", "dependencies": { "@xhmikosr/decompress-tar": "^7.0.0", "@xhmikosr/decompress-tarbz2": "^7.0.0", @@ -39026,9 +37371,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-tar": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tar/-/decompress-tar-7.0.0.tgz", - "integrity": "sha512-kyWf2hybtQVbWtB+FdRyOT+jyR5jxCNZPLqvQGB7djZj75lrpLUPEmRbyo86AtJ5OEtivpYaNWjCkqSJ8xtRWw==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^18.5.0", "is-stream": "^3.0.0", @@ -39040,9 +37384,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-tar/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -39052,9 +37395,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-tarbz2": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-tarbz2/-/decompress-tarbz2-7.0.0.tgz", - "integrity": "sha512-3QnjipYkRgh3Dee1MWDgKmANWxOQBVN4e1IwiGNe2fHYfMYTeSkVvWREt87UIoSucKUh3E95v8uGFttgTknZcA==", "dev": true, + "license": "MIT", "dependencies": { "@xhmikosr/decompress-tar": "^7.0.0", "file-type": "^18.5.0", @@ -39068,9 +37410,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-tarbz2/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -39080,9 +37421,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-targz": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-targz/-/decompress-targz-7.0.0.tgz", - "integrity": "sha512-7BNHJl92g9OLhw89zqcFS67V1LAtm4Ex02j6OiQzuE8P7Yy9lQcyBuEL3x6v436grLdL+BcFjgbmhWxnem4GHw==", "dev": true, + "license": "MIT", "dependencies": { "@xhmikosr/decompress-tar": "^7.0.0", "file-type": "^18.5.0", @@ -39094,9 +37434,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-targz/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -39106,9 +37445,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress-unzip": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-6.0.0.tgz", - "integrity": "sha512-R1HAkjXLS7RAL74YFLxYY9zYflCcYGssld9KKFDu87PnJ4h4btdhzXfSC8J5i5A2njH3oYIoCzx03RIGTH07Sg==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^18.5.0", "get-stream": "^6.0.1", @@ -39120,15 +37458,13 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/decompress/node_modules/graceful-fs": { "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/netlify-cli/node_modules/@xhmikosr/decompress/node_modules/make-dir": { "version": "4.0.0", - "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" }, @@ -39141,9 +37477,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader": { "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@xhmikosr/downloader/-/downloader-13.0.1.tgz", - "integrity": "sha512-mBvWew1kZJHfNQVVfVllMjUDwCGN9apPa0t4/z1zaUJ9MzpXjRL3w8fsfJKB8gHN/h4rik9HneKfDbh2fErN+w==", "dev": true, + "license": "MIT", "dependencies": { "@xhmikosr/archive-type": "^6.0.1", "@xhmikosr/decompress": "^9.0.1", @@ -39162,9 +37497,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -39174,9 +37508,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader/node_modules/filename-reserved-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", - "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -39186,9 +37519,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader/node_modules/filenamify": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", - "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", "dev": true, + "license": "MIT", "dependencies": { "filename-reserved-regex": "^3.0.0", "strip-outer": "^2.0.0", @@ -39203,9 +37535,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader/node_modules/strip-outer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", - "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -39215,9 +37546,8 @@ }, "node_modules/netlify-cli/node_modules/@xhmikosr/downloader/node_modules/trim-repeated": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", - "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0" }, @@ -39227,15 +37557,13 @@ }, "node_modules/netlify-cli/node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -39245,15 +37573,13 @@ }, "node_modules/netlify-cli/node_modules/abstract-logging": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/accepts": { "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==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -39264,9 +37590,8 @@ }, "node_modules/netlify-cli/node_modules/acorn": { "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -39276,27 +37601,24 @@ }, "node_modules/netlify-cli/node_modules/acorn-import-attributes": { "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/netlify-cli/node_modules/acorn-walk": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/netlify-cli/node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -39306,9 +37628,8 @@ }, "node_modules/netlify-cli/node_modules/aggregate-error": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" @@ -39322,9 +37643,8 @@ }, "node_modules/netlify-cli/node_modules/aggregate-error/node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -39334,9 +37654,8 @@ }, "node_modules/netlify-cli/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -39351,9 +37670,8 @@ }, "node_modules/netlify-cli/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -39368,9 +37686,8 @@ }, "node_modules/netlify-cli/node_modules/ajv-formats/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -39384,15 +37701,13 @@ }, "node_modules/netlify-cli/node_modules/ajv-formats/node_modules/json-schema-traverse": { "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/netlify-cli/node_modules/all-node-versions": { "version": "11.3.0", - "resolved": "https://registry.npmjs.org/all-node-versions/-/all-node-versions-11.3.0.tgz", - "integrity": "sha512-psMkc5s3qpr+QMfires9bC4azRYciPWql1wqZKMsYRh1731qefQDH2X4+O19xSBX6u0Ra/8Y5diG6y/fEmqKsw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "fetch-node-website": "^7.3.0", "filter-obj": "^5.1.0", @@ -39409,18 +37724,16 @@ }, "node_modules/netlify-cli/node_modules/all-node-versions/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/all-node-versions/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" @@ -39431,18 +37744,16 @@ }, "node_modules/netlify-cli/node_modules/ansi-align": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } }, "node_modules/netlify-cli/node_modules/ansi-escapes": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -39455,18 +37766,16 @@ }, "node_modules/netlify-cli/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -39476,9 +37785,8 @@ }, "node_modules/netlify-cli/node_modules/ansi-to-html": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^2.2.0" }, @@ -39491,18 +37799,16 @@ }, "node_modules/netlify-cli/node_modules/ansi-to-html/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/netlify-cli/node_modules/anymatch": { "version": "3.1.3", - "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" @@ -39513,15 +37819,13 @@ }, "node_modules/netlify-cli/node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/archiver": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, + "license": "MIT", "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -39537,9 +37841,8 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, + "license": "MIT", "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -39555,17 +37858,14 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -39581,6 +37881,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -39588,9 +37889,8 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/glob": { "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -39610,9 +37910,8 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/is-stream": { "version": "2.0.1", - "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" }, @@ -39622,9 +37921,8 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/jackspeak": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -39640,9 +37938,8 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -39655,18 +37952,16 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/netlify-cli/node_modules/archiver-utils/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -39680,8 +37975,6 @@ }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -39696,21 +37989,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/archiver-utils/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/archiver/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -39726,6 +38017,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -39733,18 +38025,16 @@ }, "node_modules/netlify-cli/node_modules/archiver/node_modules/buffer-crc32": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/netlify-cli/node_modules/archiver/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -39758,8 +38048,6 @@ }, "node_modules/netlify-cli/node_modules/archiver/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -39774,28 +38062,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/archiver/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/are-we-there-yet": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -39806,42 +38092,36 @@ }, "node_modules/netlify-cli/node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/netlify-cli/node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/array-timsort": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/arrify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -39851,45 +38131,39 @@ }, "node_modules/netlify-cli/node_modules/ascii-table": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/ascii-table/-/ascii-table-0.0.9.tgz", - "integrity": "sha1-BqZgTWpV1L9BqaR9mHLXp42jHnM=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/ast-module-types": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-5.0.0.tgz", - "integrity": "sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/async": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/async-sema": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/netlify-cli/node_modules/avvio": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.3.0.tgz", - "integrity": "sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/error": "^3.3.0", "archy": "^1.0.0", @@ -39899,15 +38173,13 @@ }, "node_modules/netlify-cli/node_modules/b4a": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/backoff": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", "dev": true, + "license": "MIT", "dependencies": { "precond": "0.2" }, @@ -39917,14 +38189,11 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -39939,19 +38208,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/before-after-hook": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/netlify-cli/node_modules/better-ajv-errors": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-1.2.0.tgz", - "integrity": "sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.16.0", "@humanwhocodes/momoa": "^2.0.2", @@ -39968,9 +38236,8 @@ }, "node_modules/netlify-cli/node_modules/better-ajv-errors/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -39983,9 +38250,8 @@ }, "node_modules/netlify-cli/node_modules/better-ajv-errors/node_modules/chalk": { "version": "4.1.2", - "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" @@ -39999,9 +38265,8 @@ }, "node_modules/netlify-cli/node_modules/better-ajv-errors/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -40011,15 +38276,13 @@ }, "node_modules/netlify-cli/node_modules/better-ajv-errors/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/better-ajv-errors/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -40029,9 +38292,8 @@ }, "node_modules/netlify-cli/node_modules/better-opn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "license": "MIT", "dependencies": { "open": "^8.0.4" }, @@ -40041,27 +38303,24 @@ }, "node_modules/netlify-cli/node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } }, "node_modules/netlify-cli/node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -40070,15 +38329,13 @@ }, "node_modules/netlify-cli/node_modules/blueimp-md5": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -40100,27 +38357,24 @@ }, "node_modules/netlify-cli/node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/netlify-cli/node_modules/body-parser/node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/body-parser/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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -40134,21 +38388,18 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/boxen": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", "dev": true, + "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", @@ -40168,9 +38419,8 @@ }, "node_modules/netlify-cli/node_modules/boxen/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -40180,15 +38430,13 @@ }, "node_modules/netlify-cli/node_modules/boxen/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/boxen/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -40203,9 +38451,8 @@ }, "node_modules/netlify-cli/node_modules/boxen/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -40220,9 +38467,8 @@ }, "node_modules/netlify-cli/node_modules/brace-expansion": { "version": "1.1.11", - "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" @@ -40230,9 +38476,8 @@ }, "node_modules/netlify-cli/node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -40242,8 +38487,6 @@ }, "node_modules/netlify-cli/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -40259,6 +38502,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -40266,30 +38510,26 @@ }, "node_modules/netlify-cli/node_modules/buffer-crc32": { "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/netlify-cli/node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/netlify-cli/node_modules/buffer-from": { "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/netlify-cli/node_modules/builtin-modules": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -40299,45 +38539,40 @@ }, "node_modules/netlify-cli/node_modules/builtins": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/netlify-cli/node_modules/byline": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/netlify-cli/node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -40353,18 +38588,16 @@ }, "node_modules/netlify-cli/node_modules/cachedir": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -40375,8 +38608,6 @@ }, "node_modules/netlify-cli/node_modules/callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true, "engines": { "node": "*" @@ -40384,9 +38615,8 @@ }, "node_modules/netlify-cli/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -40396,9 +38626,8 @@ }, "node_modules/netlify-cli/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" }, @@ -40408,15 +38637,13 @@ }, "node_modules/netlify-cli/node_modules/chardet": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -40438,17 +38665,14 @@ }, "node_modules/netlify-cli/node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/ci-info": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "dev": true, "funding": [ { @@ -40456,24 +38680,23 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/citty": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dev": true, + "license": "MIT", "dependencies": { "consola": "^3.2.3" } }, "node_modules/netlify-cli/node_modules/clean-deep": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/clean-deep/-/clean-deep-3.4.0.tgz", - "integrity": "sha512-Lo78NV5ItJL/jl+B5w0BycAisaieJGXK1qYi/9m4SjR8zbqmrUtO7Yhro40wEShGmmxs/aJLI/A+jNhdkXK8mw==", "dev": true, + "license": "MIT", "dependencies": { "lodash.isempty": "^4.4.0", "lodash.isplainobject": "^4.0.6", @@ -40485,9 +38708,8 @@ }, "node_modules/netlify-cli/node_modules/clean-stack": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -40500,9 +38722,8 @@ }, "node_modules/netlify-cli/node_modules/clean-stack/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -40512,9 +38733,8 @@ }, "node_modules/netlify-cli/node_modules/cli-boxes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -40524,9 +38744,8 @@ }, "node_modules/netlify-cli/node_modules/cli-cursor": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -40536,9 +38755,8 @@ }, "node_modules/netlify-cli/node_modules/cli-progress": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.3" }, @@ -40548,9 +38766,8 @@ }, "node_modules/netlify-cli/node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -40560,9 +38777,8 @@ }, "node_modules/netlify-cli/node_modules/cli-truncate": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" @@ -40576,15 +38792,13 @@ }, "node_modules/netlify-cli/node_modules/cli-truncate/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/cli-truncate/node_modules/string-width": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -40599,15 +38813,13 @@ }, "node_modules/netlify-cli/node_modules/cli-width": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/clipboardy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", @@ -40622,9 +38834,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -40645,9 +38856,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -40657,18 +38867,16 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -40678,9 +38886,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/npm-run-path": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -40693,9 +38900,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -40708,9 +38914,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -40720,9 +38925,8 @@ }, "node_modules/netlify-cli/node_modules/clipboardy/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -40732,18 +38936,16 @@ }, "node_modules/netlify-cli/node_modules/cluster-key-slot": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/color": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -40751,24 +38953,21 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/netlify-cli/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/color-string": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -40776,33 +38975,29 @@ }, "node_modules/netlify-cli/node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, + "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/netlify-cli/node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/colors": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/netlify-cli/node_modules/colors-option": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/colors-option/-/colors-option-3.0.0.tgz", - "integrity": "sha512-DP3FpjsiDDvnQC1OJBsdOJZPuy7r0o6sepY2T5M3L/d2nrE23O/ErFkEqyY3ngVL1ZhTj/H0pCMNObZGkEOaaQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "chalk": "^5.0.0", "filter-obj": "^3.0.0", @@ -40815,9 +39010,8 @@ }, "node_modules/netlify-cli/node_modules/colors-option/node_modules/filter-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-3.0.0.tgz", - "integrity": "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -40827,9 +39021,8 @@ }, "node_modules/netlify-cli/node_modules/colorspace": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dev": true, + "license": "MIT", "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" @@ -40837,18 +39030,16 @@ }, "node_modules/netlify-cli/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/comment-json": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", "dev": true, + "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", @@ -40862,21 +39053,18 @@ }, "node_modules/netlify-cli/node_modules/comment-json/node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/compress-commons": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, + "license": "MIT", "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -40890,8 +39078,6 @@ }, "node_modules/netlify-cli/node_modules/compress-commons/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -40907,6 +39093,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -40914,9 +39101,8 @@ }, "node_modules/netlify-cli/node_modules/compress-commons/node_modules/is-stream": { "version": "2.0.1", - "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" }, @@ -40926,9 +39112,8 @@ }, "node_modules/netlify-cli/node_modules/compress-commons/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -40942,8 +39127,6 @@ }, "node_modules/netlify-cli/node_modules/compress-commons/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -40958,28 +39141,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/compress-commons/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/concordance": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, + "license": "ISC", "dependencies": { "date-time": "^3.1.0", "esutils": "^2.0.3", @@ -40996,9 +39177,8 @@ }, "node_modules/netlify-cli/node_modules/config-chain": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -41006,15 +39186,13 @@ }, "node_modules/netlify-cli/node_modules/config-chain/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/configstore": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", @@ -41031,9 +39209,8 @@ }, "node_modules/netlify-cli/node_modules/configstore/node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -41046,9 +39223,8 @@ }, "node_modules/netlify-cli/node_modules/configstore/node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -41058,24 +39234,21 @@ }, "node_modules/netlify-cli/node_modules/consola": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" } }, "node_modules/netlify-cli/node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -41085,8 +39258,6 @@ }, "node_modules/netlify-cli/node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -41101,49 +39272,44 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/cookie": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/cookie-es": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz", - "integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/cp-file": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-10.0.0.tgz", - "integrity": "sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.10", "nested-error-stacks": "^2.1.1", @@ -41158,9 +39324,8 @@ }, "node_modules/netlify-cli/node_modules/cpy": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", - "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^3.0.0", "cp-file": "^9.1.0", @@ -41180,9 +39345,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/cp-file": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", - "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", @@ -41198,9 +39362,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -41217,9 +39380,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/p-event": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, + "license": "MIT", "dependencies": { "p-timeout": "^3.1.0" }, @@ -41232,9 +39394,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/p-filter": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, + "license": "MIT", "dependencies": { "p-map": "^5.1.0" }, @@ -41247,9 +39408,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/p-map": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, @@ -41262,9 +39422,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/p-timeout": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, + "license": "MIT", "dependencies": { "p-finally": "^1.0.0" }, @@ -41274,9 +39433,8 @@ }, "node_modules/netlify-cli/node_modules/cpy/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -41286,9 +39444,8 @@ }, "node_modules/netlify-cli/node_modules/crc-32": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -41298,9 +39455,8 @@ }, "node_modules/netlify-cli/node_modules/crc32-stream": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, + "license": "MIT", "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -41311,8 +39467,6 @@ }, "node_modules/netlify-cli/node_modules/crc32-stream/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -41328,6 +39482,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -41335,9 +39490,8 @@ }, "node_modules/netlify-cli/node_modules/crc32-stream/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -41351,8 +39505,6 @@ }, "node_modules/netlify-cli/node_modules/crc32-stream/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -41367,28 +39519,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/crc32-stream/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/cron-parser": { "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dev": true, + "license": "MIT", "dependencies": { "luxon": "^3.2.1" }, @@ -41398,9 +39548,8 @@ }, "node_modules/netlify-cli/node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -41412,24 +39561,21 @@ }, "node_modules/netlify-cli/node_modules/cross-spawn/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/crossws": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.1.1.tgz", - "integrity": "sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -41442,9 +39588,8 @@ }, "node_modules/netlify-cli/node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -41454,9 +39599,8 @@ }, "node_modules/netlify-cli/node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -41470,9 +39614,8 @@ }, "node_modules/netlify-cli/node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -41483,9 +39626,8 @@ }, "node_modules/netlify-cli/node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -41495,15 +39637,13 @@ }, "node_modules/netlify-cli/node_modules/cssfilter": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -41514,9 +39654,8 @@ }, "node_modules/netlify-cli/node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -41528,30 +39667,26 @@ }, "node_modules/netlify-cli/node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/netlify-cli/node_modules/cyclist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/data-uri-to-buffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/netlify-cli/node_modules/date-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", "dev": true, + "license": "MIT", "dependencies": { "time-zone": "^1.0.0" }, @@ -41561,9 +39696,8 @@ }, "node_modules/netlify-cli/node_modules/debug": { "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -41578,24 +39712,21 @@ }, "node_modules/netlify-cli/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/decache": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", - "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", "dev": true, + "license": "MIT", "dependencies": { "callsite": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -41608,9 +39739,8 @@ }, "node_modules/netlify-cli/node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -41620,87 +39750,76 @@ }, "node_modules/netlify-cli/node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/netlify-cli/node_modules/deepmerge": { "version": "4.3.1", - "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" } }, "node_modules/netlify-cli/node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/defu": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.10" } }, "node_modules/netlify-cli/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/deprecation": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/destr": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz", - "integrity": "sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -41708,18 +39827,16 @@ }, "node_modules/netlify-cli/node_modules/detect-libc": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/detective-amd": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-5.0.2.tgz", - "integrity": "sha512-XFd/VEQ76HSpym80zxM68ieB77unNuoMwopU2TFT/ErUk5n4KvUTwW4beafAVUugrjV48l4BmmR0rh2MglBaiA==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^5.0.0", "escodegen": "^2.0.0", @@ -41735,9 +39852,8 @@ }, "node_modules/netlify-cli/node_modules/detective-cjs": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-5.0.1.tgz", - "integrity": "sha512-6nTvAZtpomyz/2pmEmGX1sXNjaqgMplhQkskq2MLrar0ZAIkHMrDhLXkRiK2mvbu9wSWr0V5/IfiTrZqAQMrmQ==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^5.0.0", "node-source-walk": "^6.0.0" @@ -41748,9 +39864,8 @@ }, "node_modules/netlify-cli/node_modules/detective-es6": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-4.0.1.tgz", - "integrity": "sha512-k3Z5tB4LQ8UVHkuMrFOlvb3GgFWdJ9NqAa2YLUU/jTaWJIm+JJnEh4PsMc+6dfT223Y8ACKOaC0qcj7diIhBKw==", "dev": true, + "license": "MIT", "dependencies": { "node-source-walk": "^6.0.1" }, @@ -41760,9 +39875,8 @@ }, "node_modules/netlify-cli/node_modules/detective-postcss": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-6.1.3.tgz", - "integrity": "sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==", "dev": true, + "license": "MIT", "dependencies": { "is-url": "^1.2.4", "postcss": "^8.4.23", @@ -41774,9 +39888,8 @@ }, "node_modules/netlify-cli/node_modules/detective-sass": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-5.0.3.tgz", - "integrity": "sha512-YsYT2WuA8YIafp2RVF5CEfGhhyIVdPzlwQgxSjK+TUm3JoHP+Tcorbk3SfG0cNZ7D7+cYWa0ZBcvOaR0O8+LlA==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^6.0.1" @@ -41787,9 +39900,8 @@ }, "node_modules/netlify-cli/node_modules/detective-scss": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-4.0.3.tgz", - "integrity": "sha512-VYI6cHcD0fLokwqqPFFtDQhhSnlFWvU614J42eY6G0s8c+MBhi9QAWycLwIOGxlmD8I/XvGSOUV1kIDhJ70ZPg==", "dev": true, + "license": "MIT", "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^6.0.1" @@ -41800,18 +39912,16 @@ }, "node_modules/netlify-cli/node_modules/detective-stylus": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-4.0.0.tgz", - "integrity": "sha512-TfPotjhszKLgFBzBhTOxNHDsutIxx9GTWjrL5Wh7Qx/ydxKhwUrlSFeLIn+ZaHPF+h0siVBkAQSuy6CADyTxgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/detective-typescript": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-11.2.0.tgz", - "integrity": "sha512-ARFxjzizOhPqs1fYC/2NMC3N4jrQ6HvVflnXBTRqNEqJuXwyKLRr9CrJwkRcV/SnZt1sNXgsF6FPm0x57Tq0rw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "^5.62.0", "ast-module-types": "^5.0.0", @@ -41824,9 +39934,8 @@ }, "node_modules/netlify-cli/node_modules/detective-typescript/node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -41837,9 +39946,8 @@ }, "node_modules/netlify-cli/node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -41864,9 +39972,8 @@ }, "node_modules/netlify-cli/node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -41881,9 +39988,8 @@ }, "node_modules/netlify-cli/node_modules/detective-typescript/node_modules/eslint-visitor-keys": { "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==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -41893,9 +39999,8 @@ }, "node_modules/netlify-cli/node_modules/detective-typescript/node_modules/typescript": { "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -41906,9 +40011,8 @@ }, "node_modules/netlify-cli/node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -41918,9 +40022,8 @@ }, "node_modules/netlify-cli/node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -41932,21 +40035,19 @@ }, "node_modules/netlify-cli/node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/netlify-cli/node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -41959,9 +40060,8 @@ }, "node_modules/netlify-cli/node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -41973,9 +40073,8 @@ }, "node_modules/netlify-cli/node_modules/dot-prop": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", - "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^4.18.2" }, @@ -41988,9 +40087,8 @@ }, "node_modules/netlify-cli/node_modules/dot-prop/node_modules/type-fest": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -42000,9 +40098,8 @@ }, "node_modules/netlify-cli/node_modules/dotenv": { "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -42012,60 +40109,52 @@ }, "node_modules/netlify-cli/node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/netlify-cli/node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/enabled": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/end-of-stream": { "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==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/netlify-cli/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -42075,9 +40164,8 @@ }, "node_modules/netlify-cli/node_modules/env-paths": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -42087,9 +40175,8 @@ }, "node_modules/netlify-cli/node_modules/envinfo": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -42099,9 +40186,8 @@ }, "node_modules/netlify-cli/node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -42111,40 +40197,35 @@ }, "node_modules/netlify-cli/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" } }, "node_modules/netlify-cli/node_modules/error-stack-parser": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/netlify-cli/node_modules/es-module-lexer": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/es6-promisify": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/esbuild": { "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -42179,18 +40260,16 @@ }, "node_modules/netlify-cli/node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/escape-goat": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -42200,15 +40279,13 @@ }, "node_modules/netlify-cli/node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -42227,9 +40304,8 @@ }, "node_modules/netlify-cli/node_modules/esprima": { "version": "4.0.1", - "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" @@ -42240,66 +40316,58 @@ }, "node_modules/netlify-cli/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/netlify-cli/node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/event-target-shim": { "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/netlify-cli/node_modules/execa": { "version": "5.1.1", - "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", @@ -42320,9 +40388,8 @@ }, "node_modules/netlify-cli/node_modules/execa/node_modules/is-stream": { "version": "2.0.1", - "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" }, @@ -42332,18 +40399,16 @@ }, "node_modules/netlify-cli/node_modules/expand-template": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/express": { "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -42383,9 +40448,8 @@ }, "node_modules/netlify-cli/node_modules/express-logging": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/express-logging/-/express-logging-1.1.1.tgz", - "integrity": "sha512-1KboYwxxCG5kwkJHR5LjFDTD1Mgl8n4PIMcCuhhd/1OqaxlC68P3QKbvvAbZVUtVgtlxEdTgSUwf6yxwzRCuuA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "on-headers": "^1.0.0" }, @@ -42395,27 +40459,24 @@ }, "node_modules/netlify-cli/node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/netlify-cli/node_modules/express/node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/express/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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -42429,14 +40490,11 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -42451,13 +40509,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/ext-list": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "^1.28.0" }, @@ -42467,9 +40525,8 @@ }, "node_modules/netlify-cli/node_modules/ext-name": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", "dev": true, + "license": "MIT", "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" @@ -42480,9 +40537,8 @@ }, "node_modules/netlify-cli/node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -42494,9 +40550,8 @@ }, "node_modules/netlify-cli/node_modules/extract-zip": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -42514,9 +40569,8 @@ }, "node_modules/netlify-cli/node_modules/extract-zip/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -42529,45 +40583,38 @@ }, "node_modules/netlify-cli/node_modules/fast-content-type-parse": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", - "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fast-decode-uri-component": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fast-diff": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/netlify-cli/node_modules/fast-equals": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-3.0.3.tgz", - "integrity": "sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fast-fifo": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", - "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -42581,16 +40628,14 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/netlify-cli/node_modules/fast-json-stringify": { "version": "5.15.1", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.15.1.tgz", - "integrity": "sha512-JopGtkvvguRqrS4gHXSSA2jf4pDgOZkeBAkLO1LbzOpiOMo7/kugoR+KiWifpLpluaVeYDkAuxCJOj4Gyc6L9A==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", @@ -42603,9 +40648,8 @@ }, "node_modules/netlify-cli/node_modules/fast-json-stringify/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -42619,9 +40663,8 @@ }, "node_modules/netlify-cli/node_modules/fast-json-stringify/node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -42636,53 +40679,45 @@ }, "node_modules/netlify-cli/node_modules/fast-json-stringify/node_modules/json-schema-traverse": { "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/netlify-cli/node_modules/fast-querystring": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", - "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", "dev": true, + "license": "MIT", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/netlify-cli/node_modules/fast-redact": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fast-uri": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", - "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/netlify-cli/node_modules/fastify": { "version": "4.27.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.27.0.tgz", - "integrity": "sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA==", "dev": true, "funding": [ { @@ -42694,6 +40729,7 @@ "url": "https://opencollective.com/fastify" } ], + "license": "MIT", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", "@fastify/error": "^3.4.0", @@ -42715,14 +40751,11 @@ }, "node_modules/netlify-cli/node_modules/fastify-plugin": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.4.0.tgz", - "integrity": "sha512-ovwFQG2qNy3jcCROiWpr94Hs0le+c7N/3t7m9aVwbFhkxcR/esp2xu25dP8e617HpQdmeDv+gFX4zagdUhDByw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fastify/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -42738,6 +40771,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -42745,9 +40779,8 @@ }, "node_modules/netlify-cli/node_modules/fastify/node_modules/pino": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.1.0.tgz", - "integrity": "sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -42767,9 +40800,8 @@ }, "node_modules/netlify-cli/node_modules/fastify/node_modules/pino-abstract-transport": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -42777,21 +40809,18 @@ }, "node_modules/netlify-cli/node_modules/fastify/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fastify/node_modules/process-warning": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fastify/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -42805,8 +40834,6 @@ }, "node_modules/netlify-cli/node_modules/fastify/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -42821,67 +40848,61 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fastify/node_modules/sonic-boom": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/fastify/node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10.x" } }, "node_modules/netlify-cli/node_modules/fastify/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/fastify/node_modules/thread-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.0.tgz", - "integrity": "sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg==", "dev": true, + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } }, "node_modules/netlify-cli/node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/netlify-cli/node_modules/fd-slicer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, "node_modules/netlify-cli/node_modules/fdir": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.0.1.tgz", - "integrity": "sha512-bdrUUb0eYQrPRlaAtlSRoLs7sp6yKEwbMQuUgwvi/14TnaqhM/deSZUrC5ic+yjm5nEPPWE61oWpTTxQFQMmLA==", "dev": true, + "license": "MIT", "peerDependencies": { "picomatch": "2.x" }, @@ -42893,14 +40914,11 @@ }, "node_modules/netlify-cli/node_modules/fecha": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fetch-blob": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.4.tgz", - "integrity": "sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==", "dev": true, "funding": [ { @@ -42912,6 +40930,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -42922,9 +40941,8 @@ }, "node_modules/netlify-cli/node_modules/fetch-node-website": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fetch-node-website/-/fetch-node-website-7.3.0.tgz", - "integrity": "sha512-/wayUHbdVUWrD72aqRNNrr6+MHnCkumZgNugN0RfiWJpbNJUdAkMk4Z18MGayGZVVqYXR1RWrV+bIFEt5HuBZg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "cli-progress": "^3.11.2", "colors-option": "^4.4.0", @@ -42938,9 +40956,8 @@ }, "node_modules/netlify-cli/node_modules/fetch-node-website/node_modules/colors-option": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/colors-option/-/colors-option-4.5.0.tgz", - "integrity": "sha512-Soe5lerRg3erMRgYC0EC696/8dMCGpBzcQchFfi55Yrkja8F+P7cUt0LVTIg7u5ob5BexLZ/F1kO+ejmv+nq8w==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.0.1", "is-plain-obj": "^4.1.0" @@ -42951,9 +40968,8 @@ }, "node_modules/netlify-cli/node_modules/fetch-node-website/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -42963,9 +40979,8 @@ }, "node_modules/netlify-cli/node_modules/fetch-node-website/node_modules/figures": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -42979,9 +40994,8 @@ }, "node_modules/netlify-cli/node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -42994,18 +41008,16 @@ }, "node_modules/netlify-cli/node_modules/figures/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, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/netlify-cli/node_modules/file-type": { "version": "18.5.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz", - "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -43020,15 +41032,13 @@ }, "node_modules/netlify-cli/node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -43038,9 +41048,8 @@ }, "node_modules/netlify-cli/node_modules/filter-obj": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -43050,9 +41059,8 @@ }, "node_modules/netlify-cli/node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -43068,24 +41076,21 @@ }, "node_modules/netlify-cli/node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/find-my-way": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", - "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", @@ -43097,9 +41102,8 @@ }, "node_modules/netlify-cli/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", @@ -43114,9 +41118,8 @@ }, "node_modules/netlify-cli/node_modules/find-up-simple": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -43126,18 +41129,16 @@ }, "node_modules/netlify-cli/node_modules/find-up/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/flush-write-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-2.0.0.tgz", - "integrity": "sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "readable-stream": "^3.1.1" @@ -43145,23 +41146,19 @@ }, "node_modules/netlify-cli/node_modules/fn.name": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/folder-walker": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/folder-walker/-/folder-walker-3.2.0.tgz", - "integrity": "sha512-VjAQdSLsl6AkpZNyrQJfO7BXLo4chnStqb055bumZMbRUPpVuPN3a4ktsnRCmrFZjtMlYLkyXiR5rAs4WOpC4Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "from2": "^2.1.0" } }, "node_modules/netlify-cli/node_modules/follow-redirects": { "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -43169,6 +41166,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -43180,9 +41178,8 @@ }, "node_modules/netlify-cli/node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -43196,9 +41193,8 @@ }, "node_modules/netlify-cli/node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -43208,18 +41204,16 @@ }, "node_modules/netlify-cli/node_modules/form-data-encoder": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.3.tgz", - "integrity": "sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.17" } }, "node_modules/netlify-cli/node_modules/formdata-polyfill": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -43229,27 +41223,24 @@ }, "node_modules/netlify-cli/node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -43257,18 +41248,16 @@ }, "node_modules/netlify-cli/node_modules/from2-array": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/from2-array/-/from2-array-0.0.4.tgz", - "integrity": "sha512-0G0cAp7sYLobH7ALsr835x98PU/YeVF7wlwxdWbCUaea7wsa7lJfKZUAo6p2YZGZ8F94luCuqHZS3JtFER6uPg==", "dev": true, + "license": "MIT", "dependencies": { "from2": "^2.0.3" } }, "node_modules/netlify-cli/node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -43281,15 +41270,13 @@ }, "node_modules/netlify-cli/node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -43299,9 +41286,8 @@ }, "node_modules/netlify-cli/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -43311,16 +41297,13 @@ }, "node_modules/netlify-cli/node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/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" @@ -43331,17 +41314,14 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/netlify-cli/node_modules/fuzzy": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", "dev": true, "engines": { "node": ">= 0.6.0" @@ -43349,9 +41329,8 @@ }, "node_modules/netlify-cli/node_modules/gauge": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dev": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -43369,9 +41348,8 @@ }, "node_modules/netlify-cli/node_modules/gauge/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -43381,9 +41359,8 @@ }, "node_modules/netlify-cli/node_modules/get-amd-module-type": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-5.0.1.tgz", - "integrity": "sha512-jb65zDeHyDjFR1loOVk0HQGM5WNwoGB8aLWy3LKCieMKol0/ProHkhO2X1JxojuN10vbz1qNn09MJ7tNp7qMzw==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^5.0.0", "node-source-walk": "^6.0.1" @@ -43394,18 +41371,16 @@ }, "node_modules/netlify-cli/node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/netlify-cli/node_modules/get-east-asian-width": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -43415,9 +41390,8 @@ }, "node_modules/netlify-cli/node_modules/get-intrinsic": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -43429,18 +41403,16 @@ }, "node_modules/netlify-cli/node_modules/get-package-name": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/get-package-name/-/get-package-name-2.2.0.tgz", - "integrity": "sha512-LmCKVxioe63Fy6KDAQ/mmCSOSSRUE/x4zdrMD+7dU8quF3bGpzvP8mOmq4Dgce3nzU9AgkVDotucNOOg7c27BQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.0.0" } }, "node_modules/netlify-cli/node_modules/get-port": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -43450,15 +41422,13 @@ }, "node_modules/netlify-cli/node_modules/get-port-please": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/get-stream": { "version": "6.0.1", - "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" }, @@ -43468,9 +41438,8 @@ }, "node_modules/netlify-cli/node_modules/gh-release-fetch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gh-release-fetch/-/gh-release-fetch-4.0.3.tgz", - "integrity": "sha512-TOiP1nwLsH5shG85Yt6v6Kjq5JU/44jXyEpbcfPgmj3C829yeXIlx9nAEwQRaxtRF3SJinn2lz7XUkfG9W/U4g==", "dev": true, + "license": "MIT", "dependencies": { "@xhmikosr/downloader": "^13.0.0", "node-fetch": "^3.3.1", @@ -43482,39 +41451,34 @@ }, "node_modules/netlify-cli/node_modules/git-repo-info": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-2.1.1.tgz", - "integrity": "sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0" } }, "node_modules/netlify-cli/node_modules/gitconfiglocal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-2.1.0.tgz", - "integrity": "sha512-qoerOEliJn3z+Zyn1HW2F6eoYJqKwS6MgC9cztTLUB/xLWX8gD/6T60pKn4+t/d6tP7JlybI7Z3z+I572CR/Vg==", "dev": true, + "license": "BSD", "dependencies": { "ini": "^1.3.2" } }, "node_modules/netlify-cli/node_modules/gitconfiglocal/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/github-from-package": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -43532,9 +41496,8 @@ }, "node_modules/netlify-cli/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -43544,9 +41507,8 @@ }, "node_modules/netlify-cli/node_modules/global-cache-dir": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global-cache-dir/-/global-cache-dir-4.4.0.tgz", - "integrity": "sha512-bk0gI6IbbphRjAaCJJn5H+T/CcEck5B3a5KBO2BXSDzjFSV+API17w8GA7YPJ6IXJiasW8M0VsEIig1PCHdfOQ==", "dev": true, + "license": "MIT", "dependencies": { "cachedir": "^2.3.0", "path-exists": "^5.0.0" @@ -43557,18 +41519,16 @@ }, "node_modules/netlify-cli/node_modules/global-cache-dir/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -43586,9 +41546,8 @@ }, "node_modules/netlify-cli/node_modules/gonzales-pe": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5" }, @@ -43601,9 +41560,8 @@ }, "node_modules/netlify-cli/node_modules/got": { "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -43626,15 +41584,13 @@ }, "node_modules/netlify-cli/node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/h3": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.10.1.tgz", - "integrity": "sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==", "dev": true, + "license": "MIT", "dependencies": { "cookie-es": "^1.0.0", "defu": "^6.1.4", @@ -43649,9 +41605,8 @@ }, "node_modules/netlify-cli/node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -43661,27 +41616,24 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/has-own-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -43691,15 +41643,13 @@ }, "node_modules/netlify-cli/node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/hasbin": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", - "integrity": "sha512-CCd8e/w2w28G8DyZvKgiHnQJ/5XXDz6qiUHnthvtag/6T5acUeN5lqq+HMoBqcmgWueWDhiCplrw0Kb1zDACRg==", "dev": true, + "license": "MIT", "dependencies": { "async": "~1.5" }, @@ -43709,15 +41659,13 @@ }, "node_modules/netlify-cli/node_modules/hasbin/node_modules/async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/hasha": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -43731,9 +41679,8 @@ }, "node_modules/netlify-cli/node_modules/hasha/node_modules/is-stream": { "version": "2.0.1", - "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" }, @@ -43743,18 +41690,16 @@ }, "node_modules/netlify-cli/node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -43764,9 +41709,8 @@ }, "node_modules/netlify-cli/node_modules/hot-shots": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-10.0.0.tgz", - "integrity": "sha512-uy/uGpuJk7yuyiKRfZMBNkF1GAOX5O2ifO9rDCaX9jw8fu6eW9QeWC7WRPDI+O98frW1HQgV3+xwjWsZPECIzQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -43776,15 +41720,13 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/netlify-cli/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -43798,18 +41740,16 @@ }, "node_modules/netlify-cli/node_modules/http-errors/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -43821,9 +41761,8 @@ }, "node_modules/netlify-cli/node_modules/http-proxy-middleware": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -43845,9 +41784,8 @@ }, "node_modules/netlify-cli/node_modules/http-proxy-middleware/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -43857,9 +41795,8 @@ }, "node_modules/netlify-cli/node_modules/http-shutdown": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", - "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -43867,9 +41804,8 @@ }, "node_modules/netlify-cli/node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -43880,9 +41816,8 @@ }, "node_modules/netlify-cli/node_modules/https-proxy-agent": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -43893,9 +41828,8 @@ }, "node_modules/netlify-cli/node_modules/https-proxy-agent/node_modules/agent-base": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -43905,18 +41839,16 @@ }, "node_modules/netlify-cli/node_modules/human-signals": { "version": "2.1.0", - "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" } }, "node_modules/netlify-cli/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -43926,8 +41858,6 @@ }, "node_modules/netlify-cli/node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -43942,46 +41872,42 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/netlify-cli/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/netlify-cli/node_modules/image-meta": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.0.tgz", - "integrity": "sha512-ZBGjl0ZMEMeOC3Ns0wUF/5UdUmr3qQhBSCniT0LxOgGGIRHiNFOkMtIHB7EOznRU47V2AxPgiVP+s+0/UCU0Hg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/netlify-cli/node_modules/index-to-position": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -43991,9 +41917,8 @@ }, "node_modules/netlify-cli/node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -44001,15 +41926,13 @@ }, "node_modules/netlify-cli/node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/inquirer": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -44031,9 +41954,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", - "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", "dev": true, + "license": "ISC", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -44050,9 +41972,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/node_modules/ansi-escapes": { "version": "4.3.2", - "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" }, @@ -44065,9 +41986,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -44080,9 +42000,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/node_modules/chalk": { "version": "4.1.2", - "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" @@ -44096,9 +42015,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -44108,15 +42026,13 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -44126,9 +42042,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer-autocomplete-prompt/node_modules/type-fest": { "version": "0.21.3", - "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" }, @@ -44138,27 +42053,24 @@ }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/ansi-escapes": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/inquirer/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, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -44168,9 +42080,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer/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, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -44182,18 +42093,16 @@ }, "node_modules/netlify-cli/node_modules/inquirer/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, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/figures": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -44203,27 +42112,24 @@ }, "node_modules/netlify-cli/node_modules/inquirer/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, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -44234,18 +42140,16 @@ }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -44255,9 +42159,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -44267,9 +42170,8 @@ }, "node_modules/netlify-cli/node_modules/inquirer/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, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -44279,18 +42181,16 @@ }, "node_modules/netlify-cli/node_modules/inspect-with-kind": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inspect-with-kind/-/inspect-with-kind-1.0.5.tgz", - "integrity": "sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==", "dev": true, + "license": "ISC", "dependencies": { "kind-of": "^6.0.2" } }, "node_modules/netlify-cli/node_modules/ioredis": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", - "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", "dev": true, + "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -44312,18 +42212,16 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/netlify-cli/node_modules/ipx": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.1.0.tgz", - "integrity": "sha512-AVnPGXJ8L41vjd11Z4akIF2yd14636Klxul3tBySxHA6PKfCOQPxBDkCFK5zcWh0z/keR6toh1eg8qzdBVUgdA==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/accept-negotiator": "^1.1.0", "citty": "^0.1.5", @@ -44348,9 +42246,8 @@ }, "node_modules/netlify-cli/node_modules/ipx/node_modules/@netlify/blobs": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.5.0.tgz", - "integrity": "sha512-wRFlNnL/Qv3WNLZd3OT/YYqF1zb6iPSo8T31sl9ccL1ahBxW1fBqKgF4b1XL7Z+6mRIkatvcsVPkWBcO+oJMNA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "engines": { @@ -44359,18 +42256,16 @@ }, "node_modules/netlify-cli/node_modules/ipx/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/netlify-cli/node_modules/ipx/node_modules/unstorage": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz", - "integrity": "sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "^3.1.3", "chokidar": "^3.5.3", @@ -44439,24 +42334,21 @@ }, "node_modules/netlify-cli/node_modules/iron-webcrypto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz", - "integrity": "sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/brc-dd" } }, "node_modules/netlify-cli/node_modules/is-arrayish": { "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/netlify-cli/node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -44466,9 +42358,8 @@ }, "node_modules/netlify-cli/node_modules/is-builtin-module": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", - "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.0.0" }, @@ -44478,9 +42369,8 @@ }, "node_modules/netlify-cli/node_modules/is-core-module": { "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -44490,9 +42380,8 @@ }, "node_modules/netlify-cli/node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -44505,18 +42394,16 @@ }, "node_modules/netlify-cli/node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -44526,9 +42413,8 @@ }, "node_modules/netlify-cli/node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -44538,9 +42424,8 @@ }, "node_modules/netlify-cli/node_modules/is-in-ci": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", - "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", "dev": true, + "license": "MIT", "bin": { "is-in-ci": "cli.js" }, @@ -44553,9 +42438,8 @@ }, "node_modules/netlify-cli/node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -44571,9 +42455,8 @@ }, "node_modules/netlify-cli/node_modules/is-installed-globally": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, + "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" @@ -44587,9 +42470,8 @@ }, "node_modules/netlify-cli/node_modules/is-installed-globally/node_modules/global-dirs": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, + "license": "MIT", "dependencies": { "ini": "2.0.0" }, @@ -44602,18 +42484,16 @@ }, "node_modules/netlify-cli/node_modules/is-installed-globally/node_modules/ini": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/is-interactive": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -44623,9 +42503,8 @@ }, "node_modules/netlify-cli/node_modules/is-npm": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -44635,36 +42514,32 @@ }, "node_modules/netlify-cli/node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/netlify-cli/node_modules/is-obj": { "version": "2.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/is-path-inside": { "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -44674,9 +42549,8 @@ }, "node_modules/netlify-cli/node_modules/is-stream": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -44686,15 +42560,13 @@ }, "node_modules/netlify-cli/node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/is-unicode-supported": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -44704,15 +42576,13 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/is-url-superb": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -44722,9 +42592,8 @@ }, "node_modules/netlify-cli/node_modules/is-wsl": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -44737,9 +42606,8 @@ }, "node_modules/netlify-cli/node_modules/is64bit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", "dev": true, + "license": "MIT", "dependencies": { "system-architecture": "^0.1.0" }, @@ -44752,30 +42620,26 @@ }, "node_modules/netlify-cli/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/iserror": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/netlify-cli/node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -44791,18 +42655,16 @@ }, "node_modules/netlify-cli/node_modules/jest-get-type": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, + "license": "MIT", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/netlify-cli/node_modules/jest-validate": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -44817,9 +42679,8 @@ }, "node_modules/netlify-cli/node_modules/jest-validate/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -44832,9 +42693,8 @@ }, "node_modules/netlify-cli/node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", - "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" @@ -44848,9 +42708,8 @@ }, "node_modules/netlify-cli/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -44860,15 +42719,13 @@ }, "node_modules/netlify-cli/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -44878,33 +42735,29 @@ }, "node_modules/netlify-cli/node_modules/jiti": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/netlify-cli/node_modules/js-string-escape": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/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/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -44914,52 +42767,45 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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/netlify-cli/node_modules/json-schema-ref-resolver": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", - "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" } }, "node_modules/netlify-cli/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/netlify-cli/node_modules/jsonc-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/jsonpointer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/jsonwebtoken": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, + "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -44979,9 +42825,8 @@ }, "node_modules/netlify-cli/node_modules/junk": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", - "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -44991,9 +42836,8 @@ }, "node_modules/netlify-cli/node_modules/jwa": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -45002,9 +42846,8 @@ }, "node_modules/netlify-cli/node_modules/jws": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dev": true, + "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -45012,18 +42855,16 @@ }, "node_modules/netlify-cli/node_modules/jwt-decode": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/netlify-cli/node_modules/keep-func-props": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keep-func-props/-/keep-func-props-4.0.1.tgz", - "integrity": "sha512-87ftOIICfdww3SxR5P1veq3ThBNyRPG0JGL//oaR08v0k2yTicEIHd7s0GqSJfQvlb+ybC3GiDepOweo0LDhvw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -45033,33 +42874,29 @@ }, "node_modules/netlify-cli/node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/netlify-cli/node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/kuler": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lambda-local": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lambda-local/-/lambda-local-2.2.0.tgz", - "integrity": "sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^10.0.1", "dotenv": "^16.3.1", @@ -45074,9 +42911,8 @@ }, "node_modules/netlify-cli/node_modules/latest-version": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dev": true, + "license": "MIT", "dependencies": { "package-json": "^8.1.0" }, @@ -45089,9 +42925,8 @@ }, "node_modules/netlify-cli/node_modules/lazystream": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^2.0.5" }, @@ -45101,9 +42936,8 @@ }, "node_modules/netlify-cli/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -45116,18 +42950,16 @@ }, "node_modules/netlify-cli/node_modules/leven": { "version": "3.1.0", - "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" } }, "node_modules/netlify-cli/node_modules/light-my-request": { "version": "5.13.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.13.0.tgz", - "integrity": "sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "cookie": "^0.6.0", "process-warning": "^3.0.0", @@ -45136,21 +42968,18 @@ }, "node_modules/netlify-cli/node_modules/light-my-request/node_modules/process-warning": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lines-and-columns": { "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/netlify-cli/node_modules/listhen": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.6.0.tgz", - "integrity": "sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==", "dev": true, + "license": "MIT", "dependencies": { "@parcel/watcher": "^2.4.0", "@parcel/watcher-wasm": "2.4.0", @@ -45178,9 +43007,8 @@ }, "node_modules/netlify-cli/node_modules/listr2": { "version": "8.2.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", - "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", @@ -45195,21 +43023,18 @@ }, "node_modules/netlify-cli/node_modules/listr2/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/listr2/node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/listr2/node_modules/string-width": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -45224,9 +43049,8 @@ }, "node_modules/netlify-cli/node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -45241,9 +43065,8 @@ }, "node_modules/netlify-cli/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" }, @@ -45256,9 +43079,8 @@ }, "node_modules/netlify-cli/node_modules/locate-path/node_modules/p-limit": { "version": "4.0.0", - "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" }, @@ -45271,9 +43093,8 @@ }, "node_modules/netlify-cli/node_modules/locate-path/node_modules/p-locate": { "version": "6.0.0", - "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" }, @@ -45286,9 +43107,8 @@ }, "node_modules/netlify-cli/node_modules/locate-path/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -45298,93 +43118,78 @@ }, "node_modules/netlify-cli/node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.deburr": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.defaults": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isempty": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/lodash.transform": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/log-process-errors": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/log-process-errors/-/log-process-errors-8.0.0.tgz", - "integrity": "sha512-+SNGqNC1gCMJfhwYzAHr/YgNT/ZJc+V2nCkvtPnjrENMeCe+B/jgShBW0lmWoh6uVV2edFAPc/IUOkDdsjTbTg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "colors-option": "^3.0.0", "figures": "^4.0.0", @@ -45400,9 +43205,8 @@ }, "node_modules/netlify-cli/node_modules/log-process-errors/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -45412,9 +43216,8 @@ }, "node_modules/netlify-cli/node_modules/log-process-errors/node_modules/figures": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", - "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0", "is-unicode-supported": "^1.2.0" @@ -45428,9 +43231,8 @@ }, "node_modules/netlify-cli/node_modules/log-process-errors/node_modules/filter-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-3.0.0.tgz", - "integrity": "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -45440,9 +43242,8 @@ }, "node_modules/netlify-cli/node_modules/log-process-errors/node_modules/map-obj": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", - "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -45452,9 +43253,8 @@ }, "node_modules/netlify-cli/node_modules/log-symbols": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" @@ -45468,9 +43268,8 @@ }, "node_modules/netlify-cli/node_modules/log-update": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^6.2.0", "cli-cursor": "^4.0.0", @@ -45487,9 +43286,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/ansi-escapes": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -45499,9 +43297,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -45514,15 +43311,13 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, + "license": "MIT", "dependencies": { "get-east-asian-width": "^1.0.0" }, @@ -45535,9 +43330,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/restore-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -45551,9 +43345,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -45567,9 +43360,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/string-width": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -45584,9 +43376,8 @@ }, "node_modules/netlify-cli/node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -45601,9 +43392,8 @@ }, "node_modules/netlify-cli/node_modules/logform": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", - "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", "dev": true, + "license": "MIT", "dependencies": { "@colors/colors": "1.5.0", "fecha": "^4.2.0", @@ -45614,9 +43404,8 @@ }, "node_modules/netlify-cli/node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -45626,9 +43415,8 @@ }, "node_modules/netlify-cli/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -45638,18 +43426,16 @@ }, "node_modules/netlify-cli/node_modules/luxon": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", - "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/netlify-cli/node_modules/macos-release": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.0.1.tgz", - "integrity": "sha512-3l6OrhdDg2H2SigtuN3jBh+5dRJRWxNKuJTPBbGeNJTsmt/pj9PO25wYaNb05NuNmAsl435j4rDP6rgNXz7s7g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -45659,9 +43445,8 @@ }, "node_modules/netlify-cli/node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -45674,30 +43459,26 @@ }, "node_modules/netlify-cli/node_modules/make-dir/node_modules/semver": { "version": "6.3.1", - "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/netlify-cli/node_modules/make-error": { "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/netlify-cli/node_modules/maxstache": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/maxstache/-/maxstache-1.0.7.tgz", - "integrity": "sha512-53ZBxHrZM+W//5AcRVewiLpDunHnucfdzZUGz54Fnvo4tE+J3p8EL66kBrs2UhBXvYKTWckWYYWBqJqoTcenqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/maxstache-stream": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/maxstache-stream/-/maxstache-stream-1.0.4.tgz", - "integrity": "sha512-v8qlfPN0pSp7bdSoLo1NTjG43GXGqk5W2NWFnOCq2GlmFFqebGzPCjLKSbShuqIOVorOtZSAy7O/S1OCCRONUw==", "dev": true, + "license": "MIT", "dependencies": { "maxstache": "^1.0.0", "pump": "^1.0.0", @@ -45707,9 +43488,8 @@ }, "node_modules/netlify-cli/node_modules/maxstache-stream/node_modules/pump": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -45717,9 +43497,8 @@ }, "node_modules/netlify-cli/node_modules/maxstache-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -45732,18 +43511,16 @@ }, "node_modules/netlify-cli/node_modules/maxstache-stream/node_modules/split2": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz", - "integrity": "sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==", "dev": true, + "license": "ISC", "dependencies": { "through2": "~2.0.0" } }, "node_modules/netlify-cli/node_modules/maxstache-stream/node_modules/through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -45751,9 +43528,8 @@ }, "node_modules/netlify-cli/node_modules/md5-hex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", "dev": true, + "license": "MIT", "dependencies": { "blueimp-md5": "^2.10.0" }, @@ -45763,36 +43539,31 @@ }, "node_modules/netlify-cli/node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/netlify-cli/node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/memoize-one": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/merge-options": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-obj": "^2.1.0" }, @@ -45802,54 +43573,47 @@ }, "node_modules/netlify-cli/node_modules/merge-options/node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/merge-stream": { "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/netlify-cli/node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/netlify-cli/node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/micro-api-client": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/micro-api-client/-/micro-api-client-3.3.0.tgz", - "integrity": "sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/micro-memoize": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/micro-memoize/-/micro-memoize-4.0.11.tgz", - "integrity": "sha512-CjxsaYe4j43df32DtzzNCwanPqZjZDwuQAZilsCYpa2ZVtSPDjHXbTlR4gsEZRyO9/twHs0b7HLjvy/sowl7sA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -45860,9 +43624,8 @@ }, "node_modules/netlify-cli/node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -45872,18 +43635,16 @@ }, "node_modules/netlify-cli/node_modules/mime-db": { "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/mime-types": { "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.51.0" }, @@ -45893,9 +43654,8 @@ }, "node_modules/netlify-cli/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -45905,9 +43665,8 @@ }, "node_modules/netlify-cli/node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -45917,9 +43676,8 @@ }, "node_modules/netlify-cli/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" }, @@ -45929,27 +43687,24 @@ }, "node_modules/netlify-cli/node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/netlify-cli/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -45960,9 +43715,8 @@ }, "node_modules/netlify-cli/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -45972,9 +43726,8 @@ }, "node_modules/netlify-cli/node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -45984,15 +43737,13 @@ }, "node_modules/netlify-cli/node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/mlly": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", @@ -46002,9 +43753,8 @@ }, "node_modules/netlify-cli/node_modules/module-definition": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-5.0.1.tgz", - "integrity": "sha512-kvw3B4G19IXk+BOXnYq/D/VeO9qfHaapMeuS7w7sNUqmGaA6hywdFHMi+VWeR9wUScXM7XjoryTffCZ5B0/8IA==", "dev": true, + "license": "MIT", "dependencies": { "ast-module-types": "^5.0.0", "node-source-walk": "^6.0.1" @@ -46018,9 +43768,8 @@ }, "node_modules/netlify-cli/node_modules/moize": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/moize/-/moize-6.1.3.tgz", - "integrity": "sha512-Cn+1T5Ypieeo46fn8X98V2gHj2VSRohVPjvT8BRvNANJJC3UOeege/G84xA/3S9c5qA4p9jOdSB1jfhumwe8qw==", "dev": true, + "license": "MIT", "dependencies": { "fast-equals": "^3.0.1", "micro-memoize": "^4.0.11" @@ -46028,9 +43777,8 @@ }, "node_modules/netlify-cli/node_modules/move-file": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-3.0.0.tgz", - "integrity": "sha512-v6u4XjX3MFW6Jo1V/YfbhC7eiGSgvYPJ/NM+aGtTtB9/Y6IYj7YViaHu6dkgDsZFB7MbnAoSI5+Z26XZXnP0vg==", "dev": true, + "license": "MIT", "dependencies": { "path-exists": "^5.0.0" }, @@ -46043,33 +43791,29 @@ }, "node_modules/netlify-cli/node_modules/move-file/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/multiparty": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", - "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", "dev": true, + "license": "MIT", "dependencies": { "http-errors": "~1.8.1", "safe-buffer": "5.2.1", @@ -46081,8 +43825,6 @@ }, "node_modules/netlify-cli/node_modules/multiparty/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -46097,25 +43839,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/mute-stream": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/nan": { "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/netlify-cli/node_modules/nanoid": { "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -46123,6 +43862,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -46132,30 +43872,26 @@ }, "node_modules/netlify-cli/node_modules/napi-build-utils": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/nested-error-stacks": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/netlify": { "version": "13.1.20", - "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.1.20.tgz", - "integrity": "sha512-pfYUCfaywrzkMzN8If4IVM58DqsAYq2JroAFziuYK7m0LKYPzlbuSNYWhlfQL/zoBmRm8kxzRxEiK6fj1tvOOw==", "dev": true, + "license": "MIT", "dependencies": { "@netlify/open-api": "^2.33.1", "lodash-es": "^4.17.21", @@ -46171,9 +43907,8 @@ }, "node_modules/netlify-cli/node_modules/netlify-headers-parser": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/netlify-headers-parser/-/netlify-headers-parser-7.1.4.tgz", - "integrity": "sha512-fTVQf8u65vS4YTP2Qt1K6Np01q3yecRKXf6VMONMlWbfl5n3M/on7pZlZISNAXHNOtnVt+6Kpwfl+RIeALC8Kg==", "dev": true, + "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", "escape-string-regexp": "^5.0.0", @@ -46188,9 +43923,8 @@ }, "node_modules/netlify-cli/node_modules/netlify-headers-parser/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -46200,9 +43934,8 @@ }, "node_modules/netlify-cli/node_modules/netlify-headers-parser/node_modules/map-obj": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", - "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -46212,18 +43945,16 @@ }, "node_modules/netlify-cli/node_modules/netlify-headers-parser/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/netlify-redirect-parser": { "version": "14.3.0", - "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-14.3.0.tgz", - "integrity": "sha512-/Oqq+SrTXk8hZqjCBy0AkWf5qAhsgcsdxQA09uYFdSSNG5w9rhh17a7dp77o5Q5XoHCahm8u4Kig/lbXkl4j2g==", "dev": true, + "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", "fast-safe-stringify": "^2.1.1", @@ -46237,24 +43968,21 @@ }, "node_modules/netlify-cli/node_modules/netlify-redirect-parser/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/netlify-redirector": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/netlify-redirector/-/netlify-redirector-0.5.0.tgz", - "integrity": "sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/netlify/node_modules/p-timeout": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -46264,9 +43992,8 @@ }, "node_modules/netlify-cli/node_modules/netlify/node_modules/p-wait-for": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", "dev": true, + "license": "MIT", "dependencies": { "p-timeout": "^5.0.0" }, @@ -46279,9 +44006,8 @@ }, "node_modules/netlify-cli/node_modules/node-abi": { "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -46291,17 +44017,14 @@ }, "node_modules/netlify-cli/node_modules/node-addon-api": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", "dev": true, + "license": "MIT", "engines": { "node": "^16 || ^18 || >= 20" } }, "node_modules/netlify-cli/node_modules/node-domexception": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "dev": true, "funding": [ { @@ -46313,15 +44036,15 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } }, "node_modules/netlify-cli/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -46337,24 +44060,21 @@ }, "node_modules/netlify-cli/node_modules/node-fetch-native": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", - "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/netlify-cli/node_modules/node-gyp-build": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true, + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -46363,9 +44083,8 @@ }, "node_modules/netlify-cli/node_modules/node-source-walk": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-6.0.2.tgz", - "integrity": "sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.21.8" }, @@ -46375,9 +44094,8 @@ }, "node_modules/netlify-cli/node_modules/node-stream-zip": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" }, @@ -46388,9 +44106,8 @@ }, "node_modules/netlify-cli/node_modules/node-version-alias": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/node-version-alias/-/node-version-alias-3.4.1.tgz", - "integrity": "sha512-Kf3L9spAL6lEHMPyqpwHSTNG3LPkOXBfSUnBMG/YE2TdoC8Qoqf0+qg01nr6K9MFQEcXtWUyTQzLJByRixSBsA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "all-node-versions": "^11.3.0", "filter-obj": "^5.1.0", @@ -46405,18 +44122,16 @@ }, "node_modules/netlify-cli/node_modules/node-version-alias/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/nopt": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -46429,9 +44144,8 @@ }, "node_modules/netlify-cli/node_modules/normalize-node-version": { "version": "12.4.0", - "resolved": "https://registry.npmjs.org/normalize-node-version/-/normalize-node-version-12.4.0.tgz", - "integrity": "sha512-0oLZN5xcyKVrSHMk8/9RuNblEe7HEsXAt5Te2xmMiZD9VX7bqWYe0HMyfqSYFD3xv0949lZuXaEwjTqle1uWWQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "all-node-versions": "^11.3.0", "filter-obj": "^5.1.0", @@ -46443,9 +44157,8 @@ }, "node_modules/netlify-cli/node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -46458,18 +44171,16 @@ }, "node_modules/netlify-cli/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" } }, "node_modules/netlify-cli/node_modules/normalize-url": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -46479,9 +44190,8 @@ }, "node_modules/netlify-cli/node_modules/npm-run-path": { "version": "4.0.1", - "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" }, @@ -46491,18 +44201,16 @@ }, "node_modules/netlify-cli/node_modules/npm-run-path/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/npmlog": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dev": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -46512,9 +44220,8 @@ }, "node_modules/netlify-cli/node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -46524,27 +44231,24 @@ }, "node_modules/netlify-cli/node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/object-inspect": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/netlify-cli/node_modules/ofetch": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz", - "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==", "dev": true, + "license": "MIT", "dependencies": { "destr": "^2.0.1", "node-fetch-native": "^1.4.0", @@ -46553,30 +44257,26 @@ }, "node_modules/netlify-cli/node_modules/ohash": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", - "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/omit.js": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz", - "integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/on-exit-leak-free": { "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/netlify-cli/node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -46586,36 +44286,32 @@ }, "node_modules/netlify-cli/node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/netlify-cli/node_modules/one-time": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "dev": true, + "license": "MIT", "dependencies": { "fn.name": "1.x.x" } }, "node_modules/netlify-cli/node_modules/onetime": { "version": "5.1.2", - "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" }, @@ -46628,18 +44324,16 @@ }, "node_modules/netlify-cli/node_modules/onetime/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -46654,9 +44348,8 @@ }, "node_modules/netlify-cli/node_modules/open/node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -46669,9 +44362,8 @@ }, "node_modules/netlify-cli/node_modules/open/node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -46681,9 +44373,8 @@ }, "node_modules/netlify-cli/node_modules/ora": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", @@ -46704,9 +44395,8 @@ }, "node_modules/netlify-cli/node_modules/ora/node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -46719,15 +44409,13 @@ }, "node_modules/netlify-cli/node_modules/ora/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/ora/node_modules/is-unicode-supported": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -46737,9 +44425,8 @@ }, "node_modules/netlify-cli/node_modules/ora/node_modules/restore-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -46753,9 +44440,8 @@ }, "node_modules/netlify-cli/node_modules/ora/node_modules/string-width": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -46770,9 +44456,8 @@ }, "node_modules/netlify-cli/node_modules/os-name": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", - "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", "dev": true, + "license": "MIT", "dependencies": { "macos-release": "^3.0.1", "windows-release": "^5.0.1" @@ -46786,27 +44471,24 @@ }, "node_modules/netlify-cli/node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/netlify-cli/node_modules/p-event": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", - "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, + "license": "MIT", "dependencies": { "p-timeout": "^5.0.2" }, @@ -46819,9 +44501,8 @@ }, "node_modules/netlify-cli/node_modules/p-event/node_modules/p-timeout": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -46831,9 +44512,8 @@ }, "node_modules/netlify-cli/node_modules/p-every": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-every/-/p-every-2.0.0.tgz", - "integrity": "sha512-MCz9DqD5opPC48Zsd+BHm56O/HfhYIQQtupfDzhXoVgQdg/Ux4F8/JcdRuQ+arq7zD5fB6zP3axbH3d9Nr8dlw==", "dev": true, + "license": "MIT", "dependencies": { "p-map": "^2.0.0" }, @@ -46843,18 +44523,16 @@ }, "node_modules/netlify-cli/node_modules/p-every/node_modules/p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/p-filter": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, + "license": "MIT", "dependencies": { "p-map": "^7.0.1" }, @@ -46867,18 +44545,16 @@ }, "node_modules/netlify-cli/node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/p-map": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", - "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -46888,9 +44564,8 @@ }, "node_modules/netlify-cli/node_modules/p-reduce": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -46900,9 +44575,8 @@ }, "node_modules/netlify-cli/node_modules/p-retry": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-5.1.1.tgz", - "integrity": "sha512-i69WkEU5ZAL8mrmdmVviWwU+DN+IUF8f4sSJThoJ3z5A7Nn5iuO5ROX3Boye0u+uYQLOSfgFl7SuFZCjlAVbQA==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.1", "retry": "^0.13.1" @@ -46916,9 +44590,8 @@ }, "node_modules/netlify-cli/node_modules/p-timeout": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -46928,9 +44601,8 @@ }, "node_modules/netlify-cli/node_modules/p-wait-for": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz", - "integrity": "sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==", "dev": true, + "license": "MIT", "dependencies": { "p-timeout": "^6.0.0" }, @@ -46943,9 +44615,8 @@ }, "node_modules/netlify-cli/node_modules/package-json": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", "dev": true, + "license": "MIT", "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", @@ -46961,9 +44632,8 @@ }, "node_modules/netlify-cli/node_modules/parallel-transform": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, + "license": "MIT", "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -46972,9 +44642,8 @@ }, "node_modules/netlify-cli/node_modules/parallel-transform/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -46987,9 +44656,8 @@ }, "node_modules/netlify-cli/node_modules/parse-github-url": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true, + "license": "MIT", "bin": { "parse-github-url": "cli.js" }, @@ -46999,18 +44667,16 @@ }, "node_modules/netlify-cli/node_modules/parse-gitignore": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-2.0.0.tgz", - "integrity": "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/netlify-cli/node_modules/parse-json": { "version": "5.2.0", - "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", @@ -47026,9 +44692,8 @@ }, "node_modules/netlify-cli/node_modules/parse-ms": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -47038,27 +44703,24 @@ }, "node_modules/netlify-cli/node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -47068,61 +44730,31 @@ }, "node_modules/netlify-cli/node_modules/path-parse": { "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 - }, - "node_modules/netlify-cli/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/netlify-cli/node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "license": "MIT" }, "node_modules/netlify-cli/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/pathe": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/peek-readable": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -47133,21 +44765,18 @@ }, "node_modules/netlify-cli/node_modules/pend": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -47157,9 +44786,8 @@ }, "node_modules/netlify-cli/node_modules/pkg-types": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", "dev": true, + "license": "MIT", "dependencies": { "jsonc-parser": "^3.2.0", "mlly": "^1.2.0", @@ -47168,8 +44796,6 @@ }, "node_modules/netlify-cli/node_modules/postcss": { "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -47185,6 +44811,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -47196,9 +44823,8 @@ }, "node_modules/netlify-cli/node_modules/postcss-values-parser": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", - "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", "dev": true, + "license": "MPL-2.0", "dependencies": { "color-name": "^1.1.4", "is-url-superb": "^4.0.0", @@ -47213,15 +44839,13 @@ }, "node_modules/netlify-cli/node_modules/postcss-values-parser/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/prebuild-install": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -47245,15 +44869,13 @@ }, "node_modules/netlify-cli/node_modules/prebuild-install/node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/prebuild-install/node_modules/tar-fs": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -47263,9 +44885,8 @@ }, "node_modules/netlify-cli/node_modules/prebuild-install/node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -47279,9 +44900,8 @@ }, "node_modules/netlify-cli/node_modules/precinct": { "version": "11.0.5", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-11.0.5.tgz", - "integrity": "sha512-oHSWLC8cL/0znFhvln26D14KfCQFFn4KOLSw6hmLhd+LQ2SKt9Ljm89but76Pc7flM9Ty1TnXyrA2u16MfRV3w==", "dev": true, + "license": "MIT", "dependencies": { "@dependents/detective-less": "^4.1.0", "commander": "^10.0.1", @@ -47305,8 +44925,6 @@ }, "node_modules/netlify-cli/node_modules/precond": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", "dev": true, "engines": { "node": ">= 0.6" @@ -47314,9 +44932,8 @@ }, "node_modules/netlify-cli/node_modules/pretty-format": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -47328,9 +44945,8 @@ }, "node_modules/netlify-cli/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "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" }, @@ -47340,9 +44956,8 @@ }, "node_modules/netlify-cli/node_modules/pretty-ms": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "dev": true, + "license": "MIT", "dependencies": { "parse-ms": "^3.0.0" }, @@ -47355,9 +44970,8 @@ }, "node_modules/netlify-cli/node_modules/prettyjson": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.5.tgz", - "integrity": "sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==", "dev": true, + "license": "MIT", "dependencies": { "colors": "1.4.0", "minimist": "^1.2.0" @@ -47368,30 +44982,26 @@ }, "node_modules/netlify-cli/node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/netlify-cli/node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -47402,9 +45012,8 @@ }, "node_modules/netlify-cli/node_modules/ps-list": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.0.tgz", - "integrity": "sha512-NoGBqJe7Ou3kfQxEvDzDyKGAyEgwIuD3YrfXinjcCmBRv0hTld0Xb71hrXvtsNPj7HSFATfemvzB8PPJtq6Yag==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -47414,9 +45023,8 @@ }, "node_modules/netlify-cli/node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -47424,18 +45032,16 @@ }, "node_modules/netlify-cli/node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/pupa": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "dev": true, + "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" }, @@ -47448,9 +45054,8 @@ }, "node_modules/netlify-cli/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -47463,8 +45068,6 @@ }, "node_modules/netlify-cli/node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -47479,25 +45082,23 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/queue-tick": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -47507,39 +45108,34 @@ }, "node_modules/netlify-cli/node_modules/quote-unquote": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", - "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/radix3": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.0.tgz", - "integrity": "sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/random-bytes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netlify-cli/node_modules/raw-body": { "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==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -47552,18 +45148,16 @@ }, "node_modules/netlify-cli/node_modules/raw-body/node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/raw-body/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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -47577,9 +45171,8 @@ }, "node_modules/netlify-cli/node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -47592,30 +45185,26 @@ }, "node_modules/netlify-cli/node_modules/rc/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/read-package-up": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -47630,9 +45219,8 @@ }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/hosted-git-info": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -47642,18 +45230,16 @@ }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/lru-cache": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/normalize-package-data": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", @@ -47666,9 +45252,8 @@ }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/parse-json": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "index-to-position": "^0.1.2", @@ -47683,9 +45268,8 @@ }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/read-pkg": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -47702,9 +45286,8 @@ }, "node_modules/netlify-cli/node_modules/read-package-up/node_modules/type-fest": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.12.0.tgz", - "integrity": "sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -47714,9 +45297,8 @@ }, "node_modules/netlify-cli/node_modules/read-pkg-up": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", @@ -47731,9 +45313,8 @@ }, "node_modules/netlify-cli/node_modules/read-pkg-up/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -47747,18 +45328,16 @@ }, "node_modules/netlify-cli/node_modules/read-pkg-up/node_modules/path-exists": { "version": "5.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/read-pkg-up/node_modules/read-pkg": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -47774,9 +45353,8 @@ }, "node_modules/netlify-cli/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -47788,9 +45366,8 @@ }, "node_modules/netlify-cli/node_modules/readable-web-to-node-stream": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^3.6.0" }, @@ -47804,27 +45381,24 @@ }, "node_modules/netlify-cli/node_modules/readdir-glob": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.1.0" } }, "node_modules/netlify-cli/node_modules/readdir-glob/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", - "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" }, @@ -47834,9 +45408,8 @@ }, "node_modules/netlify-cli/node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -47846,27 +45419,24 @@ }, "node_modules/netlify-cli/node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/netlify-cli/node_modules/redis-errors": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/redis-parser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "dev": true, + "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" }, @@ -47876,9 +45446,8 @@ }, "node_modules/netlify-cli/node_modules/registry-auth-token": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, + "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -47888,9 +45457,8 @@ }, "node_modules/netlify-cli/node_modules/registry-url": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "dev": true, + "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -47903,54 +45471,47 @@ }, "node_modules/netlify-cli/node_modules/remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/netlify-cli/node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/require-from-string": { "version": "2.0.2", - "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" } }, "node_modules/netlify-cli/node_modules/require-package-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", - "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/resolve": { "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -47965,24 +45526,21 @@ }, "node_modules/netlify-cli/node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/resolve-from": { "version": "5.0.0", - "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/netlify-cli/node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -47995,9 +45553,8 @@ }, "node_modules/netlify-cli/node_modules/restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -48008,18 +45565,16 @@ }, "node_modules/netlify-cli/node_modules/restore-cursor/node_modules/mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/restore-cursor/node_modules/onetime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -48029,18 +45584,16 @@ }, "node_modules/netlify-cli/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/netlify-cli/node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -48048,15 +45601,13 @@ }, "node_modules/netlify-cli/node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -48069,17 +45620,14 @@ }, "node_modules/netlify-cli/node_modules/run-async": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/netlify-cli/node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -48095,15 +45643,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/netlify-cli/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -48113,60 +45661,52 @@ }, "node_modules/netlify-cli/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/safe-json-stringify": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/safe-regex2": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", - "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", "dev": true, + "license": "MIT", "dependencies": { "ret": "~0.4.0" } }, "node_modules/netlify-cli/node_modules/safe-regex2/node_modules/ret": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", - "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/safe-stable-stringify": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/netlify-cli/node_modules/seek-bzip": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^2.8.1" }, @@ -48177,15 +45717,13 @@ }, "node_modules/netlify-cli/node_modules/seek-bzip/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/semver": { "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -48195,9 +45733,8 @@ }, "node_modules/netlify-cli/node_modules/semver-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -48210,9 +45747,8 @@ }, "node_modules/netlify-cli/node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -48234,33 +45770,29 @@ }, "node_modules/netlify-cli/node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/send/node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/send/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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -48274,9 +45806,8 @@ }, "node_modules/netlify-cli/node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -48289,28 +45820,24 @@ }, "node_modules/netlify-cli/node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/set-cookie-parser": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/sharp": { "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.2", @@ -48330,9 +45857,8 @@ }, "node_modules/netlify-cli/node_modules/sharp/node_modules/color": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -48343,9 +45869,8 @@ }, "node_modules/netlify-cli/node_modules/sharp/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -48355,21 +45880,18 @@ }, "node_modules/netlify-cli/node_modules/sharp/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/sharp/node_modules/node-addon-api": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -48379,18 +45901,16 @@ }, "node_modules/netlify-cli/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -48402,14 +45922,11 @@ }, "node_modules/netlify-cli/node_modules/signal-exit": { "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/netlify-cli/node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true, "funding": [ { @@ -48424,12 +45941,11 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/simple-get": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, "funding": [ { @@ -48445,6 +45961,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -48453,33 +45970,29 @@ }, "node_modules/netlify-cli/node_modules/simple-swizzle": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/netlify-cli/node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -48493,9 +46006,8 @@ }, "node_modules/netlify-cli/node_modules/sort-keys": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-obj": "^1.0.0" }, @@ -48505,9 +46017,8 @@ }, "node_modules/netlify-cli/node_modules/sort-keys-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", "dev": true, + "license": "MIT", "dependencies": { "sort-keys": "^1.0.0" }, @@ -48517,36 +46028,32 @@ }, "node_modules/netlify-cli/node_modules/sort-keys/node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/source-map": { "version": "0.6.1", - "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" } }, "node_modules/netlify-cli/node_modules/source-map-js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -48554,9 +46061,8 @@ }, "node_modules/netlify-cli/node_modules/spdx-correct": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -48564,15 +46070,13 @@ }, "node_modules/netlify-cli/node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/netlify-cli/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -48580,60 +46084,52 @@ }, "node_modules/netlify-cli/node_modules/spdx-license-ids": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/netlify-cli/node_modules/stack-generator": { "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", "dev": true, + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/netlify-cli/node_modules/stack-trace": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/netlify-cli/node_modules/stackframe": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/standard-as-callback": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/std-env": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/stdin-discarder": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -48643,9 +46139,8 @@ }, "node_modules/netlify-cli/node_modules/streamx": { "version": "2.15.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", - "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -48653,18 +46148,16 @@ }, "node_modules/netlify-cli/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/netlify-cli/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -48677,9 +46170,8 @@ "node_modules/netlify-cli/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -48691,18 +46183,16 @@ }, "node_modules/netlify-cli/node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -48712,18 +46202,16 @@ }, "node_modules/netlify-cli/node_modules/string-width/node_modules/is-fullwidth-code-point": { "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/netlify-cli/node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -48733,9 +46221,8 @@ }, "node_modules/netlify-cli/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -48749,9 +46236,8 @@ "node_modules/netlify-cli/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -48761,15 +46247,13 @@ }, "node_modules/netlify-cli/node_modules/strip-ansi-control-characters": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi-control-characters/-/strip-ansi-control-characters-2.0.0.tgz", - "integrity": "sha512-Q0/k5orrVGeaOlIOUn1gybGU0IcAbgHQT1faLo5hik4DqClKVSaka5xOhNNoRgtfztHVxCYxi7j71mrWom0bIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/strip-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -48779,9 +46263,8 @@ }, "node_modules/netlify-cli/node_modules/strip-dirs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-3.0.0.tgz", - "integrity": "sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ==", "dev": true, + "license": "ISC", "dependencies": { "inspect-with-kind": "^1.0.5", "is-plain-obj": "^1.1.0" @@ -48789,27 +46272,24 @@ }, "node_modules/netlify-cli/node_modules/strip-dirs/node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/netlify-cli/node_modules/strip-final-newline": { "version": "2.0.0", - "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" } }, "node_modules/netlify-cli/node_modules/strtok3": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", "dev": true, + "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0" @@ -48824,9 +46304,8 @@ }, "node_modules/netlify-cli/node_modules/supports-color": { "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -48836,9 +46315,8 @@ }, "node_modules/netlify-cli/node_modules/supports-hyperlinks": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -48849,9 +46327,8 @@ }, "node_modules/netlify-cli/node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -48861,9 +46338,8 @@ }, "node_modules/netlify-cli/node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "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" }, @@ -48873,9 +46349,8 @@ }, "node_modules/netlify-cli/node_modules/svgo": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", "dev": true, + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -48898,18 +46373,16 @@ }, "node_modules/netlify-cli/node_modules/svgo/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/netlify-cli/node_modules/system-architecture": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -48919,9 +46392,8 @@ }, "node_modules/netlify-cli/node_modules/tabtab": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.1", "es6-promisify": "^6.0.0", @@ -48933,9 +46405,8 @@ }, "node_modules/netlify-cli/node_modules/tar": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -48950,9 +46421,8 @@ }, "node_modules/netlify-cli/node_modules/tar-fs": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "dev": true, + "license": "MIT", "dependencies": { "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", @@ -48961,9 +46431,8 @@ }, "node_modules/netlify-cli/node_modules/tar-stream": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, + "license": "MIT", "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -48972,9 +46441,8 @@ }, "node_modules/netlify-cli/node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -48984,18 +46452,16 @@ }, "node_modules/netlify-cli/node_modules/temp-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/netlify-cli/node_modules/tempy": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", @@ -49011,9 +46477,8 @@ }, "node_modules/netlify-cli/node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -49023,9 +46488,8 @@ }, "node_modules/netlify-cli/node_modules/terminal-link": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", - "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^5.0.0", "supports-hyperlinks": "^2.2.0" @@ -49039,9 +46503,8 @@ }, "node_modules/netlify-cli/node_modules/terminal-link/node_modules/ansi-escapes": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.2" }, @@ -49054,9 +46517,8 @@ }, "node_modules/netlify-cli/node_modules/terminal-link/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -49066,30 +46528,26 @@ }, "node_modules/netlify-cli/node_modules/text-hex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/through2": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "3" } }, "node_modules/netlify-cli/node_modules/through2-filter": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-4.0.0.tgz", - "integrity": "sha512-P8IpQL19bSdXqGLvLdbidYRxERXgHEXGcQofPxbLpPkqS1ieOrUrocdYRTNv8YwSukaDJWr71s6F2kZ3bvgEhA==", "dev": true, + "license": "MIT", "dependencies": { "through2": "^4.0.2" }, @@ -49099,9 +46557,8 @@ }, "node_modules/netlify-cli/node_modules/through2-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/through2-map/-/through2-map-4.0.0.tgz", - "integrity": "sha512-+rpmDB5yckiBGEuqJSsWYWMs9e1zdksypDKvByysEyN+knhsPXV9Z6O2mA9meczIa6AON7bi2G3xWk5T8UG4zQ==", "dev": true, + "license": "MIT", "dependencies": { "through2": "^4.0.2" }, @@ -49111,18 +46568,16 @@ }, "node_modules/netlify-cli/node_modules/time-zone": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -49132,18 +46587,16 @@ }, "node_modules/netlify-cli/node_modules/tmp-promise": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, + "license": "MIT", "dependencies": { "tmp": "^0.2.0" } }, "node_modules/netlify-cli/node_modules/tmp-promise/node_modules/tmp": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, + "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -49153,18 +46606,16 @@ }, "node_modules/netlify-cli/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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/to-readable-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-3.0.0.tgz", - "integrity": "sha512-vD2LytT6DxPynBa1xbMtswY9gGqj27wNbh2uvI5OhBe+mrGLurRWRQZyQn3812sqlQRtUJwaKVshG+PoGwbPDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -49174,9 +46625,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -49186,27 +46636,24 @@ }, "node_modules/netlify-cli/node_modules/toad-cache": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", - "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/netlify-cli/node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/netlify-cli/node_modules/token-types": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", "dev": true, + "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -49221,33 +46668,28 @@ }, "node_modules/netlify-cli/node_modules/toml": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/tomlify-j0.4": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz", - "integrity": "sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/triple-beam": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -49288,24 +46730,21 @@ }, "node_modules/netlify-cli/node_modules/ts-node/node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/netlify-cli/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/netlify-cli/node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -49318,9 +46757,8 @@ }, "node_modules/netlify-cli/node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -49330,9 +46768,8 @@ }, "node_modules/netlify-cli/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -49342,9 +46779,8 @@ }, "node_modules/netlify-cli/node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -49355,18 +46791,16 @@ }, "node_modules/netlify-cli/node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/typescript": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -49377,15 +46811,13 @@ }, "node_modules/netlify-cli/node_modules/ufo": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/uid-safe": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", "dev": true, + "license": "MIT", "dependencies": { "random-bytes": "~1.0.0" }, @@ -49395,18 +46827,16 @@ }, "node_modules/netlify-cli/node_modules/ulid": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", - "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", "dev": true, + "license": "MIT", "bin": { "ulid": "bin/cli.js" } }, "node_modules/netlify-cli/node_modules/unbzip2-stream": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -49414,21 +46844,18 @@ }, "node_modules/netlify-cli/node_modules/uncrypto": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/unenv": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz", - "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==", "dev": true, + "license": "MIT", "dependencies": { "consola": "^3.2.3", "defu": "^6.1.3", @@ -49439,9 +46866,8 @@ }, "node_modules/netlify-cli/node_modules/unenv/node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -49451,9 +46877,8 @@ }, "node_modules/netlify-cli/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" }, @@ -49463,9 +46888,8 @@ }, "node_modules/netlify-cli/node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -49478,16 +46902,13 @@ }, "node_modules/netlify-cli/node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/unix-dgram": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.6.tgz", - "integrity": "sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==", "dev": true, - "hasInstallScript": true, + "license": "ISC", "optional": true, "dependencies": { "bindings": "^1.5.0", @@ -49499,9 +46920,8 @@ }, "node_modules/netlify-cli/node_modules/unixify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", "dev": true, + "license": "MIT", "dependencies": { "normalize-path": "^2.1.1" }, @@ -49511,9 +46931,8 @@ }, "node_modules/netlify-cli/node_modules/unixify/node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, + "license": "MIT", "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -49523,27 +46942,24 @@ }, "node_modules/netlify-cli/node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/untildify": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/netlify-cli/node_modules/untun": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", - "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", "dev": true, + "license": "MIT", "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", @@ -49555,9 +46971,8 @@ }, "node_modules/netlify-cli/node_modules/update-notifier": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", - "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.1.1", "chalk": "^5.3.0", @@ -49581,64 +46996,56 @@ }, "node_modules/netlify-cli/node_modules/uqr": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", - "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/netlify-cli/node_modules/urlpattern-polyfill": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/netlify-cli/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/netlify-cli/node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -49646,9 +47053,8 @@ }, "node_modules/netlify-cli/node_modules/validate-npm-package-name": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, + "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -49658,18 +47064,16 @@ }, "node_modules/netlify-cli/node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/netlify-cli/node_modules/wait-port": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", - "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -49684,9 +47088,8 @@ }, "node_modules/netlify-cli/node_modules/wait-port/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -49699,9 +47102,8 @@ }, "node_modules/netlify-cli/node_modules/wait-port/node_modules/chalk": { "version": "4.1.2", - "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" @@ -49715,9 +47117,8 @@ }, "node_modules/netlify-cli/node_modules/wait-port/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -49727,24 +47128,21 @@ }, "node_modules/netlify-cli/node_modules/wait-port/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 + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/wait-port/node_modules/commander": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } }, "node_modules/netlify-cli/node_modules/wait-port/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -49754,27 +47152,24 @@ }, "node_modules/netlify-cli/node_modules/web-streams-polyfill": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", - "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/netlify-cli/node_modules/well-known-symbols": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", "dev": true, + "license": "ISC", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -49782,15 +47177,13 @@ }, "node_modules/netlify-cli/node_modules/whatwg-url/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==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/netlify-cli/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -49803,24 +47196,21 @@ }, "node_modules/netlify-cli/node_modules/which/node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/netlify-cli/node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -49833,15 +47223,13 @@ }, "node_modules/netlify-cli/node_modules/widest-line/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/widest-line/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -49856,9 +47244,8 @@ }, "node_modules/netlify-cli/node_modules/windows-release": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", - "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.1.1" }, @@ -49871,9 +47258,8 @@ }, "node_modules/netlify-cli/node_modules/winston": { "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", "dev": true, + "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -49893,9 +47279,8 @@ }, "node_modules/netlify-cli/node_modules/winston-transport": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", "dev": true, + "license": "MIT", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", @@ -49907,18 +47292,16 @@ }, "node_modules/netlify-cli/node_modules/winston/node_modules/@colors/colors": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/netlify-cli/node_modules/winston/node_modules/is-stream": { "version": "2.0.1", - "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" }, @@ -49928,9 +47311,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -49946,9 +47328,8 @@ "node_modules/netlify-cli/node_modules/wrap-ansi-cjs": { "name": "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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -49963,9 +47344,8 @@ }, "node_modules/netlify-cli/node_modules/wrap-ansi-cjs/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -49978,9 +47358,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -49990,15 +47369,13 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -50008,9 +47385,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -50023,9 +47399,8 @@ }, "node_modules/netlify-cli/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==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -50035,15 +47410,13 @@ }, "node_modules/netlify-cli/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -50053,15 +47426,13 @@ }, "node_modules/netlify-cli/node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -50072,9 +47443,8 @@ }, "node_modules/netlify-cli/node_modules/write-file-atomic/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -50084,9 +47454,8 @@ }, "node_modules/netlify-cli/node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -50105,9 +47474,8 @@ }, "node_modules/netlify-cli/node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -50117,9 +47485,8 @@ }, "node_modules/netlify-cli/node_modules/xss": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" @@ -50133,39 +47500,34 @@ }, "node_modules/netlify-cli/node_modules/xss/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netlify-cli/node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/netlify-cli/node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/netlify-cli/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/netlify-cli/node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -50181,9 +47543,8 @@ }, "node_modules/netlify-cli/node_modules/yargs/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==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -50195,9 +47556,8 @@ }, "node_modules/netlify-cli/node_modules/yargs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -50207,18 +47567,16 @@ }, "node_modules/netlify-cli/node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/netlify-cli/node_modules/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -50226,18 +47584,16 @@ }, "node_modules/netlify-cli/node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/netlify-cli/node_modules/zip-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, + "license": "MIT", "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -50249,8 +47605,6 @@ }, "node_modules/netlify-cli/node_modules/zip-stream/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -50266,6 +47620,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -50273,9 +47628,8 @@ }, "node_modules/netlify-cli/node_modules/zip-stream/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==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -50289,8 +47643,6 @@ }, "node_modules/netlify-cli/node_modules/zip-stream/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -50305,30 +47657,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/netlify-cli/node_modules/zip-stream/node_modules/string_decoder": { "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==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/netlify-cli/node_modules/zod": { "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/netlify-cli/tools/lint-rules": { - "name": "eslint-plugin-workspace", - "extraneous": true - }, "node_modules/next-tick": { "version": "1.1.0", "dev": true, @@ -50357,37 +47704,27 @@ "node": ">=10" } }, - "node_modules/node-abi/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/node-addon-api": { "version": "6.1.0", "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "2.1.3", "license": "MIT", @@ -50402,21 +47739,19 @@ } }, "node_modules/node-fetch": { - "version": "2.7.0", + "version": "3.3.2", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-fetch-h2": { @@ -50429,22 +47764,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "license": "(BSD-3-Clause OR GPL-2.0)", @@ -50533,36 +47852,6 @@ "node": ">=10" } }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/normalize-path": { "version": "3.0.0", "license": "MIT", @@ -53998,9 +51287,8 @@ }, "node_modules/ora": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", @@ -54021,9 +51309,8 @@ }, "node_modules/ora/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -54033,9 +51320,8 @@ }, "node_modules/ora/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" }, @@ -54045,15 +51331,13 @@ }, "node_modules/ora/node_modules/emoji-regex": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ora/node_modules/is-unicode-supported": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -54063,9 +51347,8 @@ }, "node_modules/ora/node_modules/log-symbols": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" @@ -54079,9 +51362,8 @@ }, "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -54091,9 +51373,8 @@ }, "node_modules/ora/node_modules/stdin-discarder": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -54103,9 +51384,8 @@ }, "node_modules/ora/node_modules/string-width": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -54120,9 +51400,8 @@ }, "node_modules/ora/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -54338,6 +51617,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-ratelimit": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=10.23.0" + } + }, "node_modules/p-reduce": { "version": "2.1.0", "dev": true, @@ -54398,33 +51684,6 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/package-json/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/pako": { "version": "1.0.11", "license": "(MIT AND Zlib)" @@ -54515,9 +51774,8 @@ }, "node_modules/parse-ms": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -55141,16 +52399,13 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -55165,6 +52420,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -55324,33 +52580,6 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/postcss-merge-idents": { "version": "5.1.1", "dev": true, @@ -55470,8 +52699,7 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -55486,8 +52714,7 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -55707,8 +52934,7 @@ }, "node_modules/postcss-selector-parser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -55863,9 +53089,8 @@ }, "node_modules/prettier": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -55929,9 +53154,8 @@ }, "node_modules/pretty-ms": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", - "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", "dev": true, + "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" }, @@ -57016,8 +54240,7 @@ }, "node_modules/react-json-view-lite": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -57080,591 +54303,27 @@ "license": "MIT" }, "node_modules/react-markdown": { - "version": "8.0.7", + "version": "9.0.1", "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/react-markdown/node_modules/@types/hast": { - "version": "2.3.8", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/react-markdown/node_modules/@types/unist": { - "version": "2.0.10", - "license": "MIT" - }, - "node_modules/react-markdown/node_modules/hast-util-whitespace": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/mdast-util-definitions": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/micromark": { - "version": "3.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-factory-label": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-factory-title": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-encode": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/react-markdown/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/react-markdown/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/react-markdown/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/react-markdown/node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, - "node_modules/react-markdown/node_modules/remark-parse": { - "version": "10.0.2", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/remark-rehype": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unified": { - "version": "10.1.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-generated": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-is": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-position": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-visit": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/vfile": { - "version": "5.3.7", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/react-markdown/node_modules/vfile-message": { - "version": "3.1.4", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/react": ">=18", + "react": ">=18" } }, "node_modules/react-modal": { @@ -58007,31 +54666,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/read-pkg/node_modules/type-fest": { "version": "4.8.3", "dev": true, @@ -58043,11 +54677,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/readable-stream": { "version": "4.4.2", "license": "MIT", @@ -58274,9 +54903,8 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -59446,9 +56074,8 @@ }, "node_modules/safe-array-concat": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -59464,9 +56091,8 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -59496,9 +56122,8 @@ }, "node_modules/safe-regex-test": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -59517,8 +56142,7 @@ }, "node_modules/sass": { "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -59591,16 +56215,6 @@ "version": "0.4.1", "license": "MIT" }, - "node_modules/sass-loader/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/sass-loader/node_modules/schema-utils": { "version": "3.3.0", "license": "MIT", @@ -59617,23 +56231,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/sass-loader/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sass-loader/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/sax": { "version": "1.3.0", "license": "ISC" @@ -59682,8 +56279,7 @@ }, "node_modules/search-insights": { "version": "2.14.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", - "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", + "license": "MIT", "peer": true }, "node_modules/section-matter": { @@ -60219,6 +56815,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/semantic-release/node_modules/normalize-package-data": { "version": "2.5.0", "dev": true, @@ -62992,31 +59607,6 @@ "node": ">=8" } }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semantic-release/node_modules/temp-dir": { "version": "2.0.0", "dev": true, @@ -63054,6 +59644,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, "node_modules/semantic-release/node_modules/unique-string": { "version": "2.0.0", "dev": true, @@ -63070,6 +59665,20 @@ "dev": true, "license": "MIT" }, + "node_modules/semantic-release/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/semantic-release/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/semantic-release/node_modules/yallist": { "version": "4.0.0", "dev": true, @@ -63087,10 +59696,13 @@ } }, "node_modules/semver": { - "version": "6.3.1", + "version": "7.6.2", "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -63106,33 +59718,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-diff/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/semver-greatest-satisfied-range": { "version": "1.1.0", "dev": true, @@ -63376,8 +59961,7 @@ }, "node_modules/set-function-length": { "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", @@ -63482,33 +60066,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/sharp/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -63708,8 +60265,7 @@ }, "node_modules/sitemap": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -63726,8 +60282,7 @@ }, "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + "license": "MIT" }, "node_modules/skin-tone": { "version": "2.0.0", @@ -63781,8 +60336,7 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -63957,8 +60511,7 @@ }, "node_modules/source-map-js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -64523,9 +61076,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -64541,9 +61093,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -64555,9 +61106,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -64759,9 +61309,8 @@ }, "node_modules/stylus": { "version": "0.62.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.62.0.tgz", - "integrity": "sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "~4.3.1", "debug": "^4.3.2", @@ -65022,6 +61571,40 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/swagger2openapi/node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/swagger2openapi/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/swagger2openapi/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/swagger2openapi/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "dev": true, @@ -65642,9 +62225,8 @@ }, "node_modules/test-links/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -66248,9 +62830,8 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -66264,9 +62845,8 @@ }, "node_modules/ts-jest": { "version": "29.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.4.tgz", - "integrity": "sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -66309,36 +62889,6 @@ } } }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/ts-jest/node_modules/yargs-parser": { "version": "21.1.1", "dev": true, @@ -66498,9 +63048,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -66512,9 +63061,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -66531,9 +63079,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -66551,9 +63098,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -66594,9 +63140,8 @@ }, "node_modules/typescript-plugin-css-modules": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-5.1.0.tgz", - "integrity": "sha512-6h+sLBa4l+XYSTn/31vZHd/1c3SvAbLpobY6FxDiUOHJQG1eD9Gh3eCs12+Eqc+TCOAdxcO+zAPvUq0jBfdciw==", "dev": true, + "license": "MIT", "dependencies": { "@types/postcss-modules-local-by-default": "^4.0.2", "@types/postcss-modules-scope": "^3.0.4", @@ -67297,33 +63842,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/uri-js": { "version": "4.4.1", "license": "BSD-2-Clause", @@ -67611,33 +64129,6 @@ "node": ">= 12" } }, - "node_modules/validate-peer-dependencies/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/validate-peer-dependencies/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/validate-peer-dependencies/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/validate.io-array": { "version": "1.0.6", "license": "MIT" @@ -68133,6 +64624,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "dev": true, @@ -68220,8 +64718,7 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -68485,9 +64982,8 @@ }, "node_modules/webpconvert": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webpconvert/-/webpconvert-3.0.1.tgz", - "integrity": "sha512-svqxsUKvOR1ZBMDQG03uKTDVYIA8G+wMBsyOOOBmxYIW+ajRJF//m21YCxr9B9QB338VWHLgwDuyFon+Rx8p4Q==", "dev": true, + "license": "MIT", "dependencies": { "gulp": "^4.0.2", "gulp-imagemin": "^8.0.0", @@ -68631,8 +65127,7 @@ }, "node_modules/which-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -68808,8 +65303,7 @@ }, "node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -68990,9 +65484,8 @@ }, "node_modules/yoctocolors": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.0.2.tgz", - "integrity": "sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index 5af771b997..163b84e41b 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "react-live": ">=3.1.1 <4.0.0" }, "dependencies": { + "@ant-design/icons": "^4.8.3", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@docusaurus/core": "^3.4.0", @@ -47,6 +48,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.0.0", "antd": "^5.6.2", + "axios-retry": "^3.8.0", "babel-plugin-macros": "^3.1.0", "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^1.0.1", @@ -54,11 +56,17 @@ "docusaurus-plugin-sass": "^0.2.5", "docusaurus-theme-openapi-docs": "^3.0.0-beta.10", "fuse.js": "^6.6.2", + "markdown-to-jsx": "^7.0.0", + "node-fetch": "^3.1.0", + "p-ratelimit": "^1.0.1", "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-markdown": "9.0.1", + "remark-gfm": "4.0.0", "react-select": "^5.8.0", - "sass": "^1.77.6" + "sass": "^1.77.6", + "semver": "^7.3.7" }, "devDependencies": { "@argos-ci/cli": "^2.0.1", diff --git a/plugins/font-awesome.js b/plugins/font-awesome.js index e476b36d50..7d5d69f820 100644 --- a/plugins/font-awesome.js +++ b/plugins/font-awesome.js @@ -86,7 +86,7 @@ async function pluginImportFontAwesomeIcons() { fs.mkdirSync(directory, { recursive: true }); } - fs.writeFile(path.join(directory, "dynamicFontAwesomeImports.js"), fileContent, "utf8", (err) => { + fs.writeFile(path.join(directory, "dynamicFontAwesomeImports.ts"), fileContent, "utf8", (err) => { if (err) { console.error("An error occurred while writing the file:", err); } diff --git a/plugins/packs-integrations.js b/plugins/packs-integrations.js index f44283ab54..16494d87b7 100644 --- a/plugins/packs-integrations.js +++ b/plugins/packs-integrations.js @@ -1,33 +1,491 @@ +const { api, callRateLimitAPI } = require("../src/services/api"); +const { packTypeNames, addOnTypes, layerTypes } = require("../src/constants/packs"); +const packDescription = require("../static/packs-data/packs_information.json"); +const { coerce, rcompare } = require("semver"); +const path = require("path"); +const mime = require("mime-types"); +const { setTimeout } = require("timers/promises"); +const BASE_URL = require("../static/scripts/constants.js").BASE_URL; +const fetch = require("node-fetch"); +const excludeList = require("../static/packs-data/exclude_packs.json"); +const { existsSync, promises, open, mkdirSync, writeFile, close, createWriteStream } = require("node:fs"); +import logger from "@docusaurus/logger"; + +const filterLimit = 100; //Limit for fetching the packs from the Palette API +const dirname = ".docusaurus/packs-integrations/"; +const logoDirname = "static/img/packs/"; +const filename = "api_pack_response.json"; +const options = { + headers: { + "Content-Disposition": "attachment", + ApiKey: process.env.PALETTE_API_KEY, + }, +}; +let counter = 0; function generateIntegrationData(allContent) { const packsData = allContent["docusaurus-plugin-content-docs"].default.loadedVersions[0].docs .filter((doc) => { return doc.frontMatter.type === "appTier"; }) .map((doc) => { - return { fields: { ...doc.frontMatter, slug: doc.slug, id: doc.id } }; + return { ...doc.frontMatter, slug: doc.slug, id: doc.id }; }); return packsData; } -function generatePacksData(allContent) { - const packsData = allContent["docusaurus-plugin-content-docs"].default.loadedVersions[0].docs - .filter((doc) => { - return doc.frontMatter.type === "integration"; +function getPackUidMap(registries) { + let generatedReadMeData = {}; + registries.forEach((registry) => { + const proccessedPackReadMeDetails = registry.packValues.reduce( + (packValuesMap, packValue) => + Object.assign(packValuesMap, { + [packValue.packUid]: { + registryUid: registry.registryUid, + readme: packValue.readme, + deprecated: packValue.annotations?.system_state === "deprecated", + }, + }), + {} + ); + generatedReadMeData = Object.assign(generatedReadMeData, proccessedPackReadMeDetails); + }); + return generatedReadMeData; +} + +function filterBasedOnRegistriesInConfig(packRegistries, configRepositories) { + //Filter the pack registries based on the selected registries given in the docusaurus config file + return packRegistries.filter((registry) => { + return configRepositories.find((repo) => repo.uid === registry.registryUid); + }); +} + +function combineAPICustomPackData(packsMData, packsPaletteDetailsData, customPacksData, repositories, logoPathMap) { + const filteredPalattePackDataMap = packsPaletteDetailsData.reduce((acc, packContent) => { + const packName = packContent.name; + //filtered the packs based on the selected registries given in the docusaurus config file + if ( + repositories.find((repo) => repo.uid === packContent.registryUid) && + ((packsMData[packName].spec.layer === "addon" && packsMData[packName].spec.addonType) || + packsMData[packName].spec.layer !== "addon") + ) { + if (Object.hasOwnProperty.call(acc, packName)) { + const packValues = acc[packName]; + packValues.registries.push(packContent); + } else { + const packData = { + name: packName, + registries: [packContent], + }; + acc[packName] = packData; + } + } + return acc; + }, {}); + const filteredPalattePackData = Object.values(filteredPalattePackDataMap); + const preferredRegistryUid = repositories?.[0]?.uid; + return filteredPalattePackData.map((packContent) => { + const packName = packContent.name; + if (packsMData[packName]) { + const packMDValue = packsMData[packName]; + const preferredRegistry = packMDValue.spec.registries.find((registry) => registry.uid === preferredRegistryUid); + const latestPackVersion = preferredRegistry + ? preferredRegistry.latestVersion + : packMDValue.spec.registries[0].latestVersion; + const packType = packMDValue.spec.layer === "addon" ? packMDValue.spec.addonType : packMDValue.spec.layer; + const layer = + packMDValue.spec.layer === "addon" ? packMDValue.spec.addonType : packTypeNames[packMDValue.spec.layer]; + const selectedRegistries = filterBasedOnRegistriesInConfig(packContent.registries, repositories); + const packDetailsMap = getPackUidMap(selectedRegistries); + //union of all the versions of all the supported registries of a pack. + const allSupportedVersions = getAggregatedVersions(selectedRegistries, repositories, packDetailsMap, packName); + return { + name: packName, + title: packMDValue.spec.displayName, + description: customPacksData?.[packName], + packUidMap: packDetailsMap, + cloudTypes: packMDValue.spec.cloudTypes, + type: "integration", + category: [layer], + packType: packType, + logoUrl: logoPathMap[packName], + tags: [], + slug: "/integrations/${packMDValue.spec.name}", + id: "integrations/${packMDValue.spec.name}", + registries: packMDValue.spec.registries.map((registry) => registry.uid), + community: packMDValue.spec.registries[0].annotations?.source === "community", + verified: packMDValue.spec.registries[0].annotations?.source === "spectrocloud", + versions: allSupportedVersions, + // disabled: packMDValue.spec.registries[0].annotations?.disabled === "true", + disabled: packMDValue.spec.registries[0].annotations?.disabled === "true", + deprecated: packMDValue.spec.registries[0].annotations?.system_state === "deprecated", + latestVersion: latestPackVersion, + }; + } + }); +} + +function matchAmbiguousPatch(tag) { + const [major, minor, patch] = tag.split("."); + return major !== undefined && minor !== undefined && patch === "x"; +} + +export function sanitizeVersion(version) { + let sanitizedVersion = version; + if (version.split(".").length < 3) { + sanitizedVersion = `${version}.0`; + } + return sanitizedVersion + .split(".") + .map((subVersion) => { + if (subVersion.startsWith("0")) { + return subVersion.replace("0", ""); + } + + return subVersion; }) - .map((doc) => { - return { fields: { ...doc.frontMatter, slug: doc.slug, id: doc.id } }; + .join("."); +} + +function sortVersions(tags) { + let sortedVersions = [...tags].sort((pack1, pack2) => { + let version1 = sanitizeVersion(pack1.version); + let version2 = sanitizeVersion(pack2.version); + + if (coerce(version1) !== null) { + version1 = coerce(version1).version; + } + + if (coerce(version2) !== null) { + version2 = coerce(version2).version; + } + + try { + return rcompare(version1, version2, true); + } catch (e) { + return 0; + } + }); + return sortedVersions; +} + +function getAggregatedVersions(registries, repositories, packUidMap) { + const prefferedRegistryUid = repositories?.[0]?.uid; + //if a pack has multiple registries, then the versions of the pack are aggregated based on the selected registries + //if a same version in multiple registries, the preferred registry is the higher precendence. + const aggregatedTags = registries.reduce((previousVersions, registry) => { + const computedVersions = getComputedVersions(registry.tags); + if (previousVersions.length) { + const versionTags = new Set(previousVersions.map((verssion) => verssion.title)); + const computedCommonVersions = computedVersions.filter((version) => versionTags.has(version.title)); + if (computedCommonVersions.length) { + //merging the non-overlapping Tags in the previous computed versions and current computing versions + const mergedNonOverlappingParentVersions = [ + ...computedVersions.filter((version) => !versionTags.has(version.title)), + ...previousVersions.filter((version) => !versionTags.has(version.title)), + ]; + computedCommonVersions.forEach((commonVersion) => { + //Take PreviousVersion Parent version tag from the iterated overlapping tag title + const previousVersiontagdata = previousVersions.find( + (prevVersion) => prevVersion.title === commonVersion.title + ); + const previousVersionChildrenSet = new Set(previousVersiontagdata.children.map((verssion) => verssion.title)); + const commonComputedChildren = commonVersion.children.filter((child) => + previousVersionChildrenSet.has(child.title) + ); + if (commonComputedChildren.length) { + //merge non overlapping children in each parent version + const mergedNonOverlappingChildren = [ + ...commonVersion.children.filter((child) => !previousVersionChildrenSet.has(child.title)), + ...previousVersiontagdata.children.filter((child) => !previousVersionChildrenSet.has(child.title)), + ]; + commonComputedChildren.forEach((childComputedVersion) => { + const previousVersionChild = previousVersiontagdata.children.find( + (prevChildVersion) => prevChildVersion.title === childComputedVersion.title + ); + const childPreviousVersionPackUid = previousVersionChild.packUid; + const previousVersionRegistryUid = packUidMap[childPreviousVersionPackUid]?.registryUid; + //while doing union of both versions of pack of the registries, not belong to the preferred registry, + //then either of the registry is considered. + if (previousVersionRegistryUid !== prefferedRegistryUid) { + previousVersionChild.packUid = childComputedVersion.packUid; + } + }); + //merging non-overlapping children with the previous version children + previousVersiontagdata.children = [...previousVersiontagdata.children, ...mergedNonOverlappingChildren]; + } else { + previousVersiontagdata.children = [...previousVersiontagdata.children, ...commonVersion.children]; + } + }); + //merging the non-overlapping tags with the previous Versions + previousVersions = [...previousVersions, ...mergedNonOverlappingParentVersions]; + } else { + previousVersions = [...previousVersions, ...computedVersions]; + } + } else { + previousVersions = [...previousVersions, ...computedVersions]; + } + return previousVersions; + }, []); + return aggregatedTags; +} + +function getComputedVersions(tags) { + const sortedVersions = sortVersions(tags); + const roots = sortedVersions + .filter((version) => { + return matchAmbiguousPatch(version.tag); + }) + .map((version) => { + return { + title: version.tag, + value: version.version, + packUid: version.packUid, + }; }); - return packsData; + sortedVersions.forEach((version) => { + const parentTags = version?.parentTags || []; + const parent = parentTags.find(matchAmbiguousPatch); + if (!parent) return; + const parentVersion = roots.find((rootVersion) => rootVersion.title === parent); + if (parentVersion) { + parentVersion.children = parentVersion.children || []; + parentVersion.children.push({ + title: version.tag, + value: version.version, + packUid: version.packUid, + }); + } + }); + return roots; +} + +function generateCustomData(packsDescription) { + const generatedCustomData = packsDescription.reduce( + (obj, desc) => Object.assign(obj, { [desc.name]: desc.description }), + {} + ); + logger.info("Completed generating custom data description."); + return generatedCustomData; +} + +function generateRoutes(packsAllData) { + return packsAllData.map((pack) => { + const parentVersion = pack.versions.find((version) => { + return version.children.find((child) => child.title === pack.latestVersion); + }); + let path = `/integrations/packs/${pack.name}/${pack.latestVersion}`; + if (parentVersion && parentVersion.title) { + path = `${path}/${parentVersion.title}`; + } + return { + path: path, + exact: false, + component: "@site/src/components/PacksInformation", + metadata: { + sourceFilePath: "../docs/docs-content/integrations/packs.mdx", + }, + data: { name: pack.name, version: pack.latestVersion, parent: parentVersion?.title }, + }; + }); +} + +async function fetchPackListItems(queryParams, packDataArr, counter) { + const payload = { filter: { type: ["spectro", "oci"] } }; + const response = await callRateLimitAPI(() => api.post(`/v1/packs/search${queryParams}`, payload)); + const tempPackArr = packDataArr.concat(response?.data?.items); + if (response?.data?.listmeta?.continue) { + return fetchPackListItems( + `?limit=${filterLimit}&continue=` + response.data.listmeta.continue, + tempPackArr, + counter + ); + } else { + return tempPackArr; + } } -async function pluginPacksAndIntegrationsData() { +async function mapRepositories(repositories) { + const ociRegistries = await api.get("v1/registries/oci/summary"); + const packRegistries = await api.get("v1/registries/pack"); + const mergedRegistries = [ociRegistries.data?.items || [], packRegistries.data?.items || []]; + const results = mergedRegistries.flat(); + const repoMap = repositories.reduce((acc, repository) => { + const repoObj = results.find((repo) => { + return repo.metadata.name === repository; + }); + if (repoObj) { + acc.push({ name: repoObj.metadata.name, uid: repoObj.metadata.uid }); + } + return acc; + }, []); + return repoMap; +} + +async function write(res, packName, logoUrlMap) { + return new Promise((resolve, reject) => { + const type = res.headers.get("Content-Type"); + if (mime.extension(type) !== "html") { + const destination = path.resolve(logoDirname, packName); + const fileStream = createWriteStream(`${destination}.${mime.extension(type)}`); + res.body.pipe(fileStream); + res.body.on("error", (err) => { + reject(err); + }); + fileStream.on("finish", function () { + resolve(); + logoUrlMap[packName] = `${packName}.${mime.extension(type)}`; + }); + } else { + reject(`Invalid MIME type received for the logo ${packName}`); + } + }); +} + +async function getLogoUrl(packsAllData, logoUrlMap) { + for (let j = 0; j < packsAllData.length; j++) { + const registries = packsAllData[j].spec.registries; + const packName = packsAllData[j].spec.name; + for (let i = 0; i < registries.length; i++) { + const registry = registries[i]; + try { + let url = registry.logoUrl; + if (!url) { + url = `${BASE_URL}/v1/packs/${registry.latestPackUid}/logo`; + } else { + url = url.startsWith("https") ? url : url.startsWith("/") ? `${BASE_URL}${url}` : `${BASE_URL}/${url}`; + } + if (!Object.hasOwnProperty.call(logoUrlMap, packName)) { + const res = await fetch(url, options); + await write(res, packName, logoUrlMap); + counter++; + if (counter % 10 === 0) { + await setTimeout(1000); + } + } + } catch (e) { + // Intentionally ignoring errors here to continue processing other logos + // Enable the below line to log the error, if needed, for debugging. + // logger.error(e); + } + } + } +} + +async function pluginPacksAndIntegrationsData(context, options) { return { name: "plugin-packs-integrations", + async loadContent() { + const repositories = options.repositories || []; + const mappedRepos = await mapRepositories(repositories); + let apiPackResponse = {}; + let isFileExists = false; + if (existsSync(dirname) && existsSync(`${dirname}${filename}`)) { + isFileExists = true; + } + let logoUrlMap = {}; + if (!isFileExists) { + if (!existsSync(dirname)) { + mkdirSync(dirname, { recursive: true }); + } + logger.info("Fetching the list of packs from the Palette API"); + let packDataArr = await fetchPackListItems(`?limit=${filterLimit}`, [], 0); + + // Filter out the packs from the exclude list. + packDataArr = packDataArr.filter((pack) => { + if (excludeList.includes(pack.spec.name)) { + // Only uncomment if debugging is required + // logger.warn(`Pack ${pack.spec.name} is excluded from the list`); + return false; + } + return true; + }); + logger.info("Downloading each pack's details and README"); + packDataArr = packDataArr.filter((pack) => { + return ( + layerTypes.includes(pack.spec.layer) || + (pack.spec.layer === "addon" && addOnTypes.includes(pack.spec.addonType) && pack.spec.registries.length) + ); + }); + const packUrl = "v1/packs/"; + const packMDMap = new Map(); + let apiPacksData = []; + const promisesPackDetails = packDataArr.map((packData) => { + packMDMap[packData.spec.name] = packData; + const cloudType = packData.spec.cloudTypes.includes("all") ? "aws" : packData.spec.cloudTypes[0]; + const registryPackData = []; + for (const registry of packData.spec.registries) { + const url = `${packUrl}${packData.spec.name}/registries/${registry.uid}?cloudType=${cloudType}&layer=${packData.spec.layer}`; + registryPackData.push(callRateLimitAPI(() => api.get(url))); + } + return registryPackData; + }); + const flatted = promisesPackDetails.flat(); + const results = await Promise.allSettled(flatted); + apiPacksData = results + .filter((result) => result.status === "fulfilled" && result.value?.data) + .map((result) => result.value.data); + logger.info("Completed fetching all the packs and their details"); + logger.info("Fetching the logo for each pack"); + //Fetch logos + if (!existsSync(logoDirname)) { + mkdirSync(logoDirname, { recursive: true }); + } + await getLogoUrl(packDataArr, logoUrlMap); + logger.info("Completed fetching all pack logos"); + apiPackResponse.apiPacksData = apiPacksData; + apiPackResponse.packMDMap = packMDMap; + apiPackResponse.logoUrlMap = logoUrlMap; + open(`${dirname}${filename}`, "w+", (err, fd) => { + try { + writeFile(`${dirname}${filename}`, JSON.stringify(apiPackResponse), (err) => { + if (err) { + logger.error("An error occurred while writing the JSON file:", err); + } + }); + } finally { + close(fd, (err1) => { + if (err1) logger.error("An error occurred while closing the file:", err1); + }); + } + }); + } else { + try { + const data = await promises.readFile(`${dirname}${filename}`); + apiPackResponse = JSON.parse(data); + } catch (e) { + logger.error("An error occurred while reading the JSON file:", e); + } + } + logger.info(`The number of packs identified are ${Object.keys(apiPackResponse.packMDMap).length}`); + return { + packsPaletteData: apiPackResponse.packMDMap, + packsPaletteDetailsData: apiPackResponse.apiPacksData, + packsDescription: packDescription, + repositories: mappedRepos, + logoFilesPathMap: apiPackResponse.logoUrlMap, + }; + }, + async contentLoaded({ content, actions }) { + const { setGlobalData, addRoute } = actions; + const { packsPaletteData, packsPaletteDetailsData, packsDescription, repositories, logoFilesPathMap } = content; + const customPacksData = generateCustomData(packsDescription); + const unionPackData = combineAPICustomPackData( + packsPaletteData, + packsPaletteDetailsData, + customPacksData, + repositories, + logoFilesPathMap + ); + const routes = generateRoutes(unionPackData); + logger.info("Completed generating routes for all the packs"); + routes.map((route) => addRoute(route)); + setGlobalData({ packs: unionPackData, repositories: repositories }); + logger.success("Packs data successfully loaded 📦"); + }, async allContentLoaded({ allContent, actions }) { const { setGlobalData } = actions; const integrationsData = generateIntegrationData(allContent); - const packsData = generatePacksData(allContent); - setGlobalData({ integrations: integrationsData, packs: packsData }); + setGlobalData({ integrations: integrationsData }); }, }; } diff --git a/redirects.js b/redirects.js index 55a938d721..8343e554f1 100644 --- a/redirects.js +++ b/redirects.js @@ -83,10 +83,6 @@ const redirects = [ from: `/clusters/public-cloud/aks/`, to: `/clusters/public-cloud/azure/aks/`, }, - { - from: `/integrations/minio-operator/`, - to: `/integrations/`, - }, { from: `/knowledgebase/how-to/reverse-proxy-dashboard/`, to: `/clusters/cluster-management/kubernetes-dashboard/`, @@ -163,18 +159,10 @@ const redirects = [ from: `/clusters/edge/edgeforge-workflow/build-images/`, to: `/clusters/edge/edgeforge-workflow/palette-canvos/`, }, - { - from: `/integrations/ubuntu-k3s/`, - to: `/integrations/ubuntu/`, - }, { from: `/clusters/brownfield-clusters/`, to: `/clusters/imported-clusters/`, }, - { - from: `/integrations/oidc-eks/`, - to: `/integrations/kubernetes/`, - }, { from: `/clusters/palette-virtual-clusters/add-virtual-cluster-to-host-cluster/`, to: `/clusters/palette-virtual-clusters/deploy-virtual-cluster/`, @@ -299,10 +287,6 @@ const redirects = [ from: `/devx/app-profile/services/service-listings/cockroach-db/`, to: `/devx/services/service-listings/cockroach-db/`, }, - { - from: `/integrations/EKS-D/`, - to: `/integrations/`, - }, { from: `/enterprise-version/on-prem-system-requirements/`, to: `/enterprise-version/install-palette/`, @@ -533,6 +517,176 @@ const redirects = [ from: "/security-bulletins/cve-reports/", to: "/security-bulletins/reports/", }, + { + from: [ + "/integrations/antrea-cni", + "/integrations/aws-autoscaler", + "/integrations/aws-ebs", + "/integrations/aws-efs", + "/integrations/azure-cni", + "/integrations/azure-disk", + "/integrations/byoos", + "/integrations/calico", + "/integrations/centos", + "/integrations/certmanager", + "/integrations/cilium", + "/integrations/citrix-ipam", + "/integrations/collectord", + "/integrations/flannel-cni", + "/integrations/fluentbit", + "/integrations/frp", + "/integrations/gce", + "/integrations/grafana-spectrocloud-dashboards", + "/integrations/harbor-edge", + "/integrations/k3s", + "/integrations/konvoy", + "/integrations/kubernetes-dashboard", + "/integrations/kubernetes-edge", + "/integrations/kubernetes-generic", + "/integrations/longhorn", + "/integrations/metallb", + "/integrations/microk8s", + "/integrations/nfs-subdir-external", + "/integrations/opa-gatekeeper", + "/integrations/portworx", + "/integrations/portworx_operator", + "/integrations/prometheus-cluster-metrics", + "/integrations/rke2", + "/integrations/rook-ceph", + "/integrations/trident", + "/integrations/ubuntu", + "/integrations/vsphere-csi", + ], + to: "/integrations/", + }, + // { + // from: "/integrations/argo-cd/", + // to: "/integrations/packs/?pack=argo-cd", + // }, + // { + // from: "/integrations/cilium-tetragon", + // to: "/integrations/packs/?pack=cilium-tetragon", + // }, + // { + // from: "/integrations/cloudanix", + // to: "/integrations/packs/?pack=cloudanix", + // }, + // { + // from: "/integrations/dex", + // to: "/integrations/packs/?pack=dex", + // }, + // { + // from: "/integrations/external-dns", + // to: "/integrations/packs/?pack=external-dns", + // }, + // { + // from: "/integrations/external-secrets-operator", + // to: "/integrations/packs/?pack=external-secrets-operator", + // }, + // { + // from: "/integrations/falco", + // to: "/integrations/packs/?pack=falco", + // }, + // { + // from: "/integrations/generic-vm-libvirt", + // to: "/integrations/packs/?pack=generic-vm-libvirtlco", + // }, + // { + // from: "/integrations/generic-vm-vsphere", + // to: "/integrations/packs/?pack=generic-vm-vsphere", + // }, + // { + // from: "/integrations/heartbeat", + // to: "/integrations/packs/?pack=heartbeat", + // }, + // { + // from: "/integrations/hello-universe", + // to: "/integrations/packs/?pack=hello-universe", + // }, + // { + // from: "/integrations/istio", + // to: "/integrations/packs/?pack=istio", + // }, + // { + // from: "/integrations/kibana", + // to: "/integrations/packs/?pack=kibana", + // }, + // { + // from: "/integrations/kong", + // to: "/integrations/packs/?pack=kong", + // }, + // { + // from: "/integrations/kubebench", + // to: "/integrations/packs/?pack=kubebench", + // }, + // { + // from: "/integrations/kubehunter", + // to: "/integrations/packs/?pack=kubehunter", + // }, + // { + // from: "/integrations/kubernetes", + // to: "/integrations/packs/?pack=kubernetes", + // }, + // { + // from: "/integrations/kubevious", + // to: "/integrations/packs/?pack=kubevious", + // }, + // { + // from: "/integrations/kubevirt", + // to: "/integrations/packs/?pack=kubevirt", + // }, + // { + // from: "/integrations/kubewatch", + // to: "/integrations/packs/?pack=kubewatch", + // }, + // { + // from: "/integrations/multus-cni", + // to: "/integrations/packs/?pack=multus-cni", + // }, + // { + // from: "/integrations/nginx", + // to: "/integrations/packs/?pack=nginx", + // }, + // { + // from: "/integrations/ngrok", + // to: "/integrations/packs/?pack=ngrok", + // }, + // { + // from: "/integrations/nutanix-csi", + // to: "/integrations/packs/?pack=nutanix-csi", + // }, + // { + // from: "/integrations/openstack-cinder", + // to: "/integrations/packs/?pack=openstack-cinder", + // }, + // { + // from: "/integrations/permission-manager", + // to: "/integrations/packs/?pack=permission-manager", + // }, + // { + // from: "/integrations/prismacloud", + // to: "/integrations/packs/?pack=prismacloud", + // }, + // { + // from: "/integrations/prometheus-agent", + // to: "/integrations/packs/?pack=prometheus-agent", + // }, + // { + // from: "/integrations/prometheus-opeartor", + // to: "/integrations/packs/?pack=prometheus-operator", + // }, + // { + // from: "/integrations/spectro-k8s-dashboard", + // to: "/integrations/packs/?pack=spectro-k8s-dashboard", + // }, + // { + // from: "/integrations/vault", + // to: "/integrations/packs/?pack=vault", + // }, + // { + // from: "/integrations/vsphere-volume", + // to: "/integrations/packs/?pack=vsphere-volume", + // }, ]; module.exports = redirects; diff --git a/src/components/IconMapper/IconMapper.tsx b/src/components/IconMapper/IconMapper.tsx index 22c06aaa02..54180d2590 100644 --- a/src/components/IconMapper/IconMapper.tsx +++ b/src/components/IconMapper/IconMapper.tsx @@ -18,6 +18,21 @@ import RolesIcon from "@site/static/assets/icons/roles.svg"; import TeamsIcon from "@site/static/assets/icons/teams.svg"; import WorkspacesIcon from "@site/static/assets/icons/workspaces.svg"; import TerraformIcon from "@site/static/assets/icons/terraform.svg"; +import K8sIcon from "@site/static/assets/packs/k8s_layer.svg"; +import CniIcon from "@site/static/assets/packs/cni_layer.svg"; +import OsIcon from "@site/static/assets/packs/os_layer.svg"; +import ServiceMeshIcon from "@site/static/assets/packs/service_mesh_layer.svg"; +import MonitoringIcon from "@site/static/assets/packs/monitoring_layer.svg"; +import CsiIcon from "@site/static/assets/packs/csi_layer.svg"; +import LoggingIcon from "@site/static/assets/packs/logging_layer.svg"; +import LoadBalancerIcon from "@site/static/assets/packs/load_balancer_layer.svg"; +import IngressIcon from "@site/static/assets/packs/ingress_layer.svg"; +import AuthenticationIcon from "@site/static/assets/packs/authentication_layer.svg"; +import RegistryIcon from "@site/static/assets/packs/registry_layer.svg"; +import SystemAppIcon from "@site/static/assets/packs/system_app_layer.svg"; +import SecurityIcon from "@site/static/assets/packs/security_layer.svg"; +import AppServicesIcon from "@site/static/assets/packs/system_app_layer.svg"; +import MiscIcon from "@site/static/assets/packs/misc_layer.svg"; import { IconProp } from "@fortawesome/fontawesome-svg-core"; import { fontAwesomeIcons } from "./dynamicFontAwesomeImports"; @@ -44,6 +59,23 @@ export const icons: IconsMap = { teams: , workspaces: , terraform: , + integration: , + k8s: , + cni: , + os: , + servicemesh: , + monitoring: , + csi: , + logging: , + "load balancer": , + ingress: , + authentication: , + registry: , + "system app": , + spectro: , + security: , + serverless: , + "app services": , }; function IconMapper({ type }: { type: string }): React.ReactElement { diff --git a/src/components/IconMapper/dynamicFontAwesomeImports.js b/src/components/IconMapper/dynamicFontAwesomeImports.ts similarity index 100% rename from src/components/IconMapper/dynamicFontAwesomeImports.js rename to src/components/IconMapper/dynamicFontAwesomeImports.ts diff --git a/src/components/Integrations/AppTiers/AppTiers.tsx b/src/components/Integrations/AppTiers/AppTiers.tsx index b0dc850a4c..1e5c7228f9 100644 --- a/src/components/Integrations/AppTiers/AppTiers.tsx +++ b/src/components/Integrations/AppTiers/AppTiers.tsx @@ -1,5 +1,5 @@ import React from "react"; -import Integrations from "@site/src/components/Technologies"; +import Integrations from "@site/src/components/Technologies/AppPackList"; import { usePluginData } from "@docusaurus/useGlobalData"; import PacksIntegrationsPluginData from "../IntegrationTypes"; diff --git a/src/components/Integrations/IntegrationTypes.ts b/src/components/Integrations/IntegrationTypes.ts index beb6fa5e6f..926cf549b6 100644 --- a/src/components/Integrations/IntegrationTypes.ts +++ b/src/components/Integrations/IntegrationTypes.ts @@ -1,24 +1,37 @@ export interface FrontMatterData { - sidebar_label: string; + name: string; title: string; description: string; - hide_table_of_contents: boolean; type: string; category: string[]; logoUrl: string; slug: string; id: string; + packType: string; + verified: boolean; + cloudTypes: string[]; + packUidMap: Map; + versions: VersionTemplate[]; + community: boolean; + registries: string[]; + disabled: boolean; + latestVersion: string; } -export interface PacksData { - fields: FrontMatterData; +export interface VersionTemplate { + title: string; + version: string; + packUid: string; + children: VersionTemplate[]; } -export interface IntegrationsData { - fields: FrontMatterData; +export interface RepositoryData { + name: string; + uid: string; } export default interface PacksIntegrationsPluginData { - integrations: PacksData[]; - packs: IntegrationsData[]; + integrations: FrontMatterData[]; + packs: FrontMatterData[]; + repositories: RepositoryData[]; } diff --git a/src/components/Integrations/Packs/Packs.tsx b/src/components/Integrations/Packs/Packs.tsx index 3fa934d4b8..439b8c6ab2 100644 --- a/src/components/Integrations/Packs/Packs.tsx +++ b/src/components/Integrations/Packs/Packs.tsx @@ -4,6 +4,6 @@ import { usePluginData } from "@docusaurus/useGlobalData"; import PacksIntegrationsPluginData from "../IntegrationTypes"; export default function Packs() { - const { packs } = usePluginData("plugin-packs-integrations") as PacksIntegrationsPluginData; - return ; + const { packs, repositories } = usePluginData("plugin-packs-integrations") as PacksIntegrationsPluginData; + return ; } diff --git a/src/components/PacksInformation/PacksInformation.tsx b/src/components/PacksInformation/PacksInformation.tsx new file mode 100644 index 0000000000..80be2d66ab --- /dev/null +++ b/src/components/PacksInformation/PacksInformation.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import PacksReadme from "@site/src/components/PacksReadme/PacksReadme"; +import { Switch, Redirect } from "react-router-dom"; + +interface Packs { + route: PacksData; +} + +interface PacksData { + data: { + name: string; + version: string; + parent: string; + }; +} + +export default function Packs(props: Packs) { + return ( + <> + {props?.route?.data ? ( + + + + ) : ( + + )} + + ); +} diff --git a/src/components/PacksInformation/index.ts b/src/components/PacksInformation/index.ts new file mode 100644 index 0000000000..e2877bba87 --- /dev/null +++ b/src/components/PacksInformation/index.ts @@ -0,0 +1,3 @@ +import PacksInformation from "./PacksInformation"; + +export default PacksInformation; diff --git a/src/components/PacksReadme/PacksReadme.antd.css b/src/components/PacksReadme/PacksReadme.antd.css new file mode 100644 index 0000000000..67b6d1299c --- /dev/null +++ b/src/components/PacksReadme/PacksReadme.antd.css @@ -0,0 +1,12 @@ +.ant-list-header { + padding-bottom: 0px; + font-size: 16px; + font-weight: bold; +} +p { + font-size: 16px; +} +[data-theme="dark"] .ant-select-tree-list-holder-inner { + background-color: #1f1f1f; + color: whitesmoke; +} diff --git a/src/components/PacksReadme/PacksReadme.module.scss b/src/components/PacksReadme/PacksReadme.module.scss new file mode 100644 index 0000000000..b753d705e3 --- /dev/null +++ b/src/components/PacksReadme/PacksReadme.module.scss @@ -0,0 +1,174 @@ +.wrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .tabPane { + padding-top: 15px; + font-size: 16px; + width: 100%; + } + + .customReadme { + h2[id="versions-supported"] { + display: none; + + div > ul { + display: none; + } + } + } + + .warningSection { + margin-top: 1em; + } + + .emptyContent { + padding-top: 20px; + display: flex; + flex-direction: column; + text-align: center; + align-items: center; + + .emptyContentTitle { + padding-top: 15px; + font-size: 20px; + font-weight: 500; + line-height: 24px; + } + + .emptyContentDescription { + font-size: 16px; + color: #545f7e; + font-weight: 400; + line-height: 24px; + margin-top: 10px; + } + } + + .description { + display: flex; + width: 100%; + padding: 10px; + + .packDescFirstCol { + display: flex; + flex-direction: column; + width: 70%; + + .packName { + font-size: 16px; + font-weight: 600; + line-height: 20px; + } + + .descriptionContent { + display: flex; + height: 100%; + font-size: 14px; + font-weight: 400; + align-items: center; + + .packIcon { + height: 100%; + } + + .customDesc { + padding-top: 12px; + padding-left: 16px; + width: 85%; + } + } + } + + .packDescSecondCol { + display: flex; + flex-direction: column; + width: 30%; + padding: 10px; + + .versionSelect { + height: max-content; + display: flex; + flex-direction: row; + padding: 10px; + } + + .versionSelectBox { + width: 300px; + } + + .packDesc { + display: flex; + flex-direction: column; + font-size: 12px; + font-weight: 400; + line-height: 16px; + + .packDescItem { + padding-top: 8px; + padding-left: 5px; + } + } + } + @media (max-width: 768px) { + .packDescFirstCol { + width: 100%; + padding-bottom: 12px; + } + .packDescSecondCol { + width: 100%; + .versionSelectBox { + width: 200px; + } + } + } + } + @media (max-width: 768px) { + .description { + display: flex; + flex-direction: column; + justify-content: space-between; + } + } +} +[data-theme="dark"] .description { + background-color: #1c202b; +} +[data-theme="light"] .description { + background-color: #edeef4; +} +[data-theme="dark"] .packDescSecondCol { + background-color: black; + border: 1px solid #1f263c; +} +[data-theme="light"] .packDescSecondCol { + background-color: white; + border: 1px solid #dee1ea; +} +[data-theme="light"] .emptyContentDescription { + color: #545f7e; +} +[data-theme="dark"] .emptyContentDescription { + color: #b5bdd4; + background-color: #111726; +} +[data-theme="dark"] .emptyContentTitle { + color: #b5bdd4; + background-color: #111726; +} +[data-theme="light"] .emptyContentTitle { + color: #545f7e; +} +[data-theme="light"] .content { + color: #545f7e; +} +[data-theme="dark"] .content { + color: #b5bdd4; +} +[data-theme="dark"] .versionSelect { + border: 1px solid #1f263c; +} +[data-theme="light"] .versionSelect { + border: 1px solid #b6bed4; +} diff --git a/src/components/PacksReadme/PacksReadme.tsx b/src/components/PacksReadme/PacksReadme.tsx new file mode 100644 index 0000000000..96aa1d5d02 --- /dev/null +++ b/src/components/PacksReadme/PacksReadme.tsx @@ -0,0 +1,306 @@ +import React, { useEffect, useState, useMemo, ReactElement } from "react"; +import styles from "./PacksReadme.module.scss"; +import { Tabs, ConfigProvider, theme, TreeSelect } from "antd"; +import CustomLabel from "../Technologies/CategorySelector/CustomLabel"; +import PackCardIcon from "../Technologies/PackCardIcon"; +import Markdown from "markdown-to-jsx"; +import { useHistory } from "react-router-dom"; +import "./PacksReadme.antd.css"; +import { usePluginData } from "@docusaurus/useGlobalData"; +import PacksIntegrationsPluginData from "../Integrations/IntegrationTypes"; +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import { useColorMode } from "@docusaurus/theme-common"; +import { packTypeNames, cloudDisplayNames } from "../../constants/packs"; +import Admonition from "@theme/Admonition"; + +interface PackReadmeProps { + customDescription: string; + packUidMap: Record; + versions: Version[]; + title: string; + logoUrl: string; + type: string; + provider: Array; + registries: Array; + selectedRepositories: Array<{ uid: string; name: string }>; + disabled: boolean; + latestVersion: string; +} +interface MarkdownFile { + default: React.FC; +} + +interface Version { + title: string; + children: Array<{ + title: string; + packUid: string; + }>; +} + +interface PackData { + customDescription: string; + packUidMap: Record; + versions: Version[]; + title: string; + logoUrl: string; + type: string; + provider: Array; + registries: Array; + selectedRepositories: Array<{ uid: string; name: string }>; + disabled: boolean; + latestVersion: string; +} + +export default function PacksReadme() { + const { packs, repositories } = usePluginData("plugin-packs-integrations") as PacksIntegrationsPluginData; + const [customReadme, setCustomReadme] = useState | null>(null); + const [packName, setPackName] = useState(""); + const [selectedPackUid, setSelectedPackUid] = useState(""); + const empty_icon_light = useBaseUrl("/img/empty_icon_table_light.svg"); + const empty_icon_dark = useBaseUrl("/img/empty_icon_table_dark.svg"); + const { colorMode } = useColorMode(); + const { defaultAlgorithm, darkAlgorithm } = theme; + const [selectedVersion, setSelectedVersion] = useState(""); + const history = useHistory(); + + useEffect(() => { + const searchParams = window ? new URLSearchParams(window.location.search) : null; + const pckName = searchParams?.get("pack") || ""; + setPackName(pckName); + const importComponent = async () => { + try { + const module: MarkdownFile = await import(`../../../docs/docs-content/integrations/${pckName}.md`); + const PackReadMeComponent = module.default; + setCustomReadme( +
+ +
+ ); + } catch (error) { + setCustomReadme(null); + } + }; + importComponent().catch((e) => { + console.error("Error importing custom readme component for pack. Additional information follows: \n", e); + }); + }, []); + + const packData: PackData = useMemo(() => { + const pack = packs.find((pack) => pack.name === packName); + if (pack) { + const packDataInfo: PackReadmeProps = { + customDescription: pack.description, + packUidMap: pack.packUidMap, + versions: pack.versions, + title: pack.title, + logoUrl: pack.logoUrl, + type: pack.packType, + provider: pack.cloudTypes, + registries: pack.registries, + selectedRepositories: repositories, + disabled: pack.disabled, + latestVersion: pack.latestVersion, + }; + return packDataInfo; + } + return { + customDescription: "", + packUidMap: {}, + versions: [], + title: "", + logoUrl: "", + type: "", + provider: [], + selectedRepositories: [], + registries: [], + disabled: false, + latestVersion: "", + }; + }, [packName]); + + useEffect(() => { + const searchParams = window ? new URLSearchParams(window.location.search) : null; + const urlParamVersion = searchParams?.get("version"); + const version = urlParamVersion || packData?.latestVersion || packData?.versions[0]?.title || ""; + if (version && !version.endsWith(".x")) { + const parentVersionObj = getParentVersion(version); + const packDataObj = parentVersionObj?.children.find((child) => child.title === version); + if (packDataObj) { + setSelectedPackUid(packDataObj.packUid); + setSelectedVersion(version); + } + } + }, [packData]); + + function versionChange(item: string) { + const [version, packUid] = item.split("==="); + const parentVersion = getParentVersion(version)?.title || ""; + history.replace({ search: `?pack=${packName}&version=${version}&parent=${parentVersion}` }); + setSelectedVersion(version); + setSelectedPackUid(packUid); + } + + function getParentVersion(version: string) { + return packData.versions.find((tagVersion) => tagVersion.children.find((child) => child.title === version)); + } + + function compareVersions(v1: string, v2: string): number { + const v1Parts = v1.split(".").map(Number); + const v2Parts = v2.split(".").map(Number); + + for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) { + const v1Part = v1Parts[i] || 0; + const v2Part = v2Parts[i] || 0; + + if (v1Part < v2Part) { + return 1; + } + if (v1Part > v2Part) { + return -1; + } + } + + return 0; + } + + function renderVersionOptions() { + return packData.versions + .sort((a, b) => compareVersions(a.title, b.title)) + .map((tagVersion) => ({ + value: tagVersion.title, + title: tagVersion.title, + selectable: false, + children: tagVersion.children + .sort((a, b) => compareVersions(a.title, b.title)) + .map((child) => ({ + value: `${child.title}===${child.packUid}`, + title: {child.title}, + })), + })); + } + + function renderTabs() { + const readme = selectedPackUid ? packData.packUidMap[selectedPackUid]?.readme : ""; + const tabs = [ + readme && { + label: `README`, + key: "1", + children: {readme}, + }, + customReadme && { + label: `Additional Details`, + key: "2", + children: customReadme, + }, + ].filter(Boolean) as { label: string; key: string; children: JSX.Element }[]; + + if (tabs.length > 1) { + return ( + + {tabs.map((item) => ( + + {item.children} + + ))} + + ); + } + if (tabs.length === 1) { + return tabs[0].children; + } + return ( +
+ +
No README found
+
+ ); + } + + function getProviders() { + if (packData.provider.includes("all")) { + return "All"; + } + + return packData.provider + .map((provider) => cloudDisplayNames[provider as keyof typeof cloudDisplayNames] || provider) + .join(", "); + } + + function getRegistries() { + if (selectedVersion && !selectedVersion.endsWith(".x")) { + const registryUid = packData.packUidMap[selectedPackUid]?.registryUid || ""; + const registry = packData.selectedRepositories.find((registry) => registry.uid === registryUid); + return registry ? registry.name : ""; + } + const consolidatedRegistries = packData.registries.reduce((accumulator, registry) => { + const regObj = packData.selectedRepositories.find((repo) => repo.uid === registry); + if (regObj) { + accumulator.push(regObj.name); + } + return accumulator; + }, []); + return consolidatedRegistries.join(", "); + } + + return ( +
+
+
+
{packData.title}
+
+ +
{packData.customDescription}
+
+
+
+
+ + versionChange(item)} + treeData={renderVersionOptions()} + /> +
+
+
{`Type: ${packTypeNames[packData.type]}`}
+
{`Cloud Providers: ${getProviders()}`}
+
{`Registry: ${getRegistries()}`}
+
+
+
+
+ {packData.disabled ? ( + + Pack version v{selectedVersion} is disabled. Upgrade to a newer version to take advantage + of new features. + + ) : selectedPackUid && packData.packUidMap[selectedPackUid]?.deprecated ? ( + + Pack version v{selectedVersion} is deprecated. Upgrade to a newer version to take advantage + of new features. + + ) : null} +
+
+ + {renderTabs()} + +
+
+ ); +} diff --git a/src/components/PacksTable/PacksTable.tsx b/src/components/PacksTable/PacksTable.tsx index f96534c7ab..685daaa994 100644 --- a/src/components/PacksTable/PacksTable.tsx +++ b/src/components/PacksTable/PacksTable.tsx @@ -137,6 +137,7 @@ const FilteredTable: React.FC = () => { const [deprecatedPacks, setDeprecatedPacks] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); + const [timer, setTimer] = useState(null); useEffect(() => { fetch("/packs-data/packs_report.json") @@ -163,15 +164,20 @@ const FilteredTable: React.FC = () => { }); }, []); - const handleSearch = useCallback((e: React.ChangeEvent) => { - const value = e.target.value; - // Delay the update to the search value by 300ms to debounce the search - const timer = setTimeout(() => { - setSearchValue(value); - }, 300); + const handleSearch = useCallback( + (searchString: string) => { + if (timer) { + clearTimeout(timer); + } - return () => clearTimeout(timer); - }, []); + const newTimer = setTimeout(() => { + setSearchValue(searchString); + }, 300); + + setTimer(newTimer); + }, + [timer] + ); const filteredPacks = searchValue ? deprecatedPacks.filter((pack) => pack.displayName.toLowerCase().includes(searchValue.toLowerCase())) diff --git a/src/components/Technologies/AppPackList.tsx b/src/components/Technologies/AppPackList.tsx new file mode 100644 index 0000000000..ada0f10d58 --- /dev/null +++ b/src/components/Technologies/AppPackList.tsx @@ -0,0 +1,80 @@ +import React, { useState, useMemo } from "react"; +import Fuse from "fuse.js"; +import styles from "./Technologies.module.scss"; +import Search from "./Search"; +import CategorySelector from "./CategorySelector/CategorySelector"; +import { FrontMatterData } from "../Integrations/IntegrationTypes"; +import TechnologyCard from "./TechnologyCard"; + +const searchOptions = { + threshold: 0.5, + keys: ["title"], +}; + +interface TechnologiesProps { + data: FrontMatterData[]; +} + +export default function Technologies({ data }: TechnologiesProps) { + const [selectedCategory, setSelectedCategory] = useState("all"); + const [searchValue, setSearchValue] = useState(""); + + const categories = useMemo(() => { + const categoriesSet = data.reduce( + (accumulator, technology) => { + const categories = technology.category || []; + categories.forEach((category) => { + accumulator.add(category); + }); + return accumulator; + }, + new Set(["all"]) + ); + return new Set([...categoriesSet].sort()); + }, [data]); + + const technologies = useMemo(() => { + let technologies = [...data].sort((pack1, pack2) => { + const category1 = pack1.category[0]; + const category2 = pack2.category[0]; + + if (category1 < category2) { + return -1; + } + + if (category1 > category2) { + return 1; + } + + return 0; + }); + + if (searchValue) { + const fuse = new Fuse(technologies, searchOptions); + technologies = fuse.search(searchValue).map(({ item }) => item); + } + + if (selectedCategory !== "all") { + technologies = technologies.filter((field) => field.category.includes(selectedCategory)) || []; + } + + return technologies; + }, [data, searchValue, selectedCategory]); + + const onSearch = (value: string) => { + setSearchValue(value); + }; + + return ( +
+ + +
+ {technologies.map((field) => { + const { title, slug, logoUrl } = field; + return ; + })} +
+
+ ); +} diff --git a/src/components/Technologies/CategorySelector/CategorySelector.module.scss b/src/components/Technologies/CategorySelector/CategorySelector.module.scss index efc4875655..b1a4ff7a25 100644 --- a/src/components/Technologies/CategorySelector/CategorySelector.module.scss +++ b/src/components/Technologies/CategorySelector/CategorySelector.module.scss @@ -3,6 +3,10 @@ flex-wrap: wrap; margin-top: 15px; margin-bottom: 15px; + align-items: center; + .selectBox { + width: 200px; + } .selectorCard { padding: 4px 12px; background: var(--ifm-breadcrumb-item-background-active); diff --git a/src/components/Technologies/CategorySelector/CategorySelector.test.tsx b/src/components/Technologies/CategorySelector/CategorySelector.test.tsx deleted file mode 100644 index d728c06eca..0000000000 --- a/src/components/Technologies/CategorySelector/CategorySelector.test.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import { render, fireEvent, screen } from "@testing-library/react"; -import CategorySelector from "./CategorySelector"; - -describe("CategorySelector Component", () => { - const mockSelectCategory = jest.fn(); - const categories = ["all", "category_one", "category_two"]; - - beforeEach(() => { - render(); - }); - - it("renders all categories", () => { - categories.forEach((category) => { - expect(screen.getByText(category.split("_").join(" "))).toBeInTheDocument(); - }); - }); - - it("indicates which category is selected", () => { - const selectedCategory = screen.getByText("all"); - expect(selectedCategory).toHaveClass("isSelected"); - }); - - it("calls the selectCategory function with the correct argument when clicked", () => { - const unselectedCategory = screen.getByText("category one"); - fireEvent.click(unselectedCategory); - expect(mockSelectCategory).toHaveBeenCalledWith("category_one"); - }); -}); diff --git a/src/components/Technologies/CategorySelector/CustomLabel.module.scss b/src/components/Technologies/CategorySelector/CustomLabel.module.scss new file mode 100644 index 0000000000..c97ead249d --- /dev/null +++ b/src/components/Technologies/CategorySelector/CustomLabel.module.scss @@ -0,0 +1,17 @@ +.customLabel { + font-size: 14px; + height: 32px; + align-self: center; + padding-top: 5px; + padding-left: 5px; + padding-right: 5px; +} +[data-theme="dark"] .customLabel { + color: white; + background-color: #1c202b; +} + +[data-theme="light"] .customLabel { + color: black; + background-color: #dee1ea; +} diff --git a/src/components/Technologies/CategorySelector/CustomLabel.tsx b/src/components/Technologies/CategorySelector/CustomLabel.tsx new file mode 100644 index 0000000000..162fda9468 --- /dev/null +++ b/src/components/Technologies/CategorySelector/CustomLabel.tsx @@ -0,0 +1,15 @@ +import React from "react"; +import styles from "./CustomLabel.module.scss"; + +interface CustomLabelProps { + label: string; + className?: string; +} + +export default function CustomLabel({ label, className = "" }: CustomLabelProps) { + return ( + <> +
{label}
+ + ); +} diff --git a/src/components/Technologies/CategorySelector/FilterSelect.tsx b/src/components/Technologies/CategorySelector/FilterSelect.tsx new file mode 100644 index 0000000000..58d091f465 --- /dev/null +++ b/src/components/Technologies/CategorySelector/FilterSelect.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { Select, SelectProps } from "antd"; +import filterStyles from "./CategorySelector.module.scss"; +import "./filterSelect.antd.css"; + +interface FilterSelectProps { + selectMode?: SelectProps["mode"]; + options: { value: string; label: string }[]; + onChange: (...args: any) => void; + value: SelectProps["value"]; +} + +export default function FilterSelect({ selectMode, options, onChange, value }: FilterSelectProps) { + return ( +
+ +
+ ); +} diff --git a/src/components/Technologies/CategorySelector/filterSelect.antd.css b/src/components/Technologies/CategorySelector/filterSelect.antd.css new file mode 100644 index 0000000000..28bc723909 --- /dev/null +++ b/src/components/Technologies/CategorySelector/filterSelect.antd.css @@ -0,0 +1,52 @@ +[data-theme="dark"] .ant-select-outlined:not(.ant-select-customize-input) .ant-select-selector { + border: 1px solid #424242; + background: #141414; +} +[data-theme="dark"] .ant-select-selection-placeholder { + color: #6a6d76; +} +[data-theme="dark"] .ant-select-arrow { + color: #6a6d76; +} +[data-theme="dark"] .ant-select-item-option { + color: whitesmoke; +} +[data-theme="dark"] .rc-virtual-list { + background-color: #1f1f1f; +} +[data-theme="dark"] .ant-select-dropdown { + background-color: #1f1f1f; +} +[data-theme="dark"] .ant-select-dropdown .ant-select-item-option-selected:not(.ant-select-item-option-disabled) { + background-color: #111a2c; + color: whitesmoke; +} +[data-theme="dark"] + .ant-select-dropdown + .ant-select-item-option-selected:not(.ant-select-item-option-disabled) + .ant-select-item-option-state { + color: #1668dc; +} +[data-theme="dark"] .ant-select:not(.ant-select-customize-input) .ant-select-selector { + background-color: #1f1f1f; +} +[data-theme="dark"] .ant-select-multiple { + .ant-select-selection-item { + color: #d6d0d0; + background-color: #313131; + } + .ant-select-selection-overflow .ant-select-selection-item-remove { + color: #d6d0d0; + } +} +[dark-theme="dark"] .ant-select-multiple .ant-select-selection-overflow .ant-select-selection-item-remove { + color: #d6d0d0; +} +[data-theme="dark"] .ant-select-clear { + color: #b1adad; + background-color: #1f1f1f; +} +[data-theme="dark"] .ant-select-single .ant-select-selector { + color: #d6d0d0; + background-color: #1f1f1f; +} diff --git a/src/components/Technologies/CategorySelector/index.ts b/src/components/Technologies/CategorySelector/index.ts deleted file mode 100644 index 4da20365ba..0000000000 --- a/src/components/Technologies/CategorySelector/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import CategorySelector from "./CategorySelector"; - -export default CategorySelector; diff --git a/src/components/Technologies/PackCardIcon.module.scss b/src/components/Technologies/PackCardIcon.module.scss new file mode 100644 index 0000000000..0dd530123d --- /dev/null +++ b/src/components/Technologies/PackCardIcon.module.scss @@ -0,0 +1,13 @@ +.imageWrapper { + display: flex; + justify-content: center; + align-items: center; + margin: 5px 0 5px; + max-width: 52px; + max-height: 52px; + align-self: center; + svg { + width: 52px; + height: 52px; + } +} diff --git a/src/components/Technologies/PackCardIcon.tsx b/src/components/Technologies/PackCardIcon.tsx new file mode 100644 index 0000000000..e6ae29aa82 --- /dev/null +++ b/src/components/Technologies/PackCardIcon.tsx @@ -0,0 +1,31 @@ +import React, { useState, useEffect, ReactElement } from "react"; +import styles from "./PackCardIcon.module.scss"; +import IconMapper from "@site/src/components/IconMapper/IconMapper"; +import Image from "@theme/IdealImage"; +interface PackCardIconProps { + appType?: string; + logoUrl?: string; + type?: any; + className?: any; +} + +export default function PackCardIcon({ appType, logoUrl, type, className }: PackCardIconProps) { + const [icon, setIcon] = useState(null); + useEffect(() => { + if (logoUrl) { + try { + if (appType === "app") { + setIcon(); + } else { + setIcon(); + } + } catch (e) { + type ? setIcon() : setIcon(null); + } + } else { + type ? setIcon() : setIcon(null); + } + }, [logoUrl]); + + return
{icon}
; +} diff --git a/src/components/Technologies/PackFilters.module.scss b/src/components/Technologies/PackFilters.module.scss new file mode 100644 index 0000000000..d607428991 --- /dev/null +++ b/src/components/Technologies/PackFilters.module.scss @@ -0,0 +1,8 @@ +.wrapper { + display: flex; + flex-wrap: wrap; + .filterItems { + display: flex; + padding-right: 10px; + } +} diff --git a/src/components/Technologies/PacksFilters.tsx b/src/components/Technologies/PacksFilters.tsx new file mode 100644 index 0000000000..28ea4b8256 --- /dev/null +++ b/src/components/Technologies/PacksFilters.tsx @@ -0,0 +1,107 @@ +import React from "react"; +import styles from "./PackFilters.module.scss"; +import CustomLabel from "./CategorySelector/CustomLabel"; +import FilterSelect from "./CategorySelector/FilterSelect"; +import "./packsFilters.antd.css"; +import { packTypeNames, cloudProviderTypes } from "../../constants/packs"; + +interface PackFiltersProps { + categories: string[]; + registries: registry[]; + setSelectedSearchFilters: (filters: SelectedFilters) => void; + selectedFilters: SelectedFilters; +} + +interface registry { + uid: string; + name: string; +} + +interface sources { + label: string; + value: string; +} + +interface SelectedFilters { + category: string[]; + registries: string[]; + cloudTypes: string[]; + source: string[]; +} + +const sourceList: sources[] = [ + { + label: "All", + value: "all", + }, + { + label: "Verified", + value: "verified", + }, + { + label: "Community", + value: "community", + }, +]; + +export default function PacksFilters({ + categories, + registries, + setSelectedSearchFilters, + selectedFilters, +}: PackFiltersProps) { + return ( +
+
+ + { + return { value: category, label: packTypeNames[category] }; + })} + onChange={(items) => setSelectedSearchFilters({ ...selectedFilters, category: items as string[] })} + value={selectedFilters.category} + /> +
+
+ + { + return { value: registry.uid, label: registry.name }; + })} + onChange={(items) => setSelectedSearchFilters({ ...selectedFilters, registries: items as string[] })} + value={selectedFilters.registries} + /> +
+
+ + { + return { value: provider.name, label: provider.displayName }; + })} + onChange={(item) => { + setSelectedSearchFilters({ + ...selectedFilters, + cloudTypes: item ? [item as string] : [], + }); + }} + value={selectedFilters.cloudTypes.length ? selectedFilters.cloudTypes[0] : undefined} + /> +
+
+ + { + setSelectedSearchFilters({ + ...selectedFilters, + source: item ? [item as string] : [], + }); + }} + value={selectedFilters.source.length ? selectedFilters.source[0] : undefined} + /> +
+
+ ); +} diff --git a/src/components/Technologies/Search/Search.tsx b/src/components/Technologies/Search/Search.tsx index c471eaa8c2..41d465ed81 100644 --- a/src/components/Technologies/Search/Search.tsx +++ b/src/components/Technologies/Search/Search.tsx @@ -1,17 +1,20 @@ -import React, { useRef, useState } from "react"; +import React, { useRef, useState, useEffect } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import styles from "./Search.module.scss"; import { faSearch, faTimes } from "@fortawesome/free-solid-svg-icons"; interface IntegrationSearchProps { - onSearch: (searchString: React.ChangeEvent) => void; + onSearch: (searchString: string) => void; placeholder: string; + value?: string; } -export default function IntegrationSearch({ onSearch, placeholder }: IntegrationSearchProps) { +export default function IntegrationSearch({ onSearch, placeholder, value = "" }: IntegrationSearchProps) { const [inputValue, setInputValue] = useState(""); const ref = useRef(null); - + useEffect(() => { + setInputValue(value); + }, [value]); return (
@@ -22,7 +25,7 @@ export default function IntegrationSearch({ onSearch, placeholder }: Integration value={inputValue} onChange={(e) => { setInputValue(e.target.value); - onSearch(e); + onSearch(e.target.value); }} /> { setInputValue(""); + onSearch(""); ref.current?.focus(); }} /> diff --git a/src/components/Technologies/Technologies.module.scss b/src/components/Technologies/Technologies.module.scss index ae777eea6a..be613fce68 100644 --- a/src/components/Technologies/Technologies.module.scss +++ b/src/components/Technologies/Technologies.module.scss @@ -1,9 +1,12 @@ .wrapper { padding: 15px 0; .technologyWrapper { - display: flex; - flex-wrap: wrap; margin-top: 32px; + display: flex; + svg { + vertical-align: bottom; + margin-right: 5px; + } } .imageWrapper { display: flex; @@ -13,11 +16,6 @@ width: 100%; margin: 5px 0 5px; } - - .imageWrapper > img { - max-height: 100%; - max-width: 100%; - } .card { width: 120px; height: 120px; @@ -34,6 +32,11 @@ 0px 0px 2px rgba(0, 0, 0, 0.2), 0px 2px 0px rgba(0, 0, 0, 0.2); border-radius: 8px; + cursor: pointer; + .cardContent { + display: flex; + flex-direction: column; + } } .title { @@ -44,4 +47,14 @@ text-align: center; word-break: break-word; } + .ant-collapse { + width: 100%; + border: 0 none; + background: white; + } +} +.ant-collapse { + width: 100%; + border: 0 none; + background: white; } diff --git a/src/components/Technologies/Technologies.test.tsx b/src/components/Technologies/Technologies.test.tsx index c7ffc9be58..b40922afb0 100644 --- a/src/components/Technologies/Technologies.test.tsx +++ b/src/components/Technologies/Technologies.test.tsx @@ -1,6 +1,7 @@ import React from "react"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import Technologies from "./Technologies"; // Replace with your actual import +import { FrontMatterData, RepositoryData } from "../Integrations/IntegrationTypes"; /* * TODO: Docusaurus Link import not resolving in Jest, @@ -20,38 +21,61 @@ jest.mock("./TechnologyCard", () => { }); }); -const mockData = [ +const mockData: FrontMatterData[] = [ { - fields: { - title: "React", - description: "A JavaScript library for building user interfaces", - hide_table_of_contents: false, - type: "library", - category: ["frontend"], - logoUrl: "react-logo.png", - slug: "/react", - id: "1", - sidebar_label: "React.js", - }, + name: "React", + title: "React", + description: "A JavaScript library for building user interfaces", + type: "library", + category: ["frontend"], + logoUrl: "react-logo.png", + slug: "/react", + id: "1", + packType: "library", // Example value, adjust as needed + verified: true, // Example value, adjust as needed + cloudTypes: ["cloudA", "cloudB"], // Example values, adjust as needed + packUidMap: new Map(), // Initialize as empty map + versions: [], // Initialize as empty array + community: true, // Example value, adjust as needed + registries: ["npm"], // Example values, adjust as needed + disabled: false, // Example value, adjust as needed + latestVersion: "17.0.2", // Example value, adjust as needed }, { - fields: { - title: "Node.js", - description: "JavaScript runtime built on Chrome's V8 JavaScript engine", - hide_table_of_contents: false, - type: "runtime", - category: ["backend"], - logoUrl: "nodejs-logo.png", - slug: "/nodejs", - id: "2", - sidebar_label: "Node", - }, + name: "Node.js", + title: "Node.js", + description: "JavaScript runtime built on Chrome's V8 JavaScript engine", + type: "runtime", + category: ["backend"], + logoUrl: "nodejs-logo.png", + slug: "/nodejs", + id: "2", + packType: "runtime", // Example value, adjust as needed + verified: true, // Example value, adjust as needed + cloudTypes: ["cloudA", "cloudB"], // Example values, adjust as needed + packUidMap: new Map(), // Initialize as empty map + versions: [], // Initialize as empty array + community: true, // Example value, adjust as needed + registries: ["64eaff453040297344bcad5d", "5eecc89d0b150045ae661cef"], // Example values, adjust as needed + disabled: false, // Example value, adjust as needed + latestVersion: "14.17.0", // Example value, adjust as needed + }, +]; + +const mockRepositories: RepositoryData[] = [ + { + name: "Palette Registry", + uid: "64eaff453040297344bcad5d", + }, + { + name: "Community Registry", + uid: "5eecc89d0b150045ae661cef", }, ]; describe("", () => { it("should filter technologies based on search", async () => { - render(); + render(); fireEvent.change(screen.getByRole("textbox"), { target: { value: "React" } }); @@ -61,39 +85,4 @@ describe("", () => { expect(screen.getByText("React")).toBeInTheDocument(); expect(screen.queryByText("Node.js")).not.toBeInTheDocument(); }); - - it("searches the technologies and checks if React is rendered", async () => { - render(); - - // Simulate a user clicking the "frontend" category - fireEvent.click(screen.getByText("frontend")); - - // Wait for the DOM to update - await waitFor(() => {}, { timeout: 300 }); - - // Check if React is displayed after selecting the "frontend" category - expect(screen.getByText("React")).toBeInTheDocument(); - - // Optionally, check if other technologies are not displayed - expect(screen.queryByText("Node.js")).not.toBeInTheDocument(); - }); - - it("searches the technologies using the input field and checks if React.js is rendered with Fuse search", async () => { - render(); - - // Get the input field by its role - const searchInput = screen.getByRole("textbox"); - - // Simulate a user typing "React.js" into the search input - fireEvent.change(searchInput, { target: { value: "React.js" } }); - - // Wait for the DOM to update - await waitFor(() => {}, { timeout: 300 }); - - // Check if React.js is displayed after searching for it - expect(screen.getByText("React")).toBeInTheDocument(); - - // Optionally, check if other technologies are not displayed - expect(screen.queryByText("Node.js")).not.toBeInTheDocument(); - }); }); diff --git a/src/components/Technologies/Technologies.tsx b/src/components/Technologies/Technologies.tsx index b0a8cdb156..ce4bd62303 100644 --- a/src/components/Technologies/Technologies.tsx +++ b/src/components/Technologies/Technologies.tsx @@ -1,79 +1,223 @@ -import React, { useState, useMemo } from "react"; +import React, { useState, useMemo, useEffect } from "react"; import Fuse from "fuse.js"; import styles from "./Technologies.module.scss"; import Search from "./Search"; -import CategorySelector from "./CategorySelector"; -import { PacksData, IntegrationsData } from "../Integrations/IntegrationTypes"; +import { FrontMatterData } from "../Integrations/IntegrationTypes"; import TechnologyCard from "./TechnologyCard"; +import PacksFilters from "./PacksFilters"; +import { packTypeNames, packTypes } from "../../constants/packs"; +import { Collapse } from "antd"; +import "./technologies.antd.css"; +import IconMapper from "../IconMapper/IconMapper"; -const searchOptions = { +const searchOptions: Fuse.IFuseOptions = { threshold: 0.5, - keys: ["fields.title"], + keys: ["title"], }; interface TechnologiesProps { - data: PacksData[] | IntegrationsData[]; + data: FrontMatterData[]; + repositories: any[]; } -export default function Technologies({ data }: TechnologiesProps) { - const [selectedCategory, setSelectedCategory] = useState("all"); - const [searchValue, setSearchValue] = useState(""); - - const categories = useMemo(() => { - const categoriesSet = data.reduce( - (accumulator, technology) => { - const categories = technology.fields.category || []; - categories.forEach((category) => { - accumulator.add(category); - }); - return accumulator; +interface SelectedFilters { + category: string[]; + registries: string[]; + cloudTypes: string[]; + source: string[]; +} + +const PACKLISTFILTERS = "packListFilters"; + +export default function Technologies({ data, repositories }: TechnologiesProps) { + const [selectedFilters, setSelectedFilters] = useState({ + category: [], + registries: [], + cloudTypes: [], + source: ["all"], + }); + + const [searchValue, setSearchValue] = useState(""); + + const filteredTechCards = useMemo(() => { + const selectedFiltersKeys = Object.keys(selectedFilters) as (keyof SelectedFilters)[]; + let filteredCards: FrontMatterData[] = []; + const conditions = selectedFiltersKeys.reduce( + (acc: ((techCard: FrontMatterData) => boolean)[], key) => { + const selectedFiltersValue = selectedFilters[key]; + if (selectedFiltersValue.length) { + let condition: (techCard: FrontMatterData) => boolean = () => false; + if (selectedFiltersValue && selectedFiltersValue.length) { + switch (key) { + case "category": + condition = (techCard: FrontMatterData) => { + return selectedFiltersValue.includes(techCard.packType); + }; + break; + case "registries": + condition = (techCard: FrontMatterData) => { + return selectedFiltersValue.some((value) => techCard.registries.includes(value)); + }; + break; + case "cloudTypes": + condition = (techCard: FrontMatterData) => { + return selectedFiltersValue.some( + (value) => techCard.cloudTypes.includes("all") || techCard.cloudTypes.includes(value) + ); + }; + break; + case "source": + if (!selectedFiltersValue.includes("all")) { + condition = (techCard: FrontMatterData) => { + return !!techCard[selectedFiltersValue[0] as keyof FrontMatterData]; + }; + } else { + condition = () => true; + } + break; + } + if (condition) { + acc.push(condition); + } + } + } + return acc; }, - new Set(["all"]) + [] as ((techCard: FrontMatterData) => boolean)[] ); - return new Set([...categoriesSet].sort()); - }, [data]); - - const technologies = useMemo(() => { - let technologies = [...data].sort((pack1, pack2) => { - const category1 = pack1.fields.category[0]; - const category2 = pack2.fields.category[0]; - if (category1 < category2) { - return -1; + filteredCards = data.filter((card) => { + if (conditions.length) { + return conditions.every((condition) => condition(card)); + } else { + return true; } + }); - if (category1 > category2) { - return 1; + if (searchValue) { + const fuse = new Fuse(filteredCards, searchOptions); + filteredCards = fuse.search(searchValue).map(({ item }) => item); + } + + const categoriesMap = filteredCards.reduce((acc: Map, technology: FrontMatterData) => { + const packType = technology.packType; + if (acc.has(packType)) { + acc.get(packType)!.push(technology); + } else { + acc.set(packType, [technology]); } + return acc; + }, new Map()); - return 0; + const sortedCategoriesMap = new Map( + [...categoriesMap.entries()].sort(([key1], [key2]) => { + const name1 = packTypeNames[key1]; + const name2 = packTypeNames[key2]; + if (!name1) return 1; + if (!name2) return -1; + return name1.localeCompare(name2); + }) + ); + + sortedCategoriesMap.forEach((techCards) => { + techCards.sort((a, b) => a.title.localeCompare(b.title)); }); - if (searchValue) { - const fuse = new Fuse(technologies, searchOptions); - technologies = fuse.search(searchValue).map(({ item }) => item); - } + return sortedCategoriesMap; + }, [data, selectedFilters, searchValue]); - if (selectedCategory !== "all") { - technologies = technologies.filter(({ fields }) => fields.category.includes(selectedCategory)) || []; + useEffect(() => { + const filters = localStorage.getItem(PACKLISTFILTERS); + if (filters) { + try { + const parsedFilters = JSON.parse(filters) as { selectedFilters: SelectedFilters; searchValue: string }; + setSelectedFilters(parsedFilters.selectedFilters); + setSearchValue(parsedFilters.searchValue || ""); + } catch (e) { + console.error("Error in parsing filters from local storage", e); + } + } else { + setFiltersInLocalStorage({ + selectedFilters: selectedFilters, + searchValue: "", + }); } + }, []); - return technologies; - }, [data, searchValue, selectedCategory]); + const renderPacksCategories = () => { + const categoryKeys = Array.from(filteredTechCards.keys()); + return categoryKeys.map((category) => { + const categoryItems = filteredTechCards.get(category)!; + if (categoryItems.length) { + return ( + + {categoryItems.map((field) => { + const { title, logoUrl, packType, name, latestVersion, versions } = field; + return ( + + ); + })} + + ); + } + return null; + }); + }; + + function addPanelHeader(category: string) { + return ( + <> + + {packTypeNames[category]} + + ); + } + + const setSelectedSearchFilters = (selectedSearchFilters: Partial) => { + const updatedFilters = { + ...selectedFilters, + ...selectedSearchFilters, + }; + setFiltersInLocalStorage({ + selectedFilters: updatedFilters, + searchValue: searchValue, + }); + setSelectedFilters(updatedFilters); + }; + + const onSearch = (value: string) => { + setFiltersInLocalStorage({ + selectedFilters: selectedFilters, + searchValue: value, + }); + setSearchValue(value); + }; - const onSearch = (event: React.ChangeEvent) => { - setSearchValue(event.target.value); + const setFiltersInLocalStorage = (filters: { selectedFilters: SelectedFilters; searchValue: string }) => { + localStorage.setItem(PACKLISTFILTERS, JSON.stringify(filters)); }; return (
- - + +
- {technologies.map(({ fields }) => { - const { title, slug, logoUrl } = fields; - return ; - })} + + {renderPacksCategories()} +
); diff --git a/src/components/Technologies/TechnologyCard.tsx b/src/components/Technologies/TechnologyCard.tsx index 67a7c9c382..173a2ba90e 100644 --- a/src/components/Technologies/TechnologyCard.tsx +++ b/src/components/Technologies/TechnologyCard.tsx @@ -1,22 +1,35 @@ import React from "react"; -import Link from "@docusaurus/Link"; import styles from "./Technologies.module.scss"; +import PackCardIcon from "./PackCardIcon"; +import Link from "@docusaurus/Link"; +interface Version { + title: string; + children: { + title: string; + }[]; +} interface TechnologyCardProps { + name?: string; title: string; - slug: string; logoUrl: string; + type?: string; + slug?: string; + version?: string; + versions?: Version[]; } -export default function TechnologyCard({ title, slug, logoUrl }: TechnologyCardProps) { +export default function TechnologyCard({ name, title, logoUrl, type, slug, version, versions }: TechnologyCardProps) { + const parentVersion = + versions?.find((tagVersion) => tagVersion.children.find((child) => child.title === version))?.title || ""; return ( - -
-
- {`${title} +
+ +
+ +
{title}
-
{title}
-
- + +
); } diff --git a/src/components/Technologies/packsFilters.antd.css b/src/components/Technologies/packsFilters.antd.css new file mode 100644 index 0000000000..c3320792be --- /dev/null +++ b/src/components/Technologies/packsFilters.antd.css @@ -0,0 +1,3 @@ +.ant-select .ant-select-selector { + border-radius: 0px; +} diff --git a/src/components/Technologies/technologies.antd.css b/src/components/Technologies/technologies.antd.css new file mode 100644 index 0000000000..3bf9b3843a --- /dev/null +++ b/src/components/Technologies/technologies.antd.css @@ -0,0 +1,27 @@ +.ant-collapse { + width: 100%; + border: 0 none; +} +.ant-collapse-content-box { + display: flex; + flex-wrap: wrap; +} +.ant-menu-horizontal > .ant-menu-submenu:hover::after { + border-bottom-color: transparent !important; +} +[data-theme="dark"] .ant-collapse-header-text { + color: whitesmoke; +} +[data-theme="dark"] .ant-collapse-header { + background-color: #161824; +} +[data-theme="dark"] .ant-collapse .ant-collapse-content { + background-color: #141414; + border-top: 1px solid #424242; +} +[data-theme="dark"] .ant-collapse-item { + border-bottom: 1px solid #424242; +} +[data-theme="dark"] .ant-collapse-expand-icon { + color: whitesmoke; +} diff --git a/src/constants/packs.ts b/src/constants/packs.ts new file mode 100644 index 0000000000..64ab196ebc --- /dev/null +++ b/src/constants/packs.ts @@ -0,0 +1,82 @@ +export const packTypes = [ + "app services", + "authentication", + "ingress", + "k8s", + "load balancer", + "logging", + "monitoring", + "cni", + "os", + "registry", + "security", + "servicemesh", + "csi", + "system app", + "integration", +] as const; + +export const packTypeNames: Record = { + "app services": "App Services", + authentication: "Authentication", + ingress: "Ingress", + k8s: "Kubernetes", + "load balancer": "Load Balancer", + logging: "Logging", + monitoring: "Monitoring", + cni: "Network", + os: "Operating System", + registry: "Registry", + security: "Security", + servicemesh: "Service Mesh", + csi: "Storage", + "system app": "System App", + integration: "Integration", +} as const; + +export const cloudProviderTypes = [ + { name: "aws", displayName: "AWS IaaS" }, + { name: "eks", displayName: "AWS EKS" }, + { name: "azure", displayName: "Azure IaaS" }, + { name: "aks", displayName: "Azure AKS" }, + { name: "gcp", displayName: "GCP IaaS" }, + { name: "gke", displayName: "GCP GKE" }, + { name: "tke", displayName: "TKE" }, + { name: "vsphere", displayName: "VMware" }, + { name: "openstack", displayName: "OpenStack" }, + { name: "maas", displayName: "MAAS" }, + { name: "edge-native", displayName: "Edge" }, + { name: "custom", displayName: "Custom" }, +] as const; + +export const layerTypes = ["k8s", "cni", "os", "csi"] as const; + +export const addOnTypes = [ + "app services", + "authentication", + "ingress", + "load balancer", + "logging", + "monitoring", + "registry", + "security", + "servicemesh", + "system app", + "integreation", + "integration", +] as const; + +export const cloudDisplayNames = { + aws: "AWS", + eks: "AWS EKS", + aks: "Azure AKS", + gke: "GCP GKE", + azure: "Azure", + gcp: "GCP", + vsphere: "VMware", + openstack: "OpenStack", + maas: "MAAS", + tke: "Tencent", + "edge-native": "Edge", + custom: "Custom", +} as const; diff --git a/src/declarations.d.ts b/src/declarations.d.ts index 98ead581ce..a9da8662dd 100644 --- a/src/declarations.d.ts +++ b/src/declarations.d.ts @@ -4,6 +4,11 @@ declare module "*.module.scss"; declare module "*.png"; +declare module "*.md" { + const value: string; // markdown is just a string + export default value; +} + interface Mendable { /* eslint-disable @typescript-eslint/no-explicit-any */ initialize: (config: any) => void; diff --git a/src/services/api/index.js b/src/services/api/index.js new file mode 100644 index 0000000000..5fcca58250 --- /dev/null +++ b/src/services/api/index.js @@ -0,0 +1,41 @@ +import axios from "axios"; +import axiosRetry from "axios-retry"; +import { pRateLimit } from "p-ratelimit"; +import { BASE_URL } from "../../../static/scripts/constants"; + +const api = axios.create({ + baseURL: BASE_URL, + timeout: 120000, // 2 minutes + headers: { + "Content-Type": "application/json", + ApiKey: process.env.PALETTE_API_KEY, + }, +}); + +const limit = pRateLimit({ + interval: 2000, // 1000 ms == 1 second + rate: 10, // 10 API calls per interval + concurrency: 10, // no more than 10 running at once +}); + +axiosRetry(api, { + retries: 3, + retryDelay: (...arg) => axiosRetry.exponentialDelay(...arg, 1000), + retryCondition(error) { + switch (error.response?.status) { + case 500: + case 404: + case 501: + case 429: + return true; + default: + return false; + } + }, +}); + +function callRateLimitAPI(delayedApiCall) { + return limit(delayedApiCall); +} + +module.exports = { api, callRateLimitAPI }; diff --git a/src/theme/MDXComponents/MDXComponents.ts b/src/theme/MDXComponents/MDXComponents.ts index cf7717bd5a..a0fd011c76 100644 --- a/src/theme/MDXComponents/MDXComponents.ts +++ b/src/theme/MDXComponents/MDXComponents.ts @@ -6,6 +6,7 @@ import Tooltip from "@site/src/components/Tooltip/Tooltip"; import PointsOfInterest from "@site/src/components/PointOfInterest/index"; import YouTube from "@site/src/components/Youtube/Youtube"; import Packs from "@site/src/components/Integrations/Packs/Packs"; +import PacksInformation from "@site/src/components/PacksInformation/PacksInformation"; import AppTiers from "@site/src/components/Integrations/AppTiers/AppTiers"; import PacksTable from "@site/src/components/PacksTable/PacksTable"; import TOCInline from "@theme/TOCInline"; @@ -24,6 +25,7 @@ export default { PointsOfInterest, YouTube, Packs, + PacksInformation, AppTiers, PacksTable, TOCInline, diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 2f73749538..b22afd025e 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -4,6 +4,11 @@ declare module "*.module.scss"; declare module "*.png"; +declare module "*.md" { + const value: string; // markdown is just a string + export default value; +} + interface Mendable { initialize: () => void; // Add other methods or properties as needed diff --git a/static/assets/packs/app_layer.svg b/static/assets/packs/app_layer.svg new file mode 100644 index 0000000000..0546d733ca --- /dev/null +++ b/static/assets/packs/app_layer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/packs/authentication_layer.svg b/static/assets/packs/authentication_layer.svg new file mode 100644 index 0000000000..5b54c141ef --- /dev/null +++ b/static/assets/packs/authentication_layer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/assets/packs/cni_layer.svg b/static/assets/packs/cni_layer.svg new file mode 100644 index 0000000000..6190df0eca --- /dev/null +++ b/static/assets/packs/cni_layer.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/assets/packs/csi_layer.svg b/static/assets/packs/csi_layer.svg new file mode 100644 index 0000000000..4dff687862 --- /dev/null +++ b/static/assets/packs/csi_layer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/assets/packs/ingress_layer.svg b/static/assets/packs/ingress_layer.svg new file mode 100644 index 0000000000..28a02fefb6 --- /dev/null +++ b/static/assets/packs/ingress_layer.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/assets/packs/k8s_layer.svg b/static/assets/packs/k8s_layer.svg new file mode 100644 index 0000000000..643cb21c2a --- /dev/null +++ b/static/assets/packs/k8s_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/load_balancer_layer.svg b/static/assets/packs/load_balancer_layer.svg new file mode 100644 index 0000000000..b676b5f9d1 --- /dev/null +++ b/static/assets/packs/load_balancer_layer.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/assets/packs/logging_layer.svg b/static/assets/packs/logging_layer.svg new file mode 100644 index 0000000000..491f49d8fa --- /dev/null +++ b/static/assets/packs/logging_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/misc_layer.svg b/static/assets/packs/misc_layer.svg new file mode 100644 index 0000000000..806f5d04fb --- /dev/null +++ b/static/assets/packs/misc_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/monitoring_layer.svg b/static/assets/packs/monitoring_layer.svg new file mode 100644 index 0000000000..fcf3bf26b3 --- /dev/null +++ b/static/assets/packs/monitoring_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/os_layer.svg b/static/assets/packs/os_layer.svg new file mode 100644 index 0000000000..4d8a3e8b9e --- /dev/null +++ b/static/assets/packs/os_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/registry_layer.svg b/static/assets/packs/registry_layer.svg new file mode 100644 index 0000000000..1408268e00 --- /dev/null +++ b/static/assets/packs/registry_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/security_layer.svg b/static/assets/packs/security_layer.svg new file mode 100644 index 0000000000..216408aefd --- /dev/null +++ b/static/assets/packs/security_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/service_mesh_layer.svg b/static/assets/packs/service_mesh_layer.svg new file mode 100644 index 0000000000..87f68780ee --- /dev/null +++ b/static/assets/packs/service_mesh_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/assets/packs/system_app_layer.svg b/static/assets/packs/system_app_layer.svg new file mode 100644 index 0000000000..462a2fb7bb --- /dev/null +++ b/static/assets/packs/system_app_layer.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/empty_icon_table_dark.svg b/static/img/empty_icon_table_dark.svg new file mode 100644 index 0000000000..fdf0420b83 --- /dev/null +++ b/static/img/empty_icon_table_dark.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/empty_icon_table_light.svg b/static/img/empty_icon_table_light.svg new file mode 100644 index 0000000000..3bd7c3eb1a --- /dev/null +++ b/static/img/empty_icon_table_light.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/packs-data/exclude_packs.json b/static/packs-data/exclude_packs.json new file mode 100644 index 0000000000..87deb017f8 --- /dev/null +++ b/static/packs-data/exclude_packs.json @@ -0,0 +1,15 @@ +[ + "palette-upgrader", + "csi-aws-new", + "csi-portworx-gcp", + "csi-portworx-aws", + "csi-portworx-vsphere", + "csi-rook-ceph-helm", + "csi-rook-ceph-helm-addon", + "calico-networking", + "ubuntu-k3s", + "ubuntu-coxedge", + "edge-os", + "spectro-zen-of-k8s", + "spectro-mgmt" +] diff --git a/static/packs-data/packs_information.json b/static/packs-data/packs_information.json new file mode 100644 index 0000000000..facd0f2d07 --- /dev/null +++ b/static/packs-data/packs_information.json @@ -0,0 +1,922 @@ +[ + { + "name": "amazon-linux-eks", + "description": "The Amazon EKS optimized Amazon Linux AMI is built on top of Amazon Linux 2 (AL2) and Amazon Linux 2023 (AL2023). This image is configured to serve as the base image for Amazon EKS nodes." + }, + { + "name": "ambassador", + "description": "Ambassador is a Kubernetes-native API gateway built on the Envoy Proxy. Ambassador simplifies the process of exposing, securing, and managing traffic to services in Kubernetes clusters, reducing challenges to implement complex networking scenarios in cloud-native environments." + }, + { + "name": "antrea", + "description": "Antrea is a Kubernetes networking solution intended to be Kubernetes native. It operates at Layer 3/4 to provide networking and security services for a Kubernetes cluster, leveraging Open vSwitch as the networking data plane." + }, + { + "name": "appdynamics-collector", + "description": "AppDynamics Collector is a component within the AppDynamics platform that gathers and processes telemetry data from applications, databases, or other monitored systems, and sends this data to the AppDynamics backend for analysis and visualization." + }, + { + "name": "appdynamics-operator", + "description": "AppDynamics Operator is a Kubernetes-native component designed to manage and automate the deployment and configuration of AppDynamics monitoring agents within Kubernetes environments." + }, + { + "name": "argo-rollouts", + "description": "Argo Rollouts is a Kubernetes controller and set of CRDs which provide advanced deployment capabilities such as blue-green, canary, canary analysis, experimentation, and progressive delivery features to Kubernetes." + }, + { + "name": "avi", + "description": "AVI AKO is a Kubernetes operator which works as an ingress controller and performs Avi-specific functions in a Kubernetes environment with the Avi Controller. AKO is deployed as a pod in the cluster and translates the required Kubernetes objects to Avi objects and automates the implementation of ingresses/routes/services on the Service Engines (SE) via the Avi Controller." + }, + { + "name": "avi-ako", + "description": "AVI AKO is a Kubernetes operator which works as an ingress controller and performs Avi-specific functions in a Kubernetes environment with the Avi Controller. AKO is deployed as a pod in the cluster and translates the required Kubernetes objects to Avi objects and automates the implementation of ingresses/routes/services on the Service Engines (SE) via the Avi Controller." + }, + { + "name": "aws-eks-calico", + "description": "Calico is a networking and security solution that enables Kubernetes workloads and non-Kubernetes/legacy workloads to communicate seamlessly and securely. Calico consists of networking to secure network communication, and advanced network policy to secure cloud-native microservices/applications at scale." + }, + { + "name": "aws-alb", + "description": "AWS Load Balancer Controller is a controller to help manage Elastic Load Balancers for a Kubernetes cluster. AWS Load Balancer Controller satisfies Kubernetes Ingress resources by provisioning Application Load Balancers. It also satisfies Kubernetes Service resources by provisioning Network Load Balancers." + }, + { + "name": "csi-aws-efs", + "description": "The Amazon Elastic File System Container Storage Interface (CSI) Driver implements the CSI specification for container orchestrators to manage the lifecycle of Amazon EFS file systems. Amazon EFS CSI driver supports dynamic provisioning and static provisioning. " + }, + { + "name": "aws-eks-oidc", + "description": "The AWS EKS OIDC pack provides the necessary configurations to configure your Identity Provider with the OIDC identity provider for Amazon EKS clusters." + }, + { + "name": "aws-ssm-agent", + "description": "The AWS SSM Agent pack installs the Amazon Session Manager Agent on the nodes of your Amazon Kubernetes cluster. The agent enables you to manage your interact and automate takss through the AWS Systems Manager." + }, + { + "name": "canonical-apache2", + "description": "The Apache HTTP Server Project is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards." + }, + { + "name": "canonical-charms-deployer", + "description": "Juju is an open source orchestration engine for software operators that enables the deployment, integration and lifecycle management of applications at any scale, on any infrastructure using charms. A charm is an operator - business logic encapsulated in reusable software packages that automate every aspect of an application's life." + }, + { + "name": "canonical-juju-olm", + "description": "The Juju controller is used to manage the software deployed through Juju, from deployment to upgrades to day-two operations. One Juju controller can manage multiple projects or workspaces, which in Juju are known as models" + }, + { + "name": "canonical-mysql", + "description": "MySQL is a fast, multi-threaded, multi-user, and robust SQL database server. It is intended for mission-critical, heavy-load production systems and mass-deployed software. This pack uses the Canonical MySQL Docker image to deploy a MySQL database." + }, + { + "name": "canonical-postgres", + "description": "PostgreSQL is a powerful, open source object-relational database system with over 35 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. This pack uses the Canonical PostgreSQL Docker image to deploy a PostgreSQL database." + }, + { + "name": "canonical-redis", + "description": "Redis is an in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker. Redis has built-in replication and different levels of on-disk persistence. It supports complex data types (for example, strings, hashes, lists, sets, sorted sets, and JSON), with atomic operations defined on those data types. This pack uses the Canonical Redis Docker image to deploy a Redis database." + }, + { + "name": "calico-network-policy", + "description": "Calico network policy provides a richer set of policy capabilities than what Kubernetes provides out-of-the-box. The Nework Policy provider includes: policy ordering/priority, deny rules, and more flexible match rules. While Kubernetes network policy applies only to pods, Calico network policy can be applied to multiple types of endpoints including pods, VMs, and host interfaces. Finally, when used with Istio service mesh, Calico network policy supports securing applications layers 5-7 match criteria, and cryptographic identity." + }, + { + "name": "calico-networking", + "description": "Calico network policy provides a richer set of policy capabilities than what Kubernetes provides out-of-the-box. The Nework Policy provider includes: policy ordering/priority, deny rules, and more flexible match rules. While Kubernetes network policy applies only to pods, Calico network policy can be applied to multiple types of endpoints including pods, VMs, and host interfaces. Finally, when used with Istio service mesh, Calico network policy supports securing applications layers 5-7 match criteria, and cryptographic identity." + }, + { + "name": "centos-aws", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open-source communities to build upon." + }, + { + "name": "centos-azure", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open-source communities to build upon." + }, + { + "name": "centos-gcp", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open-source communities to build upon." + }, + { + "name": "centos-vsphere", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open-source communities to build upon." + }, + { + "name": "centos-libvirt", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open-source communities to build upon." + }, + { + "name": "ceph-rbd", + "description": "A Container Storage Interface (CSI) driver, provisioner, snapshotter, resizer and attacher for Ceph RBD." + }, + { + "name": "ceph-rbd-addon", + "description": "A Container Storage Interface (CSI) driver, provisioner, snapshotter, resizer and attacher for Ceph RBD." + }, + { + "name": "certmanager", + "description": "cert-manager adds certificates and certificate issuers as resource types in Kubernetes clusters, simplifying obtaining, renewing, and using those certificates. It can issue certificates from various supported sources, including Let’s Encrypt, HashiCorp Vault, Venafi, and private PKI. It also takes care of the certificate validity and attempts to renew certificates before expiry." + }, + { + "name": "cisco-appdynamics-collectors", + "description": "AppDynamics Collector is a component within the AppDynamics platform that gathers and processes telemetry data from applications, databases, or other monitored systems, and sends this data to the AppDynamics backend for analysis and visualization." + }, + { + "name": "cisco-appdynamics-operators", + "description": "AppDynamics Operator is a Kubernetes-native component designed to manage and automate the deployment and configuration of AppDynamics monitoring agents within Kubernetes environments." + }, + { + "name": "cloudanix", + "description": "The Cloudanix pack is an add-on security pack that provides a dashboard to help you detect threats and unusual behavior in your Kubernetes clusters. Cloudanix detects the following: Files added or modified in sensitive directories. SSH into a container. Modifications to shell configuration files. Attempts to read sensitive files that contain credential information. And identitfy crypto mining." + }, + { + "name": "cni-azure", + "description": "The Azure CNI plugin provides network support to Azure Kubernetes Service (AKS) clusters. The plugin is responsible for setting up the network interfaces on the nodes and pods, and for managing the IP addresses. The CNI ensures every pod gets an IP address from the subnet and can be accessed directly." + }, + { + "name": "cni-aws-vpc-eks", + "description": "The Amazon Virtual Private Cloud (VPC) CNI plugin for Kubernetes. This plugin provides pod networking through Elastic Network Interfaces (ENI) for clusters deployed on AWS." + }, + { + "name": "cni-aws-vpc-eks-helm", + "description": "The Amazon Virtual Private Cloud (VPC) CNI plugin for Kubernetes. This plugin provides pod networking through Elastic Network Interfaces (ENI) for clusters deployed on AWS." + }, + { + "name": "cni-calico", + "description": "Calico is a networking and security solution that enables Kubernetes workloads and non-Kubernetes/legacy workloads to communicate seamlessly and securely. Calico consists of networking to secure network communication, and advanced network policy to secure cloud-native microservices/applications at scale." + }, + { + "name": "cni-calico-azure", + "description": "Calico is a networking and security solution that enables Kubernetes workloads and non-Kubernetes/legacy workloads to communicate seamlessly and securely. Calico consists of networking to secure network communication, and advanced network policy to secure cloud-native microservices/applications at scale." + }, + { + "name": "cni-kubenet", + "description": "Kubenet, a basic Kubernetes network plugin, configures pod network interfaces and routes using CNI plugins. It assigns IP addresses from a node-specific subnet, enabling pod-to-pod communication within nodes and relies on host network configurations for inter-node traffic." + }, + { + "name": "cni-multus", + "description": "Multus CNI is a container network interface plugin for Kubernetes that enables attaching multiple network interfaces to pods. Typically, in Kubernetes each pod only has one network interface,apart from a loopback. With Multus you can create a multi-homed pod that has multiple interfaces. This is accomplished by Multus acting as a meta-plugin, a CNI plugin that can call multiple other CNI plugins." + }, + { + "name": "cni-romana", + "description": "Romana is a new Software Defined Network (SDN) solution specifically designed for the Cloud Native architectural style. The result of this focus is that Romana cloud networks are less expensive to build, simpler to operate and deliver higher performance than cloud networks built using alternative SDN designs." + }, + { + "name": "cni-tke-global-router", + "description": "This pack deploys the TKE Global Router CNI plugin, which provides a global routing solution for Kubernetes clusters. The plugin is designed to work with the TKE Global Router controller to provide a global routing solution for Kubernetes clusters." + }, + { + "name": "cni-vpc-native-gke", + "description": "This pack deploys the GKE Container Network Interface (CNI) that provides network support to Google Kubernetes Engine (GKE) clusters. The CNI plugin is responsible for setting up the network interfaces on the nodes and pods, and for managing the IP addresses." + }, + { + "name": "cni-weavenet", + "description": "WeaveNet, a Kubernetes CNI plugin, uniquely creates a resilient virtual network for pod communication across clusters with zero configuration. It supports encryption, network policies, multicast, and automatic IP allocation, making it ideal for secure and scalable environments." + }, + { + "name": "centos", + "description": "CentOS Linux distribution is a stable, predictable, manageable and reproducible platform derived from the sources of RedHat Enterprise Linux (RHEL). It provides a rich base platform for open source communities to build upon. Spectro Cloudprovides CentOS as a development framework for its users." + }, + { + "name": "cni-flannel", + "description": "Flannel is a network layer, layer three, fabric for Kubernetes. It is designed to work with Linux routing infrastructure and creates a virtual network that gives each computing host a subnet. Flannel uses either the Kubernetes API or etcd directly to store the network configuration, the allocated subnets, and any auxiliary data such as the host’s public IP address." + }, + { + "name": "cni-cilium", + "description": "The Cilium agent runs on all clusters and servers to provide networking, security and observability to the workload running on that node." + }, + { + "name": "csi-azure", + "description": "Azure Disk CSI Driver allows Kubernetes to access Azure Disk volumes. The driver is implemented as a Container Storage Interface (CSI) plugin." + }, + { + "name": "csi-gcp", + "description": "The Google Compute Engine Persistent Disk (GCE PD) Container Storage Interface (CSI) Storage Plugin. You can use the GCE PD CSI driver to manage the lifecycle of GCE PD volumes." + }, + { + "name": "csi-gcp-driver", + "description": "The Google Compute Engine Persistent Disk (GCE PD) Container Storage Interface (CSI) Storage Plugin. You can use the GCE PD CSI driver to manage the lifecycle of GCE PD volumes. This pack supports Google IaaS clusters." + }, + { + "name": "gke-csi-gcp-driver", + "description": "The Google Compute Engine Persistent Disk (GCE PD) Container Storage Interface (CSI) Storage Plugin. You can use the GCE PD CSI driver to manage the lifecycle of GCE PD volumes. This pack supports Google GKE clusters." + }, + { + "name": "csi-local-path-provisioner", + "description": "Local Path Provisioner provides a way for the Kubernetes users to utilize the local storage in each node. Based on the user configuration, the Local Path Provisioner will create either hostPath or local based persistent volume on the node automatically" + }, + { + "name": "csi-local-path-provisioner-addon", + "description": "Local Path Provisioner provides a way for the Kubernetes users to utilize the local storage in each node. Based on the user configuration, the Local Path Provisioner will create either hostPath or local based persistent volume on the node automatically" + }, + { + "name": "csi-longhorn", + "description": "Longhorn is a lightweight distributed block storage system for cloud native storage Kubernetes that allows you to replicate storage to Kubernetes clusters. Once Longhorn is installed, it adds persistent volume support to the Kubernetes cluster using containers and microservices." + }, + { + "name": "csi-longhorn-addon", + "description": "Longhorn is a lightweight distributed block storage system for cloud native storage Kubernetes that allows you to replicate storage to Kubernetes clusters. Once Longhorn is installed, it adds persistent volume support to the Kubernetes cluster using containers and microservices." + }, + { + "name": "csi-maas-volume", + "description": "The MAAS Volume CSI driver allows Kubernetes to access MAAS volumes. The driver is implemented as a Container Storage Interface (CSI) plugin." + }, + { + "name": "csi-nfs", + "description": "The NFS Container Storage Interface (CSI) Driver provides a CSI interface used by Kubernetes to manage the lifecycle of NFS volumes." + }, + { + "name": "csi-nfs-subdir-external", + "description": "NFS subdir external provisioner is an automatic provisioner that use your existing and already configured NFS server to support dynamic provisioning of Kubernetes Persistent Volumes via Persistent Volume Claims." + }, + { + "name": "csi-openstack-cinder", + "description": "The Cinder CSI Driver is a CSI Specification compliant driver used by Container Orchestrators to manage the lifecycle of OpenStack Cinder Volumes." + }, + { + "name": "csi-portworx-aws", + "description": "The Portworx CSI Driver provides a standardized way to manage storage resources in containerized environments. This driver supports the full range of Portworx features and most of the CSI specifications, facilitating seamless integration and management of storage across different platforms." + }, + { + "name": "csi-portworx-gcp", + "description": "The Portworx CSI Driver provides a standardized way to manage storage resources in containerized environments. This driver supports the full range of Portworx features and most of the CSI specifications, facilitating seamless integration and management of storage across different platforms." + }, + { + "name": "csi-portworx-generic", + "description": "The Portworx CSI Driver provides a standardized way to manage storage resources in containerized environments. This driver supports the full range of Portworx features and most of the CSI specifications, facilitating seamless integration and management of storage across different platforms." + }, + { + "name": "csi-portworx-vsphere", + "description": "The Portworx CSI Driver provides a standardized way to manage storage resources in containerized environments. This driver supports the full range of Portworx features and most of the CSI specifications, facilitating seamless integration and management of storage across different platforms." + }, + { + "name": "kubernetes", + "description": "Palette eXtended Kubernetes (PXK) is a customized version of the open-source Cloud Native Computing Foundation (CNCF) distribution of Kubernetes. This Kubernetes version can be deployed through Palette to all major infrastructure providers, public cloud providers, and private data center providers. This is the default distribution when deploying a Kubernetes cluster through Palette." + }, + { + "name": "edge-k8s", + "description": "Palette eXtended Kubernetes (PXK-E) is a customized version of the open-source Cloud Native Computing Foundation (CNCF) distribution of Kubernetes for Edge devices. This Kubernetes version can be deployed Edge hosts. This is the default distribution when deploying Edge Kubernetes cluster through Palette." + }, + { + "name": "edge-native-opensuse", + "description": "openSUSE is a free and open-source Linux distribution developed by the openSUSE project." + }, + { + "name": "portworx-add-on", + "description": "The Portworx CSI Driver provides a standardized way to manage storage resources in containerized environments. This driver supports the full range of Portworx features and most of the CSI specifications, facilitating seamless integration and management of storage across different platforms." + }, + { + "name": "csi-rook-ceph", + "description": "Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments." + }, + { + "name": "csi-rook-ceph-addon", + "description": "Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments." + }, + { + "name": "csi-rook-ceph-helm", + "description": "Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments." + }, + { + "name": "csi-rook-ceph-helm-addon", + "description": "Rook is an open source cloud-native storage orchestrator, providing the platform, framework, and support for Ceph storage to natively integrate with cloud-native environments." + }, + { + "name": "csi-rook", + "description": "Rook is a cloud-native storage orchestrator for Kubernetes, providing the platform, framework, and support for a diverse set of storage solutions to natively integrate with cloud-native environments. Rook turns storage" + }, + { + "name": "csi-tke", + "description": "The TKE CSI Driver provides support for Kubernetes clusters to use Tencent Cloud Block Storage." + }, + { + "name": "csi-topolvm", + "description": "TopoLVM is a CSI plugin using LVM for Kubernetes. It can be considered as a specific implementation of local persistent volumes using CSI and LVM. TopoLVM supports dynamic volume provisioning from PVC, flexible volume capacity management, and enhances the scheduler to prefer nodes having a larger storage capacity." + }, + { + "name": "csi-topolvm-addon", + "description": "TopoLVM is a CSI plugin using LVM for Kubernetes. It can be considered as a specific implementation of local persistent volumes using CSI and LVM. TopoLVM supports dynamic volume provisioning from PVC, flexible volume capacity management, and enhances the scheduler to prefer nodes having a larger storage capacity." + }, + { + "name": "csi-trident", + "description": "Trident is a fully supported open source project maintained by NetApp. It has been designed from the ground up to help you meet your containerized applications' persistence demands using industry-standard interfaces, such as the Container Storage Interface (CSI)." + }, + { + "name": "csi-trident-addon", + "description": "Trident is a fully supported open source project maintained by NetApp. It has been designed from the ground up to help you meet your containerized applications' persistence demands using industry-standard interfaces, such as the Container Storage Interface (CSI)." + }, + { + "name": "csi-vsphere-csi", + "description": "The vSphere CSI Driver is a Kubernetes plugin that allows persistent storage for containerized workloads running on vSphere infrastructure. It enables dynamic provisioning of storage volumes and provides features like snapshots, cloning, and dynamic expansion of volumes. The vSphere CSI Driver replaces the in-tree vSphere volume plugin and offers integration with vSphere with better scale and performance." + }, + { + "name": "csi-vsphere", + "description": "The vSphere CSI Driver is a Kubernetes plugin that allows persistent storage for containerized workloads running on vSphere infrastructure. It enables dynamic provisioning of storage volumes and provides features like snapshots, cloning, and dynamic expansion of volumes. The vSphere CSI Driver replaces the in-tree vSphere volume plugin and offers integration with vSphere with better scale and performance." + }, + { + "name": "csi-vsphere-volume", + "description": "The Vsphere CSI Volume plugin uses in-tree vSphere volumes to provide persistent storage for containerized workloads deployed on vSphere infrastructure." + }, + { + "name": "csm-operator-addon", + "description": "The Dell Container Storage Modules Operator is a Kubernetes Operator, which can be used to install and manage the CSI Drivers and CSM Modules provided by Dell for various storage platforms." + }, + { + "name": "custom_os", + "description": "This pack supports the deployment of Operating Systems for additional infrastructure platforms, such as Nutanix." + }, + { + "name": "db-postgresql", + "description": "PostgreSQL is a free and open-source relational database management system (RDBMS) emphasizing extensibility and SQL compliance. PostgreSQL features transactions with atomicity, consistency, isolation, durability (ACID) properties, automatically updatable views, materialized views, triggers, foreign keys, and stored procedures. It is supported on all major operating systems and handles a range of workloads from single machines to data warehouses or web services with many concurrent users." + }, + { + "name": "dex", + "description": "Dex is an identity service to drive authentication for Kubernetes API Server through the OpenID Connect plugin. Clients such as kubectl can act on behalf of users who can log in to the cluster through any identity provider that dex supports." + }, + { + "name": "hello-universe", + "description": "Hello Universe is a demo web application used to help users learn more about Palette and its features. It includes a click counter and funny Spectro Cloud-themed images." + }, + { + "name": "cockroachdb-operator", + "description": "The CockroachDB Kubernetes Operator deploys CockroachDB on a Kubernetes cluster. You can use the Operator to manage the configuration of an active CockroachDB cluster." + }, + { + "name": "cost-analyzer", + "description": "Kubecost is a cost monitoring and optimization application that offers real-time cost visibility and insights for Kubernetes clusters." + }, + { + "name": "aws-cluster-autoscaler", + "description": "The AWS Cluster Autoscaler pack monitors the cluster workload and utilizes AWS autoscaling groups to dynamically provision or shut down nodes, maximizing the cluster's performance and making it more resilient to failures." + }, + { + "name": "consul", + "description": "Consul is a service networking solution that enables teams to manage secure network connectivity between services and across on-prem and multi-cloud environments and runtimes. Consul offers service discovery, service mesh, traffic management, and automated updates to network infrastructure devices." + }, + { + "name": "cos-gke", + "description": "Container-Optimized OS is an operating system image for your Compute Engine VMs that is optimized for deploying Docker containers. With Container-Optimized OS, you can bring up your Docker containers on Google Cloud Platform quickly, efficiently, and securely. Container-Optimized OS is maintained by Google and is based on the open source Chromium OS project." + }, + { + "name": "crossplane", + "description": "Crossplane transforms Kubernetes clusters into universal control planes, extending the Kubernetes API and enabling infrastructure resource provisioning and management across major infrastructure providers." + }, + { + "name": "csi-aws", + "description": "This Container Storage Interface (CSI) driver, provisioner, snapshotter, resizer, and attacher for Amazon Elastic Block Store (EBS) volumes enables Kubernetes to manage the lifecycle of EBS volumes." + }, + { + "name": "csi-aws-ebs", + "description": "The Amazon Elastic Block Store Container Storage Interface (CSI) Driver provides a CSI interface used by Container Orchestrators to manage the lifecycle of Amazon EBS volumes." + }, + { + "name": "elastic-fluentd-kibana", + "description": "This pack deploys an Elasticsearch, Fluentd and Kibana stack. Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases. Fluentd is an open-source data collector for unified logging layer. Kibana is an open-source data visualization dashboard for Elasticsearch." + }, + { + "name": "elastic-operator", + "description": "Elastic Cloud on Kubernetes automates the deployment, provisioning, management, and orchestration of Elasticsearch, Kibana, APM Server, Enterprise Search, Beats, Elastic Agent, Elastic Maps Server, and Logstash on Kubernetes based on the operator pattern." + }, + { + "name": "elastic-stack", + "description": "Elastic Cloud on Kubernetes automates the deployment, provisioning, management, and orchestration of Elasticsearch, Kibana, APM Server, Enterprise Search, Beats, Elastic Agent, Elastic Maps Server, and Logstash on Kubernetes based on the operator pattern." + }, + { + "name": "external-dns", + "description": "ExternalDNS makes Kubernetes resources discoverable via public DNS servers. Like KubeDNS, it retrieves a list of resources, such as Services, Ingresses, etc, from the Kubernetes API to determine a desired list of DNS records. Unlike KubeDNS, however, it's not a DNS server but configures other DNS providers accordingly, such as AWS Route 53 or Google Cloud DNS. In a broader sense, ExternalDNS allows you to control DNS records dynamically via Kubernetes resources in a DNS provider-agnostic way." + }, + { + "name": "external-secrets", + "description": "External Secrets is a tool integrates external secret management systems like AWS Secrets Manager, HashiCorp Vault, Google Secrets Manager, Azure Key Vault, IBM Cloud Secrets Manager, CyberArk Conjur and many more. The operator reads information from external APIs and automatically injects the values into a Kubernetes Secret." + }, + { + "name": "external-secrets-operator", + "description": "External Secrets Operator is a Kubernetes operator that integrates external secret management systems like AWS Secrets Manager, HashiCorp Vault, Google Secrets Manager, Azure Key Vault, IBM Cloud Secrets Manager, CyberArk Conjur and many more. The operator reads information from external APIs and automatically injects the values into a Kubernetes Secret." + }, + { + "name": "external-snapshotter", + "description": "External Snapshotter is a Kubernetes controller that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint. It is used to create and delete volume snapshots in a Kubernetes cluster." + }, + { + "name": "falco", + "description": "Falco is a cloud-native security tool designed for Linux systems. It employs custom rules on kernel events, which are enriched with container and Kubernetes metadata, to provide real-time alerts. Falco helps you gain visibility into abnormal behavior, potential security threats, and compliance violations, contributing to comprehensive runtime security." + }, + { + "name": "falcon-sensor", + "description": "Falcon is the CrowdStrike platform purpose-built to stop breaches via a unified set of cloud-delivered technologies that prevent all types of attacks — including malware and more. " + }, + { + "name": "f5", + "description": "F5 provides protocol and application traffic awareness for intelligent load balancing decisions. This pack deploys the F5 BIG-IP Controller for Kubernetes, which integrates with the F5 BIG-IP platform to provide advanced traffic management and security services for applications running in Kubernetes." + }, + { + "name": "fluentbit", + "description": "Fluent Bit is a fast, lightweight, and highly scalable logging and metrics processor and forwarder. Fluentbit can process Kubernetes containers logs from the file system or Systemd/Journald. Enrich logs with Kubernetes Metadata, and centralize your logs in third party storage services like Elasticsearch, InfluxDB, HTTP, etc." + }, + { + "name": "flux-cd", + "description": "Flux is a tool for keeping Kubernetes clusters in sync with sources of configuration, such as Git repositories, and automating updates to configuration when there is new code to deploy. Flux is built from the ground up to use Kubernetes' API extension system, and to integrate with Prometheus and other core components of the Kubernetes ecosystem. Flux supports multi-tenancy and support for syncing an arbitrary number of Git repositories." + }, + { + "name": "gatekeeper", + "description": "Gatekeeper is a validating and mutating webhook that enforces CRD-based policies executed by Open Policy Agent, a policy engine for Cloud Native environments hosted by CNCF." + }, + { + "name": "generic-vm-libvirt", + "description": "Generic-VM-Libvirt is a Palette Add-on pack used to simplify deploying the virtual machine applications from a cluster profile or a system profile. Generic-VM-Libvirt extracts all Terraform constructs inside the pack and exposes nothing but the values. Users will then have the ability to modify the add-on pack for the different applications." + }, + { + "name": "generic-vm-vsphere", + "description": "Generic-VM-vSphere is a Palette Add-on pack used to simplify deploying the virtual machine resource from a cluster profile or a system profile. Generic-VM-vSphere extracts all Terraform constructs inside the pack and exposes nothing but the values. Users will then have the ability to modify the add-on pack for the different applications." + }, + { + "name": "gloo", + "descrption": "Gloo Gateway is a feature-rich, fast, and flexible Kubernetes-native ingress controller and next-generation API gateway that is built on top of Envoy proxy and the Kubernetes Gateway API. It excels in function-level routing, supports legacy apps, microservices and serverless, offers robust discovery capabilities, integrates seamlessly with open-source projects, and is designed to support hybrid applications with various technologies, architectures, protocols, and clouds." + }, + { + "name": "gvisor", + "description": "gVisor is an open-source Linux-compatible sandbox that can be deployed anywhere existing container tooling does. It enables cloud-native container security and portability. gVisor leverages years of experience isolating production workloads at Google." + }, + { + "name": "kubernetes-microk8s", + "description": "MicroK8s is a lightweight Kubernetes distribution developed by Canonical. It deploys all Kubernetes services in a single, fully contained package and offers out-of-the-box add-ons." + }, + { + "name": "kubernetes-aks", + "description": "Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available." + }, + { + "name": "kubernetes-eks", + "description": "Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available." + }, + { + "name": "kubernetes-gke", + "description": "Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available." + }, + { + "name": "kubernetes-konvoy", + "description": "Konvoy is built using upstream Kubernetes combined with all other required technologies and add-ons such as networking, storage, monitoring, logging, lifecycle management, using best of breed open source CNCF technologies. Konvoy comes with operational, security leading practices, testing and support for all of those technologies, and it works on virtual, bare metal, and public cloud infrastructure." + }, + { + "name": "kubernetes-tke", + "description": "Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available." + }, + { + "name": "kubernetes-custom", + "description": "Kubernetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available." + }, + { + "name": "kubernetes-rke2", + "description": "RKE2, also known as RKE Government, is Rancher's next-generation Kubernetes distribution. RKE2 is a fully conformant Kubernetes distribution that focuses security and compliance within the U.S. Federal Government sector." + }, + { + "name": "edge-rke2", + "description": "RKE2, also known as RKE Government, is Rancher's next-generation Kubernetes distribution. RKE2 is a fully conformant Kubernetes distribution that focuses security and compliance within the U.S. Federal Government sector." + }, + { + "name": "edge-microk8s", + "description": "MicroK8s is a lightweight Kubernetes distribution developed by Canonical. It deploys all Kubernetes services in a single, fully contained package and offers out-of-the-box add-ons." + }, + { + "name": "lb-metallb", + "description": "MetalLB is a load balancer implementation for bare metal Kubernetes clusters that use standard routing protocols." + }, + { + "name": "lb-metallb-helm", + "description": "MetalLB is a load balancer implementation for bare metal Kubernetes clusters that use standard routing protocols." + }, + { + "name": "ngrok-ingress-controller", + "description": "The ngrok Ingress Controller provides secure internet access to Kubernetes workloads by offloading network ingress and middleware execution to ngrok's platform." + }, + { + "name": "nutanix-csi", + "description": "The Nutanix CSI pack uses Nutanix Volumes and Nutanix Files to provide persistent storage for stateful applications." + }, + { + "name": "argo-cd", + "description": "Argo CD is a declarative continuous delivery tool for Kubernetes. It automates the deployment of the desired application states in the specified target environments using Git repositories as the source of truth." + }, + { + "name": "cni-cilium-oss", + "description": "Cilium is an open-source software for securing and observing network connectivity between cloud-native container workloads." + }, + { + "name": "cni-cilium", + "description": "Cilium is an open-source software for securing and observing network connectivity between cloud-native container workloads." + }, + { + "name": "edge-k3s", + "description": "K3s is a lightweight distribution of Kubernetes that is specifically designed for resource-constrained environments and Internet of Things (IoT) applications." + }, + { + "name": "edge-k8s", + "description": "Palette eXtended Kubernetes - Edge (PXK-E) is a customized version of the open-source Cloud Native Computing Foundation (CNCF) distribution of Kubernetes. This Kubernetes distribution is customized and optimized for edge computing environments and can be deployed through Palette." + }, + { + "name": "edge-native-byoi", + "description": "The Bring Your Own Operating System (BYOOS) pack enables you to use a custom Operating System (OS) with Palette Edge clusters." + }, + { + "name": "generic-byoi", + "description": "The Bring Your Own Operating System (BYOOS) pack enables you to use a custom Operating System (OS) with Palette clusters." + }, + { + "name": "harbor-edge-native-config", + "description": "Harbor is an open-source registry that secures artifacts with policies and role-based access control. You can install Harbor on your Edge clusters and use it to store all the images used by the cluster, including your provider images and packs." + }, + { + "name": "harbor", + "description": "Harbor is an open-source registry that secures artifacts with policies and role-based access control. You can install Harbor on your clusters and use it to store all the images and packs used by the cluster." + }, + { + "name": "nginx", + "description": "The NGNIX pack is an Ingress Controller implementation that uses NGINX as a reverse proxy and load balancer. It provides services with externally reachable URLs, offers SSL/TLS termination, load balances traffic, and supports name-based virtual hosting." + }, + { + "name": "local-ai", + "description": "LocalAI is an open-source alternative to OpenAI that enables you to run LLMs and generate images and audio locally using consumer-grade hardware. It supports multiple model families." + }, + { + "name": "minio", + "description": "MinIO is a Kubernetes-native high-performance object store with an S3-compatible API." + }, + { + "name": "nvidia-gpu-operator", + "description": "The NVIDIA GPU Operator automates the management of the NVIDIA software components required for GPU provisioning. This allows Kubernetes cluster administrators to manage GPU nodes in the same way as CPU nodes." + }, + { + "name": "oam-app-controller", + "description": "The OAM App Controller is a set of packs used for deploying Open Application Model (OAM) applications. It comprises the App-core, Flux2, and Zot packs." + }, + { + "name": "opensuse-k3s", + "description": "SUSE K3s is a SUSE offering for K3s, a lightweight yet powerful certified Kubernetes distribution designed for production workloads across resource-restrained, remote locations or on Edge IoT devices." + }, + { + "name": "open-policy-agent", + "description": "Open Policy Agent (OPA) Gatekeeper provides an admission control system based on policies or rules implemented through parameterized and admin configurable constraints." + }, + { + "name": "outcold-monitoring", + "description": "Outcold Solutions is a Kubernetes monitoring solution integrated with Splunk. It includes capabilities for log aggregation, cluster health monitoring, application monitoring, and security auditing." + }, + { + "name": "kubesec", + "description": "Kubesec provides security risk analysis for Kubernetes resources. It identifies misconfigurations and generates recommendations to improve the security of Pods, Deployments, and other resources." + }, + { + "name": "kubevious", + "description": "Kubevious is a cloud-native best practices and configuration validation enforcement tool for Kubernetes clusters and applications. It detects and enforces custom policies and conditions within your clusters." + }, + { + "name": "kubevirt", + "description": "KubeVirt is a virtual machine management add-on that allows the management of virtual machine workloads alongside container workloads within a Kubernetes cluster." + }, + { + "name": "kubevirt-cdi", + "description": "The KubeVirt Containerized Data Importer (CDI) provides facilities for enabling Persistent Volume Claims (PVCs) to be used as disks for KubeVirt VMs via DataVolumes." + }, + { + "name": "kubewatch", + "description": "Kubewatch is a Kubernetes watcher that monitors the cluster for resource changes and publishes notifications to available collaboration hubs and notification channels." + }, + { + "name": "lb-citrix-adc", + "description": "Citrix ADC is an application delivery controller (ADC) solution that offers IP address management and load balancing capabilities for external services deployed on Kubernetes clusters, particularly suited for on-premise deployments." + }, + { + "name": "linkerd", + "description": "Linkerd is a service mesh for Kubernetes that provides runtime debugging, observability, reliability, and security without requiring code changes." + }, + { + "name": "newrelic", + "description": "New Relic is an observability platform designed to provide real-time insights into the performance and behavior of digital systems. It allows you to monitor applications, infrastructure, web browsers, and other components." + }, + { + "name": "permission-manager", + "description": "The Permission Manager pack provides a graphical user interface for RBAC management in Kubernetes. It allows you to create users, assign namespaces and permissions, and distribute Kubeconfig YAML files." + }, + { + "name": "palette-upgrader", + "description": "The Palette Upgrader pack enables you to manage the Palette upgrade version of Edge-virtual clusters." + }, + { + "name": "pfsense-vm-libvirt", + "description": "pfSense is an open-source customized distribution of the FreeBSD operating system designed for use as a firewall and router in libvirt VMs." + }, + { + "name": "pfsense-vm-vsphere", + "description": "pfSense is an open-source customized distribution of the FreeBSD operating system designed for use as a firewall and router in vSphere VMs." + }, + { + "name": "datadog", + "description": "Datadog is an observability platform that offers a variety of application monitoring capabilities for servers, databases, tools, and services." + }, + { + "name": "prismacloud", + "description": "Prisma Cloud Compute is a cloud workload protection platform (CWPP) that protects hosts, containers, and serverless deployments in any cloud at every stage of the software lifecycle. It provides security for tenant workloads regardless of the underlying compute technology or cloud environment." + }, + { + "name": "prometheus-agent", + "description": "Prometheus is an open-source monitoring and alerting system that is designed to collect and analyze metrics from various systems and services. The Prometheus Agent pack works together with the Prometheus Operator pack." + }, + { + "name": "prometheus-operator", + "description": "The Prometheus Operator is a tool that simplifies the deployment and management of Prometheus in a Kubernetes cluster. It automates tasks such as configuring Prometheus, creating and managing Prometheus rules and alerts and scaling Prometheus instances based on demand." + }, + { + "name": "qualys-agent", + "description": "Qualys Cloud Agent is a lightweight cloud security agent that enables real-time, global visibility of IT assets and response." + }, + { + "name": "rbac-manager", + "description": "Fairwinds RBAC Manager is an operator that supports declarative configuration for RBAC with new custom resources, simplifying authorization in Kubernetes." + }, + { + "name": "registry-creds", + "description": "The Registry Credentials pack allows you to refresh AWS ECR, Google Registry, and Azure Container Registry credentials inside your Kubernetes cluster using ImagePullSecrets." + }, + { + "name": "reloader", + "description": "Reloader is a Kubernetes controller that monitors changes in ConfigMaps and Secrets and performs rolling upgrades on Pods with their associated Deployments, StatefulSets, DaemonSets, and DeploymentConfigs." + }, + { + "name": "rhel-vmware", + "description": "Red Hat Enterprise Linux (RHEL) is an enterprise Linux operating system (OS) developed by Red Hat. The RHEL pack is designed for VMware clusters." + }, + { + "name": "sapp-hipster", + "description": "Hipster Commerce is a demo e-commerce application used to showcase Palette." + }, + { + "name": "seccomp", + "description": "Seccomp (Secure Computing Mode) is a security mechanism for Linux processes that filters system calls (syscalls) based on a set of defined rules. You can apply seccomp profiles to containerized workloads to enhance the security of the application deployment." + }, + { + "name": "signalfx", + "description": "SignalFx is a cloud monitoring platform for infrastructure, microservices, and applications. It allows you to monitor and observe data in real-time, regardless of the data source or type of application." + }, + { + "name": "slem-rke2", + "description": "RKE2 is a fully conformant Kubernetes distribution by Rancher, focusing on security and compliance within the U.S. Federal Government sector. SLE Micro RKE2 is the RKE2 Kubernetes distribution suited for the SUSE Linux Enterprise (SLE) Micro edge operating system." + }, + { + "name": "spectro-byo-manifest", + "description": "The BYO Manifest add-on pack enables you to add your own Kubernetes manifest to the pack's values field, allowing you to deploy your own custom applications." + }, + { + "name": "spectro-cluster-metrics", + "description": "The Spectro Cluster Metrics pack exposes Palette-specific host cluster metrics to Prometheus. You can use this data to learn about the state of your clusters, resource utilization, and more." + }, + { + "name": "spectrocloud-grafana-dashboards", + "description": "The Spectro Cloud Grafana Dashboards is a demo add-on pack that exposes internal cluster resource metrics. You can access the cluster information exposed by the pack in Grafana by visiting the Spectro Cloud/Spectro Clusters dashboard." + }, + { + "name": "spectro-grafana-dashboards", + "description": "The Spectro Cloud Grafana Dashboards is an add-on pack that exposes internal cluster resource metrics. You can access the cluster information exposed by the pack in Grafana by visiting the Spectro Cloud/Spectro Clusters dashboard." + }, + { + "name": "heartbeat", + "description": "Heartbeat is a lightweight daemon that periodically checks the status of your services and determines whether they are reachable." + }, + { + "name": "image-swap", + "description": "The ImageSwap pack is a webhook that allows you to define mappings to automatically swap image definitions within Kubernetes Pods with a different registry." + }, + { + "name": "istio", + "description": "Istio is an open-source service mesh that layers transparently onto existing distributed applications. It helps you to secure, connect, and monitor services." + }, + { + "name": "k8gb", + "description": "k8gb is an open-source global load balancing solution for Kubernetes. It focuses on load balancing traffic across geographically dispersed Kubernetes clusters using different load balancing strategies." + }, + { + "name": "k8sgpt-operator", + "description": "The K8sGPT Operator enables K8sGPT within a Kubernetes cluster. K8sGPT is a tool that continuously scans your Kubernetes clusters for anomalies. It analyzes cluster data and uses AI engines to provide insights and recommendations." + }, + { + "name": "konvoy-defaultstorageclass", + "description": "The Konvoy Default Storage Class pack enables users to specify a default storage class for applications that require persistent storage." + }, + { + "name": "konvoy-nvidia", + "description": "The NVIDIA GPU Plugin pack enables the NVIDIA device plugin in Konvoy clusters." + }, + { + "name": "konvoy-opsportal", + "description": "Konvoy Operations Portal is a web application that provides an overview of cluster status and shortcuts to several dashboards for add-on services, such as Grafana." + }, + { + "name": "kong", + "description": "Kong Ingress Controller allows you to run Kong Gateway as a Kubernetes Ingress to handle inbound requests for a Kubernetes cluster." + }, + { + "name": "k8s-dashboard", + "description": "Kubernetes Dashboard is a web-based Kubernetes UI that allows users to monitor and manage clusters and deployed workloads." + }, + { + "name": "kotsadm", + "description": "Kotsadm is an admin console designed for managing Kubernetes Off-The-Shelf (KOTS) software. Once deployed, Kotsadm enables administrators to configure, install, and update applications using step-through configuration and automated preflight checks." + }, + { + "name": "kube-bench", + "description": "kube-bench is a tool that checks whether Kubernetes is deployed securely by running the checks documented in the CIS Kubernetes Benchmark." + }, + { + "name": "kubeflow", + "description": "Kubeflow is the machine learning toolkit for Kubernetes. It helps make the deployment of machine learning (ML) workflows on Kubernetes simple, portable, and scalable." + }, + { + "name": "kubeflow-full", + "description": "The Kubeflow Full pack offers the complete suite of Kubeflow components bundled together." + }, + { + "name": "kubeflow-pipelines", + "description": "Kubeflow Pipelines is a platform for building and deploying portable, scalable machine learning (ML) workflows based on Docker containers." + }, + { + "name": "kubeflow-serving", + "description": "The Kubeflow Serving pack provides a Kubernetes Custom Resource Definition (CRD) for serving predictive and generative Machine Learning (ML) models." + }, + { + "name": "kubeflow-training", + "description": "The Kubeflow Training Operator is a Kubernetes-native project for fine-tuning and scalable distributed training of Machine Learning (ML) models created with various ML frameworks. It allows you to use Kubernetes workloads to train your large models via Kubernetes Custom Resources APIs or using the Training Operator Python Software Development Toolkit (SDK)." + }, + { + "name": "kubehunter", + "description": "Kube-hunter searches for security weaknesses in Kubernetes clusters. It is designed to increase awareness and visibility of security issues in Kubernetes environments." + }, + { + "name": "kubebench", + "description": "kube-bench is a tool that checks whether Kubernetes is deployed securely by running the checks documented in the CIS Kubernetes Benchmark." + }, + { + "name": "spectro-proxy", + "description": "Spectro Proxy is a pack that enables the use of a reverse proxy with a Kubernetes cluster. The reverse proxy allows you to connect to the cluster API of a Palette-managed Kubernetes cluster in private networks or clusters configured with private API endpoints. The reverse proxy managed by Spectro Cloud is also known as the forward reverse proxy (FRP)." + }, + { + "name": "spectro-k8s-dashboard", + "description": "This pack deploys the Kubernetes Dashboard, and the Spectro Proxy if needed. The pack reduces the complexity of deploying the Kubernetes Dashboard by creating required resources and roles." + }, + { + "name": "spectro-rbac", + "description": "The Spectro RBAC pack is a helper pack to create roleBindings and clusterRoleBindings for a user or service account in a Kubernetes cluster." + }, + { + "name": "spectro-namespace-labeler", + "description": "The Spectro Namespace Labeler pack is a helper pack to add labels to a namespace in a Kubernetes cluster." + }, + { + "name": "spectro-nodes-task-handler", + "description": "The Spectro Nodes Task Handler pack is tool you can use to perform tasks on nodes in a Kubernetes cluster post-initailization. For example, you can use it to install software, or modify default settings, and more." + }, + { + "name": "spectro-pack-status-check", + "description": "This pack invokes a script that reads a timeout from the YAML file provided, calculates the number of attempts, and repeatedly checks the status of specified Kubernetes resources against expected conditions. If a resource meets the condition within the attempts, it exits successfully; otherwise, it fa" + }, + { + "name": "spegel", + "description": "Spegel is a local OCI registry mirror for Kubernets clusters. You can use it to locally cache images from external registries with no explicit configuration, and more." + }, + { + "name": "splunk", + "description": "This pack deploys Splunk Connect for Kubernetes. Splunk Connect for Kubernetes provides a way to import and search your Kubernetes logging, object, and metrics data in your Splunk platform deployment." + }, + { + "name": "spotinst-kubernetes-cluster-controller", + "description": "Ocean automates cloud infrastructure for containers. It continuously analyzes how your containers are using infrastructure, automatically scaling compute resources to maximize utilization and availability and utilizing the optimal blend of spot, reserved, and on-demand compute instances. Ocean eliminates the need to manage and operate cloud infrastructure." + }, + { + "name": "sr-iov", + "description": "SR-IOV is a CNI plugin that enables the configuration and usage of SR-IOV VF networks in containers and orchestrators like Kubernetes." + }, + { + "name": "strimzi-kafka", + "description": "Strimzi provides a way to deploy an Apache Kafka® cluster on Kubernetes in various deployment configurations. " + }, + { + "name": "suc", + "description": "System Upgrade Controller, is a general-purpose, Kubernetes-native upgrade controller for Kubernetes nodes developed by Rancher. It introduces a new CRD, the Plan, for defining any and all of your upgrade policie and requirements. A Plan is an outstanding intent to mutate nodes in your cluster." + }, + { + "name": "sumologic", + "description": "The Sumo Logic Kubernetes app provides visibility into the worker nodes that comprise a cluster, as well as application logs of the worker nodes. The app is a single-pane-of-glass through which you can monitor and troubleshoot container health, replication, load balancing, pod state and hardware resource allocation." + }, + { + "name": "sysdig", + "description": "Sysdig is a monitoring, security, and troubleshooting platform for cloud-native applications. Sysdig provides deep visibility into containerized applications, allowing you to monitor, secure, and troubleshoot your Kubernetes environment." + }, + { + "name": "stormforge-optimize-live", + "description": "StormForge Optimize Live is a Kubernetes-native performance optimization platform that uses machine learning to automatically tune your applications for performance, cost, and resource efficiency." + }, + { + "name": "tekton-chains", + "descriptions": "Tekton Chains is a Kubernetes Custom Resource Definition (CRD) controller that allows you to manage your supply chain security in Tekton. In its default mode of operation, Chains works by observing all TaskRuns executions in your cluster. When TaskRuns complete, Chains takes a snapshot of them. Chains then converts this snapshot to one or more standard payload formats, signs them and stores where specified." + }, + { + "name": "tekton-operator", + "description": "Tekton Operator is a Kubernetes extension that can install, upgrade and manage TektonCD Pipelines, Dashboard, Triggers and other components, on any Kubernetes Cluster." + }, + { + "name": "tetragon", + "description": "Tetragon is a flexible Kubernetes-aware security observability and runtime enforcement tool that applies policy and filtering directly with eBPF, allowing for reduced observation overhead, tracking of any process, and real-time enforcement of policies." + }, + { + "name": "tke-managed-os", + "description": "TKE Managed OS is a pack that provides a managed operating system for Tencent Kubernetes Engine (TKE) clusters. The pack includes the operating system and the necessary configurations to deploy the TKE cluster." + }, + { + "name": "thanos", + "description": "Thanos is a set of components that can be composed into a highly available metric system with unlimited storage capacity, which can be added seamlessly on top of existing Prometheus deployments. Thanos leverages the Prometheus 2.0 storage format to cost-efficiently store historical metric data in any object storage while retaining fast query latencies." + }, + { + "name": "triliovault", + "description": "Trilio for Kubernetes is a data protection and backup solution specifically designed for Kubernetes environments. Trilio provides backup and recovery capabilities tailored for these dynamic, container-based infrastructures." + }, + { + "name": "trivy", + "description": "Trivy is a simple and comprehensive vulnerability, misconfiguration, secret scanner for containers and other artifacts. Trivy detects vulnerabilities of OS packages and language-specific packages. In addition, Trivy scans Infrastructure as Code (IaC) files such as Terraform and Kubernetes, to detect potential configuration issues that expose your deployments to the risk of attack." + }, + { + "name": "trow", + "description": "Trow is an image management service for Kubernetes that allows you to store, manage, and distribute container images in your cluster. Trow provides a secure, private registry for your Kubernetes cluster, allowing you to store images locally and distribute them across your cluster." + }, + { + "name": "Twistlock", + "description": "Twistlock is a comprehensive container security solution designed specifically for Kubernetes and other container environments. Twistlock provides end-to-end security for containerized applications running on Kubernetes, covering the entire container lifecycle from development to production." + }, + { + "name": "ubuntu-aws", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-azure", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-gcp", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-aks", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-eks", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-gke", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-maas", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-edge", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-libvirt", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-openstack", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "ubuntu-vsphere", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "edge-native-ubuntu", + "description": "Ubuntu is a free, open-source operating system (OS) based on Linux that can be used on desktops, servers, in the cloud, and for IoT devices. Ubuntu is a Linux distribution derived from Debian." + }, + { + "name": "unctl", + "description": "unctl is a versatile command-line tool designed to perform a wide range of checks and inspections on various components of your infrastructure. It provides a unified interface to assess the health and performance of different services and platforms, and goes beyond mere diagnosis." + }, + { + "name": "vault", + "description": "Vault is a tool developed by HashiCorp that helps organizations manage and protect sensitive data and secrets. It uses identity-based security to authenticate and authorize access to secrets, such as passwords, API keys, and encryption keys, using authentication and authorization methods. Vault also protects data in-transit and at rest, and can help prevent credential exposure and unauthorized users." + }, + { + "name": "velero", + "description": "Velero is an open source tool to safely backup and restore, perform disaster recovery, and migrate Kubernetes cluster resources and persistent volumes." + }, + { + "name": "virtual-machine-orchestrator", + "description": "The Palette Virtual Machine Orchestrator (VMO) pack consolidates all components that you need to deploy and manage Virtual Machines (VMs) alongside containers in a Kubernetes host cluster. You can deploy VMO as an add-on cluster profile on top of an existing data center or edge cluster." + }, + { + "name": "volume-snapshot-controller", + "description": "The Volume Snapshot Controller is a Kubernetes controller that can take snapshots of a persistent volume. A snapshot can be used either to rehydrate a new volume, pre-populated with the snapshot data, or to restore an existing volume to a previous state (represented by the snapshot)." + }, + { + "name": "wordpress-chart", + "description": "WordPress is an open-source web content management system. It was originally created as a tool to publish blogs but has evolved to support publishing other web content, including more traditional websites, mailing lists and Internet forum, media galleries, membership sites, learning management systems, and online stores. " + } +] diff --git a/static/scripts/constants.js b/static/scripts/constants.js new file mode 100644 index 0000000000..47e12617c1 --- /dev/null +++ b/static/scripts/constants.js @@ -0,0 +1 @@ +export const BASE_URL = "http://api.spectrocloud.com"; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 80de3b1401..9de14de20c 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -3,7 +3,15 @@ "noEmit": true, "allowJs": true }, - "extends": "./tsconfig.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "./.eslintrc.js", "*.d.ts", "visuals/**/*.ts", "playwright.config.ts"], + "extends": ["./tsconfig.json"], + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "./.eslintrc.js", + "*.d.ts", + "visuals/**/*.ts", + "playwright.config.ts", + "_partials/*.ts" + ], "exclude": ["**/node_modules", "deprecated"] }