From 3c5b46af10c0dad2bf15650537d503ff38488b48 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Thu, 13 Mar 2025 14:02:35 +0200 Subject: [PATCH 01/16] chore: canary-checker link fixes --- .../expressions/_transform_fields.mdx | 4 +- .../docs/concepts/expressions/index.md | 2 +- canary-checker/docs/concepts/index.md | 6 - canary-checker/docs/concepts/index.mdx | 12 + canary-checker/docs/concepts/metrics.mdx | 117 +++++++++ .../docs/concepts/metrics/custom-metrics.md | 61 ----- .../docs/concepts/metrics/grafana.md | 11 - .../docs/concepts/metrics/index.mdx | 30 --- .../docs/concepts/metrics/stateful-metrics.md | 29 --- .../docs/examples/{index.md => index.mdx} | 5 + canary-checker/docs/examples/k6.mdx | 2 +- canary-checker/docs/examples/newman.mdx | 2 +- canary-checker/docs/examples/playwright.mdx | 2 +- canary-checker/docs/examples/sftp.mdx | 2 +- canary-checker/docs/examples/smb.mdx | 3 +- .../docs/getting-started.canary.mdx | 9 +- canary-checker/docs/health-checks.canary.mdx | 3 +- canary-checker/docs/index.mdx | 2 +- .../1-helm.canary.md} | 8 +- .../docs/{concepts => installation}/cli.mdx | 0 .../{ => installation}/database.canary.md | 3 + .../docs/installation}/image-variants.md | 10 + .../docs/reference/1-alert-manager.mdx | 4 + canary-checker/docs/reference/1-catalog.mdx | 32 ++- canary-checker/docs/reference/1-exec.mdx | 16 +- canary-checker/docs/reference/1-folder.mdx | 50 ++-- .../docs/reference/1-kubernetes.mdx | 49 +++- .../docs/reference/1-s3-protocol.mdx | 1 + canary-checker/docs/reference/1-webhook.mdx | 4 +- .../docs/reference/3-gcs-database-backup.mdx | 38 +-- canary-checker/docs/reference/3-namespace.mdx | 2 +- .../docs/reference/{index.md => _category.md} | 1 + .../docs/reference/_connections.mdx | 21 +- canary-checker/docs/reference/category.md | 11 + canary-checker/docs/reference/jmeter.mdx | 2 +- canary-checker/docs/scripting/gotemplate.mdx | 50 +++- .../control-plane-testing/basic-canary.yaml | 47 ---- .../control-plane-testing/basic-run.svg | 31 --- .../canary-checker.properties | 0 .../control-plane-testing/custom-canary.yaml | 61 ----- .../tutorials/control-plane-testing/flux.yaml | 38 --- .../tutorials/control-plane-testing/index.mdx | 207 ---------------- .../control-plane-testing/template.yaml | 24 -- .../docs/tutorials/getting-started.md | 223 ------------------ canary-checker/docs/types.md | 11 + canary-checker/docusaurus.config.js | 27 +++ canary-checker/sidebars.js | 60 ++++- common/src/components/Badges.jsx | 4 +- common/src/components/Fields.jsx | 41 +++- common/src/components/HealthCheck.jsx | 6 +- common/src/components/Home.jsx | 14 +- common/src/components/Integrations.jsx | 45 ++-- .../docs/guide/playbooks/actions/exec.mdx | 12 + modules/.gitignore | 2 + 54 files changed, 542 insertions(+), 915 deletions(-) delete mode 100644 canary-checker/docs/concepts/index.md create mode 100644 canary-checker/docs/concepts/index.mdx create mode 100644 canary-checker/docs/concepts/metrics.mdx delete mode 100644 canary-checker/docs/concepts/metrics/custom-metrics.md delete mode 100644 canary-checker/docs/concepts/metrics/grafana.md delete mode 100644 canary-checker/docs/concepts/metrics/index.mdx delete mode 100644 canary-checker/docs/concepts/metrics/stateful-metrics.md rename canary-checker/docs/examples/{index.md => index.mdx} (54%) rename canary-checker/docs/{helm.canary.md => installation/1-helm.canary.md} (95%) rename canary-checker/docs/{concepts => installation}/cli.mdx (100%) rename canary-checker/docs/{ => installation}/database.canary.md (96%) rename {mission-control/docs/reference/canary-checker => canary-checker/docs/installation}/image-variants.md (85%) rename canary-checker/docs/reference/{index.md => _category.md} (89%) create mode 100644 canary-checker/docs/reference/category.md delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/basic-canary.yaml delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/basic-run.svg delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/canary-checker.properties delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/custom-canary.yaml delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/flux.yaml delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/index.mdx delete mode 100644 canary-checker/docs/tutorials/control-plane-testing/template.yaml delete mode 100644 canary-checker/docs/tutorials/getting-started.md create mode 100644 canary-checker/docs/types.md create mode 100644 modules/.gitignore diff --git a/canary-checker/docs/concepts/expressions/_transform_fields.mdx b/canary-checker/docs/concepts/expressions/_transform_fields.mdx index 867af3d0..51de13bf 100644 --- a/canary-checker/docs/concepts/expressions/_transform_fields.mdx +++ b/canary-checker/docs/concepts/expressions/_transform_fields.mdx @@ -102,9 +102,11 @@ { field: "metrics", description: "Add custom metrics to be exported", - scheme: "[[]Metric](../metrics/custom-metrics#metric)", + scheme: "[]Metric", required: false }, + + { field: "icon", description: null, diff --git a/canary-checker/docs/concepts/expressions/index.md b/canary-checker/docs/concepts/expressions/index.md index 0994a3a7..585e2ca1 100644 --- a/canary-checker/docs/concepts/expressions/index.md +++ b/canary-checker/docs/concepts/expressions/index.md @@ -1,7 +1,7 @@ --- title: Expressions sidebar_custom_props: - icon: variable + icon: hugeicons:code --- canary-checker can be extended using expressions in 3 ways: diff --git a/canary-checker/docs/concepts/index.md b/canary-checker/docs/concepts/index.md deleted file mode 100644 index b297838c..00000000 --- a/canary-checker/docs/concepts/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Concepts -sidebar_position: 1 -sidebar_custom_props: - icon: concepts ---- diff --git a/canary-checker/docs/concepts/index.mdx b/canary-checker/docs/concepts/index.mdx new file mode 100644 index 00000000..8d8469d2 --- /dev/null +++ b/canary-checker/docs/concepts/index.mdx @@ -0,0 +1,12 @@ +--- +title: Concepts +hide_sidebar: true +sidebar_position: 1 +sidebar_custom_props: + icon: concepts +--- + + +import DocCardList from '@theme/DocCardList'; + + diff --git a/canary-checker/docs/concepts/metrics.mdx b/canary-checker/docs/concepts/metrics.mdx new file mode 100644 index 00000000..b0ada568 --- /dev/null +++ b/canary-checker/docs/concepts/metrics.mdx @@ -0,0 +1,117 @@ +--- +title: Metrics +sidebar_custom_props: + icon: clarity:dashboard-line +--- + + +Canary Checker works well with Prometheus and exports metrics for every check, the standard metrics included are: + +| Metric | Type | Description | +| ---------------------------------------------- | --------- | ------------------------------------------- | +| canary_check | Gauge | Set to 0 when passing and 1 when failing | +| canary_check_success_count | Counter | | +| canary_check_failed_count | Counter | | +| canary_check_info | Info | | +| canary_check_duration | Histogram | Histogram of canary durations | + +Some checks like [pod](../../reference/pod) and [http](../../reference/http) expose additional metrics. + + +## Custom Metrics + +Canary checker can export custom metrics from any check type, replacing and/or consolidating multiple standalone Prometheus Exporters into a single exporter. + +In the example below, exchange rates against USD are exported by first calling an HTTP api and then using the values from the JSON response to create the metrics: + +```yaml title="exchange-rates-exporter.yaml" file=/modules/canary-checker/fixtures/minimal/metrics-multiple.yaml + +``` + +Which would output: + +```shell +exchange_rate{from=USD, to=GBP} 0.819 +exchange_rate{from=USD, to=EUR} 0.949 +exchange_rate{from=USD, to=ILS} 3.849 +exchange_rate_api 260.000 +``` + +### Fields + +| Field | Description | Scheme | Required | +| -------- | ------------------------------------------------------ | ----------------- | -------- | +| `metrics[].name` | Name of the metric | `string` | Yes | +| `metrics[].value` | An expression to derive the metric value from | CEL with [Check Context](#check-context) that returns `float` | Yes | +| `metrics[].type` | Prometheus Metric Type | `counter`, `guage`, `histogram` | Yes | +| `metrics[].labels[].name` | Name of the label | `string` | Yes | +| `metrics[].labels[].value` | A static value for the label value | `float` | | +| `metrics[].labels[].valueExpr` | An expression to derive the label value from | CEL with [Check Context](#check-context) | | +| `metrics[].labels[].labels` | Labels for prometheus metric (values can be templated) | `map[string]string` | | + +Expressions can make use of the following variables: + +### Check Context + +| Fields | Description | Scheme | +| ------------------------- | ------------------------------------------ | ----------------------------------------- | +| `*` | All fields from the check result | See result variables section of the check | +| **`last_result.results`** | The last result | | +| `check.name` | Check name | `string` | +| `check.description` | Check description | `string` | +| `check.labels` | Dynamic labels attached to the check | `map[string]string` | +| `check.endpoint` | Endpoint (usually a URL) | `string` | +| `check.duration` | Duration in milliseconds | `int64` | +| `canary.name` | Canary name | `string` | +| `canary.namespace` | Canary namespace | `string` | +| `canary.labels` | Labels attached to the canary CRD (if any) | `map[string]string` | + + +## Prometheus Operator + +The helm chart can install a `ServiceMonitor` for the prometheus operator, by enabling the serviceMonitor flag + +``` +--set serviceMonitor=true +``` + +## Grafana + + +Default grafana dashboards are available. After you deploy Grafana, these dashboards can be installed with + +``` +--set grafanaDashboards=true --set serviceMonitor=true +``` + +![](/img/grafana-dashboard.png) + + +## Stateful Metrics + + +Metrics can be generated from time based data, e.g. logs per minute, logins per second by using the output of one check execution as the input to the next. + +```yaml file=/modules/canary-checker/fixtures/elasticsearch/stateful_metrics.yaml + +``` + +This snippet retrieves the `last_result.results.max` value from the last execution ensuring data is not duplicated or missed + +```go +"@timestamp" : { + {{- if last_result.results.max }} + "gte": "{{ last_result.results.max }}" + {{- else }} + "gte": "now-5m" + {{- end }} +} +``` + +The max value is saved in the `transform` section using: + +```yaml +#... +'detail': { 'max': string(json.?aggregations.logs.age.value_as_string.orValue(last_result().?results.max.orValue(time.Now()))) }, +#... +``` diff --git a/canary-checker/docs/concepts/metrics/custom-metrics.md b/canary-checker/docs/concepts/metrics/custom-metrics.md deleted file mode 100644 index bfb8ad64..00000000 --- a/canary-checker/docs/concepts/metrics/custom-metrics.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Custom Metrics ---- - -Canary checker can export custom metrics from any check type, replacing and/or consolidating multiple standalone Prometheus Exporters into a single exporter. - -In the example below, exchange rates against the USD are exported by first calling an HTTP api and then using the values from the JSON response to create the metrics: - -```yaml title="exchange-rates-exporter.yaml" file=/modules/canary-checker/fixtures/minimal/metrics-multiple.yaml - -``` - -Which would output: - -```shell -exchange_rate{from=USD, to=GBP} 0.819 -exchange_rate{from=USD, to=EUR} 0.949 -exchange_rate{from=USD, to=ILS} 3.849 -exchange_rate_api 260.000 -``` - -## Result Variables - -| Field | Description | Scheme | Required | -| --------- | ------------------------------------ | ----------------- | -------- | -| `metrics` | Metrics to export from check results | [Metric](#metric) | | - -### Metric - -| Field | Description | Scheme | Required | -| -------- | ------------------------------------------------------ | ----------------- | -------- | -| `name` | Name of the metric | `string` | Yes | -| `value` | An expression to derive the metric value from | `Expression` | Yes | -| `type` | Prometheus Metric Type (counter, gauge or histogram) | `string` | Yes | -| `labels` | Labels for prometheus metric (values can be templated) | [[]Label](#label) | | - -### Label - -| Field | Description | Scheme | Required | -| ----------- | ------------------------------------------------------ | ------------------- | -------- | -| `name` | Name of the label | `string` | Yes | -| `value` | A static value for the header | `string` | | -| `valueExpr` | An expression to derive the header value from | `Expression` | | -| `labels` | Labels for prometheus metric (values can be templated) | `map[string]string` | | - -Expressions can make use of the following variables: - -### **Expression Variables** - -| Fields | Description | Scheme | -| ------------------------- | ------------------------------------------ | ----------------------------------------- | -| **`result`** | Check Result | See result variables section of the check | -| **`last_result.results`** | The last result | | -| `check.name` | Check name | `string` | -| `check.description` | Check description | `string` | -| `check.labels` | Dynamic labels attached to the check | `map[string]string` | -| `check.endpoint` | Endpoint (usually a URL) | `string` | -| `check.duration` | Duration in milliseconds | `int64` | -| `canary.name` | Canary name | `string` | -| `canary.namespace` | Canary namespace | `string` | -| `canary.labels` | Labels attached to the canary CRD (if any) | `map[string]string` | diff --git a/canary-checker/docs/concepts/metrics/grafana.md b/canary-checker/docs/concepts/metrics/grafana.md deleted file mode 100644 index 7e36d8c3..00000000 --- a/canary-checker/docs/concepts/metrics/grafana.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Grafana ---- - -Default grafana dashboards are available. After you deploy Grafana, these dashboards can be installed with - -``` ---set grafanaDashboards=true --set serviceMonitor=true -``` - -![](/img/grafana-dashboard.png) diff --git a/canary-checker/docs/concepts/metrics/index.mdx b/canary-checker/docs/concepts/metrics/index.mdx deleted file mode 100644 index fa969b53..00000000 --- a/canary-checker/docs/concepts/metrics/index.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Metrics -sidebar_custom_props: - icon: clarity:dashboard-line ---- - -Default Metrics exposed by canary-checker: - -| Metric | Type | Description | -| ---------------------------------------------- | --------- | ------------------------------------------- | -| canary_check | Gauge | Set to 0 when passing and 1 when failing | -| canary_check_success_count | Counter | | -| canary_check_failed_count | Counter | | -| canary_check_info | Info | | -| canary_check_duration | Histogram | Histogram of canary durations | - -Some checks like [pod](../../reference/pod) and [http](../../reference/http) expose additional metrics. - -:::tip -Custom metrics can be exported from any check, see [custom-metrics](./custom-metrics) -::: - - -## Prometheus Operator - -The helm chart can install a `ServiceMonitor` for the prometheus operator, by enabling the serviceMonitor flag - -``` ---set serviceMonitor=true -``` diff --git a/canary-checker/docs/concepts/metrics/stateful-metrics.md b/canary-checker/docs/concepts/metrics/stateful-metrics.md deleted file mode 100644 index 2118b51a..00000000 --- a/canary-checker/docs/concepts/metrics/stateful-metrics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Stateful Metrics ---- - -Metrics can be generated from time based data, e.g. logs per minute, logins per second by using the output of one check execution as the input to the next. - -```yaml file=/modules/canary-checker/fixtures/elasticsearch/stateful_metrics.yaml - -``` - -This snippet retrieves the `last_result.results.max` value from the last execution ensuring data is not duplicated or missed - -```go -"@timestamp" : { - {{- if last_result.results.max }} - "gte": "{{ last_result.results.max }}" - {{- else }} - "gte": "now-5m" - {{- end }} -} -``` - -The max value is saved in the `transform` section using: - -```yaml -#... -'detail': { 'max': string(json.?aggregations.logs.age.value_as_string.orValue(last_result().?results.max.orValue(time.Now()))) }, -#... -``` diff --git a/canary-checker/docs/examples/index.md b/canary-checker/docs/examples/index.mdx similarity index 54% rename from canary-checker/docs/examples/index.md rename to canary-checker/docs/examples/index.mdx index 0db2ed21..4a323b7a 100644 --- a/canary-checker/docs/examples/index.md +++ b/canary-checker/docs/examples/index.mdx @@ -1,6 +1,11 @@ --- title: Examples sidebar_position: 2 +hide_sidebar: true sidebar_custom_props: icon: stash:graduation-cap-light + --- +import DocCardList from '@theme/DocCardList'; + + diff --git a/canary-checker/docs/examples/k6.mdx b/canary-checker/docs/examples/k6.mdx index 13f50c24..851e6a2c 100644 --- a/canary-checker/docs/examples/k6.mdx +++ b/canary-checker/docs/examples/k6.mdx @@ -91,4 +91,4 @@ For a complete working example, see **[canary-checker-examples/k6](https://githu ## Test Result Variables -See [JUnit Test Results](/guide/canary-checker/reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. +See [JUnit Test Results](../reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. diff --git a/canary-checker/docs/examples/newman.mdx b/canary-checker/docs/examples/newman.mdx index 3d050384..2bc310bc 100644 --- a/canary-checker/docs/examples/newman.mdx +++ b/canary-checker/docs/examples/newman.mdx @@ -60,4 +60,4 @@ For a complete working example, see **[canary-checker-examples/newman](https://g ## Test Result Variables -See [JUnit Test Results](/guide/canary-checker/reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. +See [JUnit Test Results](../reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. diff --git a/canary-checker/docs/examples/playwright.mdx b/canary-checker/docs/examples/playwright.mdx index 75dc84fd..1c85d601 100644 --- a/canary-checker/docs/examples/playwright.mdx +++ b/canary-checker/docs/examples/playwright.mdx @@ -57,4 +57,4 @@ For a complete working example, see **[canary-checker-examples/playwright](https ## Test Result Variables -See [JUnit Test Results](/guide/canary-checker/reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. +See [JUnit Test Results](../reference/junit#test-result-variables) for the schema that is ingested and can be used for evaluating health or formatting the display. diff --git a/canary-checker/docs/examples/sftp.mdx b/canary-checker/docs/examples/sftp.mdx index 79fc2e73..a3a02af5 100644 --- a/canary-checker/docs/examples/sftp.mdx +++ b/canary-checker/docs/examples/sftp.mdx @@ -41,7 +41,7 @@ spec: | **`name`** | Name of the check | *string* | Yes | | **`path`** | A path to the remote folder | string | Yes | | **`sftpConnection`** | SFTP connection details | [SFTPConnection](#sftp-connection) | Yes | -| `*` | All other fields available in the folder check | [*Folder*](/guide/canary-checker/reference/folder) | | +| `*` | All other fields available in the folder check | [*Folder*](../reference/folder) | | ## SFTP Connection diff --git a/canary-checker/docs/examples/smb.mdx b/canary-checker/docs/examples/smb.mdx index 8aba10f0..39cca6d5 100644 --- a/canary-checker/docs/examples/smb.mdx +++ b/canary-checker/docs/examples/smb.mdx @@ -39,9 +39,10 @@ spec: | **`name`** | Name of the check | _string_ | Yes | | **`path`** | A path to a shared windows folder e.g. `smb://host/folder` | string | Yes | | `smbConnection` | SMB connection details | [SMB](#smb) | | -| `*` | All other fields available in the folder check | [_Folder_](/guide/canary-checker/reference/folder) | | +| `*` | All other fields available in the folder check | [_Folder_](../reference/folder) | | +## SMB diff --git a/canary-checker/docs/getting-started.canary.mdx b/canary-checker/docs/getting-started.canary.mdx index 3c337fab..72a20fbf 100644 --- a/canary-checker/docs/getting-started.canary.mdx +++ b/canary-checker/docs/getting-started.canary.mdx @@ -3,6 +3,7 @@ title: Getting Started sidebar_position: 1 sidebar_custom_props: icon: getting-started +slug: /getting-started --- import { HiOutlineExternalLink } from "react-icons/hi"; @@ -11,9 +12,9 @@ import { HiOutlineExternalLink } from "react-icons/hi"; 1. Install canary checker using helm - +

2. Create a new check @@ -29,7 +30,7 @@ import { HiOutlineExternalLink } from "react-icons/hi"; ```

- You can also run the check locally to see its output by using the [cli](./cli) + You can also run the check locally to see its output by using the [cli](./installation/cli) ```bash canary-checker run canary.yaml diff --git a/canary-checker/docs/health-checks.canary.mdx b/canary-checker/docs/health-checks.canary.mdx index b4898384..4b3e2ab4 100644 --- a/canary-checker/docs/health-checks.canary.mdx +++ b/canary-checker/docs/health-checks.canary.mdx @@ -45,7 +45,8 @@ The health checks page provides a high-level view of the overall health of all s ## Prometheus -[Prometheus](canary-checker/concepts/metrics) metrics are exposed from health checks to provide high-level visibility into latency, error rates, and other metrics. This allows monitoring the health of services and applications using existing Prometheus alerts and [Grafana](canary-checker/concepts/metrics/grafana) dashboards. +Prometheus metrics are exposed from health checks to provide high-level visibility into latency, error rates, and other metrics. This allows monitoring the health of services and applications using existing Prometheus alerts and +Grafana dashboards. ## Synthetic diff --git a/canary-checker/docs/index.mdx b/canary-checker/docs/index.mdx index c05773e8..67c87714 100644 --- a/canary-checker/docs/index.mdx +++ b/canary-checker/docs/index.mdx @@ -47,7 +47,7 @@ Health checks can be associated with components in a [topology](topology/concept ### Prometheus -[Prometheus](canary-checker/concepts/metrics) metrics are exposed from health checks to provide high level visibility into latency, error rates and other metrics. This allows monitoring the health of services and applications using existing Prometheus alerts and [Grafana](canary-checker/concepts/metrics/grafana) dashboards. +[Prometheus](/concepts/metrics) metrics are exposed from health checks to provide high level visibility into latency, error rates and other metrics. This allows monitoring the health of services and applications using existing Prometheus alerts and Grafana dashboards. ### Synthetic diff --git a/canary-checker/docs/helm.canary.md b/canary-checker/docs/installation/1-helm.canary.md similarity index 95% rename from canary-checker/docs/helm.canary.md rename to canary-checker/docs/installation/1-helm.canary.md index 33146764..e76ad57f 100644 --- a/canary-checker/docs/helm.canary.md +++ b/canary-checker/docs/installation/1-helm.canary.md @@ -2,7 +2,9 @@ title: Helm description: Recommended method for installing canary-checker sidebar_class_name: hidden-mission-control -slug: /guide/canary-checker/helm +slug: /installation/helm +sidebar_custom_props: + icon: helm --- import Schema from '@site/modules/canary-checker/chart/values.schema.json' @@ -22,7 +24,7 @@ The recommended method for installing Canary Checker is using [helm](https://hel /> :::info - Note the default installation of canary-checker uses an embedded postgres database and does not persist history, see: [Database](database) + Note the default installation of canary-checker uses an embedded postgres database and does not persist history, see: [Database](/installation/database) ::: 1. Create a canary @@ -41,7 +43,7 @@ The recommended method for installing Canary Checker is using [helm](https://hel EOF ``` -

+

1. Check the results via the [CLI](./cli) diff --git a/canary-checker/docs/concepts/cli.mdx b/canary-checker/docs/installation/cli.mdx similarity index 100% rename from canary-checker/docs/concepts/cli.mdx rename to canary-checker/docs/installation/cli.mdx diff --git a/canary-checker/docs/database.canary.md b/canary-checker/docs/installation/database.canary.md similarity index 96% rename from canary-checker/docs/database.canary.md rename to canary-checker/docs/installation/database.canary.md index eac6d9ee..c322e2f8 100644 --- a/canary-checker/docs/database.canary.md +++ b/canary-checker/docs/installation/database.canary.md @@ -1,6 +1,9 @@ --- description: Alternative methods for connecting to the db used for persistence sidebar_class_name: hidden-mission-control +slug: /installation/database +sidebar_custom_props: + icon: postgres --- # Database diff --git a/mission-control/docs/reference/canary-checker/image-variants.md b/canary-checker/docs/installation/image-variants.md similarity index 85% rename from mission-control/docs/reference/canary-checker/image-variants.md rename to canary-checker/docs/installation/image-variants.md index 62f5d1fc..fa04ae95 100644 --- a/mission-control/docs/reference/canary-checker/image-variants.md +++ b/canary-checker/docs/installation/image-variants.md @@ -1,9 +1,19 @@ --- title: Image Variants +sidebar_custom_props: + icon: docker --- Canary checker comes with 2 image variants: +## [Slim](https://github.com/flanksource/canary-checker/blob/master/build/slim/Dockerfile) + +- [arkade](https://github.com/alexellis/arkade) +- jq +- yq +- python3 + + ## [Minimal](https://github.com/flanksource/canary-checker/blob/master/build/minimal/Dockerfile) - [arkade](https://github.com/alexellis/arkade) diff --git a/canary-checker/docs/reference/1-alert-manager.mdx b/canary-checker/docs/reference/1-alert-manager.mdx index dc715bee..4fbf0752 100644 --- a/canary-checker/docs/reference/1-alert-manager.mdx +++ b/canary-checker/docs/reference/1-alert-manager.mdx @@ -1,12 +1,16 @@ --- title: Alertmanager hide_title: true +hide_toc: true sidebar_position: 0 sidebar_custom_props: icon: prometheus --- + + + # Alertmanager Checks [Prometheus AlertManager](https://prometheus.io/docs/alerting/latest/alertmanager/) for any firing alerts. diff --git a/canary-checker/docs/reference/1-catalog.mdx b/canary-checker/docs/reference/1-catalog.mdx index 5e2e05c7..7742f4f8 100644 --- a/canary-checker/docs/reference/1-catalog.mdx +++ b/canary-checker/docs/reference/1-catalog.mdx @@ -13,12 +13,40 @@ Runs a [config-db](https://github.com/flanksource/config-db) query. ```yaml title="catalog.yaml" file=/modules/canary-checker/fixtures/external/catalog.yaml ``` - + +## Resource Selectors + + +| Field | Description | Scheme | Required | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | -------- | +| `id` | ID of the component | `string` | No | +| `name` | Name of the component/config | `string` | No | +| `namespace` | Select resources in this namespace only, if empty find resources in all namespaces | `string` | No | +| `types` | Match any of the types specified | `[]string` | No | +| `statuses` | Match any of the statuses specified | `[]string` | No | +| `labelSelector` | Kubernetes Style Label Selector | [LabelSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) | No | +| `fieldSelector` | Kubernetes Style Field Selector Property fields of the component in kubernetes format (or database columns: owner, topology_id, parent_id) | [FieldSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/) | No | +| `agent` | Select resources created on this agent, Defaults to `local` | `uuid`, `{name}`, `local` or `all` | No | +| `cache` | Cache settings to use for the results, expensive selectors or selectors that are used very often should be cached for longer periods. Defaults to `max-age=10m` | `no-cache`, `no-store` or `max-age={duration}` | No | +| `search` | Search for resources via key value pairs using parsing expression grammar | [Search](#search) | No | + +## Search + +The query syntax is `field1=value1 field2>value2 field3=value3* field4=*value4`. `*` is for prefix and suffix matching. + +Supported operators: + +| Operator | Syntax | Types | +| -------- | -------------------------------- | --------------------- | +| `=` | `field=value` | `string` `int` `json` | +| `!=` | `field!=value` | `string` `int` `json` | +| `*` | `field=*value` or `field=value*` | `string` `int` | +| `>` `<` | `field>value` or `fieldImage Variants for a list of installed applications ::: ```yaml title="exec.yaml" file=/modules/canary-checker/fixtures/minimal/exec_pass.yaml @@ -48,6 +48,20 @@ See [image-variants](/reference/canary-checker/image-variants) ]}/> +## Scripting languages + +Use a shebang (`#!`) line to choose a different shell (`python`, `bash` and `pwsh` are included in the base image) + +```yaml +exec: + script: | + //highlight-next-line + #! pwsh + Get-Items | ConvertTo-JSON +``` + + +
```yaml title="exec_artifact.yaml" file=/modules/canary-checker/fixtures/minimal/exec_env_pass.yaml diff --git a/canary-checker/docs/reference/1-folder.mdx b/canary-checker/docs/reference/1-folder.mdx index 9d4f2372..798388cb 100644 --- a/canary-checker/docs/reference/1-folder.mdx +++ b/canary-checker/docs/reference/1-folder.mdx @@ -26,9 +26,34 @@ Checks the contents of a folder for size, age, and count. Folder based checks ar }, { field: 'sftpConnection',description: "Connection details", scheme: "[SFTP](#sftp)" }, { field: "gcpConnection", description: "Connection details for GCP", scheme: "[GCP](#gcp)" }, -{field: "awsConnection", description: "AWS Access credentials", scheme: "[AWS](#aws)" }, +{field: "awsConnection", description: "AWS Access credentials", scheme: "[S3](#s3)" }, {field: "smbConnection", description: "SMB connection details", scheme: "[SMB](#smb)"}, - {field: "filter", description: "Filter objects out before checking if they are valid", scheme: "[FolderFilter](#folderfilter)"}, + { + field: "filter.maxAge", + description: "MaxAge the latest object should be younger than defined age", + scheme: "Duration" + }, + { + field: "filter.maxSize", + description: "MaxSize of the files inside the searchPath", + scheme: "Size" + }, + { + field: "filter.minAge", + description: "MinAge the latest object should be older than defined age", + scheme: "Duration" + }, + { + field: "filter.minSize", + description: "MinSize of the files inside the searchPath", + scheme: "Size" + }, + { + field: "filter.regex", + description: "Filter files based on regular expression", + scheme: "regex" + }, + {field: "minCount", description: "The minimum number of files inside the `path`", scheme: "int"}, {field: "maxCount", description: "The maximum number of files inside the `path`, can be used in conjunction with `filter.regex` to detect error files", scheme: "int"}, {field: "minAge", description: "The youngest age a file can be", scheme: "Duration"}, @@ -38,17 +63,11 @@ Checks the contents of a folder for size, age, and count. Folder based checks ar ]}/> -## FolderFilter -| Field | Description | Scheme | Required | -| --------- | ----------------------------------------------------------- | ---------------------------------------------------- | -------- | -| `maxAge` | MaxAge the latest object should be younger than defined age | [Duration](/reference/types#duration) | | -| `maxSize` | MaxSize of the files inside the searchPath | [Size](/reference/types#size) | | -| `minAge` | MinAge the latest object should be older than defined age | [Duration](/reference/types#duration) | | -| `minSize` | MinSize of the files inside the searchPath | [Size](/reference/types#size) | | -| `regex` | Filter files based on regular expression | _[regex](https://github.com/google/re2/wiki/Syntax)_ | | +In the example below it checks a local folder for files matching`pg-backups-.*.zip`, the check fails if: +- No files is created within the last `1d` +- The size of the matching files us smaller than `10mb` -e.g. to verify that database backups are being performed ```yaml title="postgres-backup-check.yaml" file=/modules/canary-checker/fixtures/datasources/folder_with_filter.yaml ``` @@ -69,15 +88,6 @@ The following fields are available in `test`, `display` and `transform` [express | `AvailableSize` | int64 | | `Files` | [[]os.FileInfo](https://pkg.go.dev/io/fs#FileInfo) | -### FolderFilter - -| Field | Description | Scheme | Required | -| --------- | ----------- | --------------------------------------- | -------- | -| `minAge` | | [`Duration`](/reference/types#duration) | | -| `maxAge` | | [`Duration`](/reference/types#duration) | | -| `minSize` | | [`Size`](/reference/types#size) | | -| `maxSize` | | [`Size`](/reference/types#size) | | -| `regex` | | `string` | | ## Connection Types diff --git a/canary-checker/docs/reference/1-kubernetes.mdx b/canary-checker/docs/reference/1-kubernetes.mdx index 1e61293e..fec51199 100644 --- a/canary-checker/docs/reference/1-kubernetes.mdx +++ b/canary-checker/docs/reference/1-kubernetes.mdx @@ -15,8 +15,8 @@ The Kubernetes check performs requests on Kubernetes resources such as Pods to g + + +## Resource Selector + + +| Field | Description | Scheme | Required | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | -------- | +| `name` | Name of the component/config | `string` | No | +| `namespace` | Select resources in this namespace only, if empty find resources in all namespaces | `string` | No | | No | +| `labelSelector` | Kubernetes Style Label Selector | [LabelSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) | No | +| `fieldSelector` | Kubernetes Style Field Selector Property fields of the component in kubernetes format (or database columns: owner, topology_id, parent_id) | [FieldSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/) | No | +| `search` | Search for resources via key value pairs using parsing expression grammar | [Search](#search) | No | + +### Search + +The query syntax is `field1=value1 field2>value2 field3=value3* field4=*value4`. `*` is for prefix and suffix matching. + +Supported operators: + +| Operator | Syntax | Types | +| -------- | -------------------------------- | --------------------- | +| `=` | `field=value` | `string` `int` `json` | +| `!=` | `field!=value` | `string` `int` `json` | +| `*` | `field=*value` or `field=value*` | `string` `int` | +| `>` `<` | `field>value` or `field %s".format([i.metadata.namespace, i.metadata.name, k8s.getHealth(i).message])).join('\n') + ``` -See the CEL _Kubernetes_ docs for more details on the `k8s.isHealthy` and other functions available +See the CEL function k8s.isHealthy for more details ## Ready @@ -68,7 +95,7 @@ dyn(results).all(x, k8s.isReady(x))
-```yaml title="junit.yaml" file=/modules/canary-checker/fixtures/k8s/certmanager.yaml +```yaml title="cert-manager.yaml" file=/modules/canary-checker/fixtures/k8s/certmanager.yaml ```
diff --git a/canary-checker/docs/reference/1-s3-protocol.mdx b/canary-checker/docs/reference/1-s3-protocol.mdx index 7bb93811..90698d11 100644 --- a/canary-checker/docs/reference/1-s3-protocol.mdx +++ b/canary-checker/docs/reference/1-s3-protocol.mdx @@ -28,6 +28,7 @@ The S3 check: {field: "bucket", description: "Bucket name to test against", scheme: "string", required: true}, {field: "objectPath", description: "Path of object to upload/download for test", scheme: "string", required: true}, + {field: "storageClass", description: "Storage Class of the test test object to create", scheme: "string"}, ]}/> diff --git a/canary-checker/docs/reference/1-webhook.mdx b/canary-checker/docs/reference/1-webhook.mdx index 8f25269d..7a1edc0d 100644 --- a/canary-checker/docs/reference/1-webhook.mdx +++ b/canary-checker/docs/reference/1-webhook.mdx @@ -73,8 +73,8 @@ The request is available to the transformation function with these fields: scheme: "`map[string]string`" }, { field: 'results.content', - description: 'Request body text, See [YAML](/reference/scripting/cel#yaml), [CSV](/reference/scripting/cel#csv)', - scheme: 'string' + description: 'Request body text, See YAML and See CSV for handling other file formats', + } ]}/> diff --git a/canary-checker/docs/reference/3-gcs-database-backup.mdx b/canary-checker/docs/reference/3-gcs-database-backup.mdx index f42d322d..06d6be62 100644 --- a/canary-checker/docs/reference/3-gcs-database-backup.mdx +++ b/canary-checker/docs/reference/3-gcs-database-backup.mdx @@ -5,40 +5,22 @@ sidebar_custom_props: icon: google-cloud --- -# Google Cloud SQL Backups +# Google Cloud SQL Backups Checks if a Google Cloud SQL instance has been successfully backed up recently. ```yaml title="gcs-database.yaml" file=/modules/canary-checker/fixtures/datasources/GCP/database_backup.yaml ``` -| Field | Description | Scheme | Required | -| ------------- | ----------------------------------------------------------- | ---------------------------------------------- | -------- | -| **`gcp`** | Connect to GCP project and instance | [_GCPDatabase_](#gcpdatabase) | Yes | -| **`maxAge`** | Max age for backup allowed, e.g. 5h30m | _Duration_ | | -| **`name`** | Name of the check, must be unique within the canary | `string` | Yes | -| `description` | Description for the check | `string` | | -| `icon` | Icon for overwriting default icon on the dashboard | `string` | | -| `labels` | Labels for check | `map[string]string` | | -| `test` | Evaluate whether a check is healthy | [`Expression`](../concepts/expressions/health-evaluation) | | -| `display` | Expression to change the formatting of the display | [`Expression`](../concepts/expressions/display-formatting ) | | -| `transform` | Transform data from a check into multiple individual checks | [`Expression`](../concepts/expressions/transforms) | | -| `metrics` | Metrics to export from | [`[]Metrics`](../concepts/metrics/custom-metrics) | | -| | | | | - -## Duration - -Durations are strings with an optional fraction and unit e.g. `300ms`, `1.5h` or `2h45m`. Valid time units are `ms`, `s`, `m`, `h`. - -## GCPDatabase - -| Field | Description | Scheme | Required | -| -------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | -------- | -| `project` | GCP project name | _string_ | Yes | -| `instance` | Google CloudSQL instance name | _string_ | Yes | -| **Connection** | | | | -| `connection` | Path of an existing connection e.g. `connection://gcp`/. Mutually exclusive with `credentials`
| _Connections_ | | -| `credentials` | GCP Access Token File. Mutually exclusive with `connection` | _EnvVar_ | Yes | + + + ### Connecting to GCP diff --git a/canary-checker/docs/reference/3-namespace.mdx b/canary-checker/docs/reference/3-namespace.mdx index bb5710b5..768a6fd5 100644 --- a/canary-checker/docs/reference/3-namespace.mdx +++ b/canary-checker/docs/reference/3-namespace.mdx @@ -49,4 +49,4 @@ The Namespace check: | `test` | Evaluate whether a check is healthy | [`Expression`](../concepts/expressions/health-evaluation) | | | `display` | Expression to change the formatting of the display | [`Expression`](../concepts/expressions/display-formatting ) | | | `transform` | Transform data from a check into multiple individual checks | [`Expression`](../concepts/expressions/transforms) | | -| `metrics` | Metrics to export from | [`[]Metrics`](../concepts/metrics/custom-metrics) | | +| `metrics` | Metrics to export from | [`[]Metrics`](../concepts/metrics#custom-metrics) | | diff --git a/canary-checker/docs/reference/index.md b/canary-checker/docs/reference/_category.md similarity index 89% rename from canary-checker/docs/reference/index.md rename to canary-checker/docs/reference/_category.md index fa353e24..f98ce16e 100644 --- a/canary-checker/docs/reference/index.md +++ b/canary-checker/docs/reference/_category.md @@ -3,6 +3,7 @@ title: Checks sidebar_position: 1 sidebar_custom_props: icon: codicon:pass +slug: /reference --- import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/reference/_connections.mdx b/canary-checker/docs/reference/_connections.mdx index 22d5f490..52574d93 100644 --- a/canary-checker/docs/reference/_connections.mdx +++ b/canary-checker/docs/reference/_connections.mdx @@ -23,11 +23,10 @@ title: Connections There are 3 options when connecting to AWS: - +1. AWS Instance or Pod Identity By using the AWS [Instance Profile](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) or [Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-configuration.html) (the default if no `connection` or `accessKey` is specified) - - +1. Connection Using a shared Connection ```yaml title="aws-connection.yaml" @@ -41,8 +40,7 @@ spec: - connection: connection://aws/internal region: us-east-1 # optional if specified in the connection ``` - - +1. Inline ```yaml title="inline.yaml" apiVersion: canaries.flanksource.com/v1 @@ -64,9 +62,6 @@ spec: key: AWS_SECRET_ACCESS_KEY region: us-east-1 ``` - - - ## GCP @@ -81,12 +76,11 @@ spec: There are 3 options when connecting to GCP: - +1. GKE Workload Identity GKE [workload identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity) (the default if no `connection` or `credentials` is specified) - - +1. Connection ```yaml title="gcs-connection.yaml" apiVersion: canaries.flanksource.com/v1 @@ -102,9 +96,8 @@ spec: connection: connection://gcp/internal ``` - - +1. Inline ```yaml title="gcp-inline.yaml" apiVersion: canaries.flanksource.com/v1 @@ -123,8 +116,6 @@ spec: name: gcp-credentials key: AUTH_ACCESS_TOKEN ``` - - ## Azure diff --git a/canary-checker/docs/reference/category.md b/canary-checker/docs/reference/category.md new file mode 100644 index 00000000..75761012 --- /dev/null +++ b/canary-checker/docs/reference/category.md @@ -0,0 +1,11 @@ +--- +title: Checks +hide_sidebar: true +sidebar_custom_props: + icon: codicon:pass +slug: /reference +--- + +import DocCardList from '@theme/DocCardList'; + + diff --git a/canary-checker/docs/reference/jmeter.mdx b/canary-checker/docs/reference/jmeter.mdx index 9a75468f..0b9de648 100644 --- a/canary-checker/docs/reference/jmeter.mdx +++ b/canary-checker/docs/reference/jmeter.mdx @@ -27,4 +27,4 @@ This check executes the JMeter CLI to execute the JMX test plan on the specified | `test` | Evaluate whether a check is healthy | [`Expression`](../concepts/expressions/health-evaluation) | | | `display` | Expression to change the formatting of the display | [`Expression`](../concepts/expressions/display-formatting ) | | | `transform` | Transform data from a check into multiple individual checks | [`Expression`](../concepts/expressions/transforms) | | -| `metrics` | Metrics to export from | [`[]Metrics`](../concepts/metrics/custom-metrics) | | +| `metrics` | Metrics to export from | [`[]Metrics`](../concepts/metrics#custom-metrics) | | diff --git a/canary-checker/docs/scripting/gotemplate.mdx b/canary-checker/docs/scripting/gotemplate.mdx index cc456405..8dff78bf 100644 --- a/canary-checker/docs/scripting/gotemplate.mdx +++ b/canary-checker/docs/scripting/gotemplate.mdx @@ -16,8 +16,56 @@ In this example we print out the exchange rates returned by an HTTP API Call

- +## Escaping +If you need to pass a template through a Helm Chart and prevent Helm from templating you need to escape it: + +``` +{{`{{ .secret }}`}} +``` + +Alternatively [change the templating delimiters](#delimiters) + + +## Multiline YAML + +If you are using a YAML multiline string use `|` and not `>` which will strip newlines + +Instead of: + +```yaml +exec: + //highlight-next-line + script: > + #! pwsh + Get-Items | ConvertTo-JSON +``` + +Do this: + +```yaml +exec: + //highlight-next-line + script: | + #! pwsh + Get-Items | ConvertTo-JSON +``` + + +## Delimiters + +The template delimiters can be changed from the defaults of `$()` and `{{}}` with `gotemplate` comments + +```yaml +exec: + script: | + #! pwsh + //highlight-next-line + # gotemplate: left-delim=$[[ right-delim=]] + $message = "$[[.config.name]]" + Write-Host "{{ $message }}" + Write-Host @{ Number = 1; Shape = "Square"; Color = "Blue"} | ConvertTo-JSON +``` ## base64 diff --git a/canary-checker/docs/tutorials/control-plane-testing/basic-canary.yaml b/canary-checker/docs/tutorials/control-plane-testing/basic-canary.yaml deleted file mode 100644 index 6ced146b..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/basic-canary.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: control-plane-tests - namespace: control-plane-tests -spec: - schedule: "@every 1h" - kubernetesResource: - - name: helm-release-postgres-check - description: "Deploy postgresql via HelmRelease" - waitFor: - timeout: 1m - display: - template: |+ - Helm release created: {{ .health | toYAML }} - staticResources: - - apiVersion: source.toolkit.fluxcd.io/v1 - kind: HelmRepository - metadata: - name: bitnami - spec: - type: oci - interval: 1h - url: oci://registry-1.docker.io/bitnamicharts - resources: - - apiVersion: helm.toolkit.fluxcd.io/v2 - kind: HelmRelease - metadata: - name: postgresql - spec: - chart: - spec: - chart: postgresql - sourceRef: - kind: HelmRepository - name: bitnami - interval: 5m - values: - auth: - username: admin - password: qwerty123 - database: exampledb - primary: - persistence: - enabled: true - size: 8Gi - diff --git a/canary-checker/docs/tutorials/control-plane-testing/basic-run.svg b/canary-checker/docs/tutorials/control-plane-testing/basic-run.svg deleted file mode 100644 index b76370f4..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/basic-run.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - -16:25:05.279 WRN /Users/moshe/go/src/github.com/flanksource/canary-checker/fixtures/minimal/canary-checker.properties does not exist -16:25:05.279 WRN --db not configured -16:25:05.281 INF (k8s) Using kubeconfig /Users/moshe/.kube/config -16:25:05.289 INF Checking http_pass.yaml, 1 checks found -16:25:06.711 INF (http-pass.http-deprecated-endpoint) PASS duration=279 -16:25:06.711 INF (http-pass.http-minimal-check) PASS duration=286 -16:25:06.711 INF (http-pass.http-param-tests) PASS duration=275 -16:25:06.711 INF (http-pass.http-expr-tests) PASS duration=284 code=200, age=1883h41m33.579006s -16:25:06.711 INF (http-pass.http-headers) PASS duration=269 -16:25:06.711 INF 5 passed, 0 failed in 1s - diff --git a/canary-checker/docs/tutorials/control-plane-testing/canary-checker.properties b/canary-checker/docs/tutorials/control-plane-testing/canary-checker.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/canary-checker/docs/tutorials/control-plane-testing/custom-canary.yaml b/canary-checker/docs/tutorials/control-plane-testing/custom-canary.yaml deleted file mode 100644 index 30f8fdb8..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/custom-canary.yaml +++ /dev/null @@ -1,61 +0,0 @@ - -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: control-plane-tests - namespace: control-plane-tests -spec: - schedule: "@every 1m" - kubernetesResource: - - name: helm-release-postgres-check - namespace: default - description: "Deploy postgresql via HelmRelease" - staticResources: - - apiVersion: source.toolkit.fluxcd.io/v1 - kind: HelmRepository - metadata: - name: bitnami - spec: - type: oci - interval: 1h - url: oci://registry-1.docker.io/bitnamicharts - resources: - - apiVersion: helm.toolkit.fluxcd.io/v2 - kind: HelmRelease - metadata: - name: postgresql - namespace: default - spec: - chart: - spec: - chart: postgresql - sourceRef: - kind: HelmRepository - name: bitnami - namespace: control-plane-tests - interval: 5m - values: - auth: - username: admin - password: qwerty123 - database: exampledb - primary: - persistence: - enabled: true - size: 8Gi - checks: - - postgres: - - name: postgres schemas check - url: "postgres://$(username):$(password)@postgresql.default.svc:5432/exampledb?sslmode=disable" - username: - value: admin - password: - value: qwerty123 - # Since we just want to check if database is responding, - # a SELECT 1 query should suffice - query: SELECT 1 - - checkRetries: - delay: 15s - interval: 10s - timeout: 5m diff --git a/canary-checker/docs/tutorials/control-plane-testing/flux.yaml b/canary-checker/docs/tutorials/control-plane-testing/flux.yaml deleted file mode 100644 index 0841c275..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/flux.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: control-plane-tests ---- -apiVersion: source.toolkit.fluxcd.io/v1 -kind: HelmRepository -metadata: - name: bitnami - namespace: control-plane-tests -spec: - type: oci - interval: 1h - url: oci://registry-1.docker.io/bitnamicharts ---- -apiVersion: helm.toolkit.fluxcd.io/v2 -kind: HelmRelease -metadata: - name: postgresql -spec: - chart: - spec: - chart: postgresql - sourceRef: - kind: HelmRepository - name: bitnami - namespace: control-plane-tests - version: "*" - interval: 1h - values: - auth: - database: my_database - password: qwerty123 - username: admin - primary: - persistence: - enabled: true - size: 8Gi diff --git a/canary-checker/docs/tutorials/control-plane-testing/index.mdx b/canary-checker/docs/tutorials/control-plane-testing/index.mdx deleted file mode 100644 index e3d17bd0..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/index.mdx +++ /dev/null @@ -1,207 +0,0 @@ ---- -title: Synthetic Infrastructure Testing With Canary Checker and Flux -description: Walkthrough of sythentic Infrastructure Testing for Kubernetes -slug: infrastructure-testing-with-canary-checker-and-flux -authors: [moshe,yash] -tags: [synthetic testing, flux, helm, canary-checker] -hide_table_of_contents: false ---- - - -import Install from '@site/docs/snippets/_install.mdx' - -# Control Plane Testing - - -Deploying applications with Kubernetes is easier than ever, yet developers face increasing complexity. - -Kubernetes simplifies deployment, but with it comes a labyrinth of potential issues. From resource conflicts to version incompatibilities, a failure in one component can cascade. Understanding application health through metric models like **RED** (Requests, Errors, Duration) and **USE** (Utilization, Saturation, Errors) isn't always enough. Latent errors might only surface during deployment or scaling. - - - -For example, consider deploying a stateful PostgreSQL database via Flux on AWS. Problems could arise, including: - - - - - -* Tools like `helm template` and `helm lint` can validate chart rendering and syntax, but they don't guarantee compatibility with a specific Kubernetes version or the operators running on the cluster. -* `ct install` on a `kind` or simulated cluster can verify API compatibility and ensure all resources and operators work correctly in ideal conditions. -* Deploying to a staging environment can help catch issues before they reach production, but this approach doesn't detect capacity, performance or latent errors that only surface under load. - - -Control plane testing can help improve resilience by continuously redeploying workloads, ensuring there is enough capacity within the system and that all operators and external dependencies are working correctly. - -Canary checker is a kubernetes-native test platform that continuously runs tests using 30+ check styles against your workloads. In this tutorial, we use it to continuously verify the ability to provision and run stateful workloads in a cluster. - - - -The [`kubernetesResource`](/guide/canary-checker/reference/kubernetes-resource) check creates kubernetes resources based on the provided manifests & perform checks on them, it has 5 lifecycle stages: - -## Lifecycle - -

- -* **Apply Static Resources** - Applies all `staticResources` that are required for all tests to pass e.g. namespaces, secrets, etc.. -* **Apply Resources** - Applies all the workloads defined in `resources` -* **Wait** - Using the parameters defined in `waitFor`, wait for the resources to be ready using [is-healthy](https://github.com/flanksource/is-healthy) -* **Run Checks** - Run all the `checks` against the workloads -* **Cleanup** - Delete all the `resources` that were created during the test. - -

- -## Tutorial - -### Prerequisites - - -:::info Prerequisites -To follow this tutorial, you need: - -- A Kubernetes cluster -- [FluxCD](https://fluxcd.io/) installed - -::: - - -1. Define the workload under test - - Before you can create a canary you should start with a working example of a resource, in this example we use a `HelmRelease` to deploy a postgres database. - - ```yaml file=flux.yaml - ``` - - Once you have verified the helm release is working on its own, you can then begin building the control plane test using `canary-checker`. - - - -1. Install the `canary-checker` binary - - - :::info Helm Installation - This tutorial uses the CLI for faster feedback, in production we recommend installing `canary-checker` as an operator using the [helm chart](https://canarychecker.io/getting-started) or as part of the full Mission Control [platform](/installation/self-hosted/getting-started). -1. Next create a `Canary` CustomResourceDefinition (CRD) using the `kubernetesResource` check type, the layout of the canary is as follows: - - ```yaml title=basic-canary.yaml file=template.yaml - ``` -

- - Using the workload defined in step 1, the check definition is as follows: - - ```yaml title=basic-canary.yaml file=basic-canary.yaml - ``` -

- -1. Run the test locally using `canary-checker run basic-canary.yaml` -

- - 18:01:52.745 INF (k8s) Using kubeconfig /Users/moshe/.kube/config - 18:01:52.749 INF Checking basic-canary.yaml, 1 checks found - 18:01:55.209 INF (control-plane-tests) HelmRelease/control-plane-tests/postgresql (created) +kustomized - 18:02:21.072 INF (control-plane-tests.helm-release-postgres-check) PASS duration=28321 Helm release created: - control-plane-tests/HelmRelease/postgresql: - health: healthy - message: Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 - ready: true - status: InstallSucceeded - control-plane-tests/HelmRepository/bitnami: - health: unknown - ready: true - 18:02:21.073 INF 1 passed, 0 failed in 28s - - - -

-

And if you run `kubectl get events` you should see:

- - - LAST SEEN TYPE REASON OBJECT MESSAGE - 26m Normal ChartPullSucceeded helmchart/control-plane-tests-postgresql pulled 'postgresql' chart with version '16.2.2' - 26m Normal Scheduled pod/postgresql-0 Successfully assigned control-plane-tests/postgresql-0 to ip-10-0-4-167.eu-west-1.compute.internal - 26m Normal Pulled pod/postgresql-0 Container image "docker.io/bitnami/postgresql:17.2.0-debian-12-r0" already present on machine - 26m Normal Created pod/postgresql-0 Created container postgresql - 26m Normal Started pod/postgresql-0 Started container postgresql - 26m Warning Unhealthy pod/postgresql-0 Readiness probe failed: 127.0.0.1:5432 - rejecting connections - 26m Warning Unhealthy pod/postgresql-0 Readiness probe failed: 127.0.0.1:5432 - no response - 26m Normal Killing pod/postgresql-0 Stopping container postgresql - 113s Normal Scheduled pod/postgresql-0 Successfully assigned control-plane-tests/postgresql-0 to ip-10-0-4-167.eu-west-1.compute.internal - 112s Normal Pulled pod/postgresql-0 Container image "docker.io/bitnami/postgresql:17.2.0-debian-12-r0" already present on machine - 112s Normal Created pod/postgresql-0 Created container postgresql - 112s Normal Started pod/postgresql-0 Started container postgresql - 96s Normal Killing pod/postgresql-0 Stopping container postgresql - 26m Normal HelmChartCreated helmrelease/postgresql Created HelmChart/control-plane-tests/control-plane-tests-postgresql with SourceRef 'HelmRepository/control-plane-tests/bitnami' - 26m Normal SuccessfulCreate statefulset/postgresql create Pod postgresql-0 in StatefulSet postgresql successful - 26m Normal InstallSucceeded helmrelease/postgresql Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 - 26m Normal UninstallSucceeded helmrelease/postgresql Helm uninstall succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 - 26m Normal HelmChartDeleted helmrelease/postgresql deleted HelmChart 'control-plane-tests/control-plane-tests-postgresql' - 116s Normal HelmChartCreated helmrelease/postgresql Created HelmChart/control-plane-tests/control-plane-tests-postgresql with SourceRef 'HelmRepository/control-plane-tests/bitnami' - 113s Normal SuccessfulCreate statefulset/postgresql create Pod postgresql-0 in StatefulSet postgresql successful - 101s Normal InstallSucceeded helmrelease/postgresql Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 - 96s Warning CalculateExpectedPodCountFailed poddisruptionbudget/postgresql Failed to calculate the number of expected pods: found no controllers for pod "postgresql-0" - 96s Normal UninstallSucceeded helmrelease/postgresql Helm uninstall succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 - 95s Normal HelmChartDeleted helmrelease/postgresql deleted HelmChart 'control-plane-tests/control-plane-tests-postgresql' - -2. Add custom check - - By default `kubernetesResource` only checks if the resource is ready. However, you can add custom checks to validate the resource further. - - For example, you can validate the PostgreSQL database is running and accepting connections, with a custom `postgres` check: - - - ```yaml - apiVersion: canaries.flanksource.com/v1 - kind: Canary - #... - spec: - kubernetesResource: - - #... - checks: - - postgres: - - name: postgres schemas check - url: "postgres://$(username):$(password)@postgresql.default.svc:5432/exampledb?sslmode=disable" - username: - value: admin - password: - value: qwerty123 - # Since we just want to check if database is responding, - # a SELECT 1 query should suffice - query: SELECT 1 - ``` - - :::warning Accessing variables - This example uses the `$(username)` and `$(password)` syntax to access the `username` and `password` variables hardcoded in the `checks` section, but in a production setting, reference secrets using [`valueFrom`](/reference/env-var) - ::: - - :::tip Alternatives to custom checks - Instead of using a custom check you can also add a standard helm test pod to your chart or define a canary inside the chart to automatically include health checks for all workloads. - ::: - - -3. The final test looks like: - - - ```yaml file=custom-canary.yaml - ``` - -## Conclusion - -Continuous testing of your control plane is essential for maintaining resilient infrastructure at scale. By implementing continuous testing with tools like Canary Checker, Flux, and Helm, you can: - -- Catch breaking changes early -- Validate infrastructure changes -- Ensure security compliance -- Maintain platform stability -- Reduce incident recovery time - -This proactive approach helps catch issues before they impact production environments and affect your users. - -## References - -- [kubernetesResource](/guide/canary-checker/reference/kubernetes-resource) Canary -- [ helm lint](https://helm.sh/docs/helm/helm_lint/) -- [ helm test](https://helm.sh/docs/helm/helm_test/) -- [ ct install](https://github.com/helm/chart-testing/blob/main/doc/ct_install.md) -- [ Flux HelmRelease](https://fluxcd.io/flux/components/helm/helmreleases/) -- [ Helm Chart Tests](https://helm.sh/docs/topics/chart_tests/) diff --git a/canary-checker/docs/tutorials/control-plane-testing/template.yaml b/canary-checker/docs/tutorials/control-plane-testing/template.yaml deleted file mode 100644 index cb2bb4a2..00000000 --- a/canary-checker/docs/tutorials/control-plane-testing/template.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: control-plane-tests - namespace: control-plane-tests -spec: - # how often to run the test - schedule: "@every 1h" - //highlight-next-line - kubernetesResource: # this is type of canary we are executing, canary-checker has many more - - name: helm-release-postgres-check - waitFor: - # The time to wait for the resources to be ready before considering the test a failure - timeout: 10m - staticResources: - //highlight-next-line - - # A list of resources that should be created once only and re-used across multiple tests - resources: - //highlight-next-line - - # A list of resources to be created every time the check runs - display: - # optional Go text template to display the results of the check - template: |+ - Helm release created: {{ .health | toYAML }} diff --git a/canary-checker/docs/tutorials/getting-started.md b/canary-checker/docs/tutorials/getting-started.md deleted file mode 100644 index 3addffa0..00000000 --- a/canary-checker/docs/tutorials/getting-started.md +++ /dev/null @@ -1,223 +0,0 @@ -# Getting Started with Canary Checker - -Canary checker is a monitoring system for executing synthetic tests, providing a built-in user interface, CLI and multi-cluster and multi-instance aggregation. Canary checker is designed with multi-tenancy in mind. - -You are able to write your own tests and execute them to continually verify that your applications and clusters are working the way you expect. - -In this guide, you'll see how to use canary-checker to test a Postgres database in several ways, using the CLI. - -## Prerequisites - -For the purposes of this guide, you need a PostgreSQL instance running in Kubernetes. See the following guide on [how to install PostgreSQL](https://phoenixnap.com/kb/postgresql-kubernetes) in your Kubernetes Cluster via Helm. - -## Installing the CLI - -> For this guide, Docker Desktop is used to create a Kubernetes cluster on MacOS. You can create your Cluster on the environment of your choice. - -The canary-checker CLI will allow you to quickly and simply execute checks that you have defined, via a single CLI command. - -!!! info "Info" -To install the CLI for preferred environment, See the [Canary-checker Installation guide](../run/#installation) for more information. - -To verify whether the CLI has been installed correctly, run `canary-checker run -h` from your terminal. You should see the following output: - -```console -Execute checks and return - -Usage: - canary-checker run [flags] - -Flags: - --csv output results in csv format - -d, --data string Template out each spec using the JSON or YAML data in this file - -h, --help help for run - -j, --junit output results in junit format - -n, --namespace string Namespace to run canary checks in - -o, --output-file string file to output the results in - -Global Flags: - --db string Connection string for the postgres database (default "DB_URL") - --db-trace Trace database queries - --expose-env Expose environment variables for use in all templates. Note this has serious security implications with untrusted canaries - --json-logs Print logs in json format to stderr - --log-fail Log every failing check (default true) - --log-pass Log every passing check - -v, --loglevel count Increase logging level - --shared-library stringArray Add javascript files to be shared by all javascript templates -``` - -## Creating a synthetic check for PostgreSQL - -You'll define a check against our database that will connect to it, run a query against it and verify the results. Additionally, you'll see how canary-checker responds when the results are incorrect. - -To get started, let’s created a directory to house our checks called `postgres-canaries`. - -In that directory, create a file named `postgres-canary-local.yaml`, which will house the definition for our first check. - -Add the following resource definition to our file. This is a Canary that will run the `SELECT current_schemas(true)` SQL query against our PostgreSQL instance every 30 seconds. It will also verify that the returned result is 1. - -Replace the username and password with your PostgreSQL username and password, and save the file. - -```yaml -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: postgres-succeed -spec: - interval: 30 - postgres: - - connection: 'postgres://$(username):$(password)@127.0.0.1:5432/postgres?sslmode=disable' - name: postgres schemas check - auth: - username: - value: postgres - password: - value: yourpassword - query: SELECT current_schemas(true) - display: - template: | - {{- range $r := .results.rows }} - {{- $r.current_schemas}} - {{- end}} - results: 1 -``` - -The above Canary runs the query against our database, which has been port forwarded to port 5432 running on our development machine. - -Run the Canary using the following command: - -```bash -canary-checker run postgres-canary-local.yaml -``` - -You should see that canary-checker ran the test that you defined, and validated the results: - -```console -2022-08-20T13:03:49.264+0200 INFO Checking postgres-canary-local.yaml, 1 checks found -2022-08-20T13:03:49+02:00 PASS [postgres] default/postgres-succeed/postgres schemas check duration=139 {pg_catalog,public} -2022-08-20T13:03:49.413+0200 INFO 1 passed, 0 failed in 154ms -``` - -Let’s modify the `results` field in our Canary definition to be `2` instead of `1`, and run the check again. - -```console -2022-08-20T13:05:38.469+0200 INFO Checking postgres-canary-local.yaml, 1 checks found -2022-08-20T13:05:38+02:00 FAIL [postgres] default/postgres-succeed/postgres schemas check duration=130 {pg_catalog,public} Query return 1 rows, expected 2 -2022-08-20T13:05:38.607+0200 INFO 0 passed, 1 failed in 145ms -``` - -You can see that canary-checker is able to validate that the result was not as expected, as well as provide us with contextual information about why it was incorrect. -Writing a custom check - -The above check was a simple query that validated something that exists by default in a PostgreSQL database. However, a common use case for synthetic testing might be to validate the existence of some business-specific information. - -Taking for instance there's a database table called `Users`, where you store the user information for your application. - -You might want to run a Canary to validate whether a specific entry exists in the `Users` table. - -To do this, create another Canary definition in our `postgres-canaries` directory called postgres-canary-local-does-admin-user-exist.yaml. - -```yaml -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: postgres-succeed -spec: - interval: 30 - postgres: - - connection: 'postgres://$(username):$(password)@127.0.0.1:5432/postgres?sslmode=disable' - name: postgres schemas check - auth: - username: - value: postgres - password: - value: yourpassword - query: SELECT * from Users - resultsFunction: '[[ if index .results 0 "username | eq "admin" ]]true[[else]]false[[end]]' - displayTemplate: '[[ index .results 0 ]]' -``` - -If you run your Canary right away, using the `canary-checker run` CLI command, you'll see that it fails, because you have not created the Users table yet. - -```bash -canary-checker run ../postgres-canaries/postgres-canary-local-does-admin-user-exist.yaml -``` - -``` -2022-09-08T13:18:31.547+0200 INFO Checking ../postgres-canaries/postgres-canary-local-does-admin-user-exist.yaml, 1 checks found -2022-09-08T13:18:31+02:00 FAIL [postgres] default/postgres-succeed/postgres schemas check duration=126 failed to query db: pq: relation "users" does not exist -2022-09-08T13:18:31.677+0200 INFO 0 passed, 1 failed in 134ms -``` - -Let’s create and insert the required data into our database with the following SQL. - -```sql -CREATE TABLE users( - id int, - username varchar(200), - PRIMARY KEY(id) -); - -insert into users (id, username) values (1, 'admin') -``` - -Now, running the Canary again, you see the expected behavior occurs - and our data is validated as expected. - -```bash -canary-checker run ../postgres-canaries/postgres-canary-local-does-admin-user-exist.yaml -``` - -## Installing canary-checker as a Kubernetes operator - -So far, you've been running canary-checker using the CLI, but it's recommended you install it in your cluster and deploy a few Canaries with it. - -To do this, you can use the operator for canary-checker. - -From your terminal, run the following command to install canary-checker (Ensure that you have the prerequisites installed on your cluster first). - -```bash -kubectl apply -f https://github.com/flanksource/canary-checker/releases/download/v0.38.154/release.yaml -``` - -Once the operator has been installed, you should be able to run `kubectl get canary` to see any canaries that you've deployed into our namespace. - -To get started using the operator, let’s deploy a simple HTTP canary to our namespace. - -Create a file called `http_pass.yaml` containing the below resource definition. - -```yaml -apiVersion: canaries.flanksource.com/v1 -kind: Canary -metadata: - name: http-pass -spec: - interval: 30 - http: - - endpoint: https://httpstat.us/200 - thresholdMillis: 3000 - responseCodes: [201, 200, 301] - responseContent: '' - maxSSLExpiry: 7` -``` - -You can then deploy this canary into our namespace using: - -```bash -kubectl apply -f http_pass.yaml -``` - -``` -canary.canaries.flanksource.com/http-pass created -``` - -You can then check the status of our canary by running: - -``` -TODO - Add the status -``` - -### Wrapping up - -In this guide, you've seen how to get started with canary-checker and run a few synthetic tests against PostgreSQL running in Kubernetes. You've also seen how you can deploy canary-checker as a Kubernetes operator and deploy a Canary into your Kubernetes cluster to continuously monitor your systems. - -In the next guide, You'll take a look at how to model an application and Kubernetes cluster using Topologies, as well as how to link components together - eventually linking components to canaries. diff --git a/canary-checker/docs/types.md b/canary-checker/docs/types.md new file mode 100644 index 00000000..99bd88ae --- /dev/null +++ b/canary-checker/docs/types.md @@ -0,0 +1,11 @@ +--- +hide_title: true +title: Common Types +sidebar_position: 2 +sidebar_custom_props: + icon: fluent:library-16-regular +--- + +import Types from '@site/docs/snippets/_types.md' + + diff --git a/canary-checker/docusaurus.config.js b/canary-checker/docusaurus.config.js index e6a84068..e1c761b2 100644 --- a/canary-checker/docusaurus.config.js +++ b/canary-checker/docusaurus.config.js @@ -30,6 +30,9 @@ export default async function createConfigAsync() { "cel": "/scripting/cel", "gotemplate": "/scripting/gotemplate", "javascript": '/scripting/javascript', + "types": "/types", + "image-variants": "/installation/image-variants", + "grafana": "/concepts/metrics#grafana", "jsonpath": 'https://jsonpath.com/' } }, @@ -82,6 +85,30 @@ export default async function createConfigAsync() { customCss: './src/css/out.css' } }) + ], + + ['@docusaurus/plugin-client-redirects', + { + redirects: [ + { + to: '/getting-started', + from: '/docs/getting-started/installation', + }, + { + to: '/concepts/metrics#grafana', + from: '/concepts/metrics/grafana', + }, + { + to: '/concepts/metrics', + from: '/concepts/metrics/custom-metrics', + }, + { + to: '/concepts/metrics', + from: '/concepts/metrics-exporter', + } + ], + } + ] ], diff --git a/canary-checker/sidebars.js b/canary-checker/sidebars.js index a6ef1b43..28e6473f 100644 --- a/canary-checker/sidebars.js +++ b/canary-checker/sidebars.js @@ -12,16 +12,45 @@ module.exports = { }, { type: 'category', - label: 'Concepts', + label: "Installation", items: [ { - type: 'autogenerated', - dirName: "concepts" - }] + label: "Helm", + type: "doc", + id: "installation/helm.canary" + }, + { + label: "CLI", + type: "doc", + id: "installation/cli" + }, + + { + label: "Database", + type: "doc", + id: "installation/database.canary" + }, + + { + label: "Image Variants", + type: 'doc', + id: 'installation/image-variants' + }, + ] + }, + { + type: 'category', + label: "Concepts", + items: [{ + type: 'autogenerated', + dirName: "concepts" + }] + }, { type: 'category', label: 'Checks', + link: { type: 'doc', id: 'reference/category' }, items: [ { className: 'condensed', @@ -34,19 +63,21 @@ module.exports = { { type: 'category', label: 'Examples', + items: [ { className: 'condensed', type: 'autogenerated', - dirName: 'examples' + dirName: 'examples', + } ] }, { type: 'category', - label: 'Reference', + label: 'Scripting', items: [ { @@ -63,7 +94,14 @@ module.exports = { label: "Javascript", type: 'doc', id: 'scripting/javascript' - } + }, + + { + label: "Common Types", + type: 'doc', + id: 'types' + }, + ] }, @@ -88,12 +126,12 @@ module.exports = { { type: 'category', label: 'Tutorials', - collapsed: false, + collapsed: true, items: [ { - type: 'doc', - id: 'tutorials/control-plane-testing/index', - label: 'Control Plane Testing' + type: 'link', + href: 'https://flanksource.com/docs/blog/infrastructure-testing-with-canary-checker-and-flux', + label: 'Synthetic Testing with Flux and Helm' } ] diff --git a/common/src/components/Badges.jsx b/common/src/components/Badges.jsx index f6c52127..1eddfbd5 100644 --- a/common/src/components/Badges.jsx +++ b/common/src/components/Badges.jsx @@ -2,7 +2,7 @@ import React from 'react'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import { GoDotFill } from "react-icons/go"; import clsx from 'clsx' - +import { CommonLink } from './Link' export function Health({ color, children }) { return - Full Image Variant Required + Full Image variant required. ); } diff --git a/common/src/components/Fields.jsx b/common/src/components/Fields.jsx index 2804551b..14f95849 100644 --- a/common/src/components/Fields.jsx +++ b/common/src/components/Fields.jsx @@ -1,12 +1,9 @@ import React from 'react' -import Admonition from '@theme/Admonition' import useDocusaurusContext from '@docusaurus/useDocusaurusContext' -import Link from '@docusaurus/Link' import ReactMarkdown from 'react-markdown' import useBaseUrl from '@docusaurus/useBaseUrl'; -import clsx from 'clsx' -const schemes = { +let schemes = { envvar: '[EnvVar](/reference/env-var)', matchpattern: '[MatchPattern](/reference/types#match-pattern)', '[]envvar': '[[]EnvVar](/reference/env-var)', @@ -18,6 +15,7 @@ const schemes = { '[]jsonpathorstring': '`[]string` or [[]JSONPath](https://jsonpath.com/)', jsonpath: '[JSONPath](https://jsonpath.com/)', size: '[Size](/reference/types#size)', + "[]metric": '[[]Metric](/guides/canary-checker/concepts/metrics#custom-metrics)', agent: '[Agent](/reference/types#agent)', resourceselector: '[ResourceSelector](/reference/resource-selector)', resourceselectors: '[[]ResourceSelector](/reference/resource-selector)', @@ -33,7 +31,22 @@ const schemes = { '[map[string]string](/reference/notifications#properties)' } -function useSchemeUrl(value) { +let ossSchemes = { + icon: '[Icon](/types#icon)', + envvar: '[EnvVar](/concepts/secret-management)', + matchpattern: '[MatchPattern](/types#match-pattern)', + '[]envvar': '[[]EnvVar](/concepts/secret-management)', + cel: '[CEL](/scripting/cel)', + javascript: '[Javascript](/scripting/javascript)', + gotemplate: '[Go Template](/scripting/gotemplate)', + duration: '[Duration](/types#duration)', + size: '[Size](/types#size)', + "[]metric": '[[]Metric](/concepts/metrics#custom-metrics)', + resourceselector: '[ResourceSelector](/resource-selector)', + resourceselectors: '[[]ResourceSelector](/resource-selector)', +} + +function useSchemeUrl(value, oss) { if (value == null) { return "string" } @@ -43,11 +56,20 @@ function useSchemeUrl(value) { return value; } - value = schemes[key] - if (value == null || !value.includes('](/')) { + if (oss) { + for (const key of Object.keys(ossSchemes)) { + schemes[key] = ossSchemes[key]; + } + } + + let mapping = schemes[value.toLowerCase()] + + if (mapping == null || !mapping.includes('](/')) { return value } + value = mapping; + // Extract link text and URL const matches = value.match(/\[(.*?)\]\((.*?)\)/); if (matches) { @@ -65,12 +87,11 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio const oss = siteConfig.customFields.oss; - rows = rows.filter(row => row.field != null && (row.field != "artifacts" || !oss)); - var fieldSorter = function(a, b) { + var fieldSorter = function (a, b) { if (a.required && !b.required) { return -1; } @@ -423,7 +444,7 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio {row.anyOf && {row.anyOf.join(' | ')}} {!row.anyOf && row.scheme && ( - {useSchemeUrl(row.scheme)} + {useSchemeUrl(row.scheme, oss)} )} diff --git a/common/src/components/HealthCheck.jsx b/common/src/components/HealthCheck.jsx index 3fcd84d1..ad0157ba 100644 --- a/common/src/components/HealthCheck.jsx +++ b/common/src/components/HealthCheck.jsx @@ -10,6 +10,10 @@ export default function HealthCheck({ name, edition, rows, ...props }) { const { siteConfig } = useDocusaurusContext() + const oss = siteConfig.customFields.oss; + + rows = rows.filter(row => row.field != null && + (row.field != "artifacts" || !oss)); const commonsRows = [ { @@ -51,7 +55,7 @@ export default function HealthCheck({ name, edition, rows, ...props }) { { field: "metrics", description: "Metrics to export from", - scheme: "[`[]Metrics`](../concepts/metrics/custom-metrics)" + scheme: "[`[]Metrics`](../concepts/metrics)" } ] diff --git a/common/src/components/Home.jsx b/common/src/components/Home.jsx index 20a3f064..5c3c2270 100644 --- a/common/src/components/Home.jsx +++ b/common/src/components/Home.jsx @@ -147,7 +147,7 @@ function Home() { subtitle="Integrations" title="Batteries included with 30+ check types" image={} - url="/checks"> + url="/getting-started"> Canary checker is a single binary with most checks bundled and not requiring an external installation. @@ -171,7 +171,7 @@ function Home() { subtitle="Prometheus" title="Metrics Exporter" image="metrics-exporter.png" - url="/concepts/metrics-exporter"> + url="/concepts/metrics"> Export custom metrics from any check, replacing the need for multiple separate metric exporters. @@ -180,7 +180,7 @@ function Home() { title="Grafana" left={false} image="grafana-dashboard.png" - url="/concepts/grafana"> + url="/concepts/metrics#grafana"> Chose from a standard Grafana dashboard or create your own using the prometheus metrics exposed by Canary Checker. @@ -226,7 +226,7 @@ function Home() { image="display-format.png" - url="/concepts/display-formatting"> + url="/concepts/expressions/display-formatting"> Evaluate the health of checks using scripts in CEL, Javascript or Go Templating. Templates can also be used to format the output of checks.
@@ -250,7 +250,7 @@ function Home() { subtitle="Control Plane Monitoring" title="Active Infrastructure Checks" image="infrastructure-check.png" - url="/concepts/scripting"> + url="https://flanksource.com/docs/blog/infrastructure-testing-with-canary-checker-and-flux"> Proactive infrastructure checks ensure your control plane has ample buffer/ or capacity. These checks validate the ability to schedule new pods, launch EC2 instances, and push/pull to docker and helm repositories.
@@ -267,7 +267,7 @@ function Home() { left={false} image="exec-check.png" - url="/concepts/scripting"> + url="/scripting"> Evaluate the health of checks using scripts in CEL, Javascript or Go Templating. Templates can also be used to format the output of checks.
@@ -286,7 +286,7 @@ function Home() { title="Leverage Kubernetes Secrets" image="auth-check.png" - url="/concepts/authentication"> + url="/concepts/secret-management"> Canaries are namespace aware and can be configured to use kubernetes secrets and configmaps for authentication details, negating the need to store secrets in the configuration. diff --git a/common/src/components/Integrations.jsx b/common/src/components/Integrations.jsx index 5a48af32..d389c000 100644 --- a/common/src/components/Integrations.jsx +++ b/common/src/components/Integrations.jsx @@ -5,7 +5,7 @@ import { FeatureBody } from './FeatureBody'; const integrations = [ { icon: "prometheus" }, // { icon: "datadog" }, - { icon: "dynatrace" }, + // { icon: "dynatrace" }, { icon: "aws-cloudwatch" }, { icon: "k8s", url: "kubernetes" }, // { icon: "argo" }, @@ -18,39 +18,48 @@ const integrations = [ { icon: "dns" }, { icon: "ldap" }, - { icon: "sftp" }, - { icon: "smb" }, - { icon: "s3" }, - { icon: "gcs", url: "gcs-bucket" }, + { icon: "sftp", url: "/examples/sftp" }, + { icon: "smb", url: "/examples/smb" }, + { icon: "s3", url: "folder#s3" }, + { icon: "gcs", url: "folder#gcs" }, { icon: "redis" }, - { icon: "mysql" }, - { icon: "postgres" }, - { icon: "mssql" }, + { icon: "mysql", url: "sql#mysql" }, + { icon: "postgres", url: "sql#postgres" }, + { icon: "mssql", url: "sql#mssql" }, { icon: "mongo" }, { icon: "elasticsearch" }, { icon: "opensearch", url: "elasticsearch" }, - { icon: "jmeter" }, - { icon: "k6" }, - { icon: "postman" }, - { icon: "playwright" }, - { icon: "aws-ec2-instance" }, + { icon: "jmeter", url: "jmeter" }, + { icon: "k6", url: "/examples/k6" }, + { icon: "postman", url: "/examples/newman" }, + { icon: "playwright", url: "/examples/playwright" }, { icon: "aws-config" }, { icon: "helm" }, - { icon: "docker" }, + { icon: "docker", url: "containerd" }, { icon: "bash", url: "exec" }, { icon: "powershell", url: "exec" }, - { icon: "github" }, + { icon: "github", url: "git" }, { icon: "azure-devops" }, ]; + + export function Integrations() { return ( ) } diff --git a/mission-control/docs/guide/playbooks/actions/exec.mdx b/mission-control/docs/guide/playbooks/actions/exec.mdx index e515eb6d..aee1ae6b 100644 --- a/mission-control/docs/guide/playbooks/actions/exec.mdx +++ b/mission-control/docs/guide/playbooks/actions/exec.mdx @@ -35,6 +35,18 @@ exec: script: kubectl rollout release deployment -n $(.config.tags.namespace) $(.conf ``` +## Shell Language + +Use a shebang (`#!`) line to choose a different shell (`python`, `bash` and `pwsh` are included in the base image) + +```yaml +exec: + script: | + //highlight-next-line + #! pwsh + Get-Items | ConvertTo-JSON +``` + diff --git a/modules/.gitignore b/modules/.gitignore new file mode 100644 index 00000000..e5420ac2 --- /dev/null +++ b/modules/.gitignore @@ -0,0 +1,2 @@ +rendered.yaml +generated/**/* From 48fe8149d2d400e1f079e32beb7bfe11b75ec000 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Thu, 13 Mar 2025 14:03:19 +0200 Subject: [PATCH 02/16] chore: link fixes --- canary-checker/docs/reference/1-exec.mdx | 2 +- .../docs/reference/canary-checker/index.mdx | 60 +++++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/canary-checker/docs/reference/1-exec.mdx b/canary-checker/docs/reference/1-exec.mdx index 9a0ce729..21e96312 100644 --- a/canary-checker/docs/reference/1-exec.mdx +++ b/canary-checker/docs/reference/1-exec.mdx @@ -48,7 +48,7 @@ See Image Variants for a list of in ]}/> -## Scripting languages +## Shell Language Use a shebang (`#!`) line to choose a different shell (`python`, `bash` and `pwsh` are included in the base image) diff --git a/mission-control/docs/reference/canary-checker/index.mdx b/mission-control/docs/reference/canary-checker/index.mdx index 2e3af073..80b4ddae 100644 --- a/mission-control/docs/reference/canary-checker/index.mdx +++ b/mission-control/docs/reference/canary-checker/index.mdx @@ -13,34 +13,34 @@ sidebar_custom_props: | `icon` | Icon to use for the check. | `string` | | | `severity` | Severity of the check. | `string` | | | `resultmode` | Result mode of the check. | `string` | | -| `alertmanager` | List of AlertManager checks to run. | [`[]AlertManager`](/guide/canary-checker/reference/alert-manager) | | -| `awsConfig` | List of AWS Config checks to run. | [`[]AwsConfig`](/guide/canary-checker/reference/aws-config) | | -| `awsConfigRule` | List of AWS Config Rule checks to run. | [`[]AwsConfigRule`](/guide/canary-checker/reference/aws-config-rule) | | -| `cloudwatch` | List of CloudWatch checks to run. | [`[]CloudWatch`](/guide/canary-checker/reference/aws-cloudwatch) | | -| `catalog` | List of config DB checks to run. | [`[]Catalog`](/guide/canary-checker/reference/catalog) | | -| `containerd` | List of containerd pull checks to run. | [`[]ContainerdPull`](/guide/canary-checker/reference/containerd) | | -| `containerdPush` | List of containerd push checks to run. | [`[]ContainerdPush`](/guide/canary-checker/reference/containerd) | | -| `gcsDatabaseBackup` | List of GCP database backup checks to run. | [`[]DatabaseBackup`](/guide/canary-checker/reference/gcs-database-backup) | | -| `dns` | List of DNS checks to run. | [`[]DNS`](/guide/canary-checker/reference/dns) | | -| `elasticsearch` | List of ElasticSearch checks to run. | [`[]Elasticsearch`](/guide/canary-checker/reference/elasticsearch) | | -| `exec` | List of exec checks to run. | [`[]Exec`](/guide/canary-checker/reference/exec) | | -| `folder` | List of folder checks to run. | [`[]Folder`](/guide/canary-checker/reference/folder) | | -| `git` | List of GitHub checks to run. | [`[]GitHub`](/guide/canary-checker/reference/git) | | -| `helm` | List of Helm checks to run. | [`[]Helm`](/guide/canary-checker/reference/helm) | | -| `http` | List of HTTP checks to run. | [`[]HTTP`](/guide/canary-checker/reference/http) | | -| `icmp` | List of ICMP checks to run. | [`[]ICMP`](/guide/canary-checker/reference/icmp) | | -| `jmeter` | List of JMeter load test checks to run. | [`[]Jmeter`](/guide/canary-checker/reference/jmeter) | | -| `junit` | List of JUnit test result checks to run. | [`[]Junit`](/guide/canary-checker/reference/junit) | | -| `kubernetes` | List of Kubernetes checks to run. | [`[]Kubernetes`](/guide/canary-checker/reference/kubernetes) | | -| `kubernetesResource` | Kubernetes Resource Checks | [`[]KubernetesResource`](/guide/canary-checker/reference/kubernetes-resource) | | -| `ldap` | List of LDAP checks to run. | [`[]LDAP`](/guide/canary-checker/reference/ldap) | |s -| `mongodb` | List of MongoDB checks to run. | [`[]MongoDB`](/guide/canary-checker/reference/mongo) | | -| `mssql` | List of MSSQL checks to run. | [`[]Mssql`](/guide/canary-checker/reference/sql) | | -| `mysql` | List of MySQL checks to run. | [`[]Mysql`](/guide/canary-checker/reference/sql) | | -| `postgres` | List of Postgres checks to run. | [`[]Postgres`](/guide/canary-checker/reference/sql) | | -| `prometheus` | List of Prometheus checks to run. | [`[]Prometheus`](/guide/canary-checker/reference/prometheus) | | -| `redis` | List of Redis checks to run. | [`[]Redis`](/guide/canary-checker/reference/redis) | | -| `restic` | List of restic backup checks to run. | [`[]Restic`](/guide/canary-checker/reference/./restic) | | -| `s3` | List of S3 checks to run. | [`[]S3`](/guide/canary-checker/reference/s3-protocol) | | -| `tcp` | List of TCP checks to run. | [`[]TCP`](/guide/canary-checker/reference/./tcp) | | +| `alertmanager` | List of AlertManager checks to run. | [`[]AlertManager`](reference/alert-manager) | | +| `awsConfig` | List of AWS Config checks to run. | [`[]AwsConfig`](reference/aws-config) | | +| `awsConfigRule` | List of AWS Config Rule checks to run. | [`[]AwsConfigRule`](reference/aws-config-rule) | | +| `cloudwatch` | List of CloudWatch checks to run. | [`[]CloudWatch`](reference/aws-cloudwatch) | | +| `catalog` | List of config DB checks to run. | [`[]Catalog`](reference/catalog) | | +| `containerd` | List of containerd pull checks to run. | [`[]ContainerdPull`](reference/containerd) | | +| `containerdPush` | List of containerd push checks to run. | [`[]ContainerdPush`](reference/containerd) | | +| `gcsDatabaseBackup` | List of GCP database backup checks to run. | [`[]DatabaseBackup`](reference/gcs-database-backup) | | +| `dns` | List of DNS checks to run. | [`[]DNS`](reference/dns) | | +| `elasticsearch` | List of ElasticSearch checks to run. | [`[]Elasticsearch`](reference/elasticsearch) | | +| `exec` | List of exec checks to run. | [`[]Exec`](reference/exec) | | +| `folder` | List of folder checks to run. | [`[]Folder`](reference/folder) | | +| `git` | List of GitHub checks to run. | [`[]GitHub`](reference/git) | | +| `helm` | List of Helm checks to run. | [`[]Helm`](reference/helm) | | +| `http` | List of HTTP checks to run. | [`[]HTTP`](reference/http) | | +| `icmp` | List of ICMP checks to run. | [`[]ICMP`](reference/icmp) | | +| `jmeter` | List of JMeter load test checks to run. | [`[]Jmeter`](reference/jmeter) | | +| `junit` | List of JUnit test result checks to run. | [`[]Junit`](reference/junit) | | +| `kubernetes` | List of Kubernetes checks to run. | [`[]Kubernetes`](reference/kubernetes) | | +| `kubernetesResource` | Kubernetes Resource Checks | [`[]KubernetesResource`](reference/kubernetes-resource) | | +| `ldap` | List of LDAP checks to run. | [`[]LDAP`](reference/ldap) | |s +| `mongodb` | List of MongoDB checks to run. | [`[]MongoDB`](reference/mongo) | | +| `mssql` | List of MSSQL checks to run. | [`[]Mssql`](reference/sql) | | +| `mysql` | List of MySQL checks to run. | [`[]Mysql`](reference/sql) | | +| `postgres` | List of Postgres checks to run. | [`[]Postgres`](reference/sql) | | +| `prometheus` | List of Prometheus checks to run. | [`[]Prometheus`](reference/prometheus) | | +| `redis` | List of Redis checks to run. | [`[]Redis`](reference/redis) | | +| `restic` | List of restic backup checks to run. | [`[]Restic`](reference/./restic) | | +| `s3` | List of S3 checks to run. | [`[]S3`](reference/s3-protocol) | | +| `tcp` | List of TCP checks to run. | [`[]TCP`](reference/./tcp) | | From b2389bac06a2cf55aeb3c859e79da3cb47a97c06 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Thu, 13 Mar 2025 14:15:36 +0200 Subject: [PATCH 03/16] chore: add snippets --- common/snippets/_types.md | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 common/snippets/_types.md diff --git a/common/snippets/_types.md b/common/snippets/_types.md new file mode 100644 index 00000000..d59611a5 --- /dev/null +++ b/common/snippets/_types.md @@ -0,0 +1,75 @@ +# Common Types + +This document provides a reference for common types used in the configuration and operation of the system. + +## Agent + +An agent can be specified using: + +- `local`: The primary mission control instance. +- `uuid`: The UUID of an agent. +- `name`: The name of an agent. +- `all`: Match all/any agents. + +## Cron + +``` +# ┌───────────── minute (0–59) +# │ ┌───────────── hour (0–23) +# │ │ ┌───────────── day of the month (1–31) +# │ │ │ ┌───────────── month (1–12) +# │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday) +# │ │ │ │ │ +# │ │ │ │ │ +# │ │ │ │ │ + 0 * * * * +``` + +| Shortcut | Description | Equivalent | +| ------------------------------ | ---------------------------------------------------------- | ----------- | +| `@every` [Duration](#duration) | e.g., `@every 5m` | | +| `@yearly` (or `@annually`) | Run once a year at midnight of 1 January | `0 0 1 1 *` | +| `@monthly` | Run once a month at midnight of the first day of the month | `0 0 1 * *` | +| `@weekly` | Run once a week at midnight on Sunday | `0 0 * * 0` | +| `@daily` (or `@midnight`) | Run once a day at midnight | `0 0 * * *` | +| `@hourly` | Run once an hour at the beginning of the hour | `0 * * * *` | + +## Duration + +Valid time units are `s`, `m`, `h`, `d`, `w`, `y`. For example: + +- `1m15s` +- `1h5m` +- `23h` +- `1d8h` +- `1w6d8h` +- `19w0d8h` + +## Size + +Sizes are strings with a unit suffix, e.g., `100`, `100b`, `10mb`. Valid size units are `kb`, `mb`, `gb`, `tb`. + +## Icon + +One of the icons in the [flanksource-icons](https://github.com/flanksource/flanksource-icons/tree/main/svg) project or a URL to an image. + +e.g. + +- `kubernetes` +- `Kubernetes::Pod` +- `argo` +- `aws-ebs-volume` + +Use the picker below to search for icons: + + + +## Match Pattern + +Pattern matching supports the following operations: + +- `*` - Match anything +- `Added,Deleted` - Match either `Added` or `Deleted` +- `Added*`: Match anything starting with `Added`. +- `*Terminated`: Match anything ending with `Terminated`. +- `!PodCrashLooping`: Match everything except `PodCrashLooping`. From 99b0066708ae734cb7c6a655eb7ad94770c6e4b7 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 14 Mar 2025 10:04:12 +0200 Subject: [PATCH 04/16] chore: doc fixes --- CONVENTIONS.md | 38 +++++++++++-------- .../docs/installation/image-variants.md | 1 - canary.yaml | 24 ++++++++++++ .../docs/installation/self-hosted/oidc.mdx | 2 +- styles/Flanksource/Adverbs.yml | 1 + styles/Flanksource/SpellingSuggestions.yml | 1 + 6 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 canary.yaml diff --git a/CONVENTIONS.md b/CONVENTIONS.md index 0cab7346..b576f9e9 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -1,20 +1,26 @@ 1. Use an active, present tense voice -2. Do not use any salesy or marketing terms, Do not use adverbs -3. Use MDX formatting -4. Do not use the first person, Use "you" or "your team" -5. Do not use archaic language -6. Do not use oxymorons -7. Precede every command with an explanation of what the command does. After the command, provide additional details about the command, such as what the arguments do and why your reader is using them. -8. Avoid pop culture references, gender assumptions, holidays, hemisphere seasons, and other exclusionary language -9. Do not tell people how they feel -10. Explicitly tell the user to create or open each file you’ll have them use. -11. Like commands, always introduce a file or script by describing its general purpose, then explain any changes that the reader will be making in the file. Without these explanations, readers won’t be able to customize, update, or troubleshoot issues in the long run. -12. If you’re asking the reader to write code, follow the same approach for commands: introduce the code block with a high-level explanation of what it does. Then show the code, and then call out any important details. -13. Avoid adverbs and complex language -14. Use markdown codeblocks with a language and a title -15. Do not remove any "```" or "//highlight-next-line" text -16. Do not use the term "this document", when referring to the system or product being documented always use "Mission Control" -17. For examples using the following structure: +2. When referring to concepts or resources do not use the term "they", use the name of the concept or resource instead +3. Do not use any salesy or marketing terms, Do not use adverbs. +4. Prefer simple language over complex language, target Grade 10 reading level. +5. Parse the text as Markdown mixed with JSX blocks i.e. MDX +6. Avoid using more than 1 list in a paragraph or section. +7. Never remove or reformat JSX or code blocks\ +8. Do not use the first person, Use "you" or "your team" +9. Do not use archaic language +10. Do not use oxymorons +11. Do not refer to "the system" use "Mission Control" instead +12. Precede every command with an explanation of what the command does. After the command, provide additional details about the command, such as what the arguments do and why your reader is using them. +13. Avoid pop culture references, gender assumptions, holidays, hemisphere seasons, and other exclusionary language +14. Do not tell people how they feel +15. Explicitly tell the user to create or open each file you’ll have them use. +16. Always introduce a file or script by describing its general purpose, then explain any changes that the reader will be making in the file. Without these explanations, readers won’t be able to customize, update, or troubleshoot issues in the long run. +17. If you’re asking the reader to write code. introduce the code block with a high-level explanation of what it does. Then show the code, and then call out any important details. +18. Avoid adverbs and complex language +19. Use markdown codeblocks with a language and a title +20. Do not remove any "```" or "//highlight-next-line" text +21. Follow standard markdown rules provided by markdownlint +22. Do not use the term "this document", when referring to the system or product being documented always use "Mission Control" +23. For examples using the following structure: Introduction of example Example Code This example: diff --git a/canary-checker/docs/installation/image-variants.md b/canary-checker/docs/installation/image-variants.md index fa04ae95..c6a69a30 100644 --- a/canary-checker/docs/installation/image-variants.md +++ b/canary-checker/docs/installation/image-variants.md @@ -13,7 +13,6 @@ Canary checker comes with 2 image variants: - yq - python3 - ## [Minimal](https://github.com/flanksource/canary-checker/blob/master/build/minimal/Dockerfile) - [arkade](https://github.com/alexellis/arkade) diff --git a/canary.yaml b/canary.yaml new file mode 100644 index 00000000..e569dbf5 --- /dev/null +++ b/canary.yaml @@ -0,0 +1,24 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: http-crawl +spec: + schedule: "@daily" + http: + - name: docs + url: http://localhost:3000/ + crawl: + parallelism: 10 + delay: 1ms + randomDelay: 1ms + depth: 10 + disallowedURLFilters: + - http://localhost:8080 + + # - name: canary-checker + # url: https://canarychecker.io + # crawl: + # parallelism: 10 + # delay: 1ms + # randomDelay: 1ms + # depth: 10 diff --git a/mission-control/docs/installation/self-hosted/oidc.mdx b/mission-control/docs/installation/self-hosted/oidc.mdx index 6a8ff9ca..bb1dd4b9 100644 --- a/mission-control/docs/installation/self-hosted/oidc.mdx +++ b/mission-control/docs/installation/self-hosted/oidc.mdx @@ -83,7 +83,7 @@ See [Providers](https://www.ory.sh/docs/kratos/social-signin/overview) more deta script: > { "role": "sre" in identity.traits.groups ? "admin": "viewer" - } + }.toJSON() ```

diff --git a/styles/Flanksource/Adverbs.yml b/styles/Flanksource/Adverbs.yml index 6f753a9c..6bbd16f5 100644 --- a/styles/Flanksource/Adverbs.yml +++ b/styles/Flanksource/Adverbs.yml @@ -7,6 +7,7 @@ action: name: remove tokens: - abnormally + - sophisticated - absentmindedly - accidentally - adventurously diff --git a/styles/Flanksource/SpellingSuggestions.yml b/styles/Flanksource/SpellingSuggestions.yml index 40a2cc59..74994810 100644 --- a/styles/Flanksource/SpellingSuggestions.yml +++ b/styles/Flanksource/SpellingSuggestions.yml @@ -31,3 +31,4 @@ swap: pulldown: pull-down an URL: a URL sunset(?:|s|ed|ing)?: deprecate(s) + configuration items: config items From 3854abc1ed2213cc75055c02ac3d1bccd59f578e Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 14 Mar 2025 11:39:26 +0200 Subject: [PATCH 05/16] chore: lint fixes --- CONVENTIONS.md | 1 + canary-checker/docs/types.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CONVENTIONS.md b/CONVENTIONS.md index b576f9e9..6fbccbc9 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -1,3 +1,4 @@ + 1. Use an active, present tense voice 2. When referring to concepts or resources do not use the term "they", use the name of the concept or resource instead 3. Do not use any salesy or marketing terms, Do not use adverbs. diff --git a/canary-checker/docs/types.md b/canary-checker/docs/types.md index 99bd88ae..a2e710d0 100644 --- a/canary-checker/docs/types.md +++ b/canary-checker/docs/types.md @@ -6,6 +6,6 @@ sidebar_custom_props: icon: fluent:library-16-regular --- -import Types from '@site/docs/snippets/_types.md' +import Types from '@site/docs/snippets/\_types.md' From d0673ec154df1fab32e9cc43cc7af01a23a82a0b Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 14 Mar 2025 12:01:32 +0200 Subject: [PATCH 06/16] chore: style fixes --- CONVENTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONVENTIONS.md b/CONVENTIONS.md index 6fbccbc9..841a3e2e 100644 --- a/CONVENTIONS.md +++ b/CONVENTIONS.md @@ -1,4 +1,5 @@ + 1. Use an active, present tense voice 2. When referring to concepts or resources do not use the term "they", use the name of the concept or resource instead 3. Do not use any salesy or marketing terms, Do not use adverbs. From 883e76794101e33db52d0c0ddefb24381f99adfa Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Mon, 17 Mar 2025 14:12:29 +0200 Subject: [PATCH 07/16] chore: category page fixes --- canary-checker/docs/comparisons/index.md | 2 +- .../docs/concepts/{index.mdx => concepts.md} | 2 +- .../image-variants.md | 2 +- canary-checker/docs/examples/index.mdx | 2 +- canary-checker/docs/health-checks.canary.mdx | 5 +- .../_category.md => installation/index.md} | 8 +- .../reference/{category.md => reference.md} | 4 +- canary-checker/docs/scripting/index.mdx | 5 +- canary-checker/docs/security.md | 2 + canary-checker/docs/types.md | 2 +- canary-checker/docusaurus.config.js | 3 +- canary-checker/sidebars.js | 122 +- .../docs/reference/image-variants.md | 49 + mission-control/docusaurus.config.ts | 1 + mission-control/package-lock.json | 4255 ++++++++--------- mission-control/package.json | 10 +- 16 files changed, 2105 insertions(+), 2369 deletions(-) rename canary-checker/docs/concepts/{index.mdx => concepts.md} (88%) rename canary-checker/docs/{installation => concepts}/image-variants.md (96%) rename canary-checker/docs/{reference/_category.md => installation/index.md} (56%) rename canary-checker/docs/reference/{category.md => reference.md} (79%) create mode 100644 mission-control/docs/reference/image-variants.md diff --git a/canary-checker/docs/comparisons/index.md b/canary-checker/docs/comparisons/index.md index 7bca3805..b23e0446 100644 --- a/canary-checker/docs/comparisons/index.md +++ b/canary-checker/docs/comparisons/index.md @@ -1,6 +1,6 @@ --- title: Comparisons -sidebar_position: 3 +sidebar_position: 4 sidebar_custom_props: icon: material-symbols-light:text-compare-outline --- diff --git a/canary-checker/docs/concepts/index.mdx b/canary-checker/docs/concepts/concepts.md similarity index 88% rename from canary-checker/docs/concepts/index.mdx rename to canary-checker/docs/concepts/concepts.md index 8d8469d2..609875ae 100644 --- a/canary-checker/docs/concepts/index.mdx +++ b/canary-checker/docs/concepts/concepts.md @@ -1,7 +1,7 @@ --- title: Concepts hide_sidebar: true -sidebar_position: 1 +sidebar_position: 2 sidebar_custom_props: icon: concepts --- diff --git a/canary-checker/docs/installation/image-variants.md b/canary-checker/docs/concepts/image-variants.md similarity index 96% rename from canary-checker/docs/installation/image-variants.md rename to canary-checker/docs/concepts/image-variants.md index c6a69a30..fb759df7 100644 --- a/canary-checker/docs/installation/image-variants.md +++ b/canary-checker/docs/concepts/image-variants.md @@ -4,7 +4,7 @@ sidebar_custom_props: icon: docker --- -Canary checker comes with 2 image variants: +Canary checker comes with 3 image variants: ## [Slim](https://github.com/flanksource/canary-checker/blob/master/build/slim/Dockerfile) diff --git a/canary-checker/docs/examples/index.mdx b/canary-checker/docs/examples/index.mdx index 4a323b7a..5a67659d 100644 --- a/canary-checker/docs/examples/index.mdx +++ b/canary-checker/docs/examples/index.mdx @@ -1,6 +1,6 @@ --- title: Examples -sidebar_position: 2 +sidebar_position: 3 hide_sidebar: true sidebar_custom_props: icon: stash:graduation-cap-light diff --git a/canary-checker/docs/health-checks.canary.mdx b/canary-checker/docs/health-checks.canary.mdx index 4b3e2ab4..56e05f72 100644 --- a/canary-checker/docs/health-checks.canary.mdx +++ b/canary-checker/docs/health-checks.canary.mdx @@ -1,7 +1,10 @@ --- slug: /overview -title: Health Checks +sidebar_position: 0 +title: Overview id: health-checks +sidebar_custom_props: + icon: canary-checker --- diff --git a/canary-checker/docs/reference/_category.md b/canary-checker/docs/installation/index.md similarity index 56% rename from canary-checker/docs/reference/_category.md rename to canary-checker/docs/installation/index.md index f98ce16e..eda850fe 100644 --- a/canary-checker/docs/reference/_category.md +++ b/canary-checker/docs/installation/index.md @@ -1,9 +1,9 @@ --- -title: Checks -sidebar_position: 1 +title: Installation +sidebar_position: 2 sidebar_custom_props: - icon: codicon:pass -slug: /reference + icon: package-install + --- import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/reference/category.md b/canary-checker/docs/reference/reference.md similarity index 79% rename from canary-checker/docs/reference/category.md rename to canary-checker/docs/reference/reference.md index 75761012..90dd4a9c 100644 --- a/canary-checker/docs/reference/category.md +++ b/canary-checker/docs/reference/reference.md @@ -1,11 +1,13 @@ --- title: Checks +sidebar_position: 2 hide_sidebar: true sidebar_custom_props: icon: codicon:pass -slug: /reference + category: true --- + import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/scripting/index.mdx b/canary-checker/docs/scripting/index.mdx index 979b44eb..1ec12666 100644 --- a/canary-checker/docs/scripting/index.mdx +++ b/canary-checker/docs/scripting/index.mdx @@ -1,9 +1,12 @@ --- title: Scripting -sidebar_position: 1 +sidebar_position: 3 sidebar_class_name: hide-mission-control sidebar_custom_props: icon: hugeicons:code --- +import DocCardList from '@theme/DocCardList'; + + diff --git a/canary-checker/docs/security.md b/canary-checker/docs/security.md index 91f4658e..1f870f47 100644 --- a/canary-checker/docs/security.md +++ b/canary-checker/docs/security.md @@ -1,6 +1,8 @@ --- title: Security sidebar_class_name: hidden-mission-control +sidebar_custom_props: + icon: shield --- Canary checker is essentially a remote command execution platform, which from a security perspective can be challenging diff --git a/canary-checker/docs/types.md b/canary-checker/docs/types.md index a2e710d0..fef6efd7 100644 --- a/canary-checker/docs/types.md +++ b/canary-checker/docs/types.md @@ -1,7 +1,7 @@ --- hide_title: true title: Common Types -sidebar_position: 2 +sidebar_position: 3 sidebar_custom_props: icon: fluent:library-16-regular --- diff --git a/canary-checker/docusaurus.config.js b/canary-checker/docusaurus.config.js index e1c761b2..934d1421 100644 --- a/canary-checker/docusaurus.config.js +++ b/canary-checker/docusaurus.config.js @@ -31,7 +31,7 @@ export default async function createConfigAsync() { "gotemplate": "/scripting/gotemplate", "javascript": '/scripting/javascript', "types": "/types", - "image-variants": "/installation/image-variants", + "image-variants": "/concepts/image-variants", "grafana": "/concepts/metrics#grafana", "jsonpath": 'https://jsonpath.com/' } @@ -57,6 +57,7 @@ export default async function createConfigAsync() { routeBasePath: '/', exclude: [ "**/*.mc.mdx", + "**/*.mc.md", "**/modules/**", "**/_*.mdx", "**/_*.md", diff --git a/canary-checker/sidebars.js b/canary-checker/sidebars.js index 28e6473f..7a744d4d 100644 --- a/canary-checker/sidebars.js +++ b/canary-checker/sidebars.js @@ -1,128 +1,10 @@ module.exports = { docs: [ - { - type: 'doc', - id: 'health-checks', - label: 'Overview' - }, - { - type: 'doc', - id: 'getting-started.canary', - label: 'Getting Started' - }, - { - type: 'category', - label: "Installation", - items: [ - { - label: "Helm", - type: "doc", - id: "installation/helm.canary" - }, - { - label: "CLI", - type: "doc", - id: "installation/cli" - }, - - { - label: "Database", - type: "doc", - id: "installation/database.canary" - }, - - { - label: "Image Variants", - type: 'doc', - id: 'installation/image-variants' - }, - ] - }, - { - type: 'category', - label: "Concepts", - items: [{ - type: 'autogenerated', - dirName: "concepts" - }] - }, { - type: 'category', - label: 'Checks', - link: { type: 'doc', id: 'reference/category' }, - items: [ - { - className: 'condensed', - type: 'autogenerated', - dirName: 'reference' - } - ] + type: 'autogenerated', + dirName: "." }, - - { - type: 'category', - label: 'Examples', - - items: [ - - { - className: 'condensed', - type: 'autogenerated', - dirName: 'examples', - - } - ] - }, - - { - type: 'category', - label: 'Scripting', - items: [ - - { - label: "CEL", - type: 'doc', - id: 'scripting/cel' - }, - { - label: "Go Templates", - type: 'doc', - id: 'scripting/gotemplate' - }, - { - label: "Javascript", - type: 'doc', - id: 'scripting/javascript' - }, - - { - label: "Common Types", - type: 'doc', - id: 'types' - }, - - - ] - }, - { - type: 'category', - label: 'Comparisons', - items: [ - { - type: 'doc', - id: 'comparisons/blackbox-exporter', - label: 'Blackbox Exporter' - } - ] - }, - { - type: 'doc', - id: 'troubleshooting', - label: 'Troubleshooting' - }, - - { type: 'category', label: 'Tutorials', diff --git a/mission-control/docs/reference/image-variants.md b/mission-control/docs/reference/image-variants.md new file mode 100644 index 00000000..c2709021 --- /dev/null +++ b/mission-control/docs/reference/image-variants.md @@ -0,0 +1,49 @@ +--- +title: Image Variants +--- + +Canary checker comes with 2 image variants: + +## [Slim](https://github.com/flanksource/canary-checker/blob/master/build/slim/Dockerfile) + +- [arkade](https://github.com/alexellis/arkade) + +- jq +- yq +- python3 + +## [Minimal](https://github.com/flanksource/canary-checker/blob/master/build/minimal/Dockerfile) + +- [arkade](https://github.com/alexellis/arkade) +- kubectl +- [stern](https://github.com/stern/stern) +- [fblog](https://github.com/brocode/fblog) +- jq +- yq +- [sops](https://github.com//mozilla/sops) +- PowerShell 7 + - powershell-yaml +- python3 +- [azure-cli](https://learn.microsoft.com/en-us/cli/azure/) +- [gcloud-cli](https://cloud.google.com/sdk/gcloud) + - kubectl-oidc + - gke-gcloud-auth-plugin +- [aws-cli](https://aws.amazon.com/cli/) + +## [Full](https://github.com/flanksource/canary-checker/blob/master/build/full/Dockerfile) + +Everything in the minimal image plus: + +- [k6](https://github.com/grafana/k6) +- OpenJDK Temurin 21 +- [JMeter](https://jmeter.apache.org/) +- [Robot Framework](https://robotframework.org/) +- [benthos](https://benthos.dev) +- [dsq](https://github.com/multiprocessio/dsq) +- [restic](https://restic.net/) + +You can choose which variant to use in the helm chart using: + +```bash +helm install flanksource/canary-checker --set image.type=full +``` diff --git a/mission-control/docusaurus.config.ts b/mission-control/docusaurus.config.ts index ea97a943..7ed4413b 100644 --- a/mission-control/docusaurus.config.ts +++ b/mission-control/docusaurus.config.ts @@ -166,6 +166,7 @@ export default async function createConfigAsync() { routeBasePath: '/', exclude: [ "**/*.canary.mdx", + "**/*.canary.md", "**/_*.mdx", "**/modules/**", "**/_*.md" diff --git a/mission-control/package-lock.json b/mission-control/package-lock.json index 35db7ea2..e00e061e 100644 --- a/mission-control/package-lock.json +++ b/mission-control/package-lock.json @@ -8,9 +8,9 @@ "name": "mission-control", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.6.3", - "@docusaurus/plugin-client-redirects": "^3.6.3", - "@docusaurus/preset-classic": "^3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/plugin-client-redirects": "3.7.0", + "@docusaurus/preset-classic": "3.7.0", "@flanksource/icons": "^1.0.32", "@floating-ui/react": "^0.26.28", "@iconify/react": "^5.1.0", @@ -38,8 +38,8 @@ "util": "^0.12.5" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.6.3", - "@docusaurus/types": "^3.6.3", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/types": "3.7.0", "@iconify-icon/react": "^2.1.0", "@iconify/tailwind": "^1.1.3", "@tailwindcss/typography": "^0.5.15", @@ -52,31 +52,31 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -84,172 +84,101 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "dependencies": { - "@algolia/cache-common": "4.24.0" - } - }, "node_modules/@algolia/client-abtesting": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.16.0.tgz", - "integrity": "sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.21.0.tgz", + "integrity": "sha512-I239aSmXa3pXDhp3AWGaIfesqJBNFA7drUM8SIfNxMIzvQXUnHRf4rW1o77QXLI/nIClNsb8KOLaB62gO9LnlQ==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.21.0.tgz", + "integrity": "sha512-OxoUfeG9G4VE4gS7B4q65KkHzdGsQsDwxQfR5J9uKB8poSGuNlHJWsF3ABqCkc5VliAR0m8KMjsQ9o/kOpEGnQ==", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.16.0.tgz", - "integrity": "sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.21.0.tgz", + "integrity": "sha512-iHLgDQFyZNe9M16vipbx6FGOA8NoMswHrfom/QlCGoyh7ntjGvfMb+J2Ss8rRsAlOWluv8h923Ku3QVaB0oWDQ==", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.16.0.tgz", - "integrity": "sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.21.0.tgz", + "integrity": "sha512-y7XBO9Iwb75FLDl95AYcWSLIViJTpR5SUUCyKsYhpP9DgyUqWbISqDLXc96TS9shj+H+7VsTKA9cJK8NUfVN6g==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.21.0.tgz", + "integrity": "sha512-6KU658lD9Tss4oCX6c/O15tNZxw7vR+WAUG95YtZzYG/KGJHTpy2uckqbMmC2cEK4a86FAq4pH5azSJ7cGMjuw==", "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.16.0.tgz", - "integrity": "sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.21.0.tgz", + "integrity": "sha512-pG6MyVh1v0X+uwrKHn3U+suHdgJ2C+gug+UGkNHfMELHMsEoWIAQhxMBOFg7hCnWBFjQnuq6qhM3X9X5QO3d9Q==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.16.0.tgz", - "integrity": "sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.21.0.tgz", + "integrity": "sha512-nZfgJH4njBK98tFCmCW1VX/ExH4bNOl9DSboxeXGgvhoL0fG1+4DDr/mrLe21OggVCQqHwXBMh6fFInvBeyhiQ==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" @@ -261,147 +190,80 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/ingestion": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.16.0.tgz", - "integrity": "sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.21.0.tgz", + "integrity": "sha512-k6MZxLbZphGN5uRri9J/krQQBjUrqNcScPh985XXEFXbSCRvOPKVtjjLdVjGVHXXPOQgKrIZHxIdRNbHS+wVuA==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "dependencies": { - "@algolia/logger-common": "4.24.0" - } - }, "node_modules/@algolia/monitoring": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.16.0.tgz", - "integrity": "sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.21.0.tgz", + "integrity": "sha512-FiW5nnmyHvaGdorqLClw3PM6keXexAMiwbwJ9xzQr4LcNefLG3ln82NafRPgJO/z0dETAOKjds5aSmEFMiITHQ==", "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.21.0.tgz", + "integrity": "sha512-+JXavbbliaLmah5QNgc/TDW/+r0ALa+rGhg5Y7+pF6GpNnzO0L+nlUaDNE8QbiJfz54F9BkwFUnJJeRJAuzTFw==", "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.16.0.tgz", - "integrity": "sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.21.0.tgz", + "integrity": "sha512-Iw+Yj5hOmo/iixHS94vEAQ3zi5GPpJywhfxn1el/zWo4AvPIte/+1h9Ywgw/+3M7YBj4jgAkScxjxQCxzLBsjA==", "dependencies": { - "@algolia/client-common": "5.16.0" + "@algolia/client-common": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" - }, "node_modules/@algolia/requester-fetch": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.16.0.tgz", - "integrity": "sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.21.0.tgz", + "integrity": "sha512-Z00SRLlIFj3SjYVfsd9Yd3kB3dUwQFAkQG18NunWP7cix2ezXpJqA+xAoEf9vc4QZHdxU3Gm8gHAtRiM2iVaTQ==", "dependencies": { - "@algolia/client-common": "5.16.0" + "@algolia/client-common": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.16.0.tgz", - "integrity": "sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.21.0.tgz", + "integrity": "sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA==", "dependencies": { - "@algolia/client-common": "5.16.0" + "@algolia/client-common": "5.21.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -439,28 +301,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -484,12 +346,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -510,11 +372,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -533,16 +395,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -651,9 +513,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "engines": { "node": ">=6.9.0" } @@ -675,13 +537,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -740,23 +602,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -947,13 +809,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -979,11 +841,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1171,11 +1033,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -1349,11 +1211,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1615,14 +1477,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1685,11 +1547,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1699,11 +1561,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1713,13 +1575,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, @@ -1790,13 +1652,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -1808,9 +1670,9 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -1821,21 +1683,21 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -1851,17 +1713,17 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1941,9 +1803,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", - "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.10.tgz", + "integrity": "sha512-uITFQYO68pMEYR46AHgQoyBg7KPPJDAbGn4jUTIRgCFJIp88MIBUianVOplhZDEec07bp9zIyr4Kp0FCyQzmWg==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -1953,28 +1815,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1983,9 +1845,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -2025,9 +1887,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "funding": [ { "type": "github", @@ -2043,9 +1905,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", - "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "funding": [ { "type": "github", @@ -2065,9 +1927,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", - "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "funding": [ { "type": "github", @@ -2079,8 +1941,8 @@ } ], "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.0" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" }, "engines": { "node": ">=18" @@ -2198,9 +2060,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2210,9 +2072,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", - "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", + "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", "funding": [ { "type": "github", @@ -2224,7 +2086,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2238,9 +2100,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", - "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", + "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", "funding": [ { "type": "github", @@ -2252,7 +2114,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2293,9 +2155,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", - "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", + "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", "funding": [ { "type": "github", @@ -2307,7 +2169,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2344,9 +2206,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", - "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", + "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", "funding": [ { "type": "github", @@ -2358,7 +2220,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2370,9 +2232,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", - "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", + "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", "funding": [ { "type": "github", @@ -2384,7 +2246,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2398,9 +2260,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", - "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", + "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", "funding": [ { "type": "github", @@ -2412,7 +2274,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2452,9 +2314,9 @@ } }, "node_modules/@csstools/postcss-initial": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", - "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", "funding": [ { "type": "github", @@ -2519,9 +2381,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2670,9 +2532,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", - "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", + "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", "funding": [ { "type": "github", @@ -2684,7 +2546,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2" @@ -2772,9 +2634,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", - "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", + "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", "funding": [ { "type": "github", @@ -2786,7 +2648,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2824,9 +2686,9 @@ } }, "node_modules/@csstools/postcss-random-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", - "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", + "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", "funding": [ { "type": "github", @@ -2838,7 +2700,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2850,9 +2712,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", - "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", + "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", "funding": [ { "type": "github", @@ -2864,7 +2726,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2902,9 +2764,9 @@ } }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2914,9 +2776,9 @@ } }, "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", - "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", + "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", "funding": [ { "type": "github", @@ -2928,7 +2790,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2940,9 +2802,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", - "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", + "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", "funding": [ { "type": "github", @@ -2954,7 +2816,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2966,9 +2828,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", - "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "funding": [ { "type": "github", @@ -2980,7 +2842,7 @@ } ], "dependencies": { - "@csstools/color-helpers": "^5.0.1", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -2991,9 +2853,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", - "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", + "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", "funding": [ { "type": "github", @@ -3005,7 +2867,7 @@ } ], "dependencies": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -3067,24 +2929,24 @@ } }, "node_modules/@docsearch/css": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", - "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==" }, "node_modules/@docsearch/react": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", - "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.0", - "algoliasearch": "^5.12.0" + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { @@ -3102,75 +2964,10 @@ } } }, - "node_modules/@docsearch/react/node_modules/@algolia/client-analytics": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.16.0.tgz", - "integrity": "sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==", - "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/client-personalization": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.16.0.tgz", - "integrity": "sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==", - "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/@algolia/recommend": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.16.0.tgz", - "integrity": "sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==", - "dependencies": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docsearch/react/node_modules/algoliasearch": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.16.0.tgz", - "integrity": "sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==", - "dependencies": { - "@algolia/client-abtesting": "5.16.0", - "@algolia/client-analytics": "5.16.0", - "@algolia/client-common": "5.16.0", - "@algolia/client-insights": "5.16.0", - "@algolia/client-personalization": "5.16.0", - "@algolia/client-query-suggestions": "5.16.0", - "@algolia/client-search": "5.16.0", - "@algolia/ingestion": "1.16.0", - "@algolia/monitoring": "1.16.0", - "@algolia/recommend": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@docusaurus/babel": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", - "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.7.0.tgz", + "integrity": "sha512-0H5uoJLm14S/oKV3Keihxvh8RV+vrid+6Gv+2qhuzbqHanawga8tYnsdpjEyt36ucJjqlby2/Md2ObWjA02UXQ==", "dependencies": { "@babel/core": "^7.25.9", "@babel/generator": "^7.25.9", @@ -3182,8 +2979,8 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3193,16 +2990,16 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", - "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.7.0.tgz", + "integrity": "sha512-CUUT9VlSGukrCU5ctZucykvgCISivct+cby28wJwCC/fkQFgAHRp/GKv2tx38ZmXb7nacrKzFTcp++f9txUYGg==", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.6.3", - "@docusaurus/cssnano-preset": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/babel": "3.7.0", + "@docusaurus/cssnano-preset": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", "babel-loader": "^9.2.1", "clean-css": "^5.3.2", "copy-webpack-plugin": "^11.0.0", @@ -3264,17 +3061,17 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", - "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", - "dependencies": { - "@docusaurus/babel": "3.6.3", - "@docusaurus/bundler": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz", + "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==", + "dependencies": { + "@docusaurus/babel": "3.7.0", + "@docusaurus/bundler": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3295,13 +3092,12 @@ "p-map": "^4.0.0", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", "semver": "^7.5.4", "serve-handler": "^6.1.6", "shelljs": "^0.8.5", @@ -3320,14 +3116,14 @@ }, "peerDependencies": { "@mdx-js/react": "^3.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", - "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.7.0.tgz", + "integrity": "sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ==", "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -3339,9 +3135,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", - "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -3351,13 +3147,13 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", - "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz", + "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3384,8 +3180,8 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/mdx-loader/node_modules/@types/unist": { @@ -3432,16 +3228,16 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", - "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.7.0.tgz", + "integrity": "sha512-g7WdPqDNaqA60CmBrr0cORTrsOit77hbsTj7xE2l71YhBn79sxdm7WMK7wfhcaafkbpIh7jv5ef5TOpf1Xv9Lg==", "dependencies": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.7.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@*", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { @@ -3450,15 +3246,15 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.6.3.tgz", - "integrity": "sha512-fQDCxoJCO1jXNQGQmhgYoX3Yx+Z2xSbrLf3PBET6pHnsRk6gGW/VuCHcfQuZlJzbTxN0giQ5u3XcQQ/LzXftJA==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.7.0.tgz", + "integrity": "sha512-6B4XAtE5ZVKOyhPgpgMkb7LwCkN+Hgd4vOnlbwR8nCdTQhLjz8MHbGlwwvZ/cay2SPNRX5KssqKAlcHVZP2m8g==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -3468,23 +3264,23 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", - "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz", + "integrity": "sha512-EFLgEz6tGHYWdPU0rK8tSscZwx+AsyuBW/r+tNig2kbccHYGUJmZtYN38GjAa3Fda4NU+6wqUO5kTXQSRBQD3g==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -3501,24 +3297,24 @@ }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", - "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz", + "integrity": "sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3532,20 +3328,20 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", - "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.7.0.tgz", + "integrity": "sha512-YJSU3tjIJf032/Aeao8SZjFOrXJbz/FACMveSMjLyMH4itQyZ2XgUIzt4y+1ISvvk5zrW4DABVT2awTCqBkx0Q==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -3554,18 +3350,18 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", - "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.7.0.tgz", + "integrity": "sha512-Qgg+IjG/z4svtbCNyTocjIwvNTNEwgRjSXXSJkKVG0oWoH0eX/HAPiu+TS1HBwRPQV+tTYPWLrUypYFepfujZA==", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -3574,36 +3370,36 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", - "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.7.0.tgz", + "integrity": "sha512-otIqiRV/jka6Snjf+AqB360XCeSv7lQC+DKYW+EUZf6XbuE8utz5PeUQ8VuOcD8Bk5zvT1MC4JKcd5zPfDuMWA==", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "tslib": "^2.6.0" }, "engines": { "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", - "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.7.0.tgz", + "integrity": "sha512-M3vrMct1tY65ModbyeDaMoA+fNJTSPe5qmchhAbtqhDD/iALri0g9LrEpIOwNaoLmm6lO88sfBUADQrSRSGSWA==", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -3611,39 +3407,39 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", - "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.7.0.tgz", + "integrity": "sha512-X8U78nb8eiMiPNg3jb9zDIVuuo/rE1LjGDGu+5m5CX4UBZzjMy+klOY2fNya6x8ACyE/L3K2erO1ErheP55W/w==", "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "tslib": "^2.6.0" }, "engines": { "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", - "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.7.0.tgz", + "integrity": "sha512-bTRT9YLZ/8I/wYWKMQke18+PF9MV8Qub34Sku6aw/vlZ/U+kuEuRpQ8bTcNOjaTSfYsWkK4tTwDMHK2p5S86cA==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -3652,55 +3448,78 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.7.0.tgz", + "integrity": "sha512-HByXIZTbc4GV5VAUkZ2DXtXv1Qdlnpk3IpuImwSnEzCDBkUMYcec5282hPjn6skZqB25M1TYCmWS91UbhBGxQg==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", - "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/plugin-debug": "3.6.3", - "@docusaurus/plugin-google-analytics": "3.6.3", - "@docusaurus/plugin-google-gtag": "3.6.3", - "@docusaurus/plugin-google-tag-manager": "3.6.3", - "@docusaurus/plugin-sitemap": "3.6.3", - "@docusaurus/theme-classic": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-search-algolia": "3.6.3", - "@docusaurus/types": "3.6.3" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.7.0.tgz", + "integrity": "sha512-nPHj8AxDLAaQXs+O6+BwILFuhiWbjfQWrdw2tifOClQoNfuXDjfjogee6zfx6NGHWqshR23LrcN115DmkHC91Q==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/plugin-content-blog": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/plugin-content-pages": "3.7.0", + "@docusaurus/plugin-debug": "3.7.0", + "@docusaurus/plugin-google-analytics": "3.7.0", + "@docusaurus/plugin-google-gtag": "3.7.0", + "@docusaurus/plugin-google-tag-manager": "3.7.0", + "@docusaurus/plugin-sitemap": "3.7.0", + "@docusaurus/plugin-svgr": "3.7.0", + "@docusaurus/theme-classic": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-search-algolia": "3.7.0", + "@docusaurus/types": "3.7.0" }, "engines": { "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", - "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", - "dependencies": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.7.0.tgz", + "integrity": "sha512-MnLxG39WcvLCl4eUzHr0gNcpHQfWoGqzADCly54aqCofQX6UozOS9Th4RK3ARbM9m7zIRv3qbhggI53dQtx/hQ==", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/plugin-content-blog": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/plugin-content-pages": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -3719,19 +3538,19 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", - "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", - "dependencies": { - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz", + "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==", + "dependencies": { + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3746,25 +3565,25 @@ }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", - "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", - "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.7.0.tgz", + "integrity": "sha512-Al/j5OdzwRU1m3falm+sYy9AaB93S1XF1Lgk9Yc6amp80dNxJVplQdQTR4cYdzkGtuQqbzUA8+kaoYYO0RbK6g==", + "dependencies": { + "@docsearch/react": "^3.8.1", + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -3776,14 +3595,14 @@ "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", - "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz", + "integrity": "sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3793,23 +3612,23 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", - "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.7.0.tgz", + "integrity": "sha512-kOmZg5RRqJfH31m+6ZpnwVbkqMJrPOG5t0IOl4i/+3ruXyNfWzZ0lVtVrD0u4ONc/0NOsS9sWYaxxWNkH1LdLQ==", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "utility-types": "^3.10.0", "webpack": "^5.95.0", "webpack-merge": "^5.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/types/node_modules/webpack-merge": { @@ -3826,14 +3645,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", - "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@svgr/webpack": "^8.1.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", @@ -3857,11 +3675,11 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", - "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "dependencies": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.7.0", "tslib": "^2.6.0" }, "engines": { @@ -3869,13 +3687,13 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", - "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz", + "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==", "dependencies": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4941,7 +4759,8 @@ }, "node_modules/@types/parse-json": { "version": "4.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prismjs": { "version": "1.26.3", @@ -5374,31 +5193,32 @@ } }, "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.21.0.tgz", + "integrity": "sha512-hexLq2lSO1K5SW9j21Ubc+q9Ptx7dyRTY7se19U8lhIlVMLCNXWCyQ6C22p9ez8ccX0v7QVmwkl2l1CnuGoO2Q==", + "dependencies": { + "@algolia/client-abtesting": "5.21.0", + "@algolia/client-analytics": "5.21.0", + "@algolia/client-common": "5.21.0", + "@algolia/client-insights": "5.21.0", + "@algolia/client-personalization": "5.21.0", + "@algolia/client-query-suggestions": "5.21.0", + "@algolia/client-search": "5.21.0", + "@algolia/ingestion": "1.21.0", + "@algolia/monitoring": "1.21.0", + "@algolia/recommend": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.22.6", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.6.tgz", - "integrity": "sha512-F2gSb43QHyvZmvH/2hxIjbk/uFdO2MguQYTFP7J+RowMW1csjIODMobEnpLI8nbLQuzZnGZdIxl5Bpy1k9+CFQ==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.24.2.tgz", + "integrity": "sha512-vBw/INZDfyh/THbVeDy8On8lZqd2qiUAHde5N4N1ygL4SoeLqLGJ4GHneHrDAYsjikRwTTtodEP0fiXl5MxHFQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -5406,41 +5226,6 @@ "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dependencies": { - "@algolia/requester-common": "4.24.0" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "license": "ISC", @@ -5635,7 +5420,8 @@ }, "node_modules/at-least-node": { "version": "1.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "engines": { "node": ">= 4.0.0" } @@ -5738,9 +5524,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/babel-loader/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -5748,7 +5534,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -5785,12 +5571,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6296,9 +6082,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -6314,9 +6100,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -6476,9 +6262,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -6487,6 +6273,21 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "license": "MIT", @@ -6532,9 +6333,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001705", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz", + "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==", "funding": [ { "type": "opencollective", @@ -6976,9 +6777,9 @@ } }, "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -7114,9 +6915,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -7124,7 +6925,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -7152,11 +6953,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -7164,9 +6965,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7275,9 +7076,9 @@ } }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -7307,9 +7108,9 @@ } }, "node_modules/css-has-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", - "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", "funding": [ { "type": "github", @@ -7354,9 +7155,9 @@ } }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -7474,9 +7275,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -7484,7 +7285,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -7550,9 +7351,9 @@ } }, "node_modules/cssdb": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", - "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.4.tgz", + "integrity": "sha512-3KSCVkjZJe/QxicVXnbyYSY26WsFc1YoMY7jep1ZKWMEVc7jEm6V2Xq2r+MX8WKQIuB7ofGbnr5iVI+aZpoSzg==", "funding": [ { "type": "opencollective", @@ -7924,7 +7725,8 @@ }, "node_modules/deepmerge": { "version": "4.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } @@ -8160,7 +7962,8 @@ }, "node_modules/detect-port-alt": { "version": "1.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -8175,14 +7978,16 @@ }, "node_modules/detect-port-alt/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/devlop": { "version": "1.1.0", @@ -8270,9 +8075,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -8369,11 +8174,11 @@ } }, "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, @@ -8400,9 +8205,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.5.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", - "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==" + "version": "1.5.119", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz", + "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -8516,6 +8321,17 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -8728,9 +8544,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz", - "integrity": "sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.2.tgz", + "integrity": "sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==", "dependencies": { "@types/estree": "^1.0.0" }, @@ -9245,7 +9061,8 @@ }, "node_modules/filesize": { "version": "8.0.7", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "engines": { "node": ">= 0.4.0" } @@ -9321,14 +9138,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/find-versions": { "version": "3.2.0", "license": "MIT", @@ -9496,7 +9305,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -9533,7 +9343,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -9547,7 +9358,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -9560,7 +9372,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -9576,7 +9389,8 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "engines": { "node": ">=6" } @@ -9710,18 +9524,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", - "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "hasown": "^2.0.2" + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9735,6 +9551,18 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-proxy": { "version": "2.1.0", "license": "MIT", @@ -10182,15 +10010,15 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", - "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -10205,6 +10033,15 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-from-parse5/node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -10323,9 +10160,9 @@ } }, "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -10338,9 +10175,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" }, @@ -10349,6 +10186,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-estree/node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", @@ -10380,19 +10226,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, "node_modules/hast-util-to-jsx-runtime/node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -10449,14 +10282,14 @@ } }, "node_modules/hastscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", - "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -10464,6 +10297,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hastscript/node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/he": { "version": "1.2.0", "license": "MIT", @@ -10783,9 +10625,9 @@ } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.0.tgz", + "integrity": "sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==", "dependencies": { "queue": "6.0.2" }, @@ -11174,7 +11016,8 @@ }, "node_modules/immer": { "version": "9.0.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -11247,9 +11090,9 @@ "license": "ISC" }, "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "node_modules/interpret": { "version": "1.4.0", @@ -11629,7 +11472,8 @@ }, "node_modules/is-root": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "engines": { "node": ">=6" } @@ -11821,9 +11665,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, @@ -12316,6 +12160,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -12327,12 +12179,13 @@ } }, "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", + "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -12351,9 +12204,9 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -12475,9 +12328,9 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -12543,9 +12396,9 @@ ] }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -12558,9 +12411,9 @@ ] }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -13104,9 +12957,9 @@ ] }, "node_modules/micromark-extension-directive/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13168,9 +13021,9 @@ ] }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13251,9 +13104,9 @@ ] }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13338,9 +13191,9 @@ ] }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13385,9 +13238,9 @@ ] }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13400,9 +13253,9 @@ ] }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -13469,9 +13322,9 @@ ] }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13496,9 +13349,9 @@ } }, "node_modules/micromark-extension-gfm-tagfilter/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13580,9 +13433,9 @@ ] }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13595,9 +13448,9 @@ ] }, "node_modules/micromark-extension-gfm/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13688,9 +13541,9 @@ ] }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13783,9 +13636,9 @@ ] }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13835,9 +13688,9 @@ } }, "node_modules/micromark-extension-mdx-md/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13928,9 +13781,9 @@ ] }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -13968,9 +13821,9 @@ } }, "node_modules/micromark-extension-mdxjs/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -14206,9 +14059,9 @@ ] }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -14761,9 +14614,9 @@ ] }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -15222,9 +15075,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -15232,7 +15085,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -15399,9 +15252,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -15534,13 +15387,15 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -15710,13 +15565,14 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15736,31 +15592,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/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==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-map": { "version": "4.0.0", "license": "MIT", @@ -15828,7 +15659,8 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } @@ -16133,10 +15965,11 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-exists": { - "version": "4.0.0", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -16271,7 +16104,8 @@ }, "node_modules/pkg-up": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dependencies": { "find-up": "^3.0.0" }, @@ -16281,7 +16115,8 @@ }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { "locate-path": "^3.0.0" }, @@ -16291,7 +16126,8 @@ }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -16300,9 +16136,24 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { "p-limit": "^2.0.0" }, @@ -16312,7 +16163,8 @@ }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { "node": ">=4" } @@ -16514,9 +16366,9 @@ } }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16555,9 +16407,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", - "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", + "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", "funding": [ { "type": "github", @@ -16569,7 +16421,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -16747,9 +16599,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16783,9 +16635,9 @@ } }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16903,9 +16755,9 @@ } }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16939,9 +16791,9 @@ } }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17039,9 +16891,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", - "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", + "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", "funding": [ { "type": "github", @@ -17053,7 +16905,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -17144,9 +16996,9 @@ } }, "node_modules/postcss-logical": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", - "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "funding": [ { "type": "github", @@ -17286,9 +17138,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -17302,9 +17154,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17328,9 +17180,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17440,9 +17292,9 @@ } }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17668,9 +17520,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", - "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", + "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", "funding": [ { "type": "github", @@ -17683,16 +17535,16 @@ ], "dependencies": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.6", - "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-color-function": "^4.0.8", + "@csstools/postcss-color-mix-function": "^3.0.8", "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-exponential-functions": "^2.0.7", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.6", - "@csstools/postcss-gradients-interpolation-method": "^5.0.6", - "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-gamut-mapping": "^2.0.8", + "@csstools/postcss-gradients-interpolation-method": "^5.0.8", + "@csstools/postcss-hwb-function": "^4.0.8", "@csstools/postcss-ic-unit": "^4.0.0", - "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.1", "@csstools/postcss-light-dark-function": "^2.0.7", "@csstools/postcss-logical-float-and-clear": "^3.0.0", @@ -17700,29 +17552,29 @@ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-minmax": "^2.0.7", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-oklab-function": "^4.0.8", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-random-function": "^1.0.3", + "@csstools/postcss-relative-color-syntax": "^3.0.8", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.0", - "@csstools/postcss-stepped-value-functions": "^4.0.5", - "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-sign-functions": "^1.1.2", + "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.7", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", - "browserslist": "^4.23.1", + "browserslist": "^4.24.4", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.2.1", + "cssdb": "^8.2.3", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.6", + "postcss-color-functional-notation": "^7.0.8", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.5", @@ -17735,8 +17587,8 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.6", - "postcss-logical": "^8.0.0", + "postcss-lab-function": "^7.0.8", + "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", @@ -17778,9 +17630,9 @@ } }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17897,9 +17749,9 @@ } }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18094,9 +17946,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "engines": { "node": ">=6" } @@ -18337,7 +18189,8 @@ }, "node_modules/react-dev-utils": { "version": "12.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -18369,8 +18222,9 @@ } }, "node_modules/react-dev-utils/node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -18382,7 +18236,8 @@ }, "node_modules/react-dev-utils/node_modules/find-up": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -18395,15 +18250,17 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "license": "MIT", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "engines": { "node": ">= 12.13.0" } }, "node_modules/react-dev-utils/node_modules/locate-path": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { "p-locate": "^5.0.0" }, @@ -18416,7 +18273,8 @@ }, "node_modules/react-dev-utils/node_modules/p-limit": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -18429,7 +18287,8 @@ }, "node_modules/react-dev-utils/node_modules/p-locate": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { "p-limit": "^3.0.2" }, @@ -18440,16 +18299,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, "node_modules/react-dev-utils/node_modules/path-key": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/shebang-command": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -18459,14 +18328,16 @@ }, "node_modules/react-dev-utils/node_modules/shebang-regex": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/which": { "version": "2.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, @@ -18477,6 +18348,17 @@ "node": ">= 8" } }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -18490,8 +18372,9 @@ } }, "node_modules/react-error-overlay": { - "version": "6.0.11", - "license": "MIT" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==" }, "node_modules/react-fast-compare": { "version": "3.2.2", @@ -18929,7 +18812,8 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { "minimatch": "^3.0.5" }, @@ -19022,6 +18906,17 @@ "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -19153,9 +19048,9 @@ } }, "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", @@ -19198,9 +19093,9 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -19518,10 +19413,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -20212,9 +20103,9 @@ } }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==" }, "node_modules/strict-uri-encode": { "version": "1.1.0", @@ -20425,12 +20316,20 @@ "license": "MIT", "optional": true }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "dependencies": { + "style-to-object": "1.0.8" + } + }, "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "node_modules/stylehacks": { @@ -21172,7 +21071,8 @@ }, "node_modules/text-table": { "version": "0.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", @@ -22690,7 +22590,8 @@ }, "node_modules/yaml": { "version": "1.10.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { "node": ">= 6" } @@ -22705,10 +22606,11 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.0.tgz", + "integrity": "sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -22730,188 +22632,105 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "requires": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", "requires": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" } }, "@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "requires": {} }, - "@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "requires": { - "@algolia/cache-common": "4.24.0" - } - }, - "@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==" - }, - "@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "requires": { - "@algolia/cache-common": "4.24.0" - } - }, "@algolia/client-abtesting": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.16.0.tgz", - "integrity": "sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.21.0.tgz", + "integrity": "sha512-I239aSmXa3pXDhp3AWGaIfesqJBNFA7drUM8SIfNxMIzvQXUnHRf4rW1o77QXLI/nIClNsb8KOLaB62gO9LnlQ==", "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - }, - "@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" - }, - "dependencies": { - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - } + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.21.0.tgz", + "integrity": "sha512-OxoUfeG9G4VE4gS7B4q65KkHzdGsQsDwxQfR5J9uKB8poSGuNlHJWsF3ABqCkc5VliAR0m8KMjsQ9o/kOpEGnQ==", "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - }, - "dependencies": { - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - } + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/client-common": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.16.0.tgz", - "integrity": "sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==" + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.21.0.tgz", + "integrity": "sha512-iHLgDQFyZNe9M16vipbx6FGOA8NoMswHrfom/QlCGoyh7ntjGvfMb+J2Ss8rRsAlOWluv8h923Ku3QVaB0oWDQ==" }, "@algolia/client-insights": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.16.0.tgz", - "integrity": "sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.21.0.tgz", + "integrity": "sha512-y7XBO9Iwb75FLDl95AYcWSLIViJTpR5SUUCyKsYhpP9DgyUqWbISqDLXc96TS9shj+H+7VsTKA9cJK8NUfVN6g==", "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.21.0.tgz", + "integrity": "sha512-6KU658lD9Tss4oCX6c/O15tNZxw7vR+WAUG95YtZzYG/KGJHTpy2uckqbMmC2cEK4a86FAq4pH5azSJ7cGMjuw==", "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - }, - "dependencies": { - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - } + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/client-query-suggestions": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.16.0.tgz", - "integrity": "sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.21.0.tgz", + "integrity": "sha512-pG6MyVh1v0X+uwrKHn3U+suHdgJ2C+gug+UGkNHfMELHMsEoWIAQhxMBOFg7hCnWBFjQnuq6qhM3X9X5QO3d9Q==", "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/client-search": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.16.0.tgz", - "integrity": "sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.21.0.tgz", + "integrity": "sha512-nZfgJH4njBK98tFCmCW1VX/ExH4bNOl9DSboxeXGgvhoL0fG1+4DDr/mrLe21OggVCQqHwXBMh6fFInvBeyhiQ==", "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/events": { @@ -22920,132 +22739,60 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/ingestion": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.16.0.tgz", - "integrity": "sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==", - "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - }, - "@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==" - }, - "@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.21.0.tgz", + "integrity": "sha512-k6MZxLbZphGN5uRri9J/krQQBjUrqNcScPh985XXEFXbSCRvOPKVtjjLdVjGVHXXPOQgKrIZHxIdRNbHS+wVuA==", "requires": { - "@algolia/logger-common": "4.24.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/monitoring": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.16.0.tgz", - "integrity": "sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.21.0.tgz", + "integrity": "sha512-FiW5nnmyHvaGdorqLClw3PM6keXexAMiwbwJ9xzQr4LcNefLG3ln82NafRPgJO/z0dETAOKjds5aSmEFMiITHQ==", "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.21.0.tgz", + "integrity": "sha512-+JXavbbliaLmah5QNgc/TDW/+r0ALa+rGhg5Y7+pF6GpNnzO0L+nlUaDNE8QbiJfz54F9BkwFUnJJeRJAuzTFw==", "requires": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - }, - "dependencies": { - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "requires": { - "@algolia/requester-common": "4.24.0" - } - }, - "@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "requires": { - "@algolia/requester-common": "4.24.0" - } - } + "@algolia/client-common": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "@algolia/requester-browser-xhr": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.16.0.tgz", - "integrity": "sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.21.0.tgz", + "integrity": "sha512-Iw+Yj5hOmo/iixHS94vEAQ3zi5GPpJywhfxn1el/zWo4AvPIte/+1h9Ywgw/+3M7YBj4jgAkScxjxQCxzLBsjA==", "requires": { - "@algolia/client-common": "5.16.0" + "@algolia/client-common": "5.21.0" } }, - "@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" - }, "@algolia/requester-fetch": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.16.0.tgz", - "integrity": "sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.21.0.tgz", + "integrity": "sha512-Z00SRLlIFj3SjYVfsd9Yd3kB3dUwQFAkQG18NunWP7cix2ezXpJqA+xAoEf9vc4QZHdxU3Gm8gHAtRiM2iVaTQ==", "requires": { - "@algolia/client-common": "5.16.0" + "@algolia/client-common": "5.21.0" } }, "@algolia/requester-node-http": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.16.0.tgz", - "integrity": "sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.21.0.tgz", + "integrity": "sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA==", "requires": { - "@algolia/client-common": "5.16.0" - } - }, - "@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "requires": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.21.0" } }, "@alloc/quick-lru": { @@ -23073,25 +22820,25 @@ } }, "@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==" + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==" }, "@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -23107,12 +22854,12 @@ } }, "@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "requires": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -23127,11 +22874,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "requires": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -23146,16 +22893,16 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "requires": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "dependencies": { @@ -23232,9 +22979,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==" + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==" }, "@babel/helper-remap-async-to-generator": { "version": "7.25.9", @@ -23247,13 +22994,13 @@ } }, "@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "requires": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -23291,20 +23038,20 @@ } }, "@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "requires": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10" } }, "@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "requires": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.10" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -23415,13 +23162,13 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" } }, "@babel/plugin-transform-async-to-generator": { @@ -23435,11 +23182,11 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" } }, "@babel/plugin-transform-block-scoping": { @@ -23549,11 +23296,11 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" } }, @@ -23655,11 +23402,11 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" } }, "@babel/plugin-transform-numeric-separator": { @@ -23813,14 +23560,14 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", "requires": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -23858,29 +23605,29 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "requires": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", + "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", "requires": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" } @@ -23921,13 +23668,13 @@ } }, "@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "requires": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -23939,9 +23686,9 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -23952,21 +23699,21 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -23982,17 +23729,17 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "dependencies": { @@ -24047,42 +23794,42 @@ } }, "@babel/runtime-corejs3": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", - "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.10.tgz", + "integrity": "sha512-uITFQYO68pMEYR46AHgQoyBg7KPPJDAbGn4jUTIRgCFJIp88MIBUianVOplhZDEec07bp9zIyr4Kp0FCyQzmWg==", "requires": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" } }, "@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "requires": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "requires": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -24099,23 +23846,23 @@ "requires": {} }, "@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==" }, "@csstools/css-calc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", - "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", - "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "requires": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.0" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" } }, "@csstools/css-parser-algorithms": { @@ -24151,9 +23898,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -24162,11 +23909,11 @@ } }, "@csstools/postcss-color-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", - "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", + "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24174,11 +23921,11 @@ } }, "@csstools/postcss-color-mix-function": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", - "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", + "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24197,11 +23944,11 @@ } }, "@csstools/postcss-exponential-functions": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", - "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", + "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } @@ -24216,21 +23963,21 @@ } }, "@csstools/postcss-gamut-mapping": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", - "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", + "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", - "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", + "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24238,11 +23985,11 @@ } }, "@csstools/postcss-hwb-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", - "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", + "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24260,9 +24007,9 @@ } }, "@csstools/postcss-initial": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", - "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", "requires": {} }, "@csstools/postcss-is-pseudo-class": { @@ -24281,9 +24028,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -24338,11 +24085,11 @@ } }, "@csstools/postcss-media-minmax": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", - "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", + "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2" @@ -24376,11 +24123,11 @@ } }, "@csstools/postcss-oklab-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", - "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", + "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24396,21 +24143,21 @@ } }, "@csstools/postcss-random-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", - "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", + "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-relative-color-syntax": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", - "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", + "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -24426,9 +24173,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -24437,40 +24184,40 @@ } }, "@csstools/postcss-sign-functions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", - "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", + "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-stepped-value-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", - "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", + "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", - "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "requires": { - "@csstools/color-helpers": "^5.0.1", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" } }, "@csstools/postcss-trigonometric-functions": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", - "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", + "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", "requires": { - "@csstools/css-calc": "^2.1.0", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } @@ -24493,80 +24240,25 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@docsearch/css": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", - "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==" }, "@docsearch/react": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", - "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", "requires": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.0", - "algoliasearch": "^5.12.0" - }, - "dependencies": { - "@algolia/client-analytics": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.16.0.tgz", - "integrity": "sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==", - "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - }, - "@algolia/client-personalization": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.16.0.tgz", - "integrity": "sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==", - "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - }, - "@algolia/recommend": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.16.0.tgz", - "integrity": "sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==", - "requires": { - "@algolia/client-common": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - }, - "algoliasearch": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.16.0.tgz", - "integrity": "sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==", - "requires": { - "@algolia/client-abtesting": "5.16.0", - "@algolia/client-analytics": "5.16.0", - "@algolia/client-common": "5.16.0", - "@algolia/client-insights": "5.16.0", - "@algolia/client-personalization": "5.16.0", - "@algolia/client-query-suggestions": "5.16.0", - "@algolia/client-search": "5.16.0", - "@algolia/ingestion": "1.16.0", - "@algolia/monitoring": "1.16.0", - "@algolia/recommend": "5.16.0", - "@algolia/requester-browser-xhr": "5.16.0", - "@algolia/requester-fetch": "5.16.0", - "@algolia/requester-node-http": "5.16.0" - } - } + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" } }, "@docusaurus/babel": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", - "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.7.0.tgz", + "integrity": "sha512-0H5uoJLm14S/oKV3Keihxvh8RV+vrid+6Gv+2qhuzbqHanawga8tYnsdpjEyt36ucJjqlby2/Md2ObWjA02UXQ==", "requires": { "@babel/core": "^7.25.9", "@babel/generator": "^7.25.9", @@ -24578,24 +24270,24 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "@docusaurus/bundler": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", - "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.7.0.tgz", + "integrity": "sha512-CUUT9VlSGukrCU5ctZucykvgCISivct+cby28wJwCC/fkQFgAHRp/GKv2tx38ZmXb7nacrKzFTcp++f9txUYGg==", "requires": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.6.3", - "@docusaurus/cssnano-preset": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/babel": "3.7.0", + "@docusaurus/cssnano-preset": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", "babel-loader": "^9.2.1", "clean-css": "^5.3.2", "copy-webpack-plugin": "^11.0.0", @@ -24639,17 +24331,17 @@ } }, "@docusaurus/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", - "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", - "requires": { - "@docusaurus/babel": "3.6.3", - "@docusaurus/bundler": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz", + "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==", + "requires": { + "@docusaurus/babel": "3.7.0", + "@docusaurus/bundler": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -24670,13 +24362,12 @@ "p-map": "^4.0.0", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.3.4", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", "semver": "^7.5.4", "serve-handler": "^6.1.6", "shelljs": "^0.8.5", @@ -24689,9 +24380,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", - "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.7.0.tgz", + "integrity": "sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ==", "requires": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -24700,22 +24391,22 @@ } }, "@docusaurus/logger": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", - "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", "requires": { "chalk": "^4.1.2", "tslib": "^2.6.0" } }, "@docusaurus/mdx-loader": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", - "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz", + "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==", "requires": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -24773,29 +24464,29 @@ } }, "@docusaurus/module-type-aliases": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", - "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.7.0.tgz", + "integrity": "sha512-g7WdPqDNaqA60CmBrr0cORTrsOit77hbsTj7xE2l71YhBn79sxdm7WMK7wfhcaafkbpIh7jv5ef5TOpf1Xv9Lg==", "requires": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.7.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@*", "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" } }, "@docusaurus/plugin-client-redirects": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.6.3.tgz", - "integrity": "sha512-fQDCxoJCO1jXNQGQmhgYoX3Yx+Z2xSbrLf3PBET6pHnsRk6gGW/VuCHcfQuZlJzbTxN0giQ5u3XcQQ/LzXftJA==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.7.0.tgz", + "integrity": "sha512-6B4XAtE5ZVKOyhPgpgMkb7LwCkN+Hgd4vOnlbwR8nCdTQhLjz8MHbGlwwvZ/cay2SPNRX5KssqKAlcHVZP2m8g==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -24803,18 +24494,18 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", - "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz", + "integrity": "sha512-EFLgEz6tGHYWdPU0rK8tSscZwx+AsyuBW/r+tNig2kbccHYGUJmZtYN38GjAa3Fda4NU+6wqUO5kTXQSRBQD3g==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -24828,19 +24519,19 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", - "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz", + "integrity": "sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -24852,121 +24543,137 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", - "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.7.0.tgz", + "integrity": "sha512-YJSU3tjIJf032/Aeao8SZjFOrXJbz/FACMveSMjLyMH4itQyZ2XgUIzt4y+1ISvvk5zrW4DABVT2awTCqBkx0Q==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" } }, "@docusaurus/plugin-debug": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", - "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.7.0.tgz", + "integrity": "sha512-Qgg+IjG/z4svtbCNyTocjIwvNTNEwgRjSXXSJkKVG0oWoH0eX/HAPiu+TS1HBwRPQV+tTYPWLrUypYFepfujZA==", "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", - "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.7.0.tgz", + "integrity": "sha512-otIqiRV/jka6Snjf+AqB360XCeSv7lQC+DKYW+EUZf6XbuE8utz5PeUQ8VuOcD8Bk5zvT1MC4JKcd5zPfDuMWA==", "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", - "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.7.0.tgz", + "integrity": "sha512-M3vrMct1tY65ModbyeDaMoA+fNJTSPe5qmchhAbtqhDD/iALri0g9LrEpIOwNaoLmm6lO88sfBUADQrSRSGSWA==", "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-tag-manager": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", - "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.7.0.tgz", + "integrity": "sha512-X8U78nb8eiMiPNg3jb9zDIVuuo/rE1LjGDGu+5m5CX4UBZzjMy+klOY2fNya6x8ACyE/L3K2erO1ErheP55W/w==", "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "tslib": "^2.6.0" } }, "@docusaurus/plugin-sitemap": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", - "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.7.0.tgz", + "integrity": "sha512-bTRT9YLZ/8I/wYWKMQke18+PF9MV8Qub34Sku6aw/vlZ/U+kuEuRpQ8bTcNOjaTSfYsWkK4tTwDMHK2p5S86cA==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" } }, + "@docusaurus/plugin-svgr": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.7.0.tgz", + "integrity": "sha512-HByXIZTbc4GV5VAUkZ2DXtXv1Qdlnpk3IpuImwSnEzCDBkUMYcec5282hPjn6skZqB25M1TYCmWS91UbhBGxQg==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + } + }, "@docusaurus/preset-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", - "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/plugin-debug": "3.6.3", - "@docusaurus/plugin-google-analytics": "3.6.3", - "@docusaurus/plugin-google-gtag": "3.6.3", - "@docusaurus/plugin-google-tag-manager": "3.6.3", - "@docusaurus/plugin-sitemap": "3.6.3", - "@docusaurus/theme-classic": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-search-algolia": "3.6.3", - "@docusaurus/types": "3.6.3" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.7.0.tgz", + "integrity": "sha512-nPHj8AxDLAaQXs+O6+BwILFuhiWbjfQWrdw2tifOClQoNfuXDjfjogee6zfx6NGHWqshR23LrcN115DmkHC91Q==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/plugin-content-blog": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/plugin-content-pages": "3.7.0", + "@docusaurus/plugin-debug": "3.7.0", + "@docusaurus/plugin-google-analytics": "3.7.0", + "@docusaurus/plugin-google-gtag": "3.7.0", + "@docusaurus/plugin-google-tag-manager": "3.7.0", + "@docusaurus/plugin-sitemap": "3.7.0", + "@docusaurus/plugin-svgr": "3.7.0", + "@docusaurus/theme-classic": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-search-algolia": "3.7.0", + "@docusaurus/types": "3.7.0" } }, "@docusaurus/theme-classic": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", - "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", - "requires": { - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/plugin-content-blog": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/plugin-content-pages": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.7.0.tgz", + "integrity": "sha512-MnLxG39WcvLCl4eUzHr0gNcpHQfWoGqzADCly54aqCofQX6UozOS9Th4RK3ARbM9m7zIRv3qbhggI53dQtx/hQ==", + "requires": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/plugin-content-blog": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/plugin-content-pages": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -24983,14 +24690,14 @@ } }, "@docusaurus/theme-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", - "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", - "requires": { - "@docusaurus/mdx-loader": "3.6.3", - "@docusaurus/module-type-aliases": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz", + "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==", + "requires": { + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -25002,20 +24709,20 @@ } }, "@docusaurus/theme-search-algolia": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", - "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", - "requires": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.6.3", - "@docusaurus/logger": "3.6.3", - "@docusaurus/plugin-content-docs": "3.6.3", - "@docusaurus/theme-common": "3.6.3", - "@docusaurus/theme-translations": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-validation": "3.6.3", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.7.0.tgz", + "integrity": "sha512-Al/j5OdzwRU1m3falm+sYy9AaB93S1XF1Lgk9Yc6amp80dNxJVplQdQTR4cYdzkGtuQqbzUA8+kaoYYO0RbK6g==", + "requires": { + "@docsearch/react": "^3.8.1", + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -25025,25 +24732,25 @@ } }, "@docusaurus/theme-translations": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", - "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz", + "integrity": "sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g==", "requires": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "@docusaurus/types": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", - "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.7.0.tgz", + "integrity": "sha512-kOmZg5RRqJfH31m+6ZpnwVbkqMJrPOG5t0IOl4i/+3ruXyNfWzZ0lVtVrD0u4ONc/0NOsS9sWYaxxWNkH1LdLQ==", "requires": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", "utility-types": "^3.10.0", "webpack": "^5.95.0", "webpack-merge": "^5.9.0" @@ -25062,14 +24769,13 @@ } }, "@docusaurus/utils": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", - "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "requires": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/types": "3.6.3", - "@docusaurus/utils-common": "3.6.3", - "@svgr/webpack": "^8.1.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.1.1", @@ -25090,22 +24796,22 @@ } }, "@docusaurus/utils-common": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", - "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "requires": { - "@docusaurus/types": "3.6.3", + "@docusaurus/types": "3.7.0", "tslib": "^2.6.0" } }, "@docusaurus/utils-validation": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", - "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz", + "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==", "requires": { - "@docusaurus/logger": "3.6.3", - "@docusaurus/utils": "3.6.3", - "@docusaurus/utils-common": "3.6.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -25899,7 +25605,9 @@ } }, "@types/parse-json": { - "version": "4.0.2" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "@types/prismjs": { "version": "1.26.3", @@ -26279,68 +25987,29 @@ "requires": {} }, "algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "requires": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - }, - "dependencies": { - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "requires": { - "@algolia/requester-common": "4.24.0" - } - }, - "@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "requires": { - "@algolia/requester-common": "4.24.0" - } - } + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.21.0.tgz", + "integrity": "sha512-hexLq2lSO1K5SW9j21Ubc+q9Ptx7dyRTY7se19U8lhIlVMLCNXWCyQ6C22p9ez8ccX0v7QVmwkl2l1CnuGoO2Q==", + "requires": { + "@algolia/client-abtesting": "5.21.0", + "@algolia/client-analytics": "5.21.0", + "@algolia/client-common": "5.21.0", + "@algolia/client-insights": "5.21.0", + "@algolia/client-personalization": "5.21.0", + "@algolia/client-query-suggestions": "5.21.0", + "@algolia/client-search": "5.21.0", + "@algolia/ingestion": "1.21.0", + "@algolia/monitoring": "1.21.0", + "@algolia/recommend": "5.21.0", + "@algolia/requester-browser-xhr": "5.21.0", + "@algolia/requester-fetch": "5.21.0", + "@algolia/requester-node-http": "5.21.0" } }, "algoliasearch-helper": { - "version": "3.22.6", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.6.tgz", - "integrity": "sha512-F2gSb43QHyvZmvH/2hxIjbk/uFdO2MguQYTFP7J+RowMW1csjIODMobEnpLI8nbLQuzZnGZdIxl5Bpy1k9+CFQ==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.24.2.tgz", + "integrity": "sha512-vBw/INZDfyh/THbVeDy8On8lZqd2qiUAHde5N4N1ygL4SoeLqLGJ4GHneHrDAYsjikRwTTtodEP0fiXl5MxHFQ==", "requires": { "@algolia/events": "^4.0.1" } @@ -26463,7 +26132,9 @@ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==" }, "at-least-node": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { "version": "10.4.19", @@ -26520,9 +26191,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -26558,12 +26229,12 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" } }, "babel-plugin-polyfill-regenerator": { @@ -26933,13 +26604,13 @@ } }, "browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "requires": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" } }, @@ -27040,14 +26711,23 @@ } }, "call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, "callsites": { "version": "3.1.0" }, @@ -27078,9 +26758,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==" + "version": "1.0.30001705", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz", + "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==" }, "caw": { "version": "2.0.1", @@ -27365,9 +27045,9 @@ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, "consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==" }, "content-disposition": { "version": "0.5.4", @@ -27458,9 +27138,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -27479,17 +27159,17 @@ "version": "3.35.1" }, "core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "requires": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.4" } }, "core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==" + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==" }, "core-util-is": { "version": "1.0.3" @@ -27546,9 +27226,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27569,9 +27249,9 @@ "dev": true }, "css-has-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", - "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", "requires": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -27585,9 +27265,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27648,9 +27328,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -27690,9 +27370,9 @@ "version": "6.1.0" }, "cssdb": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", - "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==" + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.4.tgz", + "integrity": "sha512-3KSCVkjZJe/QxicVXnbyYSY26WsFc1YoMY7jep1ZKWMEVc7jEm6V2Xq2r+MX8WKQIuB7ofGbnr5iVI+aZpoSzg==" }, "cssesc": { "version": "3.0.0" @@ -27930,7 +27610,9 @@ "version": "0.6.0" }, "deepmerge": { - "version": "4.3.1" + "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==" }, "default-gateway": { "version": "6.0.3", @@ -28083,6 +27765,8 @@ }, "detect-port-alt": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -28090,12 +27774,16 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -28155,9 +27843,9 @@ } }, "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -28225,11 +27913,11 @@ } }, "dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "requires": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } @@ -28250,9 +27938,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.5.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", - "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==" + "version": "1.5.119", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz", + "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==" }, "emoji-regex": { "version": "9.2.2" @@ -28331,6 +28019,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, "esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -28470,9 +28166,9 @@ } }, "estree-util-value-to-estree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz", - "integrity": "sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.2.tgz", + "integrity": "sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==", "requires": { "@types/estree": "^1.0.0" } @@ -28837,7 +28533,9 @@ } }, "filesize": { - "version": "8.0.7" + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { "version": "7.1.1", @@ -28892,13 +28590,6 @@ "requires": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" - }, - "dependencies": { - "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==" - } } }, "find-versions": { @@ -29018,6 +28709,8 @@ }, "fork-ts-checker-webpack-plugin": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -29036,6 +28729,8 @@ "dependencies": { "cosmiconfig": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -29046,6 +28741,8 @@ }, "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -29055,6 +28752,8 @@ }, "schema-utils": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", @@ -29062,7 +28761,9 @@ } }, "tapable": { - "version": "1.1.3" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" } } }, @@ -29156,18 +28857,20 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", - "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { - "call-bind-apply-helpers": "^1.0.0", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "hasown": "^2.0.2" + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-own-enumerable-property-symbols": { @@ -29175,6 +28878,15 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-proxy": { "version": "2.1.0", "optional": true, @@ -29459,15 +29171,15 @@ } }, "hast-util-from-parse5": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", - "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "requires": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -29478,6 +29190,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, + "property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==" + }, "unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -29568,9 +29285,9 @@ } }, "hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "requires": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -29583,11 +29300,18 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" + }, + "dependencies": { + "property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==" + } } }, "hast-util-to-jsx-runtime": { @@ -29617,19 +29341,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "requires": { - "inline-style-parser": "0.2.3" - } - }, "unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -29672,15 +29383,22 @@ } }, "hastscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", - "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "requires": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" + }, + "dependencies": { + "property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==" + } } }, "he": { @@ -29876,9 +29594,9 @@ "version": "5.3.0" }, "image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.0.tgz", + "integrity": "sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==", "requires": { "queue": "6.0.2" } @@ -30121,7 +29839,9 @@ } }, "immer": { - "version": "9.0.21" + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" }, "import-fresh": { "version": "3.3.0", @@ -30166,9 +29886,9 @@ "version": "1.3.8" }, "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "interpret": { "version": "1.4.0" @@ -30380,7 +30100,9 @@ "optional": true }, "is-root": { - "version": "2.1.0" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-stream": { "version": "1.1.0", @@ -30509,9 +30231,9 @@ } }, "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" }, "json-buffer": { "version": "3.0.0", @@ -30902,6 +30624,11 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -30909,12 +30636,13 @@ "dev": true }, "mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "requires": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", + "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -30931,9 +30659,9 @@ } }, "mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "requires": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -31013,9 +30741,9 @@ } }, "mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "requires": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -31053,16 +30781,16 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, "mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "requires": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -31457,9 +31185,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31489,9 +31217,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31511,9 +31239,9 @@ }, "dependencies": { "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31543,9 +31271,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31588,9 +31316,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31613,16 +31341,16 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, "micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "requires": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -31655,9 +31383,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31670,9 +31398,9 @@ }, "dependencies": { "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31712,9 +31440,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31757,9 +31485,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31810,9 +31538,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" }, "unist-util-stringify-position": { "version": "4.0.0", @@ -31842,9 +31570,9 @@ }, "dependencies": { "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31864,9 +31592,9 @@ }, "dependencies": { "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" } } }, @@ -31906,9 +31634,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" }, "unist-util-stringify-position": { "version": "4.0.0", @@ -32037,9 +31765,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" }, "unist-util-stringify-position": { "version": "4.0.0", @@ -32300,9 +32028,9 @@ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" }, "micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" }, "unist-util-stringify-position": { "version": "4.0.0", @@ -32499,9 +32227,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -32616,9 +32344,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "normalize-path": { "version": "3.0.0" @@ -32698,13 +32426,15 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "requires": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, @@ -32804,9 +32534,11 @@ "optional": true }, "p-limit": { - "version": "2.3.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" } }, "p-locate": { @@ -32815,21 +32547,6 @@ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "requires": { "p-limit": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==" - } } }, "p-map": { @@ -32869,7 +32586,9 @@ } }, "p-try": { - "version": "2.2.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { "version": "8.1.1", @@ -33077,7 +32796,9 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "path-exists": { - "version": "4.0.0" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" }, "path-is-absolute": { "version": "1.0.1" @@ -33161,31 +32882,49 @@ }, "pkg-up": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "path-exists": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, @@ -33292,9 +33031,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33320,11 +33059,11 @@ } }, "postcss-color-functional-notation": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", - "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", + "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -33404,9 +33143,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33423,9 +33162,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33484,9 +33223,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33503,9 +33242,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33553,11 +33292,11 @@ } }, "postcss-lab-function": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", - "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", + "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", "requires": { - "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -33596,9 +33335,9 @@ } }, "postcss-logical": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", - "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -33675,9 +33414,9 @@ "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "requires": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -33685,9 +33424,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33704,9 +33443,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33753,9 +33492,9 @@ "requires": {} }, "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -33872,21 +33611,21 @@ } }, "postcss-preset-env": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", - "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", + "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", "requires": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.6", - "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-color-function": "^4.0.8", + "@csstools/postcss-color-mix-function": "^3.0.8", "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-exponential-functions": "^2.0.7", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.6", - "@csstools/postcss-gradients-interpolation-method": "^5.0.6", - "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-gamut-mapping": "^2.0.8", + "@csstools/postcss-gradients-interpolation-method": "^5.0.8", + "@csstools/postcss-hwb-function": "^4.0.8", "@csstools/postcss-ic-unit": "^4.0.0", - "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.1", "@csstools/postcss-light-dark-function": "^2.0.7", "@csstools/postcss-logical-float-and-clear": "^3.0.0", @@ -33894,29 +33633,29 @@ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-minmax": "^2.0.7", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-oklab-function": "^4.0.8", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-random-function": "^1.0.3", + "@csstools/postcss-relative-color-syntax": "^3.0.8", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.0", - "@csstools/postcss-stepped-value-functions": "^4.0.5", - "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-sign-functions": "^1.1.2", + "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.7", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", - "browserslist": "^4.23.1", + "browserslist": "^4.24.4", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.2.1", + "cssdb": "^8.2.3", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.6", + "postcss-color-functional-notation": "^7.0.8", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.5", @@ -33929,8 +33668,8 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.6", - "postcss-logical": "^8.0.0", + "postcss-lab-function": "^7.0.8", + "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", @@ -33950,9 +33689,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -34013,9 +33752,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -34151,9 +33890,9 @@ } }, "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" }, "process": { "version": "0.11.10", @@ -34316,6 +34055,8 @@ }, "react-dev-utils": { "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -34344,7 +34085,9 @@ }, "dependencies": { "cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -34353,49 +34096,77 @@ }, "find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "loader-utils": { - "version": "3.2.1" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==" }, "locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, "path-key": { - "version": "3.1.1" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "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==", "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } }, @@ -34409,7 +34180,9 @@ } }, "react-error-overlay": { - "version": "6.0.11" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==" }, "react-fast-compare": { "version": "3.2.2", @@ -34737,6 +34510,8 @@ }, "recursive-readdir": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { "minimatch": "^3.0.5" } @@ -34805,6 +34580,13 @@ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "requires": { "jsesc": "~3.0.2" + }, + "dependencies": { + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + } } }, "rehype-raw": { @@ -34899,9 +34681,9 @@ } }, "remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "requires": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", @@ -34933,9 +34715,9 @@ } }, "remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "requires": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -35143,9 +34925,6 @@ "glob": "^7.1.3" } }, - "rtl-detect": { - "version": "1.1.2" - }, "rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -35649,9 +35428,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==" }, "strict-uri-encode": { "version": "1.1.0", @@ -35790,12 +35569,20 @@ "version": "1.0.5", "optional": true }, + "style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "requires": { + "style-to-object": "1.0.8" + } + }, "style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "requires": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "stylehacks": { @@ -36280,7 +36067,9 @@ } }, "text-table": { - "version": "0.2.0" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "thenify": { "version": "3.3.1", @@ -37306,7 +37095,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "1.10.2" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yauzl": { "version": "2.10.0", @@ -37317,7 +37108,9 @@ } }, "yocto-queue": { - "version": "0.1.0" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.0.tgz", + "integrity": "sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==" }, "zwitch": { "version": "2.0.4", diff --git a/mission-control/package.json b/mission-control/package.json index 55acc086..c9a7e60c 100644 --- a/mission-control/package.json +++ b/mission-control/package.json @@ -14,9 +14,9 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.6.3", - "@docusaurus/plugin-client-redirects": "^3.6.3", - "@docusaurus/preset-classic": "^3.6.3", + "@docusaurus/core": "3.7.0", + "@docusaurus/plugin-client-redirects": "3.7.0", + "@docusaurus/preset-classic": "3.7.0", "@flanksource/icons": "^1.0.32", "@floating-ui/react": "^0.26.28", "@iconify/react": "^5.1.0", @@ -44,8 +44,8 @@ "util": "^0.12.5" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.6.3", - "@docusaurus/types": "^3.6.3", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/types": "3.7.0", "@iconify-icon/react": "^2.1.0", "@iconify/tailwind": "^1.1.3", "@tailwindcss/typography": "^0.5.15", From 1c0f08d2e8a4e025e95c7f0093a03049a525b7d7 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Mon, 17 Mar 2025 16:48:25 +0200 Subject: [PATCH 08/16] chore: lint fixes --- canary-checker/docs/concepts/concepts.md | 1 - .../docs/concepts/image-variants.md | 2 +- .../docs/installation/1-helm.canary.md | 8 +- canary-checker/docs/installation/index.md | 1 - canary-checker/docs/partials/_gotemplate.md | 4 +- canary-checker/docs/reference/1-catalog.mdx | 2 +- .../docs/reference/1-s3-protocol.mdx | 2 +- canary-checker/docs/reference/reference.md | 1 - canary-checker/docs/scripting/cel.mdx | 36 +++--- canary-checker/docs/scripting/gotemplate.mdx | 81 ++++++------- mission-control/Makefile | 4 +- .../guide/playbooks/concepts/expression.md | 73 ------------ .../guide/playbooks/concepts/expression.mdx | 108 ++++++++++++++++++ mission-control/docs/integrations/azure.mdx | 2 +- .../docs/integrations/flux/topology.md | 2 +- modules/Makefile | 14 +++ modules/make.sh | 32 ++++++ styles/ignore/words-with-suggestions.txt | 41 +++++++ 18 files changed, 263 insertions(+), 151 deletions(-) delete mode 100644 mission-control/docs/guide/playbooks/concepts/expression.md create mode 100644 mission-control/docs/guide/playbooks/concepts/expression.mdx create mode 100644 modules/Makefile create mode 100755 modules/make.sh diff --git a/canary-checker/docs/concepts/concepts.md b/canary-checker/docs/concepts/concepts.md index 609875ae..e7fb8087 100644 --- a/canary-checker/docs/concepts/concepts.md +++ b/canary-checker/docs/concepts/concepts.md @@ -6,7 +6,6 @@ sidebar_custom_props: icon: concepts --- - import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/concepts/image-variants.md b/canary-checker/docs/concepts/image-variants.md index fb759df7..fd0d045e 100644 --- a/canary-checker/docs/concepts/image-variants.md +++ b/canary-checker/docs/concepts/image-variants.md @@ -33,7 +33,7 @@ Canary checker comes with 3 image variants: ## [Full](https://github.com/flanksource/canary-checker/blob/master/build/full/Dockerfile) -Everthing in the minimal image plus: +Everything in the minimal image plus: - [k6](https://github.com/grafana/k6) - OpenJDK Temurin 21 diff --git a/canary-checker/docs/installation/1-helm.canary.md b/canary-checker/docs/installation/1-helm.canary.md index e76ad57f..a6b8c56d 100644 --- a/canary-checker/docs/installation/1-helm.canary.md +++ b/canary-checker/docs/installation/1-helm.canary.md @@ -47,10 +47,10 @@ The recommended method for installing Canary Checker is using [helm](https://hel 1. Check the results via the [CLI](./cli) - -NAME INTERVAL STATUS LAST CHECK UPTIME 1H LATENCY 1H LAST TRANSITIONED -http-check 30 Passed 13s 18/18 (100.0%) 480ms 13s - + + NAME INTERVAL STATUS LAST CHECK UPTIME 1H LATENCY 1H LAST TRANSITIONED + http-check 30 Passed 13s 18/18 (100.0%) 480ms 13s + 1. Access the dashboard diff --git a/canary-checker/docs/installation/index.md b/canary-checker/docs/installation/index.md index eda850fe..7a855a9a 100644 --- a/canary-checker/docs/installation/index.md +++ b/canary-checker/docs/installation/index.md @@ -3,7 +3,6 @@ title: Installation sidebar_position: 2 sidebar_custom_props: icon: package-install - --- import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/partials/_gotemplate.md b/canary-checker/docs/partials/_gotemplate.md index dd93358f..e4a4ec5a 100644 --- a/canary-checker/docs/partials/_gotemplate.md +++ b/canary-checker/docs/partials/_gotemplate.md @@ -20,13 +20,13 @@ If you need to pass a template through a Helm Chart and prevent Helm from templa {{`{{ .secret }}`}} ``` -Alternatively [change the templating delimiters](#changing-templating-delimiters) +Alternatively [change the templating delimiters](#delimiters)

-If you are using a YAML multiline string use `|` and not `>` which will strip newlines +If you are using a YAML multiline string use `|` and not `>` which strips newlines. Instead of: diff --git a/canary-checker/docs/reference/1-catalog.mdx b/canary-checker/docs/reference/1-catalog.mdx index 7742f4f8..f6e46062 100644 --- a/canary-checker/docs/reference/1-catalog.mdx +++ b/canary-checker/docs/reference/1-catalog.mdx @@ -35,7 +35,7 @@ Runs a [config-db](https://github.com/flanksource/config-db) query. | `labelSelector` | Kubernetes Style Label Selector | [LabelSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) | No | | `fieldSelector` | Kubernetes Style Field Selector Property fields of the component in kubernetes format (or database columns: owner, topology_id, parent_id) | [FieldSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/) | No | | `agent` | Select resources created on this agent, Defaults to `local` | `uuid`, `{name}`, `local` or `all` | No | -| `cache` | Cache settings to use for the results, expensive selectors or selectors that are used very often should be cached for longer periods. Defaults to `max-age=10m` | `no-cache`, `no-store` or `max-age={duration}` | No | +| `cache` | Cache settings to use for the results, expensive selectors or selectors that are used often should be cached for longer periods. Defaults to `max-age=10m` | `no-cache`, `no-store` or `max-age={duration}` | No | | `search` | Search for resources via key value pairs using parsing expression grammar | [Search](#search) | No | ## Search diff --git a/canary-checker/docs/reference/1-s3-protocol.mdx b/canary-checker/docs/reference/1-s3-protocol.mdx index 90698d11..a04bf5ea 100644 --- a/canary-checker/docs/reference/1-s3-protocol.mdx +++ b/canary-checker/docs/reference/1-s3-protocol.mdx @@ -28,7 +28,7 @@ The S3 check: {field: "bucket", description: "Bucket name to test against", scheme: "string", required: true}, {field: "objectPath", description: "Path of object to upload/download for test", scheme: "string", required: true}, - {field: "storageClass", description: "Storage Class of the test test object to create", scheme: "string"}, + {field: "storageClass", description: "Storage Class of the test object to create", scheme: "string"}, ]}/> diff --git a/canary-checker/docs/reference/reference.md b/canary-checker/docs/reference/reference.md index 90dd4a9c..fbb27a91 100644 --- a/canary-checker/docs/reference/reference.md +++ b/canary-checker/docs/reference/reference.md @@ -7,7 +7,6 @@ sidebar_custom_props: category: true --- - import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/scripting/cel.mdx b/canary-checker/docs/scripting/cel.mdx index 9fe8824d..a7490cdb 100644 --- a/canary-checker/docs/scripting/cel.mdx +++ b/canary-checker/docs/scripting/cel.mdx @@ -950,7 +950,7 @@ filepath.Match("*.txt", "foo.txt") // true `filepath.Rel` returns a relative path that is lexically equivalent to targpath when joined to basepath with an intervening separator. That is, Join(basepath, Rel(basepath, targpath)) is equivalent to targpath itself. -On success, the returned path will always be relative to basepath, +On success, the returned path is always be relative to basepath, even if basepath and targpath share no elements. An error is returned if targpath can't be made relative to basepath or if knowing the current working directory would be necessary to compute it. @@ -1617,7 +1617,7 @@ regexp.Split(pattern, count, input) ``` - `pattern` is the regular expression pattern that separates the substrings. -- `count` is the maximum number of splits. Use -1 for no limit. +- `count` is the maximum number of splits. Use `-1` for no limit. - `input` is the string to split. ```javascript @@ -1640,12 +1640,11 @@ regexp.Split("z", -1, "hello") // ["hello"] ### .abbrev -`abbrev` on a string abbreviates the string using ellipses. Tl turn the string "Now is the time for all good men" into "...s the time for..." -This function works like `Abbreviate(string, int)`, but allows you to specify a "left edge" offset. The left edge is not -necessarily going to be the leftmost character in the result, or the first character following the ellipses, but it will appear -somewhere in the result. -In no case will it return a string of length greater than maxWidth. +The `abbrev` function abbreviates a string using ellipses. For example, it transforms "Now is the time for all good men" into "...s the time for..." +This function works like `Abbreviate(string, int)`, but allows you to specify a "left edge" offset. The left edge appears somewhere in the result, though not necessarily as the leftmost character or the first character following the ellipses. + +The function ensures the returned string length does not exceed maxWidth. ```javascript "string".abbrev(offset, maxWidth) ``` @@ -1688,9 +1687,8 @@ Examples: ``` ### .charAt - Returns the character at the given position. If the position is negative, or -greater than the length of the string, the function will produce an error: +greater than the length of the string, an error is thrown ```javascript "hello".charAt(4) // return 'o' @@ -1706,7 +1704,7 @@ greater than the length of the string, the function will produce an error: ### .contains -`contains` check if a string contains a given substring. +`contains` checks if a string contains a given substring. ```javascript "apple".contains("app") // true @@ -1721,19 +1719,17 @@ greater than the length of the string, the function will produce an error: ``` ### .format - -`format` Returns a new string with substitutions being performed, printf-style. +`format` creates a new string with substitutions performed in printf-style. The valid formatting clauses are: -- `%s` substitutes a string. This can also be used on `bools`, `lists`, `maps`, `bytes`, - `Duration`, `Timestamp`,`int`, `double` -
the dot/period decimal separator will always be used when printing a list or map that contains a double, and that null can be passed (which results in the string "null") in addition to types. +- `%s` substitutes a string. Use this for `bools`, `lists`, `maps`, `bytes`, `Duration`, `Timestamp`,`int`, `double` +
The dot/period decimal separator appears when printing a list or map containing a double. You can pass null, which outputs the string "null" in addition to types. - `%d` substitutes an integer. -- `%f` substitutes a double with fixed-point precision. The default precision is 6, but this can be adjusted. The strings `Infinity`, `-Infinity`, and `NaN` are also valid input for this clause. -- `%e` substitutes a double in scientific notation. The default precision is 6, but this can be adjusted. -- `%b` substitutes an integer with its equivalent binary string. Can also be used on bools. -- `%x` substitutes an integer with its equivalent in hexadecimal, or if given a string or bytes, will output each character's equivalent in hexadecimal. -- `%X` same as above, but with A-F capitalized. +- `%f` substitutes a double with fixed-point precision. The default precision is 6, but you can adjust this. The strings `Infinity`, `-Infinity`, and `NaN` are valid input for this clause. +- `%e` substitutes a double in scientific notation. The default precision is 6, but you can adjust this. +- `%b` substitutes an integer with its equivalent binary string. Use this for bools too. +- `%x` substitutes an integer with its equivalent in hexadecimal. For strings or bytes, it outputs each character's hexadecimal equivalent. +- `%X` same as `%x`, but with A-F capitalized. - `%o` substitutes an integer with its equivalent in octal. ```javascript diff --git a/canary-checker/docs/scripting/gotemplate.mdx b/canary-checker/docs/scripting/gotemplate.mdx index 8dff78bf..a7f5ca65 100644 --- a/canary-checker/docs/scripting/gotemplate.mdx +++ b/canary-checker/docs/scripting/gotemplate.mdx @@ -29,7 +29,7 @@ Alternatively [change the templating delimiters](#delimiters) ## Multiline YAML -If you are using a YAML multiline string use `|` and not `>` which will strip newlines +If you are using a YAML multiline string use `|` and not `>` which strips newlines Instead of: @@ -203,7 +203,7 @@ Where books is from [fantasy.json](https://openlibrary.org/subjects/fantasy.json Return a list of keys in one or more maps. -The keys will be ordered first by map position (if multiple maps are given), then alphabetically. +The keys are ordered first by map position (if multiple maps are given), then alphabetically. See also [`coll.Values`](#values). @@ -216,7 +216,7 @@ See also [`coll.Values`](#values). Return a list of values in one or more maps. -The values will be ordered first by map position (if multiple maps are given), then alphabetically by key. +The values are ordered first by map position (if multiple maps are given), then alphabetically by key. See also [`coll.Keys`](#keys). @@ -278,12 +278,11 @@ _this function does not change the given list; it always produces a new one._ ### Sort -Sort a given list. Uses the natural sort order if possible. For inputs that are not sortable (either because the elements are of different types, or of an un-sortable type), the input will simply be returned, unmodified. +Sort a given list using the natural sort order when possible. For inputs that are not sortable (either because the elements are of different types, or of an un-sortable type), the input returns unmodified. Maps and structs can be sorted by a named key. _this function does not modify the input._ - ```go {{ slice "foo" "bar" "baz" | coll.Sort }} // [bar baz foo] ``` @@ -294,10 +293,9 @@ _this function does not modify the input._ ### Merge -Merge maps together by overriding src with dst. In other words, the src map can be configured the "default" map, whereas the dst -map can be configured the "overrides". Many source maps can be provided. Precedence is in left-to-right order. +Merge combines multiple maps by overriding values from left to right. The first map acts as the base "defaults", while subsequent maps provide overrides. Multiple source maps can be provided, with precedence given in left-to-right order. -_this function does not modify the input._ +_This function does not modify the input maps._ ```go {{ $default := dict "foo" 1 "bar" 2}} @@ -361,10 +359,9 @@ Converts a true-ish string to a boolean. Can be used to simplify conditional sta ``` ### default - Provides a default value given an empty input. Empty inputs are `0` for numeric types, `""` for strings, `false` for booleans, empty arrays/maps, and `nil`. -this will not provide a default for the case where the input is undefined (i.e. referencing things like `.foo` where there is no `foo` field of `.`), but [`conv.Has`](#has) can be used for that. +This provides no default for cases where the input is undefined (that is, referencing things like `.foo` where there is no `foo` field of `.`), but [`conv.Has`](#has) can be used for that. ```go {{ "" | default "foo" }} // foo @@ -574,7 +571,7 @@ This delegates to [`conv.ToFloat64`](#tofloat64) for each input argument. Converts the input (of any type) to a `string`. -The input will always be represented in _some_ way. +The input is always be represented in _some_ way. ```go {{ conv.ToString 0xFF }} // 255 @@ -609,7 +606,7 @@ _Warning: SHA-1 is cryptographically broken and should not be used for secure ap ### json -Converts a JSON string into an object. Works for JSON Objects, but will also parse JSON Arrays. Will not parse other valid JSON types. +Converts a JSON string into an object. Supports only JSON Objects and Arrays. For more explicit JSON Array support, see [`data.JSONArray`](#jsonarray). @@ -627,7 +624,7 @@ Converts a JSON string into a slice. Only works for JSON Arrays. ### yaml -Converts a YAML string into an object. Works for YAML Objects but will also parse YAML Arrays. This can be used to access properties of YAML objects. +Converts a YAML string into an object. Supports only YAML Objects and Arrays. For more explicit YAML Array support, see [`data.JSONArray`](#yamlarray). @@ -682,7 +679,7 @@ Converts a CSV-format string into a slice of maps. By default, the [RFC 4180](https://tools.ietf.org/html/rfc4180) format is supported, but any single-character delimiter can be specified. -Also by default, the first line of the string will be assumed to be the header, but this can be overridden by providing an explicit header, or auto-indexing can be used. +Also by default, the first line of the string is assumed to be the header, but this can be overridden by providing an explicit header, or auto-indexing can be used. ``` {{ $c := `lang,keywords @@ -749,7 +746,6 @@ The indent string must be provided as an argument. Converts an object to a YAML document. Input objects may be the result of `data.JSON`, `data.YAML`, `data.JSONArray`, or `data.YAMLArray` functions. -_This is obviously contrived - `data.JSON` is used to create an object._ ```go {{ (`{"foo":{"hello":"world"}}` | data.JSON).foo | data.ToYAML }} // hello: world @@ -875,10 +871,9 @@ A wrapper for Go's [`filepath.Rel`](https://golang.org/pkg/path/filepath/#Rel) f ``` ### Split - Splits path immediately following the final path separator, separating it into a directory and file name component. -The function returns an array with two values, the first being the diretory, and the second the file. +The function returns an array with two values, the first being the directory, and the second the file. A wrapper for Go's [`filepath.Split`](https://golang.org/pkg/path/filepath/#Split) function. @@ -909,7 +904,7 @@ A wrapper for Go's [`filepath.VolumeName`](https://golang.org/pkg/path/filepath/ ## math -Returns the absolute value of a given number. When the input is an integer, the result is `int64`, otherwise it will be a `float64`. +Returns the absolute value of a given number. When the input is an integer, the result is `int64`, otherwise it is `float64`. ```go {{ math.Abs -3.5 }} {{ math.Abs 3.5 }} {{ math.Abs -42 }} // 3.5 3.5 42 @@ -917,7 +912,7 @@ Returns the absolute value of a given number. When the input is an integer, the ### Add -Adds all given operators. When one of the inputs is a floating-point number, the result will be a `float64`, otherwise it is `int64`. +Adds all given operators. When one of the inputs is a floating-point number, the result is `float64`, otherwise it is `int64`. ```go {{ math.Add 1 2 3 4 }} {{ math.Add 1.5 2 3 }} // 10 6.5 @@ -943,7 +938,7 @@ Returns the least integer value greater than or equal to a given floating-point ### Div -Divide the first number by the second. Division by zero is disallowed. The result will be a `float64`. +Divide the first number by the second. Division by zero is disallowed. The result is `float64`. ```go {{ math.Div 8 2 }} {{ math.Div 3 2 }} // 4 1.5 @@ -969,9 +964,9 @@ Returns the greatest integer value less than or equal to a given floating-point ### IsFloat -Returns whether or not the given number can be interpreted as a floating-point literal, as defined by the [Go language reference](https://golang.org/ref/spec#Floating-point_literals). +Returns whether the given number can be interpreted as a floating-point literal, as defined by the [Go language reference](https://golang.org/ref/spec#Floating-point_literals). -**Note:** If a decimal point is part of the input number, it will be considered a floating-point number, even if the decimal is `0`. +**Note:** If a decimal point is part of the input number, it is considered a floating-point number, even if the decimal is `0`. ```go {{ range (slice 1.0 "-1.0" 5.1 42 "3.14" "foo" "0xFF" "NaN" "Inf" "-0") }}{{ if (math.IsFloat .) }}{{.}} is a float{{"\n"}}{{ end }}{{end}} @@ -986,7 +981,7 @@ Returns whether or not the given number can be interpreted as a floating-point l ### IsInt -Returns whether or not the given number is an integer. +Returns whether the given number is an integer. ```go {{ range (slice 1.0 "-1.0" 5.1 42 "3.14" "foo" "0xFF" "NaN" "Inf" "-0") }}{{ if (math.IsInt .) }}{{.}} is an integer{{"\n"}}{{ end }}{{end}} @@ -1007,7 +1002,7 @@ Returns whether the given input is a number. Useful for `if` conditions. ### Max -Returns the largest number provided. If any values are floating-point numbers, a `float64` is returned, otherwise an `int64` is returned. The same special-cases as Go's [`math.Max`](https://golang.org/pkg/math/#Max) are followed. +Returns the largest number provided. If any values are floating-point numbers, a `float64` is returned, otherwise an `int64` is returned. Follows the same syntax as Go's [`math.Max`](https://golang.org/pkg/math/#Max). ```go {{ math.Max 0 8.0 4.5 "-1.5e-11" }} // 8 @@ -1015,7 +1010,7 @@ Returns the largest number provided. If any values are floating-point numbers, a ### Min -Returns the smallest number provided. If any values are floating-point numbers, a `float64` is returned, otherwise an `int64` is returned. The same special-cases as Go's [`math.Min`](https://golang.org/pkg/math/#Min) are followed. +Returns the smallest number provided. If any values are floating-point numbers, a `float64` is returned, otherwise an `int64` is returned. Follows the same syntax as Go's [`math.Min`](https://golang.org/pkg/math/#Min). ```go {{ math.Min 0 8 4.5 "-1.5e-11" }} // -1.5e-11 @@ -1199,7 +1194,7 @@ By default, the possible characters are those represented by the regular express A different set of characters can be specified with a regular expression, or by giving a range of possible characters by specifying the lower and upper bounds. Lower/upper bounds can be specified as characters (e.g. `"q"`, or escape sequences such as `"\U0001f0AF"`), or numeric Unicode code-points (e.g. `48` or `0x30` for the character `0`). -When given a range of Unicode code-points, `random.String` will discard non-printable characters from the selection. This may result in a much smaller set of possible characters than intended, so check the [Unicode character code charts](http://www.unicode.org/charts/) to verify the correct code-points. +When given a range of Unicode code-points, `random.String` discards non-printable characters from the selection. This may result in a much smaller set of possible characters than intended, so check the [Unicode character code charts](http://www.unicode.org/charts/) to verify the correct code-points. ```go {{ random.String 8 }} // FODZ01u_ @@ -1221,7 +1216,7 @@ Pick an element at a random from a given slice or array. Pick a random integer. By default, a number between `0` and `100` (inclusive) is chosen, but this range can be overridden. -the difference between `min` and `max` can not be larger than a 63-bit integer (i.e. the unsigned portion of a 64-bit signed integer). The result is given as an `int64`. +the difference between `min` and `max` can not be larger than a 63-bit integer (that is the unsigned portion of a 64-bit signed integer). The result is given as an `int64`. ```go {{ random.Number }} // 55 @@ -1231,7 +1226,7 @@ the difference between `min` and `max` can not be larger than a 63-bit integer ( ### Float -Pick a random decimal floating-point number. By default, a number between `0.0` and `1.0` (_exclusive_, i.e. `[0.0,1.0)`) is chosen, but this range can be overridden. +Pick a random decimal floating-point number. By default, a number between `0.0` and `1.0` (_exclusive_, that is `[0.0,1.0)`) is chosen, but this range can be overridden. The result is given as a `float64`. @@ -1260,7 +1255,7 @@ no {{ "will not match" | regexp.Find "[0-9]" }}numbers // no numbers Returns a list of all successive matches of the regular expression. -This can be called with 2 or 3 arguments. When called with 2 arguments, the `n` argument (number of matches) will be set to `-1`, causing all matches to be returned. +FindAll can be called with 2 or 3 arguments. When called with 2 arguments, the `n` argument (number of matches) is set to `-1`, causing all matches to be returned. This function provides the same behavior as Go's [`regexp.FindAllString`](https://golang.org/pkg/regexp/#Regexp.FindAllString) function. @@ -1324,7 +1319,7 @@ This function provides the same behavior as Go's [`regexp.ReplaceAllLiteralStrin Splits `input` into sub-strings, separated by the expression. -This can be called with 2 or 3 arguments. When called with 2 arguments, the `n` argument (number of matches) will be set to `-1`, causing all sub-strings to be returned. +This can be called with 2 or 3 arguments. When called with 2 arguments, the `n` argument (number of matches) is set to `-1`, causing all sub-strings to be returned. This is equivalent to [`strings.SplitN`](#splitn), except that regular expressions are supported. @@ -1378,7 +1373,7 @@ http://example.com:80 ### Indent -Indents a string. If the input string has multiple lines, each line will be indented. +Indents a string. If the input string has multiple lines, each line is indented. This function can be especially useful when adding YAML snippets into other YAML documents, where indentation is important: @@ -1404,7 +1399,7 @@ foo: **Deprecation Notice:** Use [`coll.Sort`](#sort) instead -Returns an alphanumerically-sorted copy of a given string list. +Returns an alphanumerically sorted copy of a given string list. ```go {{ (slice "foo" "bar" "baz") | strings.Sort }} // [bar baz foo] @@ -1477,7 +1472,7 @@ Replaces all occurrences of a given string with another. ### Slug -Creates a a "slug" from a given string - supports Unicode correctly. This wraps the [github.com/gosimple/slug](https://github.com/gosimple/slug) package. See [the github.com/gosimple/slug docs](https://godoc.org/github.com/gosimple/slug) for more information. +Creates a "slug" from a given string - supports Unicode correctly. This wraps the [github.com/gosimple/slug](https://github.com/gosimple/slug) package. See [the github.com/gosimple/slug docs](https://godoc.org/github.com/gosimple/slug) for more information. ```go {{ "Hello, world!" | strings.Slug }} // hello-world @@ -1485,8 +1480,8 @@ Creates a a "slug" from a given string - supports Unicode correctly. This wraps ### shellQuote -Given a string, emits a version of that string that will evaluate to its literal data when expanded by any POSIX-compliant shell. -Given an array or slice, emit a single string which will evaluate to a series of shell words, one per item in that array or slice. +Given a string, emits a version of that string that evaluates to its literal data when expanded by any POSIX-compliant shell. +Given an array or slice, emits a single string which evaluates to a series of shell words, one per item in that array or slice. ```go {{ slice "one word" "foo='bar baz'" | shellQuote }} @@ -1584,7 +1579,7 @@ _Also see [`strings.Abbrev`](#abbrev)._ Converts a sentence to CamelCase, i.e. `The quick brown fox` becomes `TheQuickBrownFox`. -All non-alphanumeric characters are stripped, and the beginnings of words are upper-cased. If the input begins with a lower-case letter, the result will also begin with a lower-case letter. +All non-alphanumeric characters are stripped, and the beginnings of words are upper-cased. If the input begins with a lower-case letter, the result also begin with a lower-case letter. See [CamelCase on Wikipedia](https://en.wikipedia.org/wiki/Camel_case) for more details. @@ -1598,7 +1593,7 @@ See [CamelCase on Wikipedia](https://en.wikipedia.org/wiki/Camel_case) for more Converts a sentence to snake_case, i.e. `The quick brown fox` becomes `The_quick_brown_fox`. -All non-alphanumeric characters are stripped, and spaces are replaced with an underscore (`_`). If the input begins with a lower-case letter, the result will also begin with a lower-case letter. +All non-alphanumeric characters are stripped, and spaces are replaced with an underscore (`_`). If the input begins with a lower-case letter, the result also begin with a lower-case letter. See [Snake Case on Wikipedia](https://en.wikipedia.org/wiki/Snake_case) for more details. @@ -1609,7 +1604,7 @@ See [Snake Case on Wikipedia](https://en.wikipedia.org/wiki/Snake_case) for more ### KebabCase -Converts a sentence to kebab-case, i.e. `The quick brown fox` becomes `The-quick-brown-fox`. All non-alphanumeric characters are stripped, and spaces are replaced with a hyphen (`-`). If the input begins with a lower-case letter, the result will also begin with a lower-case letter. +Converts a sentence to kebab-case, i.e. `The quick brown fox` becomes `The-quick-brown-fox`. All non-alphanumeric characters are stripped, and spaces are replaced with a hyphen (`-`). If the input begins with a lower-case letter, the result also begins with a lower-case letter. See [Kebab Case on Wikipedia](https://en.wikipedia.org/wiki/Kebab_case) for more details. ```go @@ -1748,9 +1743,9 @@ See [the Go `reflect` source code](https://github.com/golang/go/blob/36fcde1676a - `float64` - `slice` - `map` -- `invalid` (a catch-all, usually just `nil` values) +- `invalid` (a catch-all, usually only `nil` values) -In addition, the special kind `number` is accepted by this function, to represent _any_ numeric kind (whether `float32`, `uint8`, or whatever). This is useful when the specific numeric type is unknown. +In addition, the kind `number` is accepted by this function, to represent _any_ numeric kind (whether `float32`, `uint8`, or whatever). This is useful when the specific numeric type is unknown. See also [`test.Kind`](#kind). @@ -1779,7 +1774,7 @@ Got a number: {{ $object }} ### Kind -Report the _kind_ of the given argument. This differs from the _type_ of the argument in specificity; for example, while a slice of strings may have a type of `[]string`, the _kind_ of that slice will simply be `slice`. +Report the _kind_ of the given argument. This differs from the _type_ of the argument in specificity; for example, while a slice of strings may have a type of `[]string`, the _kind_ of that slice is `slice`. If you need to know the precise type of a value, use `printf "%T" $value`. See also [`test.IsKind`](#iskind) @@ -1799,7 +1794,7 @@ This is effectively a short-form of the following template: {{ if conv.ToBool $condition }}{{ $truevalue }}{{ else }}{{ $falsevalue }}{{ end }} ``` -Keep in mind that using an explicit `if`/`else` block is often easier to understand than ternary expressions! +Keep in mind that using an explicit `if`/`else` block is often easier to understand than ternary expressions. ```go {{ ternary "FOO" "BAR" false }} // BAR @@ -1873,7 +1868,7 @@ time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`. ### ParseLocal -Same as [`time.Parse`](#parse), except that in the absence of a time zone indicator, the timestamp wil be parsed in the local timezone. +Same as [`time.Parse`](#parse), except that in the absence of a time zone indicator, the timestamp is parsed in the local timezone. Usage with [`Format`](https://golang.org/pkg/time/#Time.Format): diff --git a/mission-control/Makefile b/mission-control/Makefile index 583804e9..4cab347f 100644 --- a/mission-control/Makefile +++ b/mission-control/Makefile @@ -3,4 +3,6 @@ watch: .PHONY: sync: - git submodule update --init --recursive + cd modules && make -b all + + diff --git a/mission-control/docs/guide/playbooks/concepts/expression.md b/mission-control/docs/guide/playbooks/concepts/expression.md deleted file mode 100644 index 8dcb6dac..00000000 --- a/mission-control/docs/guide/playbooks/concepts/expression.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Expressions -sidebar_custom_props: - icon: hugeicons:code ---- - -Playbook event filters use [Common Expression Language (CEL)](https://github.com/google/cel-go). - -> The Common Expression Language (CEL) is a non-Turing complete language designed for simplicity, speed, safety, and portability. CEL's C-like syntax looks nearly identical to equivalent expressions in C++, Go, Java, and TypeScript. - -**Examples:** - -```yaml title="notify-with-filter.yaml" ---- -apiVersion: mission-control.flanksource.com/v1 -kind: Playbook -metadata: - name: notify-with-filter -spec: - on: - config: - - event: created - configs: - - type: Kubernetes::Pod - actions: - - name: Send notification - exec: - script: notify-send "{{.config.name}} was created" - - name: Bad script to create a failing action - exec: - script: non-existing-command - - name: Send all success notification - if: success() # this filter practically skips this action as the second action above always fails - exec: - script: notify-send "Everything went successfully" - - name: Send notification regardless - if: always() - exec: - script: notify-send "a config was created" -``` - -## Conditionally running actions - -Playbook actions can be selectively executed based on CEL expressions. These expressions must either return - -- a boolean value (`true` indicating run the action & skip the action otherwise) -- or a special function among the ones listed below - -| Function | Description | -| ----------- | ----------------------------------------------------------- | -| `always()` | run no matter what; even if the playbook is cancelled/fails | -| `failure()` | run if any of the previous actions failed | -| `skip()` | skip running this action | -| `success()` | run only if all previous actions succeeded (default) | -| `timeout()` | run only if any of the previous actions timed out | - -**Examples** - -- `if: config.deleted_at ? true: false` -- `if: always()` - -## Context - -Expressions have access to the following variables and functions - -| Field | Description | Schema | -| ------------- | ---------------------------------------- | --------------------------------------------- | -| `.config` | Config passed to the playbook | [`ConfigItem`](/reference/config-db) | -| `.component` | Component passed to the playbook | [`Component`](/reference/topology/components) | -| `.check` | Canary Check passed to the playbook | [`Check`](/reference/canary-checker/check) | -| `.params` | User provided parameters to the playbook | `map[string]string` | -| `.user.name` | Name of the user who invoked the action | `string` | -| `.user.email` | Email of the user who invoked the action | `string` | diff --git a/mission-control/docs/guide/playbooks/concepts/expression.mdx b/mission-control/docs/guide/playbooks/concepts/expression.mdx new file mode 100644 index 00000000..1609b808 --- /dev/null +++ b/mission-control/docs/guide/playbooks/concepts/expression.mdx @@ -0,0 +1,108 @@ +--- +title: Expressions +sidebar_custom_props: + icon: hugeicons:code +--- + +Playbook event filters use [Common Expression Language (CEL)](https://github.com/google/cel-go). + +> The Common Expression Language (CEL) is a non-Turing complete language designed for simplicity, speed, safety, and portability. CEL's C-like syntax is similar to expressions in C++, Go, Java, and TypeScript. + +**Examples:** + +```yaml title="notify-with-filter.yaml" +--- +apiVersion: mission-control.flanksource.com/v1 +kind: Playbook +metadata: + name: notify-with-filter +spec: + on: + config: + - event: created + configs: + - type: Kubernetes::Pod + actions: + - name: Send notification + exec: + script: notify-send "{{.config.name}} was created" + - name: Bad script to create a failing action + exec: + script: non-existing-command + - name: Send all success notification + if: success() # this filter practically skips this action as the second action above always fails + exec: + script: notify-send "Everything went successfully" + - name: Send notification regardless + if: always() + exec: + script: notify-send "a config was created" +``` + +## Conditionally running actions + +Playbook actions can be conditionally executed using CEL expressions. These expressions must return a `bool` value (return `false` to skip the action). + +Expressions support the following functions in addition to the standard CEL functions. + +| Function | Description | +| ----------- | ----------------------------------------------------------- | +| `always()` | Execute regardless of playbook state (cancelled/failed) | +| `failure()` | Execute if any previous actions failed | +| `skip()` | Skip execution of this action | +| `success()` | Execute only if all previous actions succeeded (default) | +| `timeout()` | Execute only if any previous actions timed out | + + +**Examples** + +- `if: config.deleted_at ? true: false` +- `if: always()` + +## Context + +Expressions have access to the following variables and functions: + +| Field | Description | Schema | +| --- | --- | --- | +| `config` | Configuration object passed to the playbook | [`ConfigItem`](/reference/config-db) | +| `component` | Component object passed to the playbook | [`Component`](/reference/topology/components) | +| `check` | Canary Check object passed to the playbook | [`Check`](/reference/canary-checker/check) | +| `params` | User-provided parameters for the playbook | `map[string]string` | +| `user.id` | Unique identifier of the user who triggered the action | `string` | +| `user.name` | Full name of the user who triggered the action | `string` | +| `user.email` | Email address of the user who triggered the action | `string` | +| `action.name` | Name of the current action | `string` | +| `action.status` | Current status of the action (`scheduled`, `running`, `succeeded`, `failed`, `skipped`, or `cancelled`) | `string` | +| `action.scheduled_time` | Timestamp when the action was scheduled | `string` | +| `action.start_time` | Timestamp when the action execution began | `string` | + +For playbooks triggered via webhooks, the following additional fields are available: + diff --git a/mission-control/docs/integrations/azure.mdx b/mission-control/docs/integrations/azure.mdx index a8b2b84e..c485937c 100644 --- a/mission-control/docs/integrations/azure.mdx +++ b/mission-control/docs/integrations/azure.mdx @@ -22,7 +22,7 @@ To enable the Kubernetes integration you need: - Mission Control [installed](/installation/) - [kubectl](/installation/saas/kubectl) access to the Mission Control instance -- Azure client credentials or Azure Workload Identity configured for the `config-db` service +- Azure client credentials or Azure Workload Identity configured for the `config-db` service. ::: diff --git a/mission-control/docs/integrations/flux/topology.md b/mission-control/docs/integrations/flux/topology.md index 37e0a79a..4cc8924a 100644 --- a/mission-control/docs/integrations/flux/topology.md +++ b/mission-control/docs/integrations/flux/topology.md @@ -23,6 +23,7 @@ The Flux topology provides a comprehensive view of your Flux-based GitOps infras - Associated pod relationships 4. **Repositories**: Monitors Helm, OCI and Git repositories: + - Helm repositories status and health - Git repository connections - Sync states @@ -44,7 +45,6 @@ To enable the Flux Topology you need - Mission Control [installed](/installation/) - [kubectl](/installation/saas/kubectl) access to the Mission Control instance -- A [kubernetes](/guide/config-db/scrapers/kubernetes/config) scraper already installed. ::: 1. Install the [mission-control-flux](https://artifacthub.io/packages/helm/flanksource/mission-control-flux) chart diff --git a/modules/Makefile b/modules/Makefile new file mode 100644 index 00000000..8b74fc3f --- /dev/null +++ b/modules/Makefile @@ -0,0 +1,14 @@ +.PHONY: all +all: sync manifests + +.PHONY: sync +sync: + git submodule update --remote --merge && git submodule sync + + +.PHONY: manifests +manifests: + rm -rf rendered-manifests + ./make.sh mission-control-registry/charts/playbooks-ai "--set slack.connection=connection://mission-control/slack --set global.llm_connection=connection://mission-control/anthropic" + ./make.sh mission-control-registry/charts/playbooks-kubernetes + ./make.sh mission-control-registry/charts/playbooks-flux "--set git.connection=connection://mission-control/github" diff --git a/modules/make.sh b/modules/make.sh new file mode 100755 index 00000000..e8010ac6 --- /dev/null +++ b/modules/make.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -euo pipefail + +# Check if chart name is provided +if [ $# -lt 1 ]; then + echo "Usage: $0 [helm-args]" + echo "Example: $0 ./charts/my-chart --namespace default" + exit 1 +fi + +CHART_NAME=$1 +shift +HELM_ARGS=$@ +OUTPUT_DIR="generated/playbooks" + + +# Create output directory +mkdir -p "$OUTPUT_DIR" + +echo "Rendering Helm chart: $CHART_NAME" +echo "Output directory: $OUTPUT_DIR" + +# Use helm template to render the chart and pipe to yq +helm template "$CHART_NAME" $HELM_ARGS > rendered.yaml + + +for playbook in $(yq e 'select(.kind =="Playbook") | .metadata.name ' -o json -r rendered.yaml); do + FILENAME="$OUTPUT_DIR/${playbook}.yaml" + CONTENT=$(yq e "select(.metadata.name == \"$playbook\")" rendered.yaml) + echo "$CONTENT" > $FILENAME +done diff --git a/styles/ignore/words-with-suggestions.txt b/styles/ignore/words-with-suggestions.txt index ecf51349..d36aa161 100644 --- a/styles/ignore/words-with-suggestions.txt +++ b/styles/ignore/words-with-suggestions.txt @@ -2,6 +2,47 @@ actionPrefix agent_id aggregatorName AIOps +eks +gke +aks +datasource +fblog +Temurin +dev + + +created_at + +deleted_at +updated_at +minikube +config_changes +config_summary +Temurin +fblog +valueFrom +podAnnotations +pingMode +grafanaDashboards +dockerSocket +postgrest +pprof +canaryNamespace +canarySelector +containerdSocket +clusterName +change_type +JMESPath +routable +matchQuery +last_runtime +repeatInterval +repeatGroup +groupBy +const +icon_url +argo +clusterName alarmPrefix alertmanager Alertmanager From 5f320f23330a50d41ac9060deb4233204aa9e75c Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Mon, 17 Mar 2025 17:07:44 +0200 Subject: [PATCH 09/16] chore: fix build --- modules/.gitignore | 1 + modules/Makefile | 16 +++++++++++++++- modules/make.sh | 6 ++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/.gitignore b/modules/.gitignore index e5420ac2..5ebf6518 100644 --- a/modules/.gitignore +++ b/modules/.gitignore @@ -1,2 +1,3 @@ rendered.yaml generated/**/* +.bin/ diff --git a/modules/Makefile b/modules/Makefile index 8b74fc3f..309768fd 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -1,3 +1,9 @@ + +OS ?= $(shell uname -s | tr '[:upper:]' '[:lower:]') +ARCH ?= $(shell uname -m | sed 's/x86_64/amd64/') + + + .PHONY: all all: sync manifests @@ -7,8 +13,16 @@ sync: .PHONY: manifests -manifests: +manifests: .bin/helm rm -rf rendered-manifests ./make.sh mission-control-registry/charts/playbooks-ai "--set slack.connection=connection://mission-control/slack --set global.llm_connection=connection://mission-control/anthropic" ./make.sh mission-control-registry/charts/playbooks-kubernetes ./make.sh mission-control-registry/charts/playbooks-flux "--set git.connection=connection://mission-control/github" + + +.bin: + mkdir -p .bin + +.bin/helm: .bin + wget -nv https://get.helm.sh/helm-v3.17.2-$(OS)-$(ARCH).tar.gz -O .bin/helm.tar.gz + tar -xzf .bin/helm.tar.gz -C .bin --strip-components 1 diff --git a/modules/make.sh b/modules/make.sh index e8010ac6..f92ef359 100755 --- a/modules/make.sh +++ b/modules/make.sh @@ -13,6 +13,12 @@ CHART_NAME=$1 shift HELM_ARGS=$@ OUTPUT_DIR="generated/playbooks" +HELM=.bin/helm + +if ! command -v $(HELM) &> /dev/null; then + echo "helm is not installed. Run make .bin/helm" + exit 1 +fi # Create output directory From 9437922015906b9873171c5cc5cf9a515d7684df Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Mon, 17 Mar 2025 17:13:42 +0200 Subject: [PATCH 10/16] chore: fix linting --- modules/make.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/make.sh b/modules/make.sh index f92ef359..31be2ed7 100755 --- a/modules/make.sh +++ b/modules/make.sh @@ -15,12 +15,6 @@ HELM_ARGS=$@ OUTPUT_DIR="generated/playbooks" HELM=.bin/helm -if ! command -v $(HELM) &> /dev/null; then - echo "helm is not installed. Run make .bin/helm" - exit 1 -fi - - # Create output directory mkdir -p "$OUTPUT_DIR" @@ -28,7 +22,7 @@ echo "Rendering Helm chart: $CHART_NAME" echo "Output directory: $OUTPUT_DIR" # Use helm template to render the chart and pipe to yq -helm template "$CHART_NAME" $HELM_ARGS > rendered.yaml +$HELM template "$CHART_NAME" $HELM_ARGS > rendered.yaml for playbook in $(yq e 'select(.kind =="Playbook") | .metadata.name ' -o json -r rendered.yaml); do From c333cb72e1602da1ec46e6ec67ab61c7388e4ed3 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 14:27:20 +0300 Subject: [PATCH 11/16] chore: vale + icon fixes --- canary-checker/docs/comparisons/index.md | 2 +- .../docs/concepts/expressions/index.md | 2 +- canary-checker/docs/concepts/metrics.mdx | 2 +- .../docs/concepts/secret-management.md | 2 +- canary-checker/docs/examples/index.mdx | 2 +- canary-checker/docs/partials/_domain.mdx | 4 +- .../docs/reference/1-kubernetes.mdx | 12 +- canary-checker/docs/troubleshooting.mdx | 2 +- canary-checker/docs/types.md | 2 +- common/snippets/_resource-selector.md | 144 ++++++++++++ common/snippets/_types.md | 7 + common/src/components/Helm.jsx | 114 ++++++---- common/src/components/Icon.jsx | 4 +- common/src/theme/DocCardList/index.js | 5 +- mission-control/blog/control-plane-testing | 1 - .../control-plane-testing/basic-canary.yaml | 47 ++++ .../blog/control-plane-testing/basic-run.svg | 31 +++ .../canary-checker.properties} | 0 .../control-plane-testing/custom-canary.yaml | 61 ++++++ .../blog/control-plane-testing/flux.yaml | 38 ++++ .../blog/control-plane-testing/index.mdx | 207 ++++++++++++++++++ .../blog/control-plane-testing/template.yaml | 24 ++ .../docs/guide/config-db/scrapers/aws.md | 2 +- .../guide/config-db/scrapers/kubernetes.mdx | 59 +++-- .../docs/guide/config-db/tutorials/index.mdx | 2 +- .../docs/guide/permissions/index.mdx | 8 +- .../docs/guide/playbooks/actions/gitops.mdx | 64 ++---- .../docs/guide/playbooks/examples/index.mdx | 2 +- .../docs/guide/topology/examples/index.mdx | 2 + .../docs/guide/topology/lookups/index.mdx | 2 + .../docs/installation/_aws_iam.mdx | 2 +- .../docs/installation/local-testing.md | 12 +- .../docs/installation/saas/agent.mdx | 77 ++++--- .../docs/installation/saas/eks.mdx | 17 +- .../installation/saas/getting-started.mdx | 27 +-- .../docs/installation/self-hosted/database.md | 2 + .../docs/installation/self-hosted/eks.mdx | 19 +- .../self-hosted/getting-started.mdx | 126 ++++------- .../docs/installation/self-hosted/oidc.mdx | 10 +- .../docs/installation/self-hosted/smtp.mdx | 36 +++ .../docs/integrations/aws/getting-started.md | 2 +- .../docs/reference/image-variants.md | 2 + .../docs/reference/permissions/index.mdx | 2 + .../docs/reference/resource-selector.md | 145 +----------- mission-control/docs/reference/types.md | 84 +------ mission-control/package.json | 2 +- mission-control/sidebars.js | 44 +++- mission-control/static/img/add-agent.png | Bin 0 -> 145031 bytes styles/ignore/words-with-suggestions.txt | 4 + 49 files changed, 938 insertions(+), 529 deletions(-) create mode 100644 common/snippets/_resource-selector.md delete mode 120000 mission-control/blog/control-plane-testing create mode 100644 mission-control/blog/control-plane-testing/basic-canary.yaml create mode 100644 mission-control/blog/control-plane-testing/basic-run.svg rename mission-control/{docs/installation/saas/fully-hosted.mdx => blog/control-plane-testing/canary-checker.properties} (100%) create mode 100644 mission-control/blog/control-plane-testing/custom-canary.yaml create mode 100644 mission-control/blog/control-plane-testing/flux.yaml create mode 100644 mission-control/blog/control-plane-testing/index.mdx create mode 100644 mission-control/blog/control-plane-testing/template.yaml create mode 100644 mission-control/docs/installation/self-hosted/smtp.mdx mode change 100644 => 120000 mission-control/docs/reference/resource-selector.md mode change 100644 => 120000 mission-control/docs/reference/types.md create mode 100644 mission-control/static/img/add-agent.png diff --git a/canary-checker/docs/comparisons/index.md b/canary-checker/docs/comparisons/index.md index b23e0446..0db49073 100644 --- a/canary-checker/docs/comparisons/index.md +++ b/canary-checker/docs/comparisons/index.md @@ -2,5 +2,5 @@ title: Comparisons sidebar_position: 4 sidebar_custom_props: - icon: material-symbols-light:text-compare-outline + icon: compare --- diff --git a/canary-checker/docs/concepts/expressions/index.md b/canary-checker/docs/concepts/expressions/index.md index 585e2ca1..b2a9281d 100644 --- a/canary-checker/docs/concepts/expressions/index.md +++ b/canary-checker/docs/concepts/expressions/index.md @@ -1,7 +1,7 @@ --- title: Expressions sidebar_custom_props: - icon: hugeicons:code + icon: code --- canary-checker can be extended using expressions in 3 ways: diff --git a/canary-checker/docs/concepts/metrics.mdx b/canary-checker/docs/concepts/metrics.mdx index b0ada568..5d5f2be1 100644 --- a/canary-checker/docs/concepts/metrics.mdx +++ b/canary-checker/docs/concepts/metrics.mdx @@ -1,7 +1,7 @@ --- title: Metrics sidebar_custom_props: - icon: clarity:dashboard-line + icon: dashboard-line --- diff --git a/canary-checker/docs/concepts/secret-management.md b/canary-checker/docs/concepts/secret-management.md index 971cf477..8b2c8812 100644 --- a/canary-checker/docs/concepts/secret-management.md +++ b/canary-checker/docs/concepts/secret-management.md @@ -1,7 +1,7 @@ --- title: Env Vars sidebar_custom_props: - icon: stash:search-box-light + icon: shield-lock sidebar_position: 1 --- diff --git a/canary-checker/docs/examples/index.mdx b/canary-checker/docs/examples/index.mdx index 5a67659d..1d5f201b 100644 --- a/canary-checker/docs/examples/index.mdx +++ b/canary-checker/docs/examples/index.mdx @@ -3,7 +3,7 @@ title: Examples sidebar_position: 3 hide_sidebar: true sidebar_custom_props: - icon: stash:graduation-cap-light + icon: learning --- import DocCardList from '@theme/DocCardList'; diff --git a/canary-checker/docs/partials/_domain.mdx b/canary-checker/docs/partials/_domain.mdx index ea95b278..4c8aeaa4 100644 --- a/canary-checker/docs/partials/_domain.mdx +++ b/canary-checker/docs/partials/_domain.mdx @@ -1,4 +1,4 @@ Choose a routable `DOMAIN` for Mission Control - > See [Ingress](/reference/helm/mission-control#ingress) for more options on configuring the ingress including generating certs with cert-manager - >

See [Local Testing](../local-testing) for testing using a kind or minikube without a routable domain

+ > See [Ingress](/installation/self-hosted/ingress) for more options on configuring the ingress including generating certs with cert-manager + >

See [Local Testing](/installation/local-testing) for testing using a kind or minikube without a routable domain

diff --git a/canary-checker/docs/reference/1-kubernetes.mdx b/canary-checker/docs/reference/1-kubernetes.mdx index fec51199..6720d15d 100644 --- a/canary-checker/docs/reference/1-kubernetes.mdx +++ b/canary-checker/docs/reference/1-kubernetes.mdx @@ -4,6 +4,7 @@ sidebar_position: 0 sidebar_custom_props: icon: k8s --- +import ReactMarkdown from 'react-markdown'; # Kubernetes @@ -15,9 +16,14 @@ The Kubernetes check performs requests on Kubernetes resources such as Pods to g + Failing checks are placed in this namespace, useful if you have shared namespaces. + + **NOTE:** this does not change the namespace of the resources being queried + }, {field: "ignore", description: "Ignore the specified resources from the fetched resources. Can be a glob pattern.", scheme: '[]glob'}, {field: "healthy", description: "Fail the check if any resources are unhealthy", scheme: 'bool'}, {field: "ready", description: "Fail the check if any resources are not ready", scheme: 'bool'}, diff --git a/canary-checker/docs/troubleshooting.mdx b/canary-checker/docs/troubleshooting.mdx index 6e09ea46..295ce8ba 100644 --- a/canary-checker/docs/troubleshooting.mdx +++ b/canary-checker/docs/troubleshooting.mdx @@ -1,7 +1,7 @@ --- title: Troubleshooting sidebar_custom_props: - icon: material-symbols-light:troubleshoot + icon: troubleshoot --- import Install from '@site/docs/snippets/_install.mdx' diff --git a/canary-checker/docs/types.md b/canary-checker/docs/types.md index fef6efd7..7cfaa76d 100644 --- a/canary-checker/docs/types.md +++ b/canary-checker/docs/types.md @@ -3,7 +3,7 @@ hide_title: true title: Common Types sidebar_position: 3 sidebar_custom_props: - icon: fluent:library-16-regular + icon: library --- import Types from '@site/docs/snippets/\_types.md' diff --git a/common/snippets/_resource-selector.md b/common/snippets/_resource-selector.md new file mode 100644 index 00000000..e3536c00 --- /dev/null +++ b/common/snippets/_resource-selector.md @@ -0,0 +1,144 @@ +--- +title: Resource Selectors +sidebar_position: 2 +sidebar_custom_props: + icon: stash:search-box-light +--- + +# Resource Selectors + +Resource Selectors are used in multiple places including: + +- Attaching components to a topology +- Creating relationships between configs and configs/components +- Finding resources to run health checks or playbooks on + +| Field | Description | Scheme | Required | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------- | +| `id` | ID of the component | `string` | No | +| `name` | Name of the component/config | `string` | No | +| `namespace` | Select resources in this namespace only, if empty find resources in all namespaces | `string` | No | +| `types` | Match any of the types specified | `[]string` | No | +| `statuses` | Match any of the statuses specified | `[]string` | No | +| `labelSelector` | Kubernetes Style Label Selector | [LabelSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) | No | +| `fieldSelector` | Kubernetes Style Field Selector Property fields of the component in kubernetes format (or database columns: owner, topology_id, parent_id) | [FieldSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/) | No | +| `agent` | Select resources created on this agent, Defaults to `local` | `uuid`, `{name}`, `local` or `all` | No | +| `cache` | Cache settings to use for the results, expensive selectors or selectors that are used often should be cached for longer periods. Defaults to `max-age=10m` | `no-cache`, `no-store` or `max-age={duration}` | No | +| `search` | Search for resources via key value pairs using parsing expression grammar | `#search` | No | + +## Search + +The query syntax is `field1=value1 field2>value2 field3=value3* field4=*value4`. `*` is for prefix and suffix matching. + +Supported operators: + +| Operator | Syntax | Types | +| -------- | -------------------------------- | --------------------- | +| `=` | `field=value` | `string` `int` `json` | +| `!=` | `field!=value` | `string` `int` `json` | +| `*` | `field=*value` or `field=value*` | `string` `int` | +| `>` `<` | `field>value` or `fieldnow-24h + + - name: All components updated between a specific interval + selectors: + - search: updated_at>2024-10-10 updated_at<2024-10-17 + + - name: Component with name httpbin-service + # Not giving any key will do a name lookup (ie name=httpbin-service) + selectors: + - search: httpbin-service + + - name: Components with label cluster + # JSON lookups are also supported + selectors: + - search: labels.cluster=prod + + - name: Link configs which have logistics-api image + configs: + - search: config.spec.template.spec.containers[0].name=docker.io/example/logistics-api:latest +``` diff --git a/common/snippets/_types.md b/common/snippets/_types.md index d59611a5..4b352b76 100644 --- a/common/snippets/_types.md +++ b/common/snippets/_types.md @@ -1,3 +1,10 @@ +--- +hide_title: true +title: Common Types +sidebar_position: 2 +sidebar_custom_props: + icon: library +--- # Common Types This document provides a reference for common types used in the configuration and operation of the system. diff --git a/common/src/components/Helm.jsx b/common/src/components/Helm.jsx index d19a0871..1e46a895 100644 --- a/common/src/components/Helm.jsx +++ b/common/src/components/Helm.jsx @@ -55,6 +55,7 @@ export default function Helm({ repoName = "flanksource", chart = "mission-control", namespace = "mission-control", + mode = "tabs", createNamespace = true, createRepo = true, wait = true, @@ -70,6 +71,48 @@ export default function Helm({ const [cli, setCli] = useState(generateCli( repo, repoName, chart, namespace, createNamespace, createRepo, wait, state, valueFile, args)) + + var flux = + {createNamespace && `apiVersion: v1 +kind: Namespace +metadata: +name: ${namespace} +--- +` || ""} + {createRepo && `apiVersion: source.toolkit.fluxcd.io/v1 +kind: HelmRepository +metadata: +name: ${repoName} +namespace: ${namespace} +spec: +interval: 5m0s +url: ${repo} +--- +` || ""} + {`apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: +name: ${chart} +namespace: ${namespace} +spec: +chart: +spec: +chart: ${chart} +sourceRef: + kind: HelmRepository + name: ${repoName} + namespace: ${namespace} +interval: 1m +`} + {valueFile || values && "values:\n"} + {valueFile && valueFile.replace(/^/gm, ' ')} + {values && Object.keys(values).map((k) => { + return ` ${k}: ${values[k]}\n` + }).join("")} + ; + + + return <> {/*
@@ -123,63 +166,40 @@ export default function Helm({ })}
*/} - - - - {cli} - - + {mode == 'tabs' && + + + + {cli} + - - - {createNamespace && `apiVersion: v1 -kind: Namespace -metadata: - name: ${namespace} ---- -` || ""} - {createRepo && `apiVersion: source.toolkit.fluxcd.io/v1 -kind: HelmRepository -metadata: - name: ${repoName} - namespace: ${namespace} -spec: - interval: 5m0s - url: ${repo} ---- -` || ""} - {`apiVersion: helm.toolkit.fluxcd.io/v2 -kind: HelmRelease -metadata: - name: ${chart} - namespace: ${namespace} -spec: - chart: - spec: - chart: ${chart} - sourceRef: - kind: HelmRepository - name: ${repoName} - namespace: ${namespace} - interval: 1m - `} - {valueFile || values && "values:\n"} - {valueFile && valueFile.replace(/^/gm, ' ')} - {values && Object.keys(values).map((k) => { - return ` ${k}: ${values[k]}\n` - }).join("")} - - - + + + + + + {flux} + + + } + + {mode == "helm" && + + {cli} + + } + + {mode == "flux" && flux} {schema && } {!schema && (chart == "mission-control" || chart == "mission-control-agent") && + <>See < Link to={`/reference/helm/${chart}`}>values.yaml } diff --git a/common/src/components/Icon.jsx b/common/src/components/Icon.jsx index 25750d50..03bd17df 100644 --- a/common/src/components/Icon.jsx +++ b/common/src/components/Icon.jsx @@ -32,8 +32,8 @@ export default function Icon({ name, height = 22, className, url, children, ...p name ="carbon:lightning" } - if (name =="tutorial") { - name = "stash:graduation-cap-light" + if (name == "tutorial") { + name = "learning" } diff --git a/common/src/theme/DocCardList/index.js b/common/src/theme/DocCardList/index.js index b5aef3f6..25b68d26 100644 --- a/common/src/theme/DocCardList/index.js +++ b/common/src/theme/DocCardList/index.js @@ -22,11 +22,14 @@ export default function DocCardList(props) { return } - const filteredItems = filterDocCardListItems(items); + const filteredItems = filterDocCardListItems(items).filter(i => !(i.customProps && i.customProps.category)); return ( <> {props.items.map((item, index) => { + if (item.customProps && item.customProps.category) { + return null; + } return }) } diff --git a/mission-control/blog/control-plane-testing b/mission-control/blog/control-plane-testing deleted file mode 120000 index 221ee191..00000000 --- a/mission-control/blog/control-plane-testing +++ /dev/null @@ -1 +0,0 @@ -../../canary-checker/docs/tutorials/control-plane-testing \ No newline at end of file diff --git a/mission-control/blog/control-plane-testing/basic-canary.yaml b/mission-control/blog/control-plane-testing/basic-canary.yaml new file mode 100644 index 00000000..6ced146b --- /dev/null +++ b/mission-control/blog/control-plane-testing/basic-canary.yaml @@ -0,0 +1,47 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: control-plane-tests + namespace: control-plane-tests +spec: + schedule: "@every 1h" + kubernetesResource: + - name: helm-release-postgres-check + description: "Deploy postgresql via HelmRelease" + waitFor: + timeout: 1m + display: + template: |+ + Helm release created: {{ .health | toYAML }} + staticResources: + - apiVersion: source.toolkit.fluxcd.io/v1 + kind: HelmRepository + metadata: + name: bitnami + spec: + type: oci + interval: 1h + url: oci://registry-1.docker.io/bitnamicharts + resources: + - apiVersion: helm.toolkit.fluxcd.io/v2 + kind: HelmRelease + metadata: + name: postgresql + spec: + chart: + spec: + chart: postgresql + sourceRef: + kind: HelmRepository + name: bitnami + interval: 5m + values: + auth: + username: admin + password: qwerty123 + database: exampledb + primary: + persistence: + enabled: true + size: 8Gi + diff --git a/mission-control/blog/control-plane-testing/basic-run.svg b/mission-control/blog/control-plane-testing/basic-run.svg new file mode 100644 index 00000000..b76370f4 --- /dev/null +++ b/mission-control/blog/control-plane-testing/basic-run.svg @@ -0,0 +1,31 @@ + + + +16:25:05.279 WRN /Users/moshe/go/src/github.com/flanksource/canary-checker/fixtures/minimal/canary-checker.properties does not exist +16:25:05.279 WRN --db not configured +16:25:05.281 INF (k8s) Using kubeconfig /Users/moshe/.kube/config +16:25:05.289 INF Checking http_pass.yaml, 1 checks found +16:25:06.711 INF (http-pass.http-deprecated-endpoint) PASS duration=279 +16:25:06.711 INF (http-pass.http-minimal-check) PASS duration=286 +16:25:06.711 INF (http-pass.http-param-tests) PASS duration=275 +16:25:06.711 INF (http-pass.http-expr-tests) PASS duration=284 code=200, age=1883h41m33.579006s +16:25:06.711 INF (http-pass.http-headers) PASS duration=269 +16:25:06.711 INF 5 passed, 0 failed in 1s + diff --git a/mission-control/docs/installation/saas/fully-hosted.mdx b/mission-control/blog/control-plane-testing/canary-checker.properties similarity index 100% rename from mission-control/docs/installation/saas/fully-hosted.mdx rename to mission-control/blog/control-plane-testing/canary-checker.properties diff --git a/mission-control/blog/control-plane-testing/custom-canary.yaml b/mission-control/blog/control-plane-testing/custom-canary.yaml new file mode 100644 index 00000000..30f8fdb8 --- /dev/null +++ b/mission-control/blog/control-plane-testing/custom-canary.yaml @@ -0,0 +1,61 @@ + +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: control-plane-tests + namespace: control-plane-tests +spec: + schedule: "@every 1m" + kubernetesResource: + - name: helm-release-postgres-check + namespace: default + description: "Deploy postgresql via HelmRelease" + staticResources: + - apiVersion: source.toolkit.fluxcd.io/v1 + kind: HelmRepository + metadata: + name: bitnami + spec: + type: oci + interval: 1h + url: oci://registry-1.docker.io/bitnamicharts + resources: + - apiVersion: helm.toolkit.fluxcd.io/v2 + kind: HelmRelease + metadata: + name: postgresql + namespace: default + spec: + chart: + spec: + chart: postgresql + sourceRef: + kind: HelmRepository + name: bitnami + namespace: control-plane-tests + interval: 5m + values: + auth: + username: admin + password: qwerty123 + database: exampledb + primary: + persistence: + enabled: true + size: 8Gi + checks: + - postgres: + - name: postgres schemas check + url: "postgres://$(username):$(password)@postgresql.default.svc:5432/exampledb?sslmode=disable" + username: + value: admin + password: + value: qwerty123 + # Since we just want to check if database is responding, + # a SELECT 1 query should suffice + query: SELECT 1 + + checkRetries: + delay: 15s + interval: 10s + timeout: 5m diff --git a/mission-control/blog/control-plane-testing/flux.yaml b/mission-control/blog/control-plane-testing/flux.yaml new file mode 100644 index 00000000..0841c275 --- /dev/null +++ b/mission-control/blog/control-plane-testing/flux.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: control-plane-tests +--- +apiVersion: source.toolkit.fluxcd.io/v1 +kind: HelmRepository +metadata: + name: bitnami + namespace: control-plane-tests +spec: + type: oci + interval: 1h + url: oci://registry-1.docker.io/bitnamicharts +--- +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: postgresql +spec: + chart: + spec: + chart: postgresql + sourceRef: + kind: HelmRepository + name: bitnami + namespace: control-plane-tests + version: "*" + interval: 1h + values: + auth: + database: my_database + password: qwerty123 + username: admin + primary: + persistence: + enabled: true + size: 8Gi diff --git a/mission-control/blog/control-plane-testing/index.mdx b/mission-control/blog/control-plane-testing/index.mdx new file mode 100644 index 00000000..e3d17bd0 --- /dev/null +++ b/mission-control/blog/control-plane-testing/index.mdx @@ -0,0 +1,207 @@ +--- +title: Synthetic Infrastructure Testing With Canary Checker and Flux +description: Walkthrough of sythentic Infrastructure Testing for Kubernetes +slug: infrastructure-testing-with-canary-checker-and-flux +authors: [moshe,yash] +tags: [synthetic testing, flux, helm, canary-checker] +hide_table_of_contents: false +--- + + +import Install from '@site/docs/snippets/_install.mdx' + +# Control Plane Testing + + +Deploying applications with Kubernetes is easier than ever, yet developers face increasing complexity. + +Kubernetes simplifies deployment, but with it comes a labyrinth of potential issues. From resource conflicts to version incompatibilities, a failure in one component can cascade. Understanding application health through metric models like **RED** (Requests, Errors, Duration) and **USE** (Utilization, Saturation, Errors) isn't always enough. Latent errors might only surface during deployment or scaling. + + + +For example, consider deploying a stateful PostgreSQL database via Flux on AWS. Problems could arise, including: + + + + + +* Tools like `helm template` and `helm lint` can validate chart rendering and syntax, but they don't guarantee compatibility with a specific Kubernetes version or the operators running on the cluster. +* `ct install` on a `kind` or simulated cluster can verify API compatibility and ensure all resources and operators work correctly in ideal conditions. +* Deploying to a staging environment can help catch issues before they reach production, but this approach doesn't detect capacity, performance or latent errors that only surface under load. + + +Control plane testing can help improve resilience by continuously redeploying workloads, ensuring there is enough capacity within the system and that all operators and external dependencies are working correctly. + +Canary checker is a kubernetes-native test platform that continuously runs tests using 30+ check styles against your workloads. In this tutorial, we use it to continuously verify the ability to provision and run stateful workloads in a cluster. + + + +The [`kubernetesResource`](/guide/canary-checker/reference/kubernetes-resource) check creates kubernetes resources based on the provided manifests & perform checks on them, it has 5 lifecycle stages: + +## Lifecycle + +

+ +* **Apply Static Resources** + Applies all `staticResources` that are required for all tests to pass e.g. namespaces, secrets, etc.. +* **Apply Resources** + Applies all the workloads defined in `resources` +* **Wait** - Using the parameters defined in `waitFor`, wait for the resources to be ready using [is-healthy](https://github.com/flanksource/is-healthy) +* **Run Checks** - Run all the `checks` against the workloads +* **Cleanup** - Delete all the `resources` that were created during the test. + +

+ +## Tutorial + +### Prerequisites + + +:::info Prerequisites +To follow this tutorial, you need: + +- A Kubernetes cluster +- [FluxCD](https://fluxcd.io/) installed + +::: + + +1. Define the workload under test + + Before you can create a canary you should start with a working example of a resource, in this example we use a `HelmRelease` to deploy a postgres database. + + ```yaml file=flux.yaml + ``` + + Once you have verified the helm release is working on its own, you can then begin building the control plane test using `canary-checker`. + + + +1. Install the `canary-checker` binary + + + :::info Helm Installation + This tutorial uses the CLI for faster feedback, in production we recommend installing `canary-checker` as an operator using the [helm chart](https://canarychecker.io/getting-started) or as part of the full Mission Control [platform](/installation/self-hosted/getting-started). +1. Next create a `Canary` CustomResourceDefinition (CRD) using the `kubernetesResource` check type, the layout of the canary is as follows: + + ```yaml title=basic-canary.yaml file=template.yaml + ``` +

+ + Using the workload defined in step 1, the check definition is as follows: + + ```yaml title=basic-canary.yaml file=basic-canary.yaml + ``` +

+ +1. Run the test locally using `canary-checker run basic-canary.yaml` +

+ + 18:01:52.745 INF (k8s) Using kubeconfig /Users/moshe/.kube/config + 18:01:52.749 INF Checking basic-canary.yaml, 1 checks found + 18:01:55.209 INF (control-plane-tests) HelmRelease/control-plane-tests/postgresql (created) +kustomized + 18:02:21.072 INF (control-plane-tests.helm-release-postgres-check) PASS duration=28321 Helm release created: + control-plane-tests/HelmRelease/postgresql: + health: healthy + message: Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 + ready: true + status: InstallSucceeded + control-plane-tests/HelmRepository/bitnami: + health: unknown + ready: true + 18:02:21.073 INF 1 passed, 0 failed in 28s + + + +

+

And if you run `kubectl get events` you should see:

+ + + LAST SEEN TYPE REASON OBJECT MESSAGE + 26m Normal ChartPullSucceeded helmchart/control-plane-tests-postgresql pulled 'postgresql' chart with version '16.2.2' + 26m Normal Scheduled pod/postgresql-0 Successfully assigned control-plane-tests/postgresql-0 to ip-10-0-4-167.eu-west-1.compute.internal + 26m Normal Pulled pod/postgresql-0 Container image "docker.io/bitnami/postgresql:17.2.0-debian-12-r0" already present on machine + 26m Normal Created pod/postgresql-0 Created container postgresql + 26m Normal Started pod/postgresql-0 Started container postgresql + 26m Warning Unhealthy pod/postgresql-0 Readiness probe failed: 127.0.0.1:5432 - rejecting connections + 26m Warning Unhealthy pod/postgresql-0 Readiness probe failed: 127.0.0.1:5432 - no response + 26m Normal Killing pod/postgresql-0 Stopping container postgresql + 113s Normal Scheduled pod/postgresql-0 Successfully assigned control-plane-tests/postgresql-0 to ip-10-0-4-167.eu-west-1.compute.internal + 112s Normal Pulled pod/postgresql-0 Container image "docker.io/bitnami/postgresql:17.2.0-debian-12-r0" already present on machine + 112s Normal Created pod/postgresql-0 Created container postgresql + 112s Normal Started pod/postgresql-0 Started container postgresql + 96s Normal Killing pod/postgresql-0 Stopping container postgresql + 26m Normal HelmChartCreated helmrelease/postgresql Created HelmChart/control-plane-tests/control-plane-tests-postgresql with SourceRef 'HelmRepository/control-plane-tests/bitnami' + 26m Normal SuccessfulCreate statefulset/postgresql create Pod postgresql-0 in StatefulSet postgresql successful + 26m Normal InstallSucceeded helmrelease/postgresql Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 + 26m Normal UninstallSucceeded helmrelease/postgresql Helm uninstall succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 + 26m Normal HelmChartDeleted helmrelease/postgresql deleted HelmChart 'control-plane-tests/control-plane-tests-postgresql' + 116s Normal HelmChartCreated helmrelease/postgresql Created HelmChart/control-plane-tests/control-plane-tests-postgresql with SourceRef 'HelmRepository/control-plane-tests/bitnami' + 113s Normal SuccessfulCreate statefulset/postgresql create Pod postgresql-0 in StatefulSet postgresql successful + 101s Normal InstallSucceeded helmrelease/postgresql Helm install succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 + 96s Warning CalculateExpectedPodCountFailed poddisruptionbudget/postgresql Failed to calculate the number of expected pods: found no controllers for pod "postgresql-0" + 96s Normal UninstallSucceeded helmrelease/postgresql Helm uninstall succeeded for release control-plane-tests/postgresql.v1 with chart postgresql@16.2.2 + 95s Normal HelmChartDeleted helmrelease/postgresql deleted HelmChart 'control-plane-tests/control-plane-tests-postgresql' + +2. Add custom check + + By default `kubernetesResource` only checks if the resource is ready. However, you can add custom checks to validate the resource further. + + For example, you can validate the PostgreSQL database is running and accepting connections, with a custom `postgres` check: + + + ```yaml + apiVersion: canaries.flanksource.com/v1 + kind: Canary + #... + spec: + kubernetesResource: + - #... + checks: + - postgres: + - name: postgres schemas check + url: "postgres://$(username):$(password)@postgresql.default.svc:5432/exampledb?sslmode=disable" + username: + value: admin + password: + value: qwerty123 + # Since we just want to check if database is responding, + # a SELECT 1 query should suffice + query: SELECT 1 + ``` + + :::warning Accessing variables + This example uses the `$(username)` and `$(password)` syntax to access the `username` and `password` variables hardcoded in the `checks` section, but in a production setting, reference secrets using [`valueFrom`](/reference/env-var) + ::: + + :::tip Alternatives to custom checks + Instead of using a custom check you can also add a standard helm test pod to your chart or define a canary inside the chart to automatically include health checks for all workloads. + ::: + + +3. The final test looks like: + + + ```yaml file=custom-canary.yaml + ``` + +## Conclusion + +Continuous testing of your control plane is essential for maintaining resilient infrastructure at scale. By implementing continuous testing with tools like Canary Checker, Flux, and Helm, you can: + +- Catch breaking changes early +- Validate infrastructure changes +- Ensure security compliance +- Maintain platform stability +- Reduce incident recovery time + +This proactive approach helps catch issues before they impact production environments and affect your users. + +## References + +- [kubernetesResource](/guide/canary-checker/reference/kubernetes-resource) Canary +- [ helm lint](https://helm.sh/docs/helm/helm_lint/) +- [ helm test](https://helm.sh/docs/helm/helm_test/) +- [ ct install](https://github.com/helm/chart-testing/blob/main/doc/ct_install.md) +- [ Flux HelmRelease](https://fluxcd.io/flux/components/helm/helmreleases/) +- [ Helm Chart Tests](https://helm.sh/docs/topics/chart_tests/) diff --git a/mission-control/blog/control-plane-testing/template.yaml b/mission-control/blog/control-plane-testing/template.yaml new file mode 100644 index 00000000..cb2bb4a2 --- /dev/null +++ b/mission-control/blog/control-plane-testing/template.yaml @@ -0,0 +1,24 @@ +apiVersion: canaries.flanksource.com/v1 +kind: Canary +metadata: + name: control-plane-tests + namespace: control-plane-tests +spec: + # how often to run the test + schedule: "@every 1h" + //highlight-next-line + kubernetesResource: # this is type of canary we are executing, canary-checker has many more + - name: helm-release-postgres-check + waitFor: + # The time to wait for the resources to be ready before considering the test a failure + timeout: 10m + staticResources: + //highlight-next-line + - # A list of resources that should be created once only and re-used across multiple tests + resources: + //highlight-next-line + - # A list of resources to be created every time the check runs + display: + # optional Go text template to display the results of the check + template: |+ + Helm release created: {{ .health | toYAML }} diff --git a/mission-control/docs/guide/config-db/scrapers/aws.md b/mission-control/docs/guide/config-db/scrapers/aws.md index 6ef98ad4..f2a13a4f 100644 --- a/mission-control/docs/guide/config-db/scrapers/aws.md +++ b/mission-control/docs/guide/config-db/scrapers/aws.md @@ -11,7 +11,7 @@ This config type is used to scrape information about your AWS infrastructure. :::tip Registry -The registry has an [AWS](/registry/aws) Helm chart that provides a pre-configured Scraper with some common defaults +The Mission Control Registry includes an [AWS](/integration/aws) Helm chart that provides a pre-configured Scraper with common defaults ::: diff --git a/mission-control/docs/guide/config-db/scrapers/kubernetes.mdx b/mission-control/docs/guide/config-db/scrapers/kubernetes.mdx index 5e6cee50..95ac26ab 100644 --- a/mission-control/docs/guide/config-db/scrapers/kubernetes.mdx +++ b/mission-control/docs/guide/config-db/scrapers/kubernetes.mdx @@ -8,8 +8,7 @@ sidebar_custom_props: # Kubernetes :::tip Helm Chart - -See the [Kubernetes](/integrations/kubernetes/catalog) Helm chart that provides a pre-configured Scraper and Topology with some common defaults. +See the [Kubernetes](/integrations/kubernetes/getting-started) Helm chart that provides a pre-configured Scraper and Topology with some common defaults. ::: The `kubernetes` scraper collects all of the resources and events in a Kubernetes cluster, and then watches for changes. @@ -21,7 +20,7 @@ The `kubernetes` scraper collects all of the resources and events in a Kubernete | Field | Description | Scheme | | ------------ | ---------------------------------------------------------------------------- | -------------------------------------------- | | `logLevel` | Specify the level of logging. | `string` | -| `schedule` | Specify the interval to scrape in cron format. Defaults to every 60 minutes. | `string` | +| `schedule` | Specify the interval to scrape in cron format. Defaults to every 15 minutes. | `string` | | `retention` | Settings for retaining changes, analysis and scraped items | [`Retention`](/guide/config-db/concepts/retention) | | `kubernetes` | Specifies the list of Kubernetes configurations to scrape. | [`[]Kubernetes`](#kubernetes) | @@ -40,18 +39,7 @@ The `kubernetes` scraper collects all of the resources and events in a Kubernete description: 'Include resources only from this namespace', scheme: 'string' }, - { - field: 'useCache', - description: - 'Whether to use cache or not when fetching resources. Default: false', - scheme: 'bool' - }, - { - field: 'allowIncomplete', - description: - "whether to fail scrape if all api resources weren't fetched successfully", - scheme: 'bool' - }, + { field: 'scope', description: @@ -75,12 +63,6 @@ The `kubernetes` scraper collects all of the resources and events in a Kubernete description: 'Resources to be included e.g `status.Phase=Running`', scheme: 'string' }, - { - field: 'maxInflight', - description: - 'Concurrency level when resources are fetched one at a time.`', - scheme: 'int' - }, { field: 'kubeconfig', description: 'Kubeconfig to connect to the cluster', @@ -88,7 +70,7 @@ The `kubernetes` scraper collects all of the resources and events in a Kubernete }, { field: 'watch', - description: 'Kubeconfig to connect to the cluster', + description: 'List of resources to watch for real-time changes', scheme: '[`[]WatchSelector`]()' }, { @@ -111,7 +93,26 @@ The `kubernetes` scraper collects all of the resources and events in a Kubernete ### Event -`Kubernetes::Event` resources are mapped to config changes. Events can be very verbose so they can be excluded or their severity level changed: +`Kubernetes::Event` resources are mapped to config changes. Events can be verbose so they can be excluded or their severity level changed: + + +```yaml +spec: + kubernetes: + - event: + exclusions: + reason: + - SuccessfulCreate + - Created + - DNSConfigForming + severityKeywords: + error: + - failed + - error + warn: + - backoff + - nodeoutofmemory +``` | Field | Description | Scheme | Required | | ------------------ | ------------------------------------------------------------------------------------------ | --------------------------------------- | -------- | @@ -132,6 +133,8 @@ This allows near-real-time updates to your kubernetes catalogs with the flexibil This feature is enabled by default but can be disabled by setting the property `watch.disable=true`. +Kubernetes events automatically trigger a re-scrape of involved objects, so even though not all resources are watched by default, the vast majority of changes still reflect in real-time due to associated events that fire at the same time as the update. + #### Watch Selector ```yaml title="custom-watch-resources.yaml" @@ -397,3 +400,13 @@ spec: ## Performance +The scraper is highly reliant on the performance of the Kubernetes API server, and as such, it is recommended to run the scraper from within the cluster or as close as possible to the control pane. + + +:::warning Overloading the API Server +It is possible to overload the API server with too many requests, to reduce the load on the API Server: + +* Decentralize the scraper by running it on an agent, from-inside each cluster rather than remotely. +* Increase the `schedule` to `1h` or more, real-time updates still be recorded by Kubernetes events and informers. +* Filter out and exclude resources and events that have a high churn or verbosity + diff --git a/mission-control/docs/guide/config-db/tutorials/index.mdx b/mission-control/docs/guide/config-db/tutorials/index.mdx index 093f1df0..7cfc0b8d 100644 --- a/mission-control/docs/guide/config-db/tutorials/index.mdx +++ b/mission-control/docs/guide/config-db/tutorials/index.mdx @@ -1,5 +1,5 @@ --- title: Tutorials sidebar_custom_props: - icon: stash:graduation-cap-light + icon: learning --- diff --git a/mission-control/docs/guide/permissions/index.mdx b/mission-control/docs/guide/permissions/index.mdx index 02224aca..7c5cc5b0 100644 --- a/mission-control/docs/guide/permissions/index.mdx +++ b/mission-control/docs/guide/permissions/index.mdx @@ -6,15 +6,15 @@ hide_title: true # hide_table_of_contents: true pagination_prev: guide/topology/index sidebar_custom_props: - icon: user + icon: shield-user --- ## Permission In Mission Control, Permission provides a flexible and robust security model that combines two powerful approaches: -Role-Based Access Control (RBAC) and Attribute-Based Access Control (ABAC). +Role-Based Access Control (RBAC) and Attribute-Based Access Control (ABAC). This unified permission system allows you to implement precise and granular access policies. -For instance, while RBAC can control whether a user can execute any playbooks in the system, +For instance, while RBAC can control whether a user can execute any playbooks in the system, more refined ABAC policies allow you to specify exactly which playbooks specific users or teams can access. Permissions are manageable via the UI as well as via CRDs. @@ -138,4 +138,4 @@ Permissions applied to the group are then inherited by the encompassed subjects. scheme: '`[]string`', }, ]} -/> \ No newline at end of file +/> diff --git a/mission-control/docs/guide/playbooks/actions/gitops.mdx b/mission-control/docs/guide/playbooks/actions/gitops.mdx index 44d41038..d74e3a55 100644 --- a/mission-control/docs/guide/playbooks/actions/gitops.mdx +++ b/mission-control/docs/guide/playbooks/actions/gitops.mdx @@ -9,51 +9,18 @@ import Templating from '@site/docs/reference/playbooks/context.mdx' # GitOps Action -GitOps action allows you to make commits and push to a remote repository. +The GitOps action creates commits and pushes changes to a git repository. -```yaml title="edit-kubernetes-manifests-gitops.yaml" -apiVersion: mission-control.flanksource.com/v1 -kind: Playbook -metadata: - name: edit-kubernetes-manifests-gitops -spec: - title: 'Edit Kustomize Resource' - icon: 'flux' - parameters: - - default: 'chore: update $(.config.type)/$(.config.name)' - label: 'Commit Message' - name: 'commit_message' - - default: '$(.config.config | toJSON | neat | json | toYAML)' - label: 'Changes' - name: 'yamlInput' - properties: - size: 'large' - type: 'code' - configs: - - labelSelector: 'kustomize.toolkit.fluxcd.io/name' - actions: - - name: 'Create Pull Request With Changes' - gitops: - repo: - url: 'https://github.com/flanksource/flux' - connection: 'connection://default/github' - base: 'main' - branch: 'edit-manifest-$(random.Alpha 8)' - commit: - author: '$(.user.name)' - email: '$(.user.email)' - message: '$(.params.commit_message)' - pr: - title: '$(.params.commit_message)' - patches: - - path: 'prod/kustomization.yaml' - yq: | - select( - .kind=="$(.config.config | jq `.kind`)" and - .metadata.name=="$(.config.config | jq `.metadata.name`)" - ) |= $(.params.yamlInput | yaml | toJSON) +Common use cases: + +* Enable developers to provision and manage Infrastructure as Code through a GUI interface, while DevOps and Platform engineers maintain their preferred tooling workflow +* Implement guardrail-driven access for developers to make infrastructure changes +* Use native support for Flux and Kustomization to automatically identify git repositories and files using `originAnnotations` + +```yaml title="edit-kubernetes-manifests-gitops.yaml" file=/modules/generated/playbooks/kustomize-edit.yaml ``` + +These env vars are extracted by traversing up the Flux Kustomization and Git Repository that created the config resource the playbook runs against. -These env vars are extracted by traversing up the Flux Kustomization and Git Repository that created the config resource the playbook is running against. We'll see this in detail shortly. - -To tag all the resources with that annotation, you'll need to add `originAnnotations` to the buildMetadata field as shown below: +To tag all the resources with that annotation, add `originAnnotations` to the `buildMetadata` field as shown below:
diff --git a/mission-control/docs/guide/playbooks/examples/index.mdx b/mission-control/docs/guide/playbooks/examples/index.mdx index c7d888eb..65f025d3 100644 --- a/mission-control/docs/guide/playbooks/examples/index.mdx +++ b/mission-control/docs/guide/playbooks/examples/index.mdx @@ -2,7 +2,7 @@ sidebar_position: 7 title: Examples sidebar_custom_props: - icon: stash:graduation-cap-light + icon: learning --- diff --git a/mission-control/docs/guide/topology/examples/index.mdx b/mission-control/docs/guide/topology/examples/index.mdx index 1209a27e..b169d831 100644 --- a/mission-control/docs/guide/topology/examples/index.mdx +++ b/mission-control/docs/guide/topology/examples/index.mdx @@ -1,6 +1,8 @@ --- sidebar_position: 100 title: Examples +sidebar_custom_props: + icon: learning --- diff --git a/mission-control/docs/guide/topology/lookups/index.mdx b/mission-control/docs/guide/topology/lookups/index.mdx index 636dccb3..33716516 100644 --- a/mission-control/docs/guide/topology/lookups/index.mdx +++ b/mission-control/docs/guide/topology/lookups/index.mdx @@ -1,6 +1,8 @@ --- title: Lookups sidebar_position: 3 +sidebar_custom_props: + icon: database-search-o --- diff --git a/mission-control/docs/installation/_aws_iam.mdx b/mission-control/docs/installation/_aws_iam.mdx index 2d97baf2..17bbd5ab 100644 --- a/mission-control/docs/installation/_aws_iam.mdx +++ b/mission-control/docs/installation/_aws_iam.mdx @@ -12,7 +12,7 @@ Depending on how you want to use Mission Control you need to create an IAM role
-You can also create a new policy with just the permissions required by Mission Control +You can also create a new policy with only the permissions required by Mission Control ```json title="iam-policy.json" { diff --git a/mission-control/docs/installation/local-testing.md b/mission-control/docs/installation/local-testing.md index 08f2a626..c5d7145f 100644 --- a/mission-control/docs/installation/local-testing.md +++ b/mission-control/docs/installation/local-testing.md @@ -1,6 +1,8 @@ --- title: Local Testing description: Run Mission Control Locally using minikube or kind +sidebar_custom_props: + icon: lab --- import Tabs from '@theme/Tabs'; @@ -101,14 +103,14 @@ minikube addons enable ingress -[nip.io](http://nip.io) is simple wildcard DNS server that returns the ip provided in the host name, e.g. +[nip.io](http://nip.io) is a wildcard DNS server that returns the ip provided in the host name, e.g. ```bash ❯ nslookup 127.0.0.1.nip.io Address: 127.0.0.1 ``` -By using nip you will be able to access mission-control without any further networking / configuration setup. +By using nip you can access mission-control without any further networking / configuration setup. ```yaml title="values.yaml" global: @@ -155,7 +157,7 @@ See [values.yaml](/installation/helm#self-hosted) for more options. -The default username is `admin@local` and the password can be retrived with: +The default username is `admin@local` and the password can be retrieved with: ``` kubectl get secret mission-control-admin-password \ @@ -166,7 +168,7 @@ kubectl get secret mission-control-admin-password \ You can then goto [https://127.0.0.1.nip.io:8443](https://127.0.0.1.nip.io:8443) to login. :::info Self-Signed Certificate -This example uses a self-signed certificate created by Nginx, We recommend using [cert-manager.io](https://cert-manager.io/). +This example uses a self-signed certificate created by nginx, We recommend using [cert-manager.io](https://cert-manager.io/). ::: @@ -193,6 +195,6 @@ and apply to the cluster with: kubectl apply -f canaries.yaml ``` -When you goto the [Health](https://127.0.0.1.nip.io:8443/health) tab you can then see the check running: +Navigate to the [Health](https://127.0.0.1.nip.io:8443/health) tab you can then see the check running: diff --git a/mission-control/docs/installation/saas/agent.mdx b/mission-control/docs/installation/saas/agent.mdx index cde39f37..8085c071 100644 --- a/mission-control/docs/installation/saas/agent.mdx +++ b/mission-control/docs/installation/saas/agent.mdx @@ -1,7 +1,12 @@ --- title: Agent Installation +sidebar_custom_props: + icon: server --- +import ReactMarkdown from 'react-markdown' +import Link from '@docusaurus/Link'; + :::info Prerequisites To install and run the Mission Control agent you need to have the following prerequisites: @@ -19,13 +24,16 @@ import OpenAPI from '@site/src/components/OpenAPI' The recommended way of installing an agent is generating the Helm/Flux install script on the UI: + + -1. Navigate to **Settings** --> **Agents** -2. Click on the button + +1. Navigate to {props.saas && app.flanksource.com/settings/agents}{!props.saas && <>SettingsAgents} - Enter the following: + +2. Click on the button, and enter in the dialog: * **clusterName** - * Toggle **Kubernetes** to automatically scrape the cluster the agent is installed in, you can skip this step and perform it later by installing the [chart](/integrations/kubernets/catalog) + * Toggle **Kubernetes** to automatically scrape the cluster the agent is installed in, you can skip this step and perform it later by installing the [chart](/integrations/kubernetes/catalog)

3. Click **Next** @@ -33,12 +41,11 @@ The recommended way of installing an agent is generating the Helm/Flux install s -4. Alternatively if you are installing the agent in multiple locations you can reuse the same token generated - - - + + ", "upstream.agent": "YOUR_LOCAL_NAME", @@ -48,37 +55,53 @@ The recommended way of installing an agent is generating the Helm/Flux install s }} /> + + + ", + "upstream.agent": "YOUR_LOCAL_NAME", + "upstream.username": "token", + "upstream.password": "", + "upstream.host": "" + }} + + /> + + -:::info Externalize the token -We recommend that the upstream token be stored separately and encrypted using sops or similar -1. Create a new secret called `mission-control-upstream` - title=secret.yaml - apiVersion: v1 - kind: Secret - metadata: - name: upstream - stringData: - UPSTREAM_HOST: "" - UPSTREAM_USER: token - UPSTREAM_PASSWORD: "" - AGENT_NAME: "YOUR_LOCAL_NAME" +

+:::info Encrypting the Token + We recommend that the upstream token be stored and encrypted using sops or similar +1. Create a new secret called `mission-control-upstream`: + ```yaml title=secret.yaml + apiVersion: v1 + kind: Secret + metadata: + name: mission-control-upstream + stringData: + UPSTREAM_HOST: "" + UPSTREAM_USER: token + UPSTREAM_PASSWORD: "" + AGENT_NAME: "YOUR_LOCAL_NAME" + ```

2. Update the chart values: - title=values.yaml + + ```yaml title=values.yaml upstream: createSecret: false secretName: mission-control-upstream + ``` ::: - -### values.yaml - - diff --git a/mission-control/docs/installation/saas/eks.mdx b/mission-control/docs/installation/saas/eks.mdx index 215bbedb..d92041f5 100644 --- a/mission-control/docs/installation/saas/eks.mdx +++ b/mission-control/docs/installation/saas/eks.mdx @@ -1,6 +1,8 @@ --- title: AWS EKS slug: installation/eks +sidebar_custom_props: + icon: aws-eks-cluster --- import Tabs from '@theme/Tabs' @@ -28,6 +30,19 @@ To install and run Mission Control you need to have the following prerequisites: }} /> + ## Next Steps -Install the [AWS](/registry/aws) registry chart to configure the AWS Scraper + + + + + + + + + + + + + diff --git a/mission-control/docs/installation/saas/getting-started.mdx b/mission-control/docs/installation/saas/getting-started.mdx index 1734a2ce..0985f610 100644 --- a/mission-control/docs/installation/saas/getting-started.mdx +++ b/mission-control/docs/installation/saas/getting-started.mdx @@ -7,30 +7,13 @@ sidebar_custom_props: --- +import Agent from './agent.mdx' import AgentToken from '@site/docs/partials/_agent_token.mdx' -export const toc = [{ - value: "Signup", - id: "signup", - level: 2, - }, - { - value: "Agent Installation", - id: "agent-installation", - level: 2, - }, - - { - value: "Technology Bundles", - id: "registry", - level: 2, - } - -] When using the Mission Control SaaS the agent based approach is recommended for ingesting data, The agent is headless installation of mission-control that caches data locally in a postgres database and replicates it to the SaaS. - + The agent based approach has the following benefits: @@ -53,10 +36,12 @@ See [Installation](/installation) for other deployment models including [Self Ho Organization details and members can be changed by going to [accounts.flanksource.com/organization](https://accounts.flanksource.com/organization)
or Clicking on **Manage Organization** when logged in ::: -4. Install an Agent -## Agent Installation +### Agent Installation +Next an agent needs to deployed to scrape resources and execute playbooks: + + diff --git a/mission-control/docs/installation/self-hosted/database.md b/mission-control/docs/installation/self-hosted/database.md index b871bf77..6b2ec960 100644 --- a/mission-control/docs/installation/self-hosted/database.md +++ b/mission-control/docs/installation/self-hosted/database.md @@ -1,6 +1,8 @@ --- title: Database description: Alternative methods for connecting to the db used for persistence +sidebar_custom_props: + icon: postgres --- Mission Control stores all state in a Postgres Database, by default a Postgres StatefulSet is created. diff --git a/mission-control/docs/installation/self-hosted/eks.mdx b/mission-control/docs/installation/self-hosted/eks.mdx index 91453258..5401f266 100644 --- a/mission-control/docs/installation/self-hosted/eks.mdx +++ b/mission-control/docs/installation/self-hosted/eks.mdx @@ -1,5 +1,7 @@ --- title: AWS EKS +sidebar_custom_props: + icon: aws-eks-cluster --- import AwsIam from "../_aws_iam.mdx" @@ -23,7 +25,20 @@ To install and run a self-hosted Mission Control on AWS EKS you need to have the }}/> - ## Next Steps -Install the [AWS](/registry/aws) registry chart to configure the AWS Scraper + + + + + + + + + + + + + + + diff --git a/mission-control/docs/installation/self-hosted/getting-started.mdx b/mission-control/docs/installation/self-hosted/getting-started.mdx index eb47a40d..73f7886e 100644 --- a/mission-control/docs/installation/self-hosted/getting-started.mdx +++ b/mission-control/docs/installation/self-hosted/getting-started.mdx @@ -3,74 +3,55 @@ title: Getting Started show_title: true sidebar_custom_props: icon: getting-started - +pagination_next: installation/self-hosted/database sidebar_position: 0 --- - import AdminPassword from '@site/docs/partials/_admin-password.mdx' import Helm from "@site/src/components/Helm" -export const toc = [ - { - value: 'Prerequisites', - id: 'prerequisites', - level: 2 - }, - { - value: 'Step 1: Install Helm Repository', - id: 'step-1-install-helm-repository', - level: 2 - }, - { - value: 'Step 2: Install Helm Chart', - id: 'helm-chart', - level: 2 - }, - { - value: 'Cert Manager', - id: 'cert-manager', - level: 3 - }, - { - value: 'Optional Steps', - id: 'optional-steps', - level: 2 - }, - { - value: 'Step 3: Configure Email (SMTP)', - id: 'smtp', - level: 3 - }, - { - value: 'Step 4: Single Sign On', - id: 'sso', - level: 3 - }, - { - value: 'Step 5: External Database', - id: '-database', - level: 3 - } -] - - - -This tutorial guides you through setting up and configuring a self-hosted Mission Control environment. + +Mission Control is an internal developer platform built for operations. Built with a "self-hosted first" approach, Mission Control gives you complete control over your deployment environment while offering enterprise-grade features. + +## Self-Hosted Deployment + +When you self-host Mission Control, you maintain full ownership of your infrastructure and data while enjoying the same robust feature set available in the SaaS offering. In fact, some advanced features are exclusively available in the self-hosted version. + + + +### Why Self-Host Mission Control? + +**Key Benefits** +- **Infrastructure Flexibility**: Deploy on your preferred infrastructure - whether on-premise, AWS, GCP, Azure, or any other Kubernetes environment +- **Data Sovereignty**: Keep all your monitoring and operational data within your own environment +- **Security Control**: Leverage your existing security practices and compliance frameworks +- **Cost Efficiency**: Optimize resource allocation and scaling based on your specific needs +- **Customization**: Tailor the platform to integrate with your specific infrastructure components + +**Implementation Considerations** +- Configuration and management of authentication (SSO) is required +- Database management responsibilities remain with your team +- Updates and maintenance follow standard Kubernetes patterns +


+ + + +This guide walks you through the complete setup process for your self-hosted Mission Control environment. + :::info Prerequisites To install and run Mission Control you need the following: - Kubernetes 1.26+ with an Ingress Controller - [cert-manager.io](https://cert-manager.io/docs/) or an existing TLS secret for ingress -- 1 - 2 CPUs and 6-8GB of Memory (2-4GB if using an external DB) +- 1 - 2 CPU's and 6-8GB of Memory (2-4GB if using an external DB) - Persistent Volumes with 20GB+ of storage or an external postgres database - (Optional) [prometheus operator](https://prometheus-operator.dev/) - (Optional) SMTP Server (For sending notifications and invites) ::: ---- 1. Choose a routable `DOMAIN` for Mission Control +

> See [Ingress](/reference/helm/mission-control#ingress) for more options on configuring the ingress including generating certs with cert-manager >

See [Local Testing](../local-testing) for testing using a kind or minikube without a routable domain

@@ -88,50 +69,17 @@ To install and run Mission Control you need the following: 2. Login @ https://DOMAIN/ -## Optional Steps - - - -An SMTP server is required for sending notifications, approvals, user invites and password resets. - -The format of `connection_uri` is `smtp|smtps://USER:PASS@host:PORT[?param=value]` - -Use `smtps` for implicit TLS sessions or `smtp` for explicit StartTLS/cleartext sessions. - -| Parameter | Description | Default | -| --- | --- | --- | -| `disable_starttls` | When using `smtp` scheme, set to `true` to allow cleartext sessions or `false` to enforce StartTLS | `false` | -| `skip_ssl_verify` | Set to `true` to allow self-signed TLS certificates or `false` to enforce certificate verification. Applies to both implicit and explicit TLS sessions | `false` | - +## Next Steps -```yaml title="values.yaml" -kratos: - kratos: - config: - courier: - smtp: - connection_uri: # smtp://user:pass@localhost:25 - from_address: noreply@ - from_name: Mission Control - # These headers will be passed in the SMTP conversation - # e.g. when using the AWS SES SMTP interface for cross-account sending. - headers: {} - # Identifier used in the SMTP HELO/EHLO command. - # Some SMTP relays require a unique identifier. - local_name: "" -``` + -See also [HTTP Webhooks](https://www.ory.sh/docs/kratos/self-hosted/email-http) for sending emails. - - + -See [SSO](./sso) + + - - + -See [Database](./database) to configure an external database such as AWS RDS or Google Cloud SQL, or to optimize the bundled PostgreSQL settings. - diff --git a/mission-control/docs/installation/self-hosted/oidc.mdx b/mission-control/docs/installation/self-hosted/oidc.mdx index bb1dd4b9..2316c84a 100644 --- a/mission-control/docs/installation/self-hosted/oidc.mdx +++ b/mission-control/docs/installation/self-hosted/oidc.mdx @@ -1,6 +1,8 @@ --- title: Single Sign On (SSO) slug: sso +sidebar_custom_props: + icon: jwt --- import Properties from '../_properties.mdx' @@ -71,17 +73,17 @@ See [Providers](https://www.ory.sh/docs/kratos/social-signin/overview) more deta ```

-5. Optionally, create a cel expression to map identities from the OIDC provider to a mission control role & team. +5. Optionally, create a cel expression to map identities from the OIDC provider to a mission control role & team. The following script maps all Azure users in the `SRE` group to the `admin` role and everyone else to the `viewer` role. ```yaml apiVersion: v1 - kind: ConfigMap - metadata: + kind: ConfigMap + metadata: name: azure-identity-mapper data: script: > - { + { "role": "sre" in identity.traits.groups ? "admin": "viewer" }.toJSON() ``` diff --git a/mission-control/docs/installation/self-hosted/smtp.mdx b/mission-control/docs/installation/self-hosted/smtp.mdx new file mode 100644 index 00000000..4cb19724 --- /dev/null +++ b/mission-control/docs/installation/self-hosted/smtp.mdx @@ -0,0 +1,36 @@ +--- +title: SMTP / Email +sidebar_custom_props: + icon: email +--- +An SMTP server is required for sending notifications, approvals, user invites and password resets. + +The format of `connection_uri` is `smtp|smtps://USER:PASS@host:PORT[?param=value]` + +Use `smtps` for implicit TLS sessions or `smtp` for explicit StartTLS/cleartext sessions. + +| Parameter | Description | Default | +| --- | --- | --- | +| `disable_starttls` | When using `smtp` scheme, set to `true` to allow cleartext sessions or `false` to enforce StartTLS | `false` | +| `skip_ssl_verify` | Set to `true` to allow self-signed TLS certificates or `false` to enforce certificate verification. Applies to both implicit and explicit TLS sessions | `false` | + + +```yaml title="values.yaml" +kratos: + kratos: + config: + courier: + smtp: + connection_uri: # smtp://user:pass@localhost:25 + from_address: noreply@ + from_name: Mission Control + # These headers will be passed in the SMTP conversation + # e.g. when using the AWS SES SMTP interface for cross-account sending. + headers: {} + # Identifier used in the SMTP HELO/EHLO command. + # Some SMTP relays require a unique identifier. + local_name: "" +``` + +See also [HTTP Webhooks](https://www.ory.sh/docs/kratos/self-hosted/email-http) for sending emails. + diff --git a/mission-control/docs/integrations/aws/getting-started.md b/mission-control/docs/integrations/aws/getting-started.md index 34c299dd..3d599faf 100644 --- a/mission-control/docs/integrations/aws/getting-started.md +++ b/mission-control/docs/integrations/aws/getting-started.md @@ -7,7 +7,7 @@ sidebar_custom_props: import Schema from '@site/modules/mission-control-registry/charts/aws/values.schema.json' -The AWS chart catalog [scraper](/guide/config-db/scrapers/aws) that: +Installs a [catalog scraper](/guide/config-db/scrapers/aws) that: - Scrapes AWS Resources and detects changes in the resource definition - Ingests changes from CloudTrail diff --git a/mission-control/docs/reference/image-variants.md b/mission-control/docs/reference/image-variants.md index c2709021..f78e1dad 100644 --- a/mission-control/docs/reference/image-variants.md +++ b/mission-control/docs/reference/image-variants.md @@ -1,5 +1,7 @@ --- title: Image Variants +sidebar_custom_props: + icon: settings --- Canary checker comes with 2 image variants: diff --git a/mission-control/docs/reference/permissions/index.mdx b/mission-control/docs/reference/permissions/index.mdx index 2b3bf1f1..638fa326 100644 --- a/mission-control/docs/reference/permissions/index.mdx +++ b/mission-control/docs/reference/permissions/index.mdx @@ -1,6 +1,8 @@ --- title: Permissions sidebar_position: 13 +sidebar_custom_props: + icon: shield-user --- diff --git a/mission-control/docs/reference/resource-selector.md b/mission-control/docs/reference/resource-selector.md deleted file mode 100644 index 0fc824d8..00000000 --- a/mission-control/docs/reference/resource-selector.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: Resource Selectors -sidebar_position: 2 -sidebar_custom_props: - icon: stash:search-box-light ---- - -# Resource Selectors - -Resource Selectors are used in multiple places including: - -- Attaching components to a topology -- Creating relationships between configs and configs/components -- Finding resources to run health checks or playbooks on - -| Field | Description | Scheme | Required | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | -------- | -| `id` | ID of the component | `string` | No | -| `name` | Name of the component/config | `string` | No | -| `namespace` | Select resources in this namespace only, if empty find resources in all namespaces | `string` | No | -| `types` | Match any of the types specified | `[]string` | No | -| `statuses` | Match any of the statuses specified | `[]string` | No | -| `labelSelector` | Kubernetes Style Label Selector | [LabelSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) | No | -| `fieldSelector` | Kubernetes Style Field Selector Property fields of the component in kubernetes format (or database columns: owner, topology_id, parent_id) | [FieldSelector](https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/) | No | -| `agent` | Select resources created on this agent, Defaults to `local` | `uuid`, `{name}`, `local` or `all` | No | -| `cache` | Cache settings to use for the results, expensive selectors or selectors that are are use very often should be cached for longer periods. Defaults to `max-age=10m` | `no-cache`, `no-store` or `max-age={duration}` | No | -| `search` | Search for resources via key value pairs using parsing expression grammar | `string` | No | - -## Search - -The query syntax is `field1=value1 field2>value2 field3=value3* field4=*value4`. `*` is for prefix and suffix matching. - -Supported operators: - -| Operator | Syntax | Types | -| -------- | -------------------------------- | --------------------- | -| `=` | `field=value` | `string` `int` `json` | -| `!=` | `field!=value` | `string` `int` `json` | -| `*` | `field=*value` or `field=value*` | `string` `int` | -| `>` `<` | `field>value` or `fieldnow-24h - - - name: All components updated between a specific interval - selectors: - - search: updated_at>2024-10-10 updated_at<2024-10-17 - - - name: Component with name httpbin-service - # Not giving any key will do a name lookup (ie name=httpbin-service) - selectors: - - search: httpbin-service - - - name: Components with label cluster - # JSON lookups are also supported - selectors: - - search: labels.cluster=prod - - - name: Link configs which have logistics-api image - configs: - - search: config.spec.template.spec.containers[0].name=docker.io/example/logistics-api:latest -``` diff --git a/mission-control/docs/reference/resource-selector.md b/mission-control/docs/reference/resource-selector.md new file mode 120000 index 00000000..d632687d --- /dev/null +++ b/mission-control/docs/reference/resource-selector.md @@ -0,0 +1 @@ +../snippets/_resource-selector.md \ No newline at end of file diff --git a/mission-control/docs/reference/types.md b/mission-control/docs/reference/types.md deleted file mode 100644 index a27944d2..00000000 --- a/mission-control/docs/reference/types.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -hide_title: true -title: Common Types -sidebar_position: 2 -sidebar_custom_props: - icon: fluent:library-16-regular ---- - -# Common Types - -This document provides a reference for common types used in the configuration and operation of the system. - -## Agent - -An agent can be specified using: - -- `local`: The primary mission control instance. -- `uuid`: The UUID of an agent. -- `name`: The name of an agent. -- `all`: Match all/any agents. - -## Cron - -``` -# ┌───────────── minute (0–59) -# │ ┌───────────── hour (0–23) -# │ │ ┌───────────── day of the month (1–31) -# │ │ │ ┌───────────── month (1–12) -# │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday) -# │ │ │ │ │ -# │ │ │ │ │ -# │ │ │ │ │ - 0 * * * * -``` - -| Shortcut | Description | Equivalent | -| ------------------------------ | ---------------------------------------------------------- | ----------- | -| `@every` [Duration](#duration) | e.g., `@every 5m` | | -| `@yearly` (or `@annually`) | Run once a year at midnight of 1 January | `0 0 1 1 *` | -| `@monthly` | Run once a month at midnight of the first day of the month | `0 0 1 * *` | -| `@weekly` | Run once a week at midnight on Sunday | `0 0 * * 0` | -| `@daily` (or `@midnight`) | Run once a day at midnight | `0 0 * * *` | -| `@hourly` | Run once an hour at the beginning of the hour | `0 * * * *` | - -## Duration - -Valid time units are `s`, `m`, `h`, `d`, `w`, `y`. For example: - -- `1m15s` -- `1h5m` -- `23h` -- `1d8h` -- `1w6d8h` -- `19w0d8h` - -## Size - -Sizes are strings with a unit suffix, e.g., `100`, `100b`, `10mb`. Valid size units are `kb`, `mb`, `gb`, `tb`. - -## Icon - -One of the icons in the [flanksource-icons](https://github.com/flanksource/flanksource-icons/tree/main/svg) project or a URL to an image. - -e.g. - -- `kubernetes` -- `Kubernetes::Pod` -- `argo` -- `aws-ebs-volume` - -Use the picker below to search for icons: - - - -## Match Pattern - -Pattern matching supports the following operations: - -- `*` - Match anything -- `Added,Deleted` - Match either `Added` or `Deleted` -- `Added*`: Match anything starting with `Added`. -- `*Terminated`: Match anything ending with `Terminated`. -- `!PodCrashLooping`: Match everything except `PodCrashLooping`. diff --git a/mission-control/docs/reference/types.md b/mission-control/docs/reference/types.md new file mode 120000 index 00000000..00c9c871 --- /dev/null +++ b/mission-control/docs/reference/types.md @@ -0,0 +1 @@ +../snippets/_types.md \ No newline at end of file diff --git a/mission-control/package.json b/mission-control/package.json index c9a7e60c..8e1db754 100644 --- a/mission-control/package.json +++ b/mission-control/package.json @@ -17,7 +17,7 @@ "@docusaurus/core": "3.7.0", "@docusaurus/plugin-client-redirects": "3.7.0", "@docusaurus/preset-classic": "3.7.0", - "@flanksource/icons": "^1.0.32", + "@flanksource/icons": "^1.0.34", "@floating-ui/react": "^0.26.28", "@iconify/react": "^5.1.0", "@mdx-js/react": "^3.0.0", diff --git a/mission-control/sidebars.js b/mission-control/sidebars.js index 6ffb2c23..94057df8 100644 --- a/mission-control/sidebars.js +++ b/mission-control/sidebars.js @@ -76,6 +76,9 @@ const sidebars = { { type: 'category', label: 'SaaS', + customProps: { + icon: 'cloud-done' + }, link: { type: 'doc', id: 'installation/saas/getting-started', @@ -88,12 +91,6 @@ const sidebars = { id: 'installation/saas/getting-started', }, - { - type: 'doc', - id: 'installation/saas/eks', - label: 'AWS EKS' - }, - { type: 'doc', id: 'installation/saas/agent', @@ -103,19 +100,43 @@ const sidebars = { { type: 'doc', id: 'installation/saas/kubectl', + customProps: { + icon: 'console' + }, label: 'Kubectl Access' }, + { + type: 'html', + value: '

' + }, + { + type: 'doc', + id: 'installation/saas/eks', + customProps: { + icon: 'aws-eks-cluster' + }, + label: 'AWS EKS' + }, + + ] }, { type: 'category', label: 'Self-Hosted', + customProps: { + icon: 'data-center' + }, + link: { + type: 'doc', + id: 'installation/self-hosted/getting-started', + }, items: [ { type: 'doc', id: 'installation/self-hosted/getting-started', - label: 'Installation' + label: 'Getting Started' }, { type: 'doc', @@ -128,6 +149,15 @@ const sidebars = { label: 'SSO (OIDC)' }, + { + type: 'doc', + id: 'installation/self-hosted/smtp', + label: 'Email' + }, + { + type: 'html', + value: '
' + }, { type: 'doc', id: 'installation/self-hosted/eks', diff --git a/mission-control/static/img/add-agent.png b/mission-control/static/img/add-agent.png new file mode 100644 index 0000000000000000000000000000000000000000..16502afd14c067f4f87d6f9bd194c68ef2314944 GIT binary patch literal 145031 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 jq#(;z5Hp;)T7`XEoD1C(BRaN> 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

p`OJol8KPvb4V1;X2mH?Odf= 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 literal 0 HcmV?d00001 diff --git a/styles/ignore/words-with-suggestions.txt b/styles/ignore/words-with-suggestions.txt index d36aa161..2210a136 100644 --- a/styles/ignore/words-with-suggestions.txt +++ b/styles/ignore/words-with-suggestions.txt @@ -32,6 +32,10 @@ canarySelector containerdSocket clusterName change_type +Entra +Signup +JSONNET +Goto JMESPath routable matchQuery From 57ddc5cad531828ce1f507e046aab55de4eeb903 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 14:56:21 +0300 Subject: [PATCH 12/16] chore: build fixes --- canary-checker/package.json | 2 +- modules/Makefile | 8 +++++--- modules/make.sh | 5 ++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/canary-checker/package.json b/canary-checker/package.json index e83ed1c2..a015a19e 100644 --- a/canary-checker/package.json +++ b/canary-checker/package.json @@ -15,7 +15,7 @@ "@docusaurus/core": "^3.7.0", "@docusaurus/plugin-client-redirects": "^3.7.0", "@docusaurus/preset-classic": "^3.7.0", - "@flanksource/icons": "^1.0.24", + "@flanksource/icons": "^1.0.34", "@floating-ui/react": "^0.26.28", "@mdx-js/react": "^3.0.0", "ansi-to-html": "^0.7.2", diff --git a/modules/Makefile b/modules/Makefile index 309768fd..64d9c480 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -2,8 +2,6 @@ OS ?= $(shell uname -s | tr '[:upper:]' '[:lower:]') ARCH ?= $(shell uname -m | sed 's/x86_64/amd64/') - - .PHONY: all all: sync manifests @@ -13,7 +11,7 @@ sync: .PHONY: manifests -manifests: .bin/helm +manifests: .bin/helm .bin/yq rm -rf rendered-manifests ./make.sh mission-control-registry/charts/playbooks-ai "--set slack.connection=connection://mission-control/slack --set global.llm_connection=connection://mission-control/anthropic" ./make.sh mission-control-registry/charts/playbooks-kubernetes @@ -26,3 +24,7 @@ manifests: .bin/helm .bin/helm: .bin wget -nv https://get.helm.sh/helm-v3.17.2-$(OS)-$(ARCH).tar.gz -O .bin/helm.tar.gz tar -xzf .bin/helm.tar.gz -C .bin --strip-components 1 + +.bin/yq: .bin + wget -nv https://github.com/mikefarah/yq/releases/download/v4.37.4/yq_$(OS)_$(ARCH).tar.gz -O .bin/yq.tar.gz + tar -xzf .bin/yq.tar.gz -C .bin --strip-components 1 diff --git a/modules/make.sh b/modules/make.sh index 31be2ed7..c5d97147 100755 --- a/modules/make.sh +++ b/modules/make.sh @@ -13,7 +13,7 @@ CHART_NAME=$1 shift HELM_ARGS=$@ OUTPUT_DIR="generated/playbooks" -HELM=.bin/helm +export PATH=.bin:$PATH # Create output directory mkdir -p "$OUTPUT_DIR" @@ -22,8 +22,7 @@ echo "Rendering Helm chart: $CHART_NAME" echo "Output directory: $OUTPUT_DIR" # Use helm template to render the chart and pipe to yq -$HELM template "$CHART_NAME" $HELM_ARGS > rendered.yaml - +helm template "$CHART_NAME" $HELM_ARGS > rendered.yaml for playbook in $(yq e 'select(.kind =="Playbook") | .metadata.name ' -o json -r rendered.yaml); do FILENAME="$OUTPUT_DIR/${playbook}.yaml" From c7c10042df813151922fb91f376335575a70fd85 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 16:32:02 +0300 Subject: [PATCH 13/16] chore: lint fixes --- Makefile | 4 ++-- canary-checker/docs/scripting/gotemplate.mdx | 24 +++++++++----------- modules/Makefile | 5 ++-- styles/Flanksource/Acronyms.yml | 1 + styles/Flanksource/Foreign.yml | 2 +- styles/ignore/words-with-suggestions.txt | 2 ++ 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 208904cc..5b35ebae 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ .PHONY: lint lint: vale sync - vale canary-checker/docs - vale mission-control/docs + vale canary-checker/docs --glob='!**/{README,CHANGELOG,readme,security,SECURITY,CONTRIBUTING,benchmark,development,LICENSE}.md' + vale mission-control/docs --glob='!**/{README,CHANGELOG,readme,security,SECURITY,CONTRIBUTING,benchmark,development,LICENSE}.md' markdownlint mission-control/docs markdownlint canary-checker/docs diff --git a/canary-checker/docs/scripting/gotemplate.mdx b/canary-checker/docs/scripting/gotemplate.mdx index a7f5ca65..6a56e3a4 100644 --- a/canary-checker/docs/scripting/gotemplate.mdx +++ b/canary-checker/docs/scripting/gotemplate.mdx @@ -179,10 +179,12 @@ Reports whether a given object has a property with the given key, or whether a g ### jq -Filters an input object or list using the [jq](https://stedolan.github.io/jq/) language, as implemented by [gojq](https://github.com/itchyny/gojq). +The `jq` function filters input using the [jq query language](https://stedolan.github.io/jq/), implemented via [gojq](https://github.com/itchyny/gojq). -Any JSON datatype may be used as input (NOTE: strings are not JSON-parsed but passed in as is). If the expression results in multiple items (no matter if streamed or as an array) they are wrapped in an array. Otherwise a single item is returned (even if resulting in an array with a single contained element). +Input can be any valid JSON data type, strings are passed directly without JSON parsing. The function returns: +- A single value for single results +- An array for multiple results (whether streamed or array output) JQ filter expressions can be tested at [jqplay](https://jqplay.org/) See also: @@ -922,7 +924,7 @@ Adds all given operators. When one of the inputs is a floating-point number, the Returns the least integer value greater than or equal to a given floating-point number. This wraps Go's [`math.Ceil`](https://golang.org/pkg/math/#Ceil). -**Note:** the return value of this function is a `float64` so that the special-cases `NaN` and `Inf` can be returned appropriately. +**Note:** the return value of this function is a `float64` so that the cases of `NaN` and `Inf` can be returned appropriately. ```go {{ range (slice 5.1 42 "3.14" "0xFF" "NaN" "Inf" "-0") }}ceil {{ printf "%#v" . }} = {{ math.Ceil . }}{{"\n"}}{{ end }} @@ -948,7 +950,7 @@ Divide the first number by the second. Division by zero is disallowed. The resul Returns the greatest integer value less than or equal to a given floating-point number. This wraps Go's [`math.Floor`](https://golang.org/pkg/math/#Floor). -**Note:** the return value of this function is a `float64` so that the special-cases `NaN` and `Inf` can be returned appropriately. +**Note:** the return value of this function is a `float64` so that the cases of `NaN` and `Inf` can be returned appropriately. ```go {{ range (slice 5.1 42 "3.14" "0xFF" "NaN" "Inf" "-0") }}floor {{ printf "%#v" . }} = {{ math.Floor . }}{{"\n"}}{{ end }} @@ -1047,7 +1049,7 @@ Return the remainder from an integer division operation. Returns the nearest integer, rounding half away from zero. -**Note:** the return value of this function is a `float64` so that the special-cases `NaN` and `Inf` can be returned appropriately. +**Note:** the return value of this function is a `float64` so that the cases of `NaN` and `Inf` can be returned appropriately. ```go {{ range (slice -6.5 5.1 42.9 "3.5" 6.5) }}round {{ printf "%#v" . }} = {{ math.Round . }}{{"\n"}}{{ end }} @@ -1635,7 +1637,7 @@ broken Return the number of _runes_ (Unicode code-points) contained within the input. This is similar to the built-in `len` function, but `len` counts the length in _bytes_. The length of an input containing multi-byte code-points should therefore be measured with `strings.RuneCount`. -Inputs will first be converted to strings, and multiple inputs are concatenated. +Inputs are first converted to strings, and multiple inputs are concatenated. This wraps Go's [`utf8.RuneCountInString`](https://golang.org/pkg/unicode/utf8/#RuneCountInString) function. @@ -1840,10 +1842,7 @@ It is{{ if not $t.IsDST }} not{{ end }} daylight savings time. Parses a timestamp defined by the given layout. This wraps [`time.Parse`](https://golang.org/pkg/time/#Parse). -A number of pre-defined layouts are provided as constants, defined -[here](https://golang.org/pkg/time/#pkg-constants). - -Just like [`time.Now`](#now), this is usually used in conjunction with other functions. +A number of pre-defined layouts are provided as [constants](https://golang.org/pkg/time/#pkg-constants) _Note: In the absence of a time zone indicator, `time.Parse` returns a time in UTC._ @@ -1952,15 +1951,14 @@ Return the local system's time zone offset, in seconds east of UTC. Create a version 1 UUID (based on the current MAC address and the current date/time). -Use [`uuid.V4`](#v4) instead in most cases. - +_Note:_ [`uuid.V4`](#v4) is recommended instead ```go {{ uuid.V1 }} // 4d757e54-446d-11e9-a8fa-72000877c7b0 ``` ### V4 -Create a version 4 UUID (randomly generated). +Create a version 4 UUID This function consumes entropy. diff --git a/modules/Makefile b/modules/Makefile index 64d9c480..78ae4503 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -26,5 +26,6 @@ manifests: .bin/helm .bin/yq tar -xzf .bin/helm.tar.gz -C .bin --strip-components 1 .bin/yq: .bin - wget -nv https://github.com/mikefarah/yq/releases/download/v4.37.4/yq_$(OS)_$(ARCH).tar.gz -O .bin/yq.tar.gz - tar -xzf .bin/yq.tar.gz -C .bin --strip-components 1 + + wget -nv https://github.com/mikefarah/yq/releases/download/v4.37.4/yq_$(OS)_$(ARCH) -O .bin/yq + chmod +x .bin/yq diff --git a/styles/Flanksource/Acronyms.yml b/styles/Flanksource/Acronyms.yml index 5debee67..d871b89e 100644 --- a/styles/Flanksource/Acronyms.yml +++ b/styles/Flanksource/Acronyms.yml @@ -19,6 +19,7 @@ exceptions: - CRUD - CSS - CSV + - DNS - DEBUG - DOM - DPI diff --git a/styles/Flanksource/Foreign.yml b/styles/Flanksource/Foreign.yml index f645ca0b..2b70e3be 100644 --- a/styles/Flanksource/Foreign.yml +++ b/styles/Flanksource/Foreign.yml @@ -7,6 +7,6 @@ nonword: true action: name: replace swap: - '\b(?:ie|i\.e\.)[\s,]': that is + # '\b(?:ie|i\.e\.)[\s,]': that is '\b(?:viz\.)[\s,]': namely '\b(?:ergo)[\s,]': therefore diff --git a/styles/ignore/words-with-suggestions.txt b/styles/ignore/words-with-suggestions.txt index 2210a136..ac5a7672 100644 --- a/styles/ignore/words-with-suggestions.txt +++ b/styles/ignore/words-with-suggestions.txt @@ -28,6 +28,8 @@ dockerSocket postgrest pprof canaryNamespace +jmespath +shellQuote canarySelector containerdSocket clusterName From f37d84cff00d71e8ab7d98bd7cb981b3726affaf Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 16:52:11 +0300 Subject: [PATCH 14/16] chore: lint fixes --- mission-control/docs/installation/local-testing.md | 8 +++----- .../docs/integrations/aws/getting-started.md | 4 ++-- mission-control/package-lock.json | 14 +++++++------- modules/Makefile | 3 +-- styles/ignore/words-with-suggestions.txt | 1 + 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/mission-control/docs/installation/local-testing.md b/mission-control/docs/installation/local-testing.md index c5d7145f..1999c816 100644 --- a/mission-control/docs/installation/local-testing.md +++ b/mission-control/docs/installation/local-testing.md @@ -44,7 +44,7 @@ nodes: protocol: TCP ``` -A single node cluster will be provisioned, hosting both the control plane and workloads. Configure the hostPort bindings onto free ports, in this case `8080` and `8443` are used. +A single node cluster is provisioned, hosting both the control plane and workloads. Configure the `hostPort` bindings onto free ports, in this case `8080` and `8443` Provision the kind cluster with @@ -62,9 +62,7 @@ kubectl get nodes -Install [nginx](https://github.com/kubernetes/ingress-nginx) ingress controller with: - -The Kubernetes Nginx Ingress Controller maintains a kind-compatible manifest - deploy this to the cluster using: +Install [ingress-nginx](https://github.com/kubernetes/ingress-nginx) controller with: ```bash kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml @@ -165,7 +163,7 @@ kubectl get secret mission-control-admin-password \ --template='{{.data.password | base64decode}}' ``` -You can then goto [https://127.0.0.1.nip.io:8443](https://127.0.0.1.nip.io:8443) to login. +You can then go to [https://127.0.0.1.nip.io:8443](https://127.0.0.1.nip.io:8443) to login. :::info Self-Signed Certificate This example uses a self-signed certificate created by nginx, We recommend using [cert-manager.io](https://cert-manager.io/). diff --git a/mission-control/docs/integrations/aws/getting-started.md b/mission-control/docs/integrations/aws/getting-started.md index 3d599faf..00be37b9 100644 --- a/mission-control/docs/integrations/aws/getting-started.md +++ b/mission-control/docs/integrations/aws/getting-started.md @@ -41,7 +41,7 @@ For Cost & Usage Reporting 1. Create a new connection for an [AWS Access Key](/integrations/aws/iam?type=accessKey) -1. Install the [mission-control-aws](https://artifacthub.io/packages/helm/flanksource/mission-control-aws) chart +1. Install the [mission-control-aws](https://artifacthub.io/packages/helm/flanksource/mission-control-aws) chart - Aggregrate Alarms + Aggregate Alarms diff --git a/mission-control/package-lock.json b/mission-control/package-lock.json index e00e061e..20accccf 100644 --- a/mission-control/package-lock.json +++ b/mission-control/package-lock.json @@ -11,7 +11,7 @@ "@docusaurus/core": "3.7.0", "@docusaurus/plugin-client-redirects": "3.7.0", "@docusaurus/preset-classic": "3.7.0", - "@flanksource/icons": "^1.0.32", + "@flanksource/icons": "^1.0.34", "@floating-ui/react": "^0.26.28", "@iconify/react": "^5.1.0", "@mdx-js/react": "^3.0.0", @@ -3715,9 +3715,9 @@ } }, "node_modules/@flanksource/icons": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/@flanksource/icons/-/icons-1.0.32.tgz", - "integrity": "sha512-0f6P+CBzcc90O16KUuPDeie1PBg91teeusFaXBLK+Dl+G9Hb4iF7mvkjnHSXy/daABY51Vh5H++GhDHl4Ni7NQ==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@flanksource/icons/-/icons-1.0.34.tgz", + "integrity": "sha512-U9WVAOM06FfE+HtnmSkBzUi0QPn9M6In9Z2JzPi8IDQ4bpbV6747UbV9NOJ5LRbqdaOVKKxHfP9BLxsRU8gXBg==", "peerDependencies": { "react": "*" } @@ -24826,9 +24826,9 @@ "dev": true }, "@flanksource/icons": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/@flanksource/icons/-/icons-1.0.32.tgz", - "integrity": "sha512-0f6P+CBzcc90O16KUuPDeie1PBg91teeusFaXBLK+Dl+G9Hb4iF7mvkjnHSXy/daABY51Vh5H++GhDHl4Ni7NQ==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@flanksource/icons/-/icons-1.0.34.tgz", + "integrity": "sha512-U9WVAOM06FfE+HtnmSkBzUi0QPn9M6In9Z2JzPi8IDQ4bpbV6747UbV9NOJ5LRbqdaOVKKxHfP9BLxsRU8gXBg==", "requires": {} }, "@floating-ui/core": { diff --git a/modules/Makefile b/modules/Makefile index 78ae4503..89dda592 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -26,6 +26,5 @@ manifests: .bin/helm .bin/yq tar -xzf .bin/helm.tar.gz -C .bin --strip-components 1 .bin/yq: .bin - - wget -nv https://github.com/mikefarah/yq/releases/download/v4.37.4/yq_$(OS)_$(ARCH) -O .bin/yq + wget -nv https://github.com/mikefarah/yq/releases/download/v4.45.1/yq_$(OS)_$(ARCH) -O .bin/yq chmod +x .bin/yq diff --git a/styles/ignore/words-with-suggestions.txt b/styles/ignore/words-with-suggestions.txt index ac5a7672..e7ab9d95 100644 --- a/styles/ignore/words-with-suggestions.txt +++ b/styles/ignore/words-with-suggestions.txt @@ -71,6 +71,7 @@ blackbox Blackbox bool boolean +auditability booleans Booleans bools From 589b3e86c1e27c7179ef98c0bfb06390314b5771 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 17:03:49 +0300 Subject: [PATCH 15/16] chore: build fix --- common/snippets/_types.md | 7 ------- styles/Flanksource/Acronyms.yml | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/common/snippets/_types.md b/common/snippets/_types.md index 4b352b76..d59611a5 100644 --- a/common/snippets/_types.md +++ b/common/snippets/_types.md @@ -1,10 +1,3 @@ ---- -hide_title: true -title: Common Types -sidebar_position: 2 -sidebar_custom_props: - icon: library ---- # Common Types This document provides a reference for common types used in the configuration and operation of the system. diff --git a/styles/Flanksource/Acronyms.yml b/styles/Flanksource/Acronyms.yml index d871b89e..150db768 100644 --- a/styles/Flanksource/Acronyms.yml +++ b/styles/Flanksource/Acronyms.yml @@ -19,7 +19,22 @@ exceptions: - CRUD - CSS - CSV + - RDS + - SQS + - Subnet + - IAMRole + - ECSTask + - ECSCluster + - EBSVolume + - EBSVolume + - DNSZone + - DHCP + - ECS - DNS + - EKS + - IAM + - IRSA + - VPC - DEBUG - DOM - DPI From b5d68b9386b325f51811f098adebd454a8f26d79 Mon Sep 17 00:00:00 2001 From: Moshe Immerman Date: Fri, 28 Mar 2025 17:28:13 +0300 Subject: [PATCH 16/16] chore: build fix --- .github/workflows/lint.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b96240b7..b51c4296 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,7 +28,8 @@ jobs: - name: Install dependencies and build run: | - cd ${{ matrix.repo }} + cd modules && make all + cd ../${{ matrix.repo }} echo "Installing packages in $(pwd)" npm ci echo "Building $(pwd)"