From de4531864eb539170ef4c9d35eac8eefa7d45633 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Tue, 9 Jun 2026 15:58:10 +0200 Subject: [PATCH 01/26] feat!: remove deprecated Elasticsearch driver BREAKING CHANGE: The Elasticsearch driver has been removed. It was deprecated in v1.6.0. There is no drop-in replacement. --- .github/actions/integration/elasticsearch.sh | 12 - .github/labeler.yml | 4 - .github/workflows/push.yml | 2 +- DEPRECATION.md | 6 +- .../data-sources/elasticsearch.mdx | 75 - .../connect-to-data/data-sources/index.mdx | 3 - .../admin/deployment/providers/aws.mdx | 1 - docs-mintlify/docs.json | 1 - .../configuration/environment-variables.mdx | 38 - .../deployment/providers/aws.mdx | 1 - .../product/administration/pricing.mdx | 2 +- .../configuration/data-sources/_meta.js | 1 - .../data-sources/elasticsearch.mdx | 69 - .../configuration/data-sources/index.mdx | 5 - .../reference/environment-variables.mdx | 38 - docs/redirects-new-docs.json | 10 - docs/redirects.json | 5 - packages/cubejs-backend-shared/src/env.ts | 44 - .../test/db_env_multi.test.ts | 116 - .../test/db_env_single.test.ts | 68 - packages/cubejs-docker/dev.Dockerfile | 2 - packages/cubejs-docker/package.json | 1 - packages/cubejs-docker/package.json.local | 1 - .../cubejs-docker/testing-drivers.Dockerfile | 2 - .../cubejs-elasticsearch-driver/CHANGELOG.md | 2262 ----------------- packages/cubejs-elasticsearch-driver/LICENSE | 202 -- .../cubejs-elasticsearch-driver/README.md | 23 - .../docker-compose.yml | 16 - .../driver/ElasticSearchDriver.js | 187 -- .../driver/index.d.ts | 14 - .../jest.config.js | 11 - .../cubejs-elasticsearch-driver/package.json | 44 - .../ElasticSearchOpenDistro.integration.js | 76 - .../src/adapter/AWSElasticSearchQuery.ts | 43 - .../src/adapter/ElasticSearchQuery.ts | 157 -- .../src/adapter/QueryBuilder.ts | 4 - .../src/adapter/index.ts | 2 - .../src/core/DriverDependencies.ts | 2 - packages/cubejs-server-core/src/core/types.ts | 2 - yarn.lock | 21 - 40 files changed, 6 insertions(+), 3567 deletions(-) delete mode 100755 .github/actions/integration/elasticsearch.sh delete mode 100644 docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx delete mode 100644 docs/content/product/configuration/data-sources/elasticsearch.mdx delete mode 100644 packages/cubejs-elasticsearch-driver/CHANGELOG.md delete mode 100644 packages/cubejs-elasticsearch-driver/LICENSE delete mode 100644 packages/cubejs-elasticsearch-driver/README.md delete mode 100644 packages/cubejs-elasticsearch-driver/docker-compose.yml delete mode 100644 packages/cubejs-elasticsearch-driver/driver/ElasticSearchDriver.js delete mode 100644 packages/cubejs-elasticsearch-driver/driver/index.d.ts delete mode 100644 packages/cubejs-elasticsearch-driver/jest.config.js delete mode 100644 packages/cubejs-elasticsearch-driver/package.json delete mode 100644 packages/cubejs-elasticsearch-driver/test/ElasticSearchOpenDistro.integration.js delete mode 100644 packages/cubejs-schema-compiler/src/adapter/AWSElasticSearchQuery.ts delete mode 100644 packages/cubejs-schema-compiler/src/adapter/ElasticSearchQuery.ts diff --git a/.github/actions/integration/elasticsearch.sh b/.github/actions/integration/elasticsearch.sh deleted file mode 100755 index a8e992bd1e48a..0000000000000 --- a/.github/actions/integration/elasticsearch.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -eo pipefail - -# Debug log for test containers -export DEBUG=testcontainers - -export TEST_ELASTIC_OPENDISTRO_VERSION=1.13.1 - -echo "::group::ElasticSearch Open Distro ${TEST_ELASTIC_OPENDISTRO_VERSION}"; -docker pull amazon/opendistro-for-elasticsearch:${TEST_ELASTIC_OPENDISTRO_VERSION} -yarn lerna run --concurrency 1 --stream --no-prefix integration:elastic -echo "::endgroup::" diff --git a/.github/labeler.yml b/.github/labeler.yml index 4ba956abe5a3f..2c1f7027c041e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -44,10 +44,6 @@ driver:duckdb: - changed-files: - any-glob-to-any-file: packages/cubejs-duckdb-driver/**/* -driver:elasticsearch: -- changed-files: - - any-glob-to-any-file: packages/cubejs-elasticsearch-driver/**/* - driver:firebolt: - changed-files: - any-glob-to-any-file: packages/cubejs-firebolt-driver/**/* diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index afb169236f123..dc15b9d60ced4 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -400,7 +400,7 @@ jobs: # @see https://github.com/vertica/vertica-containers/issues/64 db: [ 'athena', 'bigquery', 'snowflake', 'trino', - 'clickhouse', 'druid', 'elasticsearch', 'mssql', 'mysql', 'postgres', 'prestodb', + 'clickhouse', 'druid', 'mssql', 'mysql', 'postgres', 'prestodb', 'mysql-aurora-serverless', 'crate', 'mongobi', 'firebolt', # 'dremio' # Commented out because of flaky integration tests # 'vertica' diff --git a/DEPRECATION.md b/DEPRECATION.md index e1ea79ecd51a4..392591f9b00a7 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -67,7 +67,7 @@ features: | Deprecated | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | | | Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | | | Deprecated | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | | -| Deprecated | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | | +| Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 | | Deprecated | [`context_to_roles`](#context-to-roles) | v1.6.4 | | ### Node.js 8 @@ -427,7 +427,9 @@ options and use the new `cache` parameter of the `/v1/load` endpoint instead. **Deprecated in Release: v1.6.0** -The Elasticsearch driver is deprecated and will be removed in a future release. +**Removed in Release: v1.7.0** + +The Elasticsearch driver has been removed. ### `context_to_roles` diff --git a/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx b/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx deleted file mode 100644 index ec4544d7707f0..0000000000000 --- a/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Elasticsearch -description: The driver for Elasticsearch is community-supported and is not maintained by Cube or the database vendor. ---- - - - -The driver for Elasticsearch is community-supported and is not maintained by Cube or the database vendor. - - - - - -Elasticsearch driver is deprecated and will be removed in a future release. - - - -## Prerequisites - -To connect to an [Elasticsearch][elasticsearch] database, use [`CUBEJS_DB_URL`](/reference/configuration/environment-variables#cubejs_db_url) -with the username and password embedded in the URL, if required. - - - -If you're not using [Elastic Cloud][elastic-cloud], you **must** specify -[`CUBEJS_DB_ELASTIC_QUERY_FORMAT`](/reference/configuration/environment-variables#cubejs_db_elastic_query_format). - - - -## Setup - -### Manual - -For a self-hosted Elasticsearch instance, add the following to a `.env` file in -your Cube project: - -```dotenv -CUBEJS_DB_TYPE=elasticsearch -CUBEJS_DB_URL=https://my.elasticsearch.host:9200 -CUBEJS_DB_ELASTIC_QUERY_FORMAT=json -``` - -For an Elasticsearch instanced hosted by [Elastic.co][elastic-co], add the -following to a `.env` file in your Cube project: - -```dotenv -CUBEJS_DB_TYPE=elasticsearch -CUBEJS_DB_URL=https://my.elasticsearch.host:9200 -CUBEJS_DB_ELASTIC_APIKEY_ID=VuaCfGcBCdbkQm-e5aOx -CUBEJS_DB_ELASTIC_APIKEY_KEY=ui2lp2axTNmsyakw9tvNnw -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | :------: | -| [`CUBEJS_DB_URL`](/reference/configuration/environment-variables#cubejs_db_url) | The URL for a database | A valid database URL for Elasticsearch | ✅ | -| [`CUBEJS_DB_ELASTIC_QUERY_FORMAT`](/reference/configuration/environment-variables#cubejs_db_elastic_query_format) | By default, queries return data in JDBC format, but you can also return data in standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC are currently supported) | `json`, `jdbc` | ❌ | -| [`CUBEJS_DB_ELASTIC_OPENDISTRO`](/reference/configuration/environment-variables#cubejs_db_elastic_opendistro) | If `true`, then use the Open Distro for Elasticsearch | `true`, `false` | ❌ | -| [`CUBEJS_DB_ELASTIC_APIKEY_ID`](/reference/configuration/environment-variables#cubejs_db_elastic_apikey_id) | [ID of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key ID | ❌ | -| [`CUBEJS_DB_ELASTIC_APIKEY_KEY`](/reference/configuration/environment-variables#cubejs_db_elastic_apikey_key) | [Value of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key value | ❌ | -| [`CUBEJS_DB_MAX_POOL`](/reference/configuration/environment-variables#cubejs_db_max_pool) | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | -| [`CUBEJS_CONCURRENCY`](/reference/configuration/environment-variables#cubejs_concurrency) | The number of [concurrent queries][ref-data-source-concurrency] to the data source | A valid number | ❌ | - -[ref-data-source-concurrency]: /admin/connect-to-data/concurrency#data-source-concurrency -## SSL - -Cube does not require any additional configuration to enable SSL as -Elasticsearch connections are made over HTTPS. - -[elastic-co]: https://elastic.co/ -[elastic-cloud]: https://cloud.elastic.co/ -[elasticsearch]: https://www.elastic.co/elasticsearch/ -[elastic-docs-api-keys]: - https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key diff --git a/docs-mintlify/admin/connect-to-data/data-sources/index.mdx b/docs-mintlify/admin/connect-to-data/data-sources/index.mdx index 49fa42ffbcc8b..d29cab0553b8f 100644 --- a/docs-mintlify/admin/connect-to-data/data-sources/index.mdx +++ b/docs-mintlify/admin/connect-to-data/data-sources/index.mdx @@ -107,9 +107,6 @@ sources. ## Other data sources - - Connect to Elasticsearch. - Connect to MongoDB. diff --git a/docs-mintlify/admin/deployment/providers/aws.mdx b/docs-mintlify/admin/deployment/providers/aws.mdx index f63a75aa218eb..88731f57fe4f2 100644 --- a/docs-mintlify/admin/deployment/providers/aws.mdx +++ b/docs-mintlify/admin/deployment/providers/aws.mdx @@ -21,7 +21,6 @@ Cube Cloud integrates with the following [data sources](/admin/connect-to-data/d - [Amazon Athena](/admin/connect-to-data/data-sources/aws-athena) - [Postgres](/admin/connect-to-data/data-sources/postgres), [Microsoft SQL Server](/admin/connect-to-data/data-sources/ms-sql), [MySQL](/admin/connect-to-data/data-sources/mysql), and [Oracle](/admin/connect-to-data/data-sources/oracle) on [Amazon RDS](https://aws.amazon.com/rds/) - [Hive / SparkSQL](/admin/connect-to-data/data-sources/hive), [Presto](/admin/connect-to-data/data-sources/presto), and [Trino](/admin/connect-to-data/data-sources/trino) on [Amazon EMR](https://aws.amazon.com/emr/) -- [Elasticsearch](/admin/connect-to-data/data-sources/elasticsearch) on [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/) - [Parquet, CSV, and JSON files](/admin/connect-to-data/data-sources/duckdb) on [Amazon S3](https://aws.amazon.com/s3/) ## Data visualization tools diff --git a/docs-mintlify/docs.json b/docs-mintlify/docs.json index 6353ba0c4f484..5f867afa4cce4 100644 --- a/docs-mintlify/docs.json +++ b/docs-mintlify/docs.json @@ -245,7 +245,6 @@ "admin/connect-to-data/data-sources/databricks-jdbc", "admin/connect-to-data/data-sources/druid", "admin/connect-to-data/data-sources/duckdb", - "admin/connect-to-data/data-sources/elasticsearch", "admin/connect-to-data/data-sources/firebolt", "admin/connect-to-data/data-sources/google-bigquery", "admin/connect-to-data/data-sources/hive", diff --git a/docs-mintlify/reference/configuration/environment-variables.mdx b/docs-mintlify/reference/configuration/environment-variables.mdx index 6bf869d010021..82a72ba574b36 100644 --- a/docs-mintlify/reference/configuration/environment-variables.mdx +++ b/docs-mintlify/reference/configuration/environment-variables.mdx @@ -430,42 +430,6 @@ A flag to use credentials chain for secrets for S3 connections. | ----------------------------------------------------- | ---------------------- | --------------------- | | `true`, `false` | `false` | `false` | -## `CUBEJS_DB_ELASTIC_APIKEY_ID` - -The [ID of the API key from elastic.co][elastic-docs-api-keys]. Required when -using Elastic Cloud. - -| Possible Values | Default in Development | Default in Production | -| ----------------------------- | ---------------------- | --------------------- | -| A valid Elastic.co API key ID | N/A | N/A | - -## `CUBEJS_DB_ELASTIC_APIKEY_KEY` - -The [API key from elastic.co][elastic-docs-api-keys]. Required when using -Elastic Cloud. - -| Possible Values | Default in Development | Default in Production | -| -------------------------- | ---------------------- | --------------------- | -| A valid Elastic.co API key | N/A | N/A | - -## `CUBEJS_DB_ELASTIC_OPENDISTRO` - -If `true`, then use the Open Distro for Elasticsearch. - -| Possible Values | Default in Development | Default in Production | -| --------------- | ---------------------- | --------------------- | -| `true`, `false` | N/A | N/A | - -## `CUBEJS_DB_ELASTIC_QUERY_FORMAT` - -By default, queries return data in JDBC format, but you can also return data in -standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC -are currently supported). - -| Possible Values | Default in Development | Default in Production | -| --------------- | ---------------------- | --------------------- | -| `json`, `jdbc` | N/A | N/A | - ## `CUBEJS_DB_EXPORT_BUCKET` The name of a bucket in cloud storage to store the database export snapshots. @@ -2122,8 +2086,6 @@ The port for a Cube deployment to listen to API connections on. https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs [databricks-docs-pat]: https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management -[elastic-docs-api-keys]: - https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key [firebolt-docs-account-name]: https://docs.firebolt.io/managing-your-account/concepts-and-terminology.html#firebolt-account [firebolt-docs-engine-name]: diff --git a/docs/content/product/administration/deployment/providers/aws.mdx b/docs/content/product/administration/deployment/providers/aws.mdx index b2eb06a1ceb5c..d771ac75122cc 100644 --- a/docs/content/product/administration/deployment/providers/aws.mdx +++ b/docs/content/product/administration/deployment/providers/aws.mdx @@ -18,7 +18,6 @@ Cube Cloud integrates with the following [data sources](/product/configuration/d - [Amazon Athena](/product/configuration/data-sources/aws-athena) - [Postgres](/product/configuration/data-sources/postgres), [Microsoft SQL Server](/product/configuration/data-sources/ms-sql), [MySQL](/product/configuration/data-sources/mysql), and [Oracle](/product/configuration/data-sources/oracle) on [Amazon RDS](https://aws.amazon.com/rds/) - [Hive / SparkSQL](/product/configuration/data-sources/hive), [Presto](/product/configuration/data-sources/presto), and [Trino](/product/configuration/data-sources/trino) on [Amazon EMR](https://aws.amazon.com/emr/) -- [Elasticsearch](/product/configuration/data-sources/elasticsearch) on [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/) - [Parquet, CSV, and JSON files](/product/configuration/data-sources/duckdb) on [Amazon S3](https://aws.amazon.com/s3/) ## Data visualization tools diff --git a/docs/content/product/administration/pricing.mdx b/docs/content/product/administration/pricing.mdx index 9a051a24c7193..541a922848558 100644 --- a/docs/content/product/administration/pricing.mdx +++ b/docs/content/product/administration/pricing.mdx @@ -88,7 +88,7 @@ terms][ref-enterprise-tier-support], and [limits][ref-cloud-limits]. mission-critical production deployments with security and compliance needs.** It offers everything in the [Enterprise product tier](#enterprise) as well as -unlimited pre-aggregation sizes, and support for kSQL and Elasticsearch. Cube +unlimited pre-aggregation sizes, and support for kSQL. Cube Cloud provides a 99.995% uptime SLA for this product tier. You can review its [pricing][cube-pricing], [support diff --git a/docs/content/product/configuration/data-sources/_meta.js b/docs/content/product/configuration/data-sources/_meta.js index d17eb6899dfd6..73d391bcda7de 100644 --- a/docs/content/product/configuration/data-sources/_meta.js +++ b/docs/content/product/configuration/data-sources/_meta.js @@ -6,7 +6,6 @@ export default { "databricks-jdbc": "Databricks", "druid": "Druid", "duckdb": "DuckDB / MotherDuck", - "elasticsearch": "Elasticsearch", "firebolt": "Firebolt", "google-bigquery": "Google BigQuery", "hive": "Hive / SparkSQL", diff --git a/docs/content/product/configuration/data-sources/elasticsearch.mdx b/docs/content/product/configuration/data-sources/elasticsearch.mdx deleted file mode 100644 index ec26d00c30955..0000000000000 --- a/docs/content/product/configuration/data-sources/elasticsearch.mdx +++ /dev/null @@ -1,69 +0,0 @@ -# Elasticsearch - - - - - -Elasticsearch driver is deprecated and will be removed in a future release. - - - -## Prerequisites - -To connect to an [Elasticsearch][elasticsearch] database, use CUBEJS_DB_URL -with the username and password embedded in the URL, if required. - - - -If you're not using [Elastic Cloud][elastic-cloud], you **must** specify -CUBEJS_DB_ELASTIC_QUERY_FORMAT. - - - -## Setup - -### Manual - -For a self-hosted Elasticsearch instance, add the following to a `.env` file in -your Cube project: - -```dotenv -CUBEJS_DB_TYPE=elasticsearch -CUBEJS_DB_URL=https://my.elasticsearch.host:9200 -CUBEJS_DB_ELASTIC_QUERY_FORMAT=json -``` - -For an Elasticsearch instanced hosted by [Elastic.co][elastic-co], add the -following to a `.env` file in your Cube project: - -```dotenv -CUBEJS_DB_TYPE=elasticsearch -CUBEJS_DB_URL=https://my.elasticsearch.host:9200 -CUBEJS_DB_ELASTIC_APIKEY_ID=VuaCfGcBCdbkQm-e5aOx -CUBEJS_DB_ELASTIC_APIKEY_KEY=ui2lp2axTNmsyakw9tvNnw -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | :------: | -| CUBEJS_DB_URL | The URL for a database | A valid database URL for Elasticsearch | ✅ | -| CUBEJS_DB_ELASTIC_QUERY_FORMAT | By default, queries return data in JDBC format, but you can also return data in standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC are currently supported) | `json`, `jdbc` | ❌ | -| CUBEJS_DB_ELASTIC_OPENDISTRO | If `true`, then use the Open Distro for Elasticsearch | `true`, `false` | ❌ | -| CUBEJS_DB_ELASTIC_APIKEY_ID | [ID of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key ID | ❌ | -| CUBEJS_DB_ELASTIC_APIKEY_KEY | [Value of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key value | ❌ | -| CUBEJS_DB_MAX_POOL | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | -| CUBEJS_CONCURRENCY | The number of [concurrent queries][ref-data-source-concurrency] to the data source | A valid number | ❌ | - -[ref-data-source-concurrency]: /product/configuration/concurrency#data-source-concurrency - -## SSL - -Cube does not require any additional configuration to enable SSL as -Elasticsearch connections are made over HTTPS. - -[elastic-co]: https://elastic.co/ -[elastic-cloud]: https://cloud.elastic.co/ -[elasticsearch]: https://www.elastic.co/elasticsearch/ -[elastic-docs-api-keys]: - https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key diff --git a/docs/content/product/configuration/data-sources/index.mdx b/docs/content/product/configuration/data-sources/index.mdx index f575c35d2544f..45e055d44539a 100644 --- a/docs/content/product/configuration/data-sources/index.mdx +++ b/docs/content/product/configuration/data-sources/index.mdx @@ -158,11 +158,6 @@ sources. ## Other data sources - any> = { .asBool() ), - /** **************************************************************** - * ElasticSearch Driver * - ***************************************************************** */ - - /** - * ElasticSearch API Id. - */ - elasticApiId: ({ - dataSource, - preAggregations, - }: DataSourceOpts) => ( - get(keyByDataSource('CUBEJS_DB_ELASTIC_APIKEY_ID', dataSource, preAggregations)).asString() - ), - - /** - * ElasticSearch API Key. - */ - elasticApiKey: ({ - dataSource, - preAggregations, - }: DataSourceOpts) => ( - get(keyByDataSource('CUBEJS_DB_ELASTIC_APIKEY_KEY', dataSource, preAggregations)).asString() - ), - - /** - * ElasticSearch OpenDistro flag. - */ - elasticOpenDistro: ({ - dataSource, - preAggregations, - }: DataSourceOpts) => ( - get(keyByDataSource('CUBEJS_DB_ELASTIC_OPENDISTRO', dataSource, preAggregations)).asString() - ), - - /** - * ElasticSearch query format. - */ - elasticQueryFormat: ({ - dataSource, - preAggregations, - }: DataSourceOpts) => ( - get(keyByDataSource('CUBEJS_DB_ELASTIC_QUERY_FORMAT', dataSource, preAggregations)).asString() - ), - /** **************************************************************** * Firebolt Driver * ***************************************************************** */ diff --git a/packages/cubejs-backend-shared/test/db_env_multi.test.ts b/packages/cubejs-backend-shared/test/db_env_multi.test.ts index c93b0fa4329fb..ea6e7d4cfa771 100644 --- a/packages/cubejs-backend-shared/test/db_env_multi.test.ts +++ b/packages/cubejs-backend-shared/test/db_env_multi.test.ts @@ -1566,122 +1566,6 @@ describe('Multiple datasources', () => { ); }); - test('getEnv("elasticApiId")', () => { - process.env.CUBEJS_DB_ELASTIC_APIKEY_ID = 'default1'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_ID = 'postgres1'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_ID = 'wrong1'; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toEqual('postgres1'); - expect(() => getEnv('elasticApiId', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - process.env.CUBEJS_DB_ELASTIC_APIKEY_ID = 'default2'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_ID = 'postgres2'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_ID = 'wrong2'; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toEqual('postgres2'); - expect(() => getEnv('elasticApiId', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - delete process.env.CUBEJS_DB_ELASTIC_APIKEY_ID; - delete process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_ID; - delete process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_ID; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toBeUndefined(); - expect(() => getEnv('elasticApiId', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - }); - - test('getEnv("elasticApiKey")', () => { - process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY = 'default1'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_KEY = 'postgres1'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_KEY = 'wrong1'; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toEqual('postgres1'); - expect(() => getEnv('elasticApiKey', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY = 'default2'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_KEY = 'postgres2'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_KEY = 'wrong2'; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toEqual('postgres2'); - expect(() => getEnv('elasticApiKey', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - delete process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY; - delete process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_APIKEY_KEY; - delete process.env.CUBEJS_DS_WRONG_DB_ELASTIC_APIKEY_KEY; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toBeUndefined(); - expect(() => getEnv('elasticApiKey', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - }); - - test('getEnv("elasticOpenDistro")', () => { - process.env.CUBEJS_DB_ELASTIC_OPENDISTRO = 'default1'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_OPENDISTRO = 'postgres1'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_OPENDISTRO = 'wrong1'; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toEqual('postgres1'); - expect(() => getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - process.env.CUBEJS_DB_ELASTIC_OPENDISTRO = 'default2'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_OPENDISTRO = 'postgres2'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_OPENDISTRO = 'wrong2'; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toEqual('postgres2'); - expect(() => getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - delete process.env.CUBEJS_DB_ELASTIC_OPENDISTRO; - delete process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_OPENDISTRO; - delete process.env.CUBEJS_DS_WRONG_DB_ELASTIC_OPENDISTRO; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toBeUndefined(); - expect(() => getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - }); - - test('getEnv("elasticQueryFormat")', () => { - process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT = 'default1'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_QUERY_FORMAT = 'postgres1'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_QUERY_FORMAT = 'wrong1'; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toEqual('postgres1'); - expect(() => getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT = 'default2'; - process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_QUERY_FORMAT = 'postgres2'; - process.env.CUBEJS_DS_WRONG_DB_ELASTIC_QUERY_FORMAT = 'wrong2'; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toEqual('postgres2'); - expect(() => getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - - delete process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT; - delete process.env.CUBEJS_DS_POSTGRES_DB_ELASTIC_QUERY_FORMAT; - delete process.env.CUBEJS_DS_WRONG_DB_ELASTIC_QUERY_FORMAT; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toBeUndefined(); - expect(() => getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toThrow( - 'The wrong data source is missing in the declared CUBEJS_DATASOURCES.' - ); - }); - test('getEnv("fireboltApiEndpoint")', () => { process.env.CUBEJS_FIREBOLT_API_ENDPOINT = 'default1'; process.env.CUBEJS_DS_POSTGRES_FIREBOLT_API_ENDPOINT = 'postgres1'; diff --git a/packages/cubejs-backend-shared/test/db_env_single.test.ts b/packages/cubejs-backend-shared/test/db_env_single.test.ts index 411aa0eb79558..adc04585701fb 100644 --- a/packages/cubejs-backend-shared/test/db_env_single.test.ts +++ b/packages/cubejs-backend-shared/test/db_env_single.test.ts @@ -986,74 +986,6 @@ describe('Single datasources', () => { expect(getEnv('clickhouseCompression', { dataSource: 'wrong' })).toEqual(false); }); - test('getEnv("elasticApiId")', () => { - process.env.CUBEJS_DB_ELASTIC_APIKEY_ID = 'default1'; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toEqual('default1'); - expect(getEnv('elasticApiId', { dataSource: 'wrong' })).toEqual('default1'); - - process.env.CUBEJS_DB_ELASTIC_APIKEY_ID = 'default2'; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toEqual('default2'); - expect(getEnv('elasticApiId', { dataSource: 'wrong' })).toEqual('default2'); - - delete process.env.CUBEJS_DB_ELASTIC_APIKEY_ID; - expect(getEnv('elasticApiId', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticApiId', { dataSource: 'postgres' })).toBeUndefined(); - expect(getEnv('elasticApiId', { dataSource: 'wrong' })).toBeUndefined(); - }); - - test('getEnv("elasticApiKey")', () => { - process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY = 'default1'; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toEqual('default1'); - expect(getEnv('elasticApiKey', { dataSource: 'wrong' })).toEqual('default1'); - - process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY = 'default2'; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toEqual('default2'); - expect(getEnv('elasticApiKey', { dataSource: 'wrong' })).toEqual('default2'); - - delete process.env.CUBEJS_DB_ELASTIC_APIKEY_KEY; - expect(getEnv('elasticApiKey', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticApiKey', { dataSource: 'postgres' })).toBeUndefined(); - expect(getEnv('elasticApiKey', { dataSource: 'wrong' })).toBeUndefined(); - }); - - test('getEnv("elasticOpenDistro")', () => { - process.env.CUBEJS_DB_ELASTIC_OPENDISTRO = 'default1'; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toEqual('default1'); - expect(getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toEqual('default1'); - - process.env.CUBEJS_DB_ELASTIC_OPENDISTRO = 'default2'; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toEqual('default2'); - expect(getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toEqual('default2'); - - delete process.env.CUBEJS_DB_ELASTIC_OPENDISTRO; - expect(getEnv('elasticOpenDistro', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticOpenDistro', { dataSource: 'postgres' })).toBeUndefined(); - expect(getEnv('elasticOpenDistro', { dataSource: 'wrong' })).toBeUndefined(); - }); - - test('getEnv("elasticQueryFormat")', () => { - process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT = 'default1'; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toEqual('default1'); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toEqual('default1'); - expect(getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toEqual('default1'); - - process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT = 'default2'; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toEqual('default2'); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toEqual('default2'); - expect(getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toEqual('default2'); - - delete process.env.CUBEJS_DB_ELASTIC_QUERY_FORMAT; - expect(getEnv('elasticQueryFormat', { dataSource: 'default' })).toBeUndefined(); - expect(getEnv('elasticQueryFormat', { dataSource: 'postgres' })).toBeUndefined(); - expect(getEnv('elasticQueryFormat', { dataSource: 'wrong' })).toBeUndefined(); - }); - test('getEnv("fireboltApiEndpoint")', () => { process.env.CUBEJS_FIREBOLT_API_ENDPOINT = 'default1'; expect(getEnv('fireboltApiEndpoint', { dataSource: 'default' })).toEqual('default1'); diff --git a/packages/cubejs-docker/dev.Dockerfile b/packages/cubejs-docker/dev.Dockerfile index d07058d87058a..9cf9ca88cbd16 100644 --- a/packages/cubejs-docker/dev.Dockerfile +++ b/packages/cubejs-docker/dev.Dockerfile @@ -50,7 +50,6 @@ COPY packages/cubejs-crate-driver/package.json packages/cubejs-crate-driver/pack COPY packages/cubejs-dremio-driver/package.json packages/cubejs-dremio-driver/package.json COPY packages/cubejs-druid-driver/package.json packages/cubejs-druid-driver/package.json COPY packages/cubejs-duckdb-driver/package.json packages/cubejs-duckdb-driver/package.json -COPY packages/cubejs-elasticsearch-driver/package.json packages/cubejs-elasticsearch-driver/package.json COPY packages/cubejs-firebolt-driver/package.json packages/cubejs-firebolt-driver/package.json COPY packages/cubejs-hive-driver/package.json packages/cubejs-hive-driver/package.json COPY packages/cubejs-mongobi-driver/package.json packages/cubejs-mongobi-driver/package.json @@ -126,7 +125,6 @@ COPY packages/cubejs-crate-driver/ packages/cubejs-crate-driver/ COPY packages/cubejs-dremio-driver/ packages/cubejs-dremio-driver/ COPY packages/cubejs-druid-driver/ packages/cubejs-druid-driver/ COPY packages/cubejs-duckdb-driver/ packages/cubejs-duckdb-driver/ -COPY packages/cubejs-elasticsearch-driver/ packages/cubejs-elasticsearch-driver/ COPY packages/cubejs-firebolt-driver/ packages/cubejs-firebolt-driver/ COPY packages/cubejs-hive-driver/ packages/cubejs-hive-driver/ COPY packages/cubejs-mongobi-driver/ packages/cubejs-mongobi-driver/ diff --git a/packages/cubejs-docker/package.json b/packages/cubejs-docker/package.json index 6522ed993f58f..129331edcd073 100644 --- a/packages/cubejs-docker/package.json +++ b/packages/cubejs-docker/package.json @@ -18,7 +18,6 @@ "@cubejs-backend/dremio-driver": "1.6.62", "@cubejs-backend/druid-driver": "1.6.62", "@cubejs-backend/duckdb-driver": "1.6.62", - "@cubejs-backend/elasticsearch-driver": "1.6.62", "@cubejs-backend/firebolt-driver": "1.6.62", "@cubejs-backend/hive-driver": "1.6.62", "@cubejs-backend/ksql-driver": "1.6.62", diff --git a/packages/cubejs-docker/package.json.local b/packages/cubejs-docker/package.json.local index 1be5e72927ddf..2a5beb1d3e3b5 100644 --- a/packages/cubejs-docker/package.json.local +++ b/packages/cubejs-docker/package.json.local @@ -21,7 +21,6 @@ "@cubejs-backend/dremio-driver": "file:/cube-build/packages/cubejs-dremio-driver", "@cubejs-backend/druid-driver": "file:/cube-build/packages/cubejs-druid-driver", "@cubejs-backend/duckdb-driver": "file:/cube-build/packages/cubejs-duckdb-driver", - "@cubejs-backend/elasticsearch-driver": "file:/cube-build/packages/cubejs-elasticsearch-driver", "@cubejs-backend/firebolt-driver": "file:/cube-build/packages/cubejs-firebolt-driver", "@cubejs-backend/hive-driver": "file:/cube-build/packages/cubejs-hive-driver", "@cubejs-backend/ksql-driver": "file:/cube-build/packages/cubejs-ksql-driver", diff --git a/packages/cubejs-docker/testing-drivers.Dockerfile b/packages/cubejs-docker/testing-drivers.Dockerfile index e7da9e95793d5..a5f9427a1721e 100644 --- a/packages/cubejs-docker/testing-drivers.Dockerfile +++ b/packages/cubejs-docker/testing-drivers.Dockerfile @@ -46,7 +46,6 @@ COPY packages/cubejs-crate-driver/package.json packages/cubejs-crate-driver/pack COPY packages/cubejs-dremio-driver/package.json packages/cubejs-dremio-driver/package.json COPY packages/cubejs-druid-driver/package.json packages/cubejs-druid-driver/package.json COPY packages/cubejs-duckdb-driver/package.json packages/cubejs-duckdb-driver/package.json -COPY packages/cubejs-elasticsearch-driver/package.json packages/cubejs-elasticsearch-driver/package.json COPY packages/cubejs-firebolt-driver/package.json packages/cubejs-firebolt-driver/package.json COPY packages/cubejs-hive-driver/package.json packages/cubejs-hive-driver/package.json COPY packages/cubejs-mongobi-driver/package.json packages/cubejs-mongobi-driver/package.json @@ -121,7 +120,6 @@ COPY packages/cubejs-crate-driver/ packages/cubejs-crate-driver/ COPY packages/cubejs-dremio-driver/ packages/cubejs-dremio-driver/ COPY packages/cubejs-druid-driver/ packages/cubejs-druid-driver/ COPY packages/cubejs-duckdb-driver/ packages/cubejs-duckdb-driver/ -COPY packages/cubejs-elasticsearch-driver/ packages/cubejs-elasticsearch-driver/ COPY packages/cubejs-firebolt-driver/ packages/cubejs-firebolt-driver/ COPY packages/cubejs-hive-driver/ packages/cubejs-hive-driver/ COPY packages/cubejs-mongobi-driver/ packages/cubejs-mongobi-driver/ diff --git a/packages/cubejs-elasticsearch-driver/CHANGELOG.md b/packages/cubejs-elasticsearch-driver/CHANGELOG.md deleted file mode 100644 index 19ed7f7e38878..0000000000000 --- a/packages/cubejs-elasticsearch-driver/CHANGELOG.md +++ /dev/null @@ -1,2262 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.6.62](https://github.com/cube-js/cube/compare/v1.6.61...v1.6.62) (2026-06-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.61](https://github.com/cube-js/cube/compare/v1.6.60...v1.6.61) (2026-06-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.60](https://github.com/cube-js/cube/compare/v1.6.59...v1.6.60) (2026-06-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.59](https://github.com/cube-js/cube/compare/v1.6.58...v1.6.59) (2026-06-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.58](https://github.com/cube-js/cube/compare/v1.6.57...v1.6.58) (2026-06-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.57](https://github.com/cube-js/cube/compare/v1.6.56...v1.6.57) (2026-06-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.56](https://github.com/cube-js/cube/compare/v1.6.55...v1.6.56) (2026-06-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.55](https://github.com/cube-js/cube/compare/v1.6.54...v1.6.55) (2026-06-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.54](https://github.com/cube-js/cube/compare/v1.6.53...v1.6.54) (2026-06-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.53](https://github.com/cube-js/cube/compare/v1.6.52...v1.6.53) (2026-06-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.52](https://github.com/cube-js/cube/compare/v1.6.51...v1.6.52) (2026-05-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.51](https://github.com/cube-js/cube/compare/v1.6.50...v1.6.51) (2026-05-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.50](https://github.com/cube-js/cube/compare/v1.6.49...v1.6.50) (2026-05-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.49](https://github.com/cube-js/cube/compare/v1.6.48...v1.6.49) (2026-05-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.48](https://github.com/cube-js/cube/compare/v1.6.47...v1.6.48) (2026-05-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.47](https://github.com/cube-js/cube/compare/v1.6.46...v1.6.47) (2026-05-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.46](https://github.com/cube-js/cube/compare/v1.6.45...v1.6.46) (2026-05-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.45](https://github.com/cube-js/cube/compare/v1.6.44...v1.6.45) (2026-05-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.44](https://github.com/cube-js/cube/compare/v1.6.43...v1.6.44) (2026-05-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.43](https://github.com/cube-js/cube/compare/v1.6.42...v1.6.43) (2026-05-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.42](https://github.com/cube-js/cube/compare/v1.6.41...v1.6.42) (2026-05-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.41](https://github.com/cube-js/cube/compare/v1.6.40...v1.6.41) (2026-05-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.40](https://github.com/cube-js/cube/compare/v1.6.39...v1.6.40) (2026-04-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.39](https://github.com/cube-js/cube/compare/v1.6.38...v1.6.39) (2026-04-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.38](https://github.com/cube-js/cube/compare/v1.6.37...v1.6.38) (2026-04-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.37](https://github.com/cube-js/cube/compare/v1.6.36...v1.6.37) (2026-04-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.36](https://github.com/cube-js/cube/compare/v1.6.35...v1.6.36) (2026-04-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.35](https://github.com/cube-js/cube/compare/v1.6.34...v1.6.35) (2026-04-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.34](https://github.com/cube-js/cube/compare/v1.6.33...v1.6.34) (2026-04-14) - -### Features - -- Support pre-aggregation-specific data source configuration ([#10587](https://github.com/cube-js/cube/issues/10587)) ([04eed5d](https://github.com/cube-js/cube/commit/04eed5d5ba3c1ceb8cda3c13eebf7f354eb61f48)) - -## [1.6.33](https://github.com/cube-js/cube/compare/v1.6.32...v1.6.33) (2026-04-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.32](https://github.com/cube-js/cube/compare/v1.6.31...v1.6.32) (2026-04-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.31](https://github.com/cube-js/cube/compare/v1.6.30...v1.6.31) (2026-04-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.30](https://github.com/cube-js/cube/compare/v1.6.29...v1.6.30) (2026-04-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.29](https://github.com/cube-js/cube/compare/v1.6.28...v1.6.29) (2026-03-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.28](https://github.com/cube-js/cube/compare/v1.6.27...v1.6.28) (2026-03-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.27](https://github.com/cube-js/cube/compare/v1.6.26...v1.6.27) (2026-03-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.26](https://github.com/cube-js/cube/compare/v1.6.25...v1.6.26) (2026-03-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.25](https://github.com/cube-js/cube/compare/v1.6.24...v1.6.25) (2026-03-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.24](https://github.com/cube-js/cube/compare/v1.6.23...v1.6.24) (2026-03-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.23](https://github.com/cube-js/cube/compare/v1.6.22...v1.6.23) (2026-03-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.22](https://github.com/cube-js/cube/compare/v1.6.21...v1.6.22) (2026-03-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.21](https://github.com/cube-js/cube/compare/v1.6.20...v1.6.21) (2026-03-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.20](https://github.com/cube-js/cube/compare/v1.6.19...v1.6.20) (2026-03-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.19](https://github.com/cube-js/cube/compare/v1.6.18...v1.6.19) (2026-03-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.18](https://github.com/cube-js/cube/compare/v1.6.17...v1.6.18) (2026-03-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.17](https://github.com/cube-js/cube/compare/v1.6.16...v1.6.17) (2026-02-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.16](https://github.com/cube-js/cube/compare/v1.6.15...v1.6.16) (2026-02-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.15](https://github.com/cube-js/cube/compare/v1.6.14...v1.6.15) (2026-02-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.14](https://github.com/cube-js/cube/compare/v1.6.13...v1.6.14) (2026-02-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.13](https://github.com/cube-js/cube/compare/v1.6.12...v1.6.13) (2026-02-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.12](https://github.com/cube-js/cube/compare/v1.6.11...v1.6.12) (2026-02-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.11](https://github.com/cube-js/cube/compare/v1.6.10...v1.6.11) (2026-02-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.10](https://github.com/cube-js/cube/compare/v1.6.9...v1.6.10) (2026-02-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.9](https://github.com/cube-js/cube/compare/v1.6.8...v1.6.9) (2026-02-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.8](https://github.com/cube-js/cube/compare/v1.6.7...v1.6.8) (2026-02-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.7](https://github.com/cube-js/cube/compare/v1.6.6...v1.6.7) (2026-01-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.6](https://github.com/cube-js/cube/compare/v1.6.5...v1.6.6) (2026-01-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.5](https://github.com/cube-js/cube/compare/v1.6.4...v1.6.5) (2026-01-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.4](https://github.com/cube-js/cube/compare/v1.6.3...v1.6.4) (2026-01-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.3](https://github.com/cube-js/cube/compare/v1.6.2...v1.6.3) (2026-01-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.2](https://github.com/cube-js/cube/compare/v1.6.1...v1.6.2) (2026-01-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.6.1](https://github.com/cube-js/cube/compare/v1.6.0...v1.6.1) (2025-12-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.6.0](https://github.com/cube-js/cube/compare/v1.5.16...v1.6.0) (2025-12-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.16](https://github.com/cube-js/cube/compare/v1.5.15...v1.5.16) (2025-12-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.13](https://github.com/cube-js/cube/compare/v1.5.12...v1.5.13) (2025-12-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.12](https://github.com/cube-js/cube/compare/v1.5.11...v1.5.12) (2025-12-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.11](https://github.com/cube-js/cube/compare/v1.5.10...v1.5.11) (2025-12-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.10](https://github.com/cube-js/cube/compare/v1.5.9...v1.5.10) (2025-11-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.9](https://github.com/cube-js/cube/compare/v1.5.8...v1.5.9) (2025-11-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.8](https://github.com/cube-js/cube/compare/v1.5.7...v1.5.8) (2025-11-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.7](https://github.com/cube-js/cube/compare/v1.5.6...v1.5.7) (2025-11-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.6](https://github.com/cube-js/cube/compare/v1.5.5...v1.5.6) (2025-11-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.5](https://github.com/cube-js/cube/compare/v1.5.4...v1.5.5) (2025-11-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.4](https://github.com/cube-js/cube/compare/v1.5.3...v1.5.4) (2025-11-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.3](https://github.com/cube-js/cube/compare/v1.5.2...v1.5.3) (2025-11-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.2](https://github.com/cube-js/cube/compare/v1.5.1...v1.5.2) (2025-11-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.5.1](https://github.com/cube-js/cube/compare/v1.5.0...v1.5.1) (2025-11-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.5.0](https://github.com/cube-js/cube/compare/v1.4.0...v1.5.0) (2025-10-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.4.0](https://github.com/cube-js/cube/compare/v1.3.86...v1.4.0) (2025-10-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.86](https://github.com/cube-js/cube/compare/v1.3.85...v1.3.86) (2025-10-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.85](https://github.com/cube-js/cube/compare/v1.3.84...v1.3.85) (2025-10-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.84](https://github.com/cube-js/cube/compare/v1.3.83...v1.3.84) (2025-10-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.83](https://github.com/cube-js/cube/compare/v1.3.82...v1.3.83) (2025-10-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.82](https://github.com/cube-js/cube/compare/v1.3.81...v1.3.82) (2025-10-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.81](https://github.com/cube-js/cube/compare/v1.3.80...v1.3.81) (2025-10-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.80](https://github.com/cube-js/cube/compare/v1.3.79...v1.3.80) (2025-10-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.79](https://github.com/cube-js/cube/compare/v1.3.78...v1.3.79) (2025-10-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.78](https://github.com/cube-js/cube/compare/v1.3.77...v1.3.78) (2025-10-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.77](https://github.com/cube-js/cube/compare/v1.3.76...v1.3.77) (2025-10-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.76](https://github.com/cube-js/cube/compare/v1.3.75...v1.3.76) (2025-10-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.75](https://github.com/cube-js/cube/compare/v1.3.74...v1.3.75) (2025-09-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.74](https://github.com/cube-js/cube/compare/v1.3.73...v1.3.74) (2025-09-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.73](https://github.com/cube-js/cube/compare/v1.3.72...v1.3.73) (2025-09-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.72](https://github.com/cube-js/cube/compare/v1.3.71...v1.3.72) (2025-09-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.71](https://github.com/cube-js/cube/compare/v1.3.70...v1.3.71) (2025-09-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.70](https://github.com/cube-js/cube/compare/v1.3.69...v1.3.70) (2025-09-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.69](https://github.com/cube-js/cube/compare/v1.3.68...v1.3.69) (2025-09-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.68](https://github.com/cube-js/cube/compare/v1.3.67...v1.3.68) (2025-09-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.67](https://github.com/cube-js/cube/compare/v1.3.66...v1.3.67) (2025-09-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.66](https://github.com/cube-js/cube/compare/v1.3.65...v1.3.66) (2025-09-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.65](https://github.com/cube-js/cube/compare/v1.3.64...v1.3.65) (2025-09-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.64](https://github.com/cube-js/cube/compare/v1.3.63...v1.3.64) (2025-09-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.63](https://github.com/cube-js/cube/compare/v1.3.62...v1.3.63) (2025-09-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.62](https://github.com/cube-js/cube/compare/v1.3.61...v1.3.62) (2025-08-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.61](https://github.com/cube-js/cube/compare/v1.3.60...v1.3.61) (2025-08-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.60](https://github.com/cube-js/cube/compare/v1.3.59...v1.3.60) (2025-08-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.59](https://github.com/cube-js/cube/compare/v1.3.58...v1.3.59) (2025-08-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.58](https://github.com/cube-js/cube/compare/v1.3.57...v1.3.58) (2025-08-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.57](https://github.com/cube-js/cube/compare/v1.3.56...v1.3.57) (2025-08-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.56](https://github.com/cube-js/cube/compare/v1.3.55...v1.3.56) (2025-08-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.55](https://github.com/cube-js/cube/compare/v1.3.54...v1.3.55) (2025-08-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.54](https://github.com/cube-js/cube/compare/v1.3.53...v1.3.54) (2025-08-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.53](https://github.com/cube-js/cube/compare/v1.3.52...v1.3.53) (2025-08-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.52](https://github.com/cube-js/cube/compare/v1.3.51...v1.3.52) (2025-08-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.51](https://github.com/cube-js/cube/compare/v1.3.50...v1.3.51) (2025-08-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.50](https://github.com/cube-js/cube/compare/v1.3.49...v1.3.50) (2025-08-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.49](https://github.com/cube-js/cube/compare/v1.3.48...v1.3.49) (2025-08-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.48](https://github.com/cube-js/cube/compare/v1.3.47...v1.3.48) (2025-08-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.47](https://github.com/cube-js/cube/compare/v1.3.46...v1.3.47) (2025-08-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.46](https://github.com/cube-js/cube/compare/v1.3.45...v1.3.46) (2025-07-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.45](https://github.com/cube-js/cube/compare/v1.3.44...v1.3.45) (2025-07-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.44](https://github.com/cube-js/cube/compare/v1.3.43...v1.3.44) (2025-07-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.43](https://github.com/cube-js/cube/compare/v1.3.42...v1.3.43) (2025-07-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.42](https://github.com/cube-js/cube/compare/v1.3.41...v1.3.42) (2025-07-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.41](https://github.com/cube-js/cube/compare/v1.3.40...v1.3.41) (2025-07-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.40](https://github.com/cube-js/cube/compare/v1.3.39...v1.3.40) (2025-07-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.39](https://github.com/cube-js/cube/compare/v1.3.38...v1.3.39) (2025-07-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.38](https://github.com/cube-js/cube/compare/v1.3.37...v1.3.38) (2025-07-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.37](https://github.com/cube-js/cube/compare/v1.3.36...v1.3.37) (2025-07-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.36](https://github.com/cube-js/cube/compare/v1.3.35...v1.3.36) (2025-07-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.35](https://github.com/cube-js/cube/compare/v1.3.34...v1.3.35) (2025-07-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.34](https://github.com/cube-js/cube/compare/v1.3.33...v1.3.34) (2025-07-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.33](https://github.com/cube-js/cube/compare/v1.3.32...v1.3.33) (2025-07-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.32](https://github.com/cube-js/cube/compare/v1.3.31...v1.3.32) (2025-07-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.31](https://github.com/cube-js/cube/compare/v1.3.30...v1.3.31) (2025-07-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.30](https://github.com/cube-js/cube/compare/v1.3.29...v1.3.30) (2025-07-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.29](https://github.com/cube-js/cube/compare/v1.3.28...v1.3.29) (2025-07-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.28](https://github.com/cube-js/cube/compare/v1.3.27...v1.3.28) (2025-06-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.27](https://github.com/cube-js/cube/compare/v1.3.26...v1.3.27) (2025-06-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.26](https://github.com/cube-js/cube/compare/v1.3.25...v1.3.26) (2025-06-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.25](https://github.com/cube-js/cube/compare/v1.3.24...v1.3.25) (2025-06-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.24](https://github.com/cube-js/cube/compare/v1.3.23...v1.3.24) (2025-06-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.23](https://github.com/cube-js/cube/compare/v1.3.22...v1.3.23) (2025-06-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.22](https://github.com/cube-js/cube/compare/v1.3.21...v1.3.22) (2025-06-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.21](https://github.com/cube-js/cube/compare/v1.3.20...v1.3.21) (2025-06-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.20](https://github.com/cube-js/cube/compare/v1.3.19...v1.3.20) (2025-06-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.19](https://github.com/cube-js/cube/compare/v1.3.18...v1.3.19) (2025-06-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.18](https://github.com/cube-js/cube/compare/v1.3.17...v1.3.18) (2025-05-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.17](https://github.com/cube-js/cube/compare/v1.3.16...v1.3.17) (2025-05-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.16](https://github.com/cube-js/cube/compare/v1.3.15...v1.3.16) (2025-05-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.15](https://github.com/cube-js/cube/compare/v1.3.14...v1.3.15) (2025-05-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.14](https://github.com/cube-js/cube/compare/v1.3.13...v1.3.14) (2025-05-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.13](https://github.com/cube-js/cube/compare/v1.3.12...v1.3.13) (2025-05-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.12](https://github.com/cube-js/cube/compare/v1.3.11...v1.3.12) (2025-05-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.11](https://github.com/cube-js/cube/compare/v1.3.10...v1.3.11) (2025-05-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.10](https://github.com/cube-js/cube/compare/v1.3.9...v1.3.10) (2025-05-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.9](https://github.com/cube-js/cube/compare/v1.3.8...v1.3.9) (2025-04-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.8](https://github.com/cube-js/cube/compare/v1.3.7...v1.3.8) (2025-04-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.7](https://github.com/cube-js/cube/compare/v1.3.6...v1.3.7) (2025-04-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.6](https://github.com/cube-js/cube/compare/v1.3.5...v1.3.6) (2025-04-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.5](https://github.com/cube-js/cube/compare/v1.3.4...v1.3.5) (2025-04-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.4](https://github.com/cube-js/cube/compare/v1.3.3...v1.3.4) (2025-04-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.3](https://github.com/cube-js/cube/compare/v1.3.2...v1.3.3) (2025-04-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.2](https://github.com/cube-js/cube/compare/v1.3.1...v1.3.2) (2025-04-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.3.1](https://github.com/cube-js/cube/compare/v1.3.0...v1.3.1) (2025-04-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.3.0](https://github.com/cube-js/cube/compare/v1.2.33...v1.3.0) (2025-04-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.33](https://github.com/cube-js/cube/compare/v1.2.32...v1.2.33) (2025-04-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.32](https://github.com/cube-js/cube/compare/v1.2.31...v1.2.32) (2025-04-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.31](https://github.com/cube-js/cube/compare/v1.2.30...v1.2.31) (2025-04-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.30](https://github.com/cube-js/cube/compare/v1.2.29...v1.2.30) (2025-04-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.29](https://github.com/cube-js/cube/compare/v1.2.28...v1.2.29) (2025-04-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.28](https://github.com/cube-js/cube/compare/v1.2.27...v1.2.28) (2025-04-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.27](https://github.com/cube-js/cube/compare/v1.2.26...v1.2.27) (2025-03-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.26](https://github.com/cube-js/cube/compare/v1.2.25...v1.2.26) (2025-03-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.25](https://github.com/cube-js/cube/compare/v1.2.24...v1.2.25) (2025-03-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.24](https://github.com/cube-js/cube/compare/v1.2.23...v1.2.24) (2025-03-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.23](https://github.com/cube-js/cube/compare/v1.2.22...v1.2.23) (2025-03-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.22](https://github.com/cube-js/cube/compare/v1.2.21...v1.2.22) (2025-03-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.21](https://github.com/cube-js/cube/compare/v1.2.20...v1.2.21) (2025-03-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.20](https://github.com/cube-js/cube/compare/v1.2.19...v1.2.20) (2025-03-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.19](https://github.com/cube-js/cube/compare/v1.2.18...v1.2.19) (2025-03-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.18](https://github.com/cube-js/cube/compare/v1.2.17...v1.2.18) (2025-03-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.17](https://github.com/cube-js/cube/compare/v1.2.16...v1.2.17) (2025-03-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.16](https://github.com/cube-js/cube/compare/v1.2.15...v1.2.16) (2025-03-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.15](https://github.com/cube-js/cube/compare/v1.2.14...v1.2.15) (2025-03-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.14](https://github.com/cube-js/cube/compare/v1.2.13...v1.2.14) (2025-02-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.13](https://github.com/cube-js/cube/compare/v1.2.12...v1.2.13) (2025-02-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.12](https://github.com/cube-js/cube/compare/v1.2.11...v1.2.12) (2025-02-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.11](https://github.com/cube-js/cube/compare/v1.2.10...v1.2.11) (2025-02-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.10](https://github.com/cube-js/cube/compare/v1.2.9...v1.2.10) (2025-02-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.9](https://github.com/cube-js/cube/compare/v1.2.8...v1.2.9) (2025-02-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.8](https://github.com/cube-js/cube/compare/v1.2.7...v1.2.8) (2025-02-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.7](https://github.com/cube-js/cube/compare/v1.2.6...v1.2.7) (2025-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.6](https://github.com/cube-js/cube/compare/v1.2.5...v1.2.6) (2025-02-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.5](https://github.com/cube-js/cube/compare/v1.2.4...v1.2.5) (2025-02-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.4](https://github.com/cube-js/cube/compare/v1.2.3...v1.2.4) (2025-02-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.3](https://github.com/cube-js/cube/compare/v1.2.2...v1.2.3) (2025-02-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.2](https://github.com/cube-js/cube/compare/v1.2.1...v1.2.2) (2025-02-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.2.1](https://github.com/cube-js/cube/compare/v1.2.0...v1.2.1) (2025-02-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.2.0](https://github.com/cube-js/cube/compare/v1.1.18...v1.2.0) (2025-02-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.17](https://github.com/cube-js/cube/compare/v1.1.16...v1.1.17) (2025-01-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.16](https://github.com/cube-js/cube/compare/v1.1.15...v1.1.16) (2025-01-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.12](https://github.com/cube-js/cube/compare/v1.1.11...v1.1.12) (2025-01-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.10](https://github.com/cube-js/cube/compare/v1.1.9...v1.1.10) (2024-12-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.8](https://github.com/cube-js/cube/compare/v1.1.7...v1.1.8) (2024-12-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.7](https://github.com/cube-js/cube/compare/v1.1.6...v1.1.7) (2024-11-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.4](https://github.com/cube-js/cube/compare/v1.1.3...v1.1.4) (2024-11-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.3](https://github.com/cube-js/cube/compare/v1.1.2...v1.1.3) (2024-11-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.2](https://github.com/cube-js/cube/compare/v1.1.1...v1.1.2) (2024-11-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.1.1](https://github.com/cube-js/cube/compare/v1.1.0...v1.1.1) (2024-10-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.0.3](https://github.com/cube-js/cube/compare/v1.0.2...v1.0.3) (2024-10-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [1.0.2](https://github.com/cube-js/cube/compare/v1.0.1...v1.0.2) (2024-10-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [1.0.0](https://github.com/cube-js/cube/compare/v0.36.11...v1.0.0) (2024-10-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.36.11](https://github.com/cube-js/cube/compare/v0.36.10...v0.36.11) (2024-10-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.36.8](https://github.com/cube-js/cube/compare/v0.36.7...v0.36.8) (2024-10-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.36.5](https://github.com/cube-js/cube/compare/v0.36.4...v0.36.5) (2024-10-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.36.0](https://github.com/cube-js/cube/compare/v0.35.81...v0.36.0) (2024-09-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.81](https://github.com/cube-js/cube/compare/v0.35.80...v0.35.81) (2024-09-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.67](https://github.com/cube-js/cube/compare/v0.35.66...v0.35.67) (2024-08-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.64](https://github.com/cube-js/cube/compare/v0.35.63...v0.35.64) (2024-07-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.63](https://github.com/cube-js/cube/compare/v0.35.62...v0.35.63) (2024-07-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.62](https://github.com/cube-js/cube/compare/v0.35.61...v0.35.62) (2024-07-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.59](https://github.com/cube-js/cube/compare/v0.35.58...v0.35.59) (2024-07-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.48](https://github.com/cube-js/cube/compare/v0.35.47...v0.35.48) (2024-06-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.43](https://github.com/cube-js/cube/compare/v0.35.42...v0.35.43) (2024-05-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.33](https://github.com/cube-js/cube/compare/v0.35.32...v0.35.33) (2024-05-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.26](https://github.com/cube-js/cube/compare/v0.35.25...v0.35.26) (2024-05-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.23](https://github.com/cube-js/cube/compare/v0.35.22...v0.35.23) (2024-04-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.35.2](https://github.com/cube-js/cube/compare/v0.35.1...v0.35.2) (2024-03-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.35.0](https://github.com/cube-js/cube/compare/v0.34.62...v0.35.0) (2024-03-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.62](https://github.com/cube-js/cube/compare/v0.34.61...v0.34.62) (2024-03-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.61](https://github.com/cube-js/cube/compare/v0.34.60...v0.34.61) (2024-03-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.60](https://github.com/cube-js/cube/compare/v0.34.59...v0.34.60) (2024-03-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.58](https://github.com/cube-js/cube/compare/v0.34.57...v0.34.58) (2024-02-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.57](https://github.com/cube-js/cube/compare/v0.34.56...v0.34.57) (2024-02-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.55](https://github.com/cube-js/cube/compare/v0.34.54...v0.34.55) (2024-02-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.54](https://github.com/cube-js/cube/compare/v0.34.53...v0.34.54) (2024-02-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.47](https://github.com/cube-js/cube/compare/v0.34.46...v0.34.47) (2024-01-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.44](https://github.com/cube-js/cube/compare/v0.34.43...v0.34.44) (2024-01-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.41](https://github.com/cube-js/cube/compare/v0.34.40...v0.34.41) (2024-01-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.33](https://github.com/cube-js/cube/compare/v0.34.32...v0.34.33) (2023-12-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.32](https://github.com/cube-js/cube/compare/v0.34.31...v0.34.32) (2023-12-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.31](https://github.com/cube-js/cube/compare/v0.34.30...v0.34.31) (2023-12-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.26](https://github.com/cube-js/cube/compare/v0.34.25...v0.34.26) (2023-11-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.25](https://github.com/cube-js/cube/compare/v0.34.24...v0.34.25) (2023-11-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.20](https://github.com/cube-js/cube/compare/v0.34.19...v0.34.20) (2023-11-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.14](https://github.com/cube-js/cube/compare/v0.34.13...v0.34.14) (2023-11-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.12](https://github.com/cube-js/cube/compare/v0.34.11...v0.34.12) (2023-10-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.11](https://github.com/cube-js/cube/compare/v0.34.10...v0.34.11) (2023-10-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.34.1](https://github.com/cube-js/cube/compare/v0.34.0...v0.34.1) (2023-10-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.34.0](https://github.com/cube-js/cube/compare/v0.33.65...v0.34.0) (2023-10-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.58](https://github.com/cube-js/cube/compare/v0.33.57...v0.33.58) (2023-09-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.57](https://github.com/cube-js/cube/compare/v0.33.56...v0.33.57) (2023-09-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.43](https://github.com/cube-js/cube/compare/v0.33.42...v0.33.43) (2023-08-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.41](https://github.com/cube-js/cube/compare/v0.33.40...v0.33.41) (2023-07-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.39](https://github.com/cube-js/cube/compare/v0.33.38...v0.33.39) (2023-07-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.37](https://github.com/cube-js/cube/compare/v0.33.36...v0.33.37) (2023-07-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.34](https://github.com/cube-js/cube/compare/v0.33.33...v0.33.34) (2023-07-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.29](https://github.com/cube-js/cube/compare/v0.33.28...v0.33.29) (2023-06-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.28](https://github.com/cube-js/cube/compare/v0.33.27...v0.33.28) (2023-06-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.26](https://github.com/cube-js/cube/compare/v0.33.25...v0.33.26) (2023-06-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.24](https://github.com/cube-js/cube/compare/v0.33.23...v0.33.24) (2023-06-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.21](https://github.com/cube-js/cube/compare/v0.33.20...v0.33.21) (2023-05-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.20](https://github.com/cube-js/cube/compare/v0.33.19...v0.33.20) (2023-05-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.19](https://github.com/cube-js/cube/compare/v0.33.18...v0.33.19) (2023-05-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.18](https://github.com/cube-js/cube/compare/v0.33.17...v0.33.18) (2023-05-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.11](https://github.com/cube-js/cube/compare/v0.33.10...v0.33.11) (2023-05-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.8](https://github.com/cube-js/cube/compare/v0.33.7...v0.33.8) (2023-05-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.7](https://github.com/cube-js/cube/compare/v0.33.6...v0.33.7) (2023-05-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.33.2](https://github.com/cube-js/cube/compare/v0.33.1...v0.33.2) (2023-05-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.33.0](https://github.com/cube-js/cube/compare/v0.32.31...v0.33.0) (2023-05-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.30](https://github.com/cube-js/cube/compare/v0.32.29...v0.32.30) (2023-04-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.29](https://github.com/cube-js/cube/compare/v0.32.28...v0.32.29) (2023-04-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.28](https://github.com/cube-js/cube/compare/v0.32.27...v0.32.28) (2023-04-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.26](https://github.com/cube-js/cube/compare/v0.32.25...v0.32.26) (2023-04-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.25](https://github.com/cube-js/cube/compare/v0.32.24...v0.32.25) (2023-04-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.23](https://github.com/cube-js/cube/compare/v0.32.22...v0.32.23) (2023-04-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.22](https://github.com/cube-js/cube/compare/v0.32.21...v0.32.22) (2023-04-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.17](https://github.com/cube-js/cube/compare/v0.32.16...v0.32.17) (2023-03-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.16](https://github.com/cube-js/cube/compare/v0.32.15...v0.32.16) (2023-03-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.15](https://github.com/cube-js/cube/compare/v0.32.14...v0.32.15) (2023-03-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.14](https://github.com/cube-js/cube/compare/v0.32.13...v0.32.14) (2023-03-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.12](https://github.com/cube-js/cube/compare/v0.32.11...v0.32.12) (2023-03-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.32.2](https://github.com/cube-js/cube.js/compare/v0.32.1...v0.32.2) (2023-03-07) - -### Features - -- connection validation and logging ([#6233](https://github.com/cube-js/cube.js/issues/6233)) ([6dc48f8](https://github.com/cube-js/cube.js/commit/6dc48f8dc8045234dfa9fe8922534c5204e6e569)) - -# [0.32.0](https://github.com/cube-js/cube.js/compare/v0.31.69...v0.32.0) (2023-03-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.67](https://github.com/cube-js/cube.js/compare/v0.31.66...v0.31.67) (2023-02-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.66](https://github.com/cube-js/cube.js/compare/v0.31.65...v0.31.66) (2023-02-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.65](https://github.com/cube-js/cube.js/compare/v0.31.64...v0.31.65) (2023-02-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.63](https://github.com/cube-js/cube.js/compare/v0.31.62...v0.31.63) (2023-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.62](https://github.com/cube-js/cube.js/compare/v0.31.61...v0.31.62) (2023-02-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.60](https://github.com/cube-js/cube.js/compare/v0.31.59...v0.31.60) (2023-02-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.58](https://github.com/cube-js/cube.js/compare/v0.31.57...v0.31.58) (2023-02-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.57](https://github.com/cube-js/cube.js/compare/v0.31.56...v0.31.57) (2023-02-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.56](https://github.com/cube-js/cube.js/compare/v0.31.55...v0.31.56) (2023-01-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.55](https://github.com/cube-js/cube.js/compare/v0.31.54...v0.31.55) (2023-01-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.48](https://github.com/cube-js/cube.js/compare/v0.31.47...v0.31.48) (2023-01-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.46](https://github.com/cube-js/cube.js/compare/v0.31.45...v0.31.46) (2023-01-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.42](https://github.com/cube-js/cube.js/compare/v0.31.41...v0.31.42) (2023-01-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.41](https://github.com/cube-js/cube.js/compare/v0.31.40...v0.31.41) (2023-01-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.40](https://github.com/cube-js/cube.js/compare/v0.31.39...v0.31.40) (2023-01-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.38](https://github.com/cube-js/cube.js/compare/v0.31.37...v0.31.38) (2023-01-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.33](https://github.com/cube-js/cube.js/compare/v0.31.32...v0.31.33) (2023-01-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.32](https://github.com/cube-js/cube.js/compare/v0.31.31...v0.31.32) (2022-12-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.31](https://github.com/cube-js/cube.js/compare/v0.31.30...v0.31.31) (2022-12-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.30](https://github.com/cube-js/cube.js/compare/v0.31.29...v0.31.30) (2022-12-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.29](https://github.com/cube-js/cube.js/compare/v0.31.28...v0.31.29) (2022-12-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.26](https://github.com/cube-js/cube.js/compare/v0.31.25...v0.31.26) (2022-12-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.23](https://github.com/cube-js/cube.js/compare/v0.31.22...v0.31.23) (2022-12-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.19](https://github.com/cube-js/cube.js/compare/v0.31.18...v0.31.19) (2022-11-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.16](https://github.com/cube-js/cube.js/compare/v0.31.15...v0.31.16) (2022-11-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.15](https://github.com/cube-js/cube.js/compare/v0.31.14...v0.31.15) (2022-11-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.13](https://github.com/cube-js/cube.js/compare/v0.31.12...v0.31.13) (2022-11-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.11](https://github.com/cube-js/cube.js/compare/v0.31.10...v0.31.11) (2022-11-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.31.3](https://github.com/cube-js/cube.js/compare/v0.31.2...v0.31.3) (2022-10-08) - -### Bug Fixes - -- drivers imports alignment ([#5448](https://github.com/cube-js/cube.js/issues/5448)) ([ab12426](https://github.com/cube-js/cube.js/commit/ab1242650ba0368b855176b9c6ca2d73073acf0e)) - -## [0.31.2](https://github.com/cube-js/cube.js/compare/v0.31.1...v0.31.2) (2022-10-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.31.0](https://github.com/cube-js/cube.js/compare/v0.30.75...v0.31.0) (2022-10-03) - -### Features - -- multiple data source ([#5326](https://github.com/cube-js/cube.js/issues/5326)) ([334af8c](https://github.com/cube-js/cube.js/commit/334af8c56cd02ae551844e9d1e9ab5e107fb1555)) - -## [0.30.73](https://github.com/cube-js/cube.js/compare/v0.30.72...v0.30.73) (2022-09-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.72](https://github.com/cube-js/cube.js/compare/v0.30.71...v0.30.72) (2022-09-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.70](https://github.com/cube-js/cube.js/compare/v0.30.69...v0.30.70) (2022-09-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.69](https://github.com/cube-js/cube.js/compare/v0.30.68...v0.30.69) (2022-09-13) - -### Features - -- **base-driver:** Split BaseDriver to @cubejs-backend/base-driver ([#5283](https://github.com/cube-js/cube.js/issues/5283)) ([ca7f9d2](https://github.com/cube-js/cube.js/commit/ca7f9d280c3518e012683c23b82175ec1f96d2a8)) - -## [0.30.66](https://github.com/cube-js/cube.js/compare/v0.30.65...v0.30.66) (2022-09-08) - -### Bug Fixes - -- driver's constructor parameters initializers ([#5258](https://github.com/cube-js/cube.js/issues/5258)) ([08324a5](https://github.com/cube-js/cube.js/commit/08324a50c29d8f1dad138bfdc1396038cd7ae462)) - -## [0.30.63](https://github.com/cube-js/cube.js/compare/v0.30.62...v0.30.63) (2022-09-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.61](https://github.com/cube-js/cube.js/compare/v0.30.60...v0.30.61) (2022-09-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.57](https://github.com/cube-js/cube.js/compare/v0.30.56...v0.30.57) (2022-08-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.53](https://github.com/cube-js/cube.js/compare/v0.30.52...v0.30.53) (2022-08-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.51](https://github.com/cube-js/cube.js/compare/v0.30.50...v0.30.51) (2022-08-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.50](https://github.com/cube-js/cube.js/compare/v0.30.49...v0.30.50) (2022-08-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.47](https://github.com/cube-js/cube.js/compare/v0.30.46...v0.30.47) (2022-08-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.46](https://github.com/cube-js/cube.js/compare/v0.30.45...v0.30.46) (2022-08-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.45](https://github.com/cube-js/cube.js/compare/v0.30.44...v0.30.45) (2022-08-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.43](https://github.com/cube-js/cube.js/compare/v0.30.42...v0.30.43) (2022-07-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.39](https://github.com/cube-js/cube.js/compare/v0.30.38...v0.30.39) (2022-07-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.34](https://github.com/cube-js/cube.js/compare/v0.30.33...v0.30.34) (2022-07-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.30](https://github.com/cube-js/cube.js/compare/v0.30.29...v0.30.30) (2022-07-05) - -### Bug Fixes - -- drivers default concurrency values ([4b7296f](https://github.com/cube-js/cube.js/commit/4b7296f266b49e3d38dce1ff82ce4edd703121bc)) - -### Features - -- centralized concurrency setting ([#4735](https://github.com/cube-js/cube.js/issues/4735)) ([1c897a1](https://github.com/cube-js/cube.js/commit/1c897a13c62049e23d26009351622b2a93c0a745)) - -## [0.30.25](https://github.com/cube-js/cube.js/compare/v0.30.24...v0.30.25) (2022-06-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.20](https://github.com/cube-js/cube.js/compare/v0.30.19...v0.30.20) (2022-06-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.7](https://github.com/cube-js/cube.js/compare/v0.30.6...v0.30.7) (2022-05-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.6](https://github.com/cube-js/cube.js/compare/v0.30.5...v0.30.6) (2022-05-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.4](https://github.com/cube-js/cube.js/compare/v0.30.3...v0.30.4) (2022-05-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.30.1](https://github.com/cube-js/cube.js/compare/v0.30.0...v0.30.1) (2022-05-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.30.0](https://github.com/cube-js/cube.js/compare/v0.29.57...v0.30.0) (2022-05-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.51](https://github.com/cube-js/cube.js/compare/v0.29.50...v0.29.51) (2022-04-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.48](https://github.com/cube-js/cube.js/compare/v0.29.47...v0.29.48) (2022-04-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.37](https://github.com/cube-js/cube.js/compare/v0.29.36...v0.29.37) (2022-03-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.35](https://github.com/cube-js/cube.js/compare/v0.29.34...v0.29.35) (2022-03-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.33](https://github.com/cube-js/cube.js/compare/v0.29.32...v0.29.33) (2022-03-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.31](https://github.com/cube-js/cube.js/compare/v0.29.30...v0.29.31) (2022-03-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.29](https://github.com/cube-js/cube.js/compare/v0.29.28...v0.29.29) (2022-03-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.28](https://github.com/cube-js/cube.js/compare/v0.29.27...v0.29.28) (2022-02-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.25](https://github.com/cube-js/cube.js/compare/v0.29.24...v0.29.25) (2022-02-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.24](https://github.com/cube-js/cube.js/compare/v0.29.23...v0.29.24) (2022-02-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.23](https://github.com/cube-js/cube.js/compare/v0.29.22...v0.29.23) (2022-01-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.21](https://github.com/cube-js/cube.js/compare/v0.29.20...v0.29.21) (2022-01-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.20](https://github.com/cube-js/cube.js/compare/v0.29.19...v0.29.20) (2022-01-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.18](https://github.com/cube-js/cube.js/compare/v0.29.17...v0.29.18) (2022-01-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.17](https://github.com/cube-js/cube.js/compare/v0.29.16...v0.29.17) (2022-01-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.15](https://github.com/cube-js/cube.js/compare/v0.29.14...v0.29.15) (2021-12-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.12](https://github.com/cube-js/cube.js/compare/v0.29.11...v0.29.12) (2021-12-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.7](https://github.com/cube-js/cube.js/compare/v0.29.6...v0.29.7) (2021-12-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.29.6](https://github.com/cube-js/cube.js/compare/v0.29.5...v0.29.6) (2021-12-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.29.0](https://github.com/cube-js/cube.js/compare/v0.28.67...v0.29.0) (2021-12-14) - -### Reverts - -- Revert "BREAKING CHANGE: 0.29 (#3809)" (#3811) ([db005ed](https://github.com/cube-js/cube.js/commit/db005edc04d48e8251250ab9d0e19f496cf3b52b)), closes [#3809](https://github.com/cube-js/cube.js/issues/3809) [#3811](https://github.com/cube-js/cube.js/issues/3811) - -- BREAKING CHANGE: 0.29 (#3809) ([6f1418b](https://github.com/cube-js/cube.js/commit/6f1418b9963774844f341682e594601a56bb0084)), closes [#3809](https://github.com/cube-js/cube.js/issues/3809) - -### BREAKING CHANGES - -- Drop support for Node.js 10 (12.x is a minimal version) -- Upgrade Node.js to 14 for Docker images -- Drop support for Node.js 15 - -## [0.28.64](https://github.com/cube-js/cube.js/compare/v0.28.63...v0.28.64) (2021-12-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.63](https://github.com/cube-js/cube.js/compare/v0.28.62...v0.28.63) (2021-12-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.61](https://github.com/cube-js/cube.js/compare/v0.28.60...v0.28.61) (2021-11-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.60](https://github.com/cube-js/cube.js/compare/v0.28.59...v0.28.60) (2021-11-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.59](https://github.com/cube-js/cube.js/compare/v0.28.58...v0.28.59) (2021-11-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.58](https://github.com/cube-js/cube.js/compare/v0.28.57...v0.28.58) (2021-11-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.56](https://github.com/cube-js/cube.js/compare/v0.28.55...v0.28.56) (2021-11-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.55](https://github.com/cube-js/cube.js/compare/v0.28.54...v0.28.55) (2021-11-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.52](https://github.com/cube-js/cube.js/compare/v0.28.51...v0.28.52) (2021-11-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.50](https://github.com/cube-js/cube.js/compare/v0.28.49...v0.28.50) (2021-10-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.47](https://github.com/cube-js/cube.js/compare/v0.28.46...v0.28.47) (2021-10-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.42](https://github.com/cube-js/cube.js/compare/v0.28.41...v0.28.42) (2021-10-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.38](https://github.com/cube-js/cube.js/compare/v0.28.37...v0.28.38) (2021-09-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.37](https://github.com/cube-js/cube.js/compare/v0.28.36...v0.28.37) (2021-09-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.34](https://github.com/cube-js/cube.js/compare/v0.28.33...v0.28.34) (2021-09-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.33](https://github.com/cube-js/cube.js/compare/v0.28.32...v0.28.33) (2021-09-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.32](https://github.com/cube-js/cube.js/compare/v0.28.31...v0.28.32) (2021-09-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.29](https://github.com/cube-js/cube.js/compare/v0.28.28...v0.28.29) (2021-08-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.27](https://github.com/cube-js/cube.js/compare/v0.28.26...v0.28.27) (2021-08-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.24](https://github.com/cube-js/cube.js/compare/v0.28.23...v0.28.24) (2021-08-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.22](https://github.com/cube-js/cube.js/compare/v0.28.21...v0.28.22) (2021-08-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.19](https://github.com/cube-js/cube.js/compare/v0.28.18...v0.28.19) (2021-08-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.17](https://github.com/cube-js/cube.js/compare/v0.28.16...v0.28.17) (2021-08-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.14](https://github.com/cube-js/cube.js/compare/v0.28.13...v0.28.14) (2021-08-05) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.13](https://github.com/cube-js/cube.js/compare/v0.28.12...v0.28.13) (2021-08-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.11](https://github.com/cube-js/cube.js/compare/v0.28.10...v0.28.11) (2021-07-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.10](https://github.com/cube-js/cube.js/compare/v0.28.9...v0.28.10) (2021-07-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.9](https://github.com/cube-js/cube.js/compare/v0.28.8...v0.28.9) (2021-07-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.8](https://github.com/cube-js/cube.js/compare/v0.28.7...v0.28.8) (2021-07-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.7](https://github.com/cube-js/cube.js/compare/v0.28.6...v0.28.7) (2021-07-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.6](https://github.com/cube-js/cube.js/compare/v0.28.5...v0.28.6) (2021-07-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.3](https://github.com/cube-js/cube.js/compare/v0.28.2...v0.28.3) (2021-07-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.2](https://github.com/cube-js/cube.js/compare/v0.28.1...v0.28.2) (2021-07-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.28.1](https://github.com/cube-js/cube.js/compare/v0.28.0...v0.28.1) (2021-07-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.28.0](https://github.com/cube-js/cube.js/compare/v0.27.53...v0.28.0) (2021-07-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.53](https://github.com/cube-js/cube.js/compare/v0.27.52...v0.27.53) (2021-07-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.51](https://github.com/cube-js/cube.js/compare/v0.27.50...v0.27.51) (2021-07-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.49](https://github.com/cube-js/cube.js/compare/v0.27.48...v0.27.49) (2021-07-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.47](https://github.com/cube-js/cube.js/compare/v0.27.46...v0.27.47) (2021-07-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.46](https://github.com/cube-js/cube.js/compare/v0.27.45...v0.27.46) (2021-07-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.45](https://github.com/cube-js/cube.js/compare/v0.27.44...v0.27.45) (2021-06-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.44](https://github.com/cube-js/cube.js/compare/v0.27.43...v0.27.44) (2021-06-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.41](https://github.com/cube-js/cube.js/compare/v0.27.40...v0.27.41) (2021-06-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.39](https://github.com/cube-js/cube.js/compare/v0.27.38...v0.27.39) (2021-06-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.38](https://github.com/cube-js/cube.js/compare/v0.27.37...v0.27.38) (2021-06-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.37](https://github.com/cube-js/cube.js/compare/v0.27.36...v0.27.37) (2021-06-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.36](https://github.com/cube-js/cube.js/compare/v0.27.35...v0.27.36) (2021-06-21) - -### Bug Fixes - -- **elasticsearch-driver:** Make readOnly ([15ec569](https://github.com/cube-js/cube.js/commit/15ec5690fde529bf8294111150d44916139168fe)) - -## [0.27.35](https://github.com/cube-js/cube.js/compare/v0.27.34...v0.27.35) (2021-06-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.34](https://github.com/cube-js/cube.js/compare/v0.27.33...v0.27.34) (2021-06-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.33](https://github.com/cube-js/cube.js/compare/v0.27.32...v0.27.33) (2021-06-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.32](https://github.com/cube-js/cube.js/compare/v0.27.31...v0.27.32) (2021-06-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.31](https://github.com/cube-js/cube.js/compare/v0.27.30...v0.27.31) (2021-06-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.30](https://github.com/cube-js/cube.js/compare/v0.27.29...v0.27.30) (2021-06-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.29](https://github.com/cube-js/cube.js/compare/v0.27.27...v0.27.29) (2021-06-02) - -### Bug Fixes - -- **elasticsearch-driver:** Lock @elastic/elasticsearch to 7.12 for Node.js 10 support ([cedf108](https://github.com/cube-js/cube.js/commit/cedf1089ea6262a4e3e3fed18c3714fb8258fa93)) - -## [0.27.28](https://github.com/cube-js/cube.js/compare/v0.27.27...v0.27.28) (2021-06-02) - -### Bug Fixes - -- **elasticsearch-driver:** Lock @elastic/elasticsearch to 7.12 for Node.js 10 support ([cedf108](https://github.com/cube-js/cube.js/commit/cedf1089ea6262a4e3e3fed18c3714fb8258fa93)) - -## [0.27.25](https://github.com/cube-js/cube.js/compare/v0.27.24...v0.27.25) (2021-06-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.22](https://github.com/cube-js/cube.js/compare/v0.27.21...v0.27.22) (2021-05-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.17](https://github.com/cube-js/cube.js/compare/v0.27.16...v0.27.17) (2021-05-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.16](https://github.com/cube-js/cube.js/compare/v0.27.15...v0.27.16) (2021-05-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.15](https://github.com/cube-js/cube.js/compare/v0.27.14...v0.27.15) (2021-05-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.13](https://github.com/cube-js/cube.js/compare/v0.27.12...v0.27.13) (2021-05-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.10](https://github.com/cube-js/cube.js/compare/v0.27.9...v0.27.10) (2021-05-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.5](https://github.com/cube-js/cube.js/compare/v0.27.4...v0.27.5) (2021-05-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.4](https://github.com/cube-js/cube.js/compare/v0.27.3...v0.27.4) (2021-04-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.2](https://github.com/cube-js/cube.js/compare/v0.27.1...v0.27.2) (2021-04-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.27.1](https://github.com/cube-js/cube.js/compare/v0.27.0...v0.27.1) (2021-04-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.27.0](https://github.com/cube-js/cube.js/compare/v0.26.104...v0.27.0) (2021-04-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.103](https://github.com/cube-js/cube.js/compare/v0.26.102...v0.26.103) (2021-04-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.101](https://github.com/cube-js/cube.js/compare/v0.26.100...v0.26.101) (2021-04-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.99](https://github.com/cube-js/cube.js/compare/v0.26.98...v0.26.99) (2021-04-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.95](https://github.com/cube-js/cube.js/compare/v0.26.94...v0.26.95) (2021-04-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.90](https://github.com/cube-js/cube.js/compare/v0.26.89...v0.26.90) (2021-04-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.88](https://github.com/cube-js/cube.js/compare/v0.26.87...v0.26.88) (2021-04-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.87](https://github.com/cube-js/cube.js/compare/v0.26.86...v0.26.87) (2021-04-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.81](https://github.com/cube-js/cube.js/compare/v0.26.80...v0.26.81) (2021-04-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.79](https://github.com/cube-js/cube.js/compare/v0.26.78...v0.26.79) (2021-04-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.77](https://github.com/cube-js/cube.js/compare/v0.26.76...v0.26.77) (2021-04-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.76](https://github.com/cube-js/cube.js/compare/v0.26.75...v0.26.76) (2021-04-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.74](https://github.com/cube-js/cube.js/compare/v0.26.73...v0.26.74) (2021-04-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.69](https://github.com/cube-js/cube.js/compare/v0.26.68...v0.26.69) (2021-03-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.65](https://github.com/cube-js/cube.js/compare/v0.26.64...v0.26.65) (2021-03-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.55](https://github.com/cube-js/cube.js/compare/v0.26.54...v0.26.55) (2021-03-12) - -### Features - -- **elasticsearch-driver:** Ability to use USERNAME, PASSWORD and SSL\_\* env variables ([13c90cd](https://github.com/cube-js/cube.js/commit/13c90cd097b24c6e823dc4de76ae497ebfecc06b)) -- **elasticsearch-driver:** Implement release ([2b88ed7](https://github.com/cube-js/cube.js/commit/2b88ed7c4105f0506555bd7cec63f2634f3149f4)) - -## [0.26.54](https://github.com/cube-js/cube.js/compare/v0.26.53...v0.26.54) (2021-03-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.49](https://github.com/cube-js/cube.js/compare/v0.26.48...v0.26.49) (2021-03-05) - -### Features - -- **elasticsearch-driver:** Introduce typings ([c0e519d](https://github.com/cube-js/cube.js/commit/c0e519d1daab5e04c11ddd1a54fe2fdb213b91f7)) -- **elasticsearch-driver:** Support for elastic.co & improve docs ([#2240](https://github.com/cube-js/cube.js/issues/2240)) ([d8557f6](https://github.com/cube-js/cube.js/commit/d8557f6487ea98c19c055cc94b94b284dd273835)) - -## [0.26.45](https://github.com/cube-js/cube.js/compare/v0.26.44...v0.26.45) (2021-03-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.38](https://github.com/cube-js/cube.js/compare/v0.26.37...v0.26.38) (2021-02-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.35](https://github.com/cube-js/cube.js/compare/v0.26.34...v0.26.35) (2021-02-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.25](https://github.com/cube-js/cube.js/compare/v0.26.24...v0.26.25) (2021-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.23](https://github.com/cube-js/cube.js/compare/v0.26.22...v0.26.23) (2021-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.22](https://github.com/cube-js/cube.js/compare/v0.26.21...v0.26.22) (2021-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.19](https://github.com/cube-js/cube.js/compare/v0.26.18...v0.26.19) (2021-02-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.16](https://github.com/cube-js/cube.js/compare/v0.26.15...v0.26.16) (2021-02-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.15](https://github.com/cube-js/cube.js/compare/v0.26.14...v0.26.15) (2021-02-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.13](https://github.com/cube-js/cube.js/compare/v0.26.12...v0.26.13) (2021-02-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.12](https://github.com/cube-js/cube.js/compare/v0.26.11...v0.26.12) (2021-02-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.11](https://github.com/cube-js/cube.js/compare/v0.26.10...v0.26.11) (2021-02-10) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.10](https://github.com/cube-js/cube.js/compare/v0.26.9...v0.26.10) (2021-02-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.7](https://github.com/cube-js/cube.js/compare/v0.26.6...v0.26.7) (2021-02-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.6](https://github.com/cube-js/cube.js/compare/v0.26.5...v0.26.6) (2021-02-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.26.2](https://github.com/cube-js/cube.js/compare/v0.26.1...v0.26.2) (2021-02-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.26.0](https://github.com/cube-js/cube.js/compare/v0.25.33...v0.26.0) (2021-02-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.32](https://github.com/cube-js/cube.js/compare/v0.25.31...v0.25.32) (2021-01-29) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.30](https://github.com/cube-js/cube.js/compare/v0.25.29...v0.25.30) (2021-01-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.29](https://github.com/cube-js/cube.js/compare/v0.25.28...v0.25.29) (2021-01-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.26](https://github.com/cube-js/cube.js/compare/v0.25.25...v0.25.26) (2021-01-25) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.24](https://github.com/cube-js/cube.js/compare/v0.25.23...v0.25.24) (2021-01-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.23](https://github.com/cube-js/cube.js/compare/v0.25.22...v0.25.23) (2021-01-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.22](https://github.com/cube-js/cube.js/compare/v0.25.21...v0.25.22) (2021-01-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.21](https://github.com/cube-js/cube.js/compare/v0.25.20...v0.25.21) (2021-01-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.20](https://github.com/cube-js/cube.js/compare/v0.25.19...v0.25.20) (2021-01-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.18](https://github.com/cube-js/cube.js/compare/v0.25.17...v0.25.18) (2021-01-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.15](https://github.com/cube-js/cube.js/compare/v0.25.14...v0.25.15) (2021-01-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.13](https://github.com/cube-js/cube.js/compare/v0.25.12...v0.25.13) (2021-01-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.6](https://github.com/cube-js/cube.js/compare/v0.25.5...v0.25.6) (2020-12-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.5](https://github.com/cube-js/cube.js/compare/v0.25.4...v0.25.5) (2020-12-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.4](https://github.com/cube-js/cube.js/compare/v0.25.3...v0.25.4) (2020-12-30) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.2](https://github.com/cube-js/cube.js/compare/v0.25.1...v0.25.2) (2020-12-27) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.25.1](https://github.com/cube-js/cube.js/compare/v0.25.0...v0.25.1) (2020-12-24) - -### Features - -- **elasticsearch-driver:** Support CUBEJS_DB_ELASTIC_QUERY_FORMAT, Thanks [@dylman79](https://github.com/dylman79) ([a7460f5](https://github.com/cube-js/cube.js/commit/a7460f5d45dc7e9d96b65f6cc36df810a5b9312e)) - -# [0.25.0](https://github.com/cube-js/cube.js/compare/v0.24.15...v0.25.0) (2020-12-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.13](https://github.com/cube-js/cube.js/compare/v0.24.12...v0.24.13) (2020-12-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.12](https://github.com/cube-js/cube.js/compare/v0.24.11...v0.24.12) (2020-12-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.9](https://github.com/cube-js/cube.js/compare/v0.24.8...v0.24.9) (2020-12-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.8](https://github.com/cube-js/cube.js/compare/v0.24.7...v0.24.8) (2020-12-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.6](https://github.com/cube-js/cube.js/compare/v0.24.5...v0.24.6) (2020-12-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.5](https://github.com/cube-js/cube.js/compare/v0.24.4...v0.24.5) (2020-12-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.4](https://github.com/cube-js/cube.js/compare/v0.24.3...v0.24.4) (2020-12-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.3](https://github.com/cube-js/cube.js/compare/v0.24.2...v0.24.3) (2020-12-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.24.2](https://github.com/cube-js/cube.js/compare/v0.24.1...v0.24.2) (2020-11-27) - -### Features - -- **@cubejs-backend/query-orchestrator:** Initial move to TypeScript ([#1462](https://github.com/cube-js/cube.js/issues/1462)) ([101e8dc](https://github.com/cube-js/cube.js/commit/101e8dc90d4b1266c0327adb86cab3e3caa8d4d0)) - -# [0.24.0](https://github.com/cube-js/cube.js/compare/v0.23.15...v0.24.0) (2020-11-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.23.14](https://github.com/cube-js/cube.js/compare/v0.23.13...v0.23.14) (2020-11-22) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.23.11](https://github.com/cube-js/cube.js/compare/v0.23.10...v0.23.11) (2020-11-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.23.8](https://github.com/cube-js/cube.js/compare/v0.23.7...v0.23.8) (2020-11-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.23.6](https://github.com/cube-js/cube.js/compare/v0.23.5...v0.23.6) (2020-11-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.23.3](https://github.com/cube-js/cube.js/compare/v0.23.2...v0.23.3) (2020-10-31) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.23.0](https://github.com/cube-js/cube.js/compare/v0.22.4...v0.23.0) (2020-10-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.22.4](https://github.com/cube-js/cube.js/compare/v0.22.3...v0.22.4) (2020-10-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.22.2](https://github.com/cube-js/cube.js/compare/v0.22.1...v0.22.2) (2020-10-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.22.0](https://github.com/cube-js/cube.js/compare/v0.21.2...v0.22.0) (2020-10-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.21.1](https://github.com/cube-js/cube.js/compare/v0.21.0...v0.21.1) (2020-10-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.21.0](https://github.com/cube-js/cube.js/compare/v0.20.15...v0.21.0) (2020-10-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.20.13](https://github.com/cube-js/cube.js/compare/v0.20.12...v0.20.13) (2020-10-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.20.9](https://github.com/cube-js/cube.js/compare/v0.20.8...v0.20.9) (2020-09-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.20.0](https://github.com/cube-js/cube.js/compare/v0.19.61...v0.20.0) (2020-08-26) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.61](https://github.com/cube-js/cube.js/compare/v0.19.60...v0.19.61) (2020-08-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.60](https://github.com/cube-js/cube.js/compare/v0.19.59...v0.19.60) (2020-08-08) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.56](https://github.com/cube-js/cube.js/compare/v0.19.55...v0.19.56) (2020-08-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.54](https://github.com/cube-js/cube.js/compare/v0.19.53...v0.19.54) (2020-07-23) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.53](https://github.com/cube-js/cube.js/compare/v0.19.52...v0.19.53) (2020-07-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.52](https://github.com/cube-js/cube.js/compare/v0.19.51...v0.19.52) (2020-07-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.50](https://github.com/cube-js/cube.js/compare/v0.19.49...v0.19.50) (2020-07-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.48](https://github.com/cube-js/cube.js/compare/v0.19.47...v0.19.48) (2020-07-11) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.46](https://github.com/cube-js/cube.js/compare/v0.19.45...v0.19.46) (2020-07-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.38](https://github.com/cube-js/cube.js/compare/v0.19.37...v0.19.38) (2020-06-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.36](https://github.com/cube-js/cube.js/compare/v0.19.35...v0.19.36) (2020-06-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.17](https://github.com/cube-js/cube.js/compare/v0.19.16...v0.19.17) (2020-05-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.15](https://github.com/cube-js/cube.js/compare/v0.19.14...v0.19.15) (2020-05-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.14](https://github.com/cube-js/cube.js/compare/v0.19.13...v0.19.14) (2020-04-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.9](https://github.com/cube-js/cube.js/compare/v0.19.8...v0.19.9) (2020-04-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.8](https://github.com/cube-js/cube.js/compare/v0.19.7...v0.19.8) (2020-04-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.7](https://github.com/cube-js/cube.js/compare/v0.19.6...v0.19.7) (2020-04-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.6](https://github.com/cube-js/cube.js/compare/v0.19.5...v0.19.6) (2020-04-14) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.19.5](https://github.com/cube-js/cube.js/compare/v0.19.4...v0.19.5) (2020-04-13) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.19.0](https://github.com/cube-js/cube.js/compare/v0.18.32...v0.19.0) (2020-04-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.30](https://github.com/cube-js/cube.js/compare/v0.18.29...v0.18.30) (2020-04-04) - -### Features - -- Native X-Pack SQL ElasticSearch Driver ([#551](https://github.com/cube-js/cube.js/issues/551)) ([efde731](https://github.com/cube-js/cube.js/commit/efde731)) - -## [0.18.18](https://github.com/cube-js/cube.js/compare/v0.18.17...v0.18.18) (2020-03-28) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.17](https://github.com/cube-js/cube.js/compare/v0.18.16...v0.18.17) (2020-03-24) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.13](https://github.com/cube-js/cube.js/compare/v0.18.12...v0.18.13) (2020-03-21) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.12](https://github.com/cube-js/cube.js/compare/v0.18.11...v0.18.12) (2020-03-19) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.11](https://github.com/cube-js/cube.js/compare/v0.18.10...v0.18.11) (2020-03-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.7](https://github.com/cube-js/cube.js/compare/v0.18.6...v0.18.7) (2020-03-17) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.6](https://github.com/cube-js/cube.js/compare/v0.18.5...v0.18.6) (2020-03-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.5](https://github.com/cube-js/cube.js/compare/v0.18.4...v0.18.5) (2020-03-15) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.4](https://github.com/cube-js/cube.js/compare/v0.18.3...v0.18.4) (2020-03-09) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.3](https://github.com/cube-js/cube.js/compare/v0.18.2...v0.18.3) (2020-03-02) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.2](https://github.com/cube-js/cube.js/compare/v0.18.1...v0.18.2) (2020-03-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.18.1](https://github.com/cube-js/cube.js/compare/v0.18.0...v0.18.1) (2020-03-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.18.0](https://github.com/cube-js/cube.js/compare/v0.17.10...v0.18.0) (2020-03-01) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.17.10](https://github.com/cube-js/cube.js/compare/v0.17.9...v0.17.10) (2020-02-20) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.17.9](https://github.com/cube-js/cube.js/compare/v0.17.8...v0.17.9) (2020-02-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.17.5](https://github.com/cube-js/cube.js/compare/v0.17.4...v0.17.5) (2020-02-07) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.17.3](https://github.com/cube-js/cube.js/compare/v0.17.2...v0.17.3) (2020-02-06) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.17.0](https://github.com/cube-js/cube.js/compare/v0.16.0...v0.17.0) (2020-02-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.16.0](https://github.com/cube-js/cube.js/compare/v0.15.4...v0.16.0) (2020-02-04) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.15.0](https://github.com/cube-js/cube.js/compare/v0.14.3...v0.15.0) (2020-01-18) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -# [0.14.0](https://github.com/cube-js/cube.js/compare/v0.13.12...v0.14.0) (2020-01-16) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.13.12](https://github.com/cube-js/cube.js/compare/v0.13.11...v0.13.12) (2020-01-12) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.13.9](https://github.com/cube-js/cube.js/compare/v0.13.8...v0.13.9) (2020-01-03) - -**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver - -## [0.13.6](https://github.com/cube-js/cube.js/compare/v0.13.5...v0.13.6) (2019-12-19) - -### Bug Fixes - -- **elasticsearch-driver:** TypeError: Cannot convert undefined or null to object ([2dc570f](https://github.com/cube-js/cube.js/commit/2dc570f)) - -## [0.13.5](https://github.com/cube-js/cube.js/compare/v0.13.4...v0.13.5) (2019-12-17) - -### Features - -- Elasticsearch driver preview ([d6a6a07](https://github.com/cube-js/cube.js/commit/d6a6a07)) diff --git a/packages/cubejs-elasticsearch-driver/LICENSE b/packages/cubejs-elasticsearch-driver/LICENSE deleted file mode 100644 index da67a9a3301be..0000000000000 --- a/packages/cubejs-elasticsearch-driver/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018-2020 Cube Dev, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/packages/cubejs-elasticsearch-driver/README.md b/packages/cubejs-elasticsearch-driver/README.md deleted file mode 100644 index 407617bdfb78d..0000000000000 --- a/packages/cubejs-elasticsearch-driver/README.md +++ /dev/null @@ -1,23 +0,0 @@ -

Cube.js

- -[Website](https://cube.dev) • [Docs](https://cube.dev/docs) • [Blog](https://cube.dev/blog) • [Slack](https://slack.cube.dev) • [Twitter](https://twitter.com/the_cube_dev) - -[![npm version](https://badge.fury.io/js/%40cubejs-backend%2Fserver.svg)](https://badge.fury.io/js/%40cubejs-backend%2Fserver) -[![GitHub Actions](https://github.com/cube-js/cube.js/workflows/Build/badge.svg)](https://github.com/cube-js/cube.js/actions?query=workflow%3ABuild+branch%3Amaster) - -# Cube.js Elasticsearch Database Driver - -Elasticsearch driver. -Works with OpenDistro, native and elastic.co hosted versions of Elasticsearch. - -[Learn more](https://github.com/cube-js/cube.js#getting-started) - -### Support - -This driver has been contributed by Cube.js community member [Chad Faurie](https://github.com/chadfaurie). This package is **community supported** and should be used at your own risk. - -While the Cube Dev team is happy to review and accept future community contributions, we don't have active plans for further development. This includes bug fixes unless they affect different parts of Cube.js. **We're looking for maintainers for this package.** If you'd like to become a maintainer, please contact us in Cube.js Slack. - -### License - -Cube.js Elasticsearch Database Driver is [Apache 2.0 licensed](./LICENSE). diff --git a/packages/cubejs-elasticsearch-driver/docker-compose.yml b/packages/cubejs-elasticsearch-driver/docker-compose.yml deleted file mode 100644 index be3b5a76a3f36..0000000000000 --- a/packages/cubejs-elasticsearch-driver/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: '3' -services: - es-distro: - image: amazon/opendistro-for-elasticsearch:1.13.1 - environment: - - discovery.type=single-node - - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping - - ES_JAVA_OPTS=-Xms512m -Xmx512m - ports: - - 9200:9200 - healthcheck: - test: curl -k -u admin:admin --silent --fail https://localhost:9200/_cluster/health || exit 1 - timeout: 5s - interval: 2s - retries: 3 - start_period: 10s diff --git a/packages/cubejs-elasticsearch-driver/driver/ElasticSearchDriver.js b/packages/cubejs-elasticsearch-driver/driver/ElasticSearchDriver.js deleted file mode 100644 index cd0e06e9b801c..0000000000000 --- a/packages/cubejs-elasticsearch-driver/driver/ElasticSearchDriver.js +++ /dev/null @@ -1,187 +0,0 @@ -/** - * @copyright Cube Dev, Inc. - * @license Apache-2.0 - * @fileoverview The `ElasticSearchDriver` and related types declaration. - */ - -const { - getEnv, - assertDataSource, -} = require('@cubejs-backend/shared'); -const { Client } = require('@elastic/elasticsearch'); -const SqlString = require('sqlstring'); -const { BaseDriver } = require('@cubejs-backend/base-driver'); - -/** - * ElasticSearch driver class. - */ -class ElasticSearchDriver extends BaseDriver { - /** - * Returns default concurrency value. - * @return {number} - */ - static getDefaultConcurrency() { - return 2; - } - - /** - * Class constructor. - */ - constructor(config = {}) { - super({ - testConnectionTimeout: config.testConnectionTimeout, - }); - - const dataSource = - config.dataSource || - assertDataSource('default'); - const preAggregations = config.preAggregations || false; - - const auth = { - username: getEnv('dbUser', { dataSource, preAggregations }), - password: getEnv('dbPass', { dataSource, preAggregations }), - }; - if ( - getEnv('elasticApiId', { dataSource, preAggregations }) || - getEnv('elasticApiKey', { dataSource, preAggregations }) - ) { - auth.apiKey = { - id: getEnv('elasticApiId', { dataSource, preAggregations }), - api_key: getEnv('elasticApiKey', { dataSource, preAggregations }), - }; - } - - // TODO: This config applies to AWS ES, Elastic.co ES, Native ES - // and OpenDistro ES. They have different dialects according to - // their respective documentation. - this.config = { - auth, - url: getEnv('dbUrl', { dataSource, preAggregations }), - ssl: this.getSslOptions(dataSource, preAggregations), - openDistro: - (getEnv('elasticOpenDistro', { dataSource, preAggregations }) || 'false') - .toLowerCase() === 'true' || - getEnv('dbType', { dataSource, preAggregations }) === 'odelasticsearch', - queryFormat: - getEnv('elasticQueryFormat', { dataSource, preAggregations }) || 'jdbc', - ...config, - }; - - this.client = new Client({ - node: this.config.url, - cloud: this.config.cloud, - auth: this.config.auth, - ssl: this.config.ssl - }); - - if (this.config.openDistro) { - this.sqlClient = new Client({ - node: `${this.config.url}/_opendistro`, - ssl: this.config.ssl, - auth: this.config.auth, - }); - } else { - this.sqlClient = this.client; - } - } - - /** - * Returns the configurable driver options - * Note: It returns the unprefixed option names. - * In case of using multisources options need to be prefixed manually. - */ - static driverEnvVariables() { - return [ - 'CUBEJS_DB_URL', - 'CUBEJS_DB_ELASTIC_QUERY_FORMAT', - 'CUBEJS_DB_ELASTIC_OPENDISTRO', - 'CUBEJS_DB_ELASTIC_APIKEY_ID', - 'CUBEJS_DB_ELASTIC_APIKEY_KEY', - ]; - } - - async testConnection() { - return this.client.cat.indices({ - format: 'json' - }); - } - - async release() { - await this.client.close(); - - if (this.config.openDistro && this.sqlClient) { - await this.sqlClient.close(); - } - } - - readOnly() { - // Both ES X-Pack & Open Distro don't support table creation - return true; - } - - async query(query, values) { - try { - const result = (await this.sqlClient.sql.query({ // TODO cursor - format: this.config.queryFormat, - body: { - query: SqlString.format(query, values) - } - })).body; - - // INFO: cloud left in place for backward compatibility - if (this.config.cloud || ['jdbc', 'json'].includes(this.config.queryFormat)) { - const compiled = result.rows.map( - r => result.columns.reduce((prev, cur, idx) => ({ ...prev, [cur.name]: r[idx] }), {}) - ); - - return compiled; - } - return result && result.aggregations && this.traverseAggregations(result.aggregations); - } catch (e) { - if (e.body) { - throw new Error(JSON.stringify(e.body, null, 2)); - } - - throw e; - } - } - - traverseAggregations(aggregations) { - const fields = Object.keys(aggregations).filter(k => k !== 'key' && k !== 'doc_count'); - if (fields.find(f => aggregations[f].hasOwnProperty('value'))) { - return [fields.map(f => ({ [f]: aggregations[f].value })).reduce((a, b) => ({ ...a, ...b }))]; - } - if (fields.length === 0) { - return [{}]; - } - if (fields.length !== 1) { - throw new Error(`Unexpected multiple fields at ${fields.join(', ')}`); - } - const dimension = fields[0]; - if (!aggregations[dimension].buckets) { - throw new Error(`Expecting buckets at dimension ${dimension}: ${aggregations[dimension]}`); - } - return aggregations[dimension].buckets.map(b => this.traverseAggregations(b).map( - innerRow => ({ ...innerRow, [dimension]: b.key }) - )).reduce((a, b) => a.concat(b), []); - } - - async tablesSchema() { - const indices = await this.client.cat.indices({ - format: 'json' - }); - - const schema = (await Promise.all(indices.body.map(async i => { - const props = (await this.client.indices.getMapping({ index: i.index })).body[i.index].mappings.properties || {}; - return { - [i.index]: Object.keys(props).map(p => ({ name: p, type: props[p].type })).filter(c => !!c.type) - }; - }))).reduce((a, b) => ({ ...a, ...b })); - - return { - main: schema - }; - } -} - -module.exports = ElasticSearchDriver; diff --git a/packages/cubejs-elasticsearch-driver/driver/index.d.ts b/packages/cubejs-elasticsearch-driver/driver/index.d.ts deleted file mode 100644 index db8bfe95f7b65..0000000000000 --- a/packages/cubejs-elasticsearch-driver/driver/index.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ClientOptions } from "@elastic/elasticsearch"; -import { BaseDriver } from "@cubejs-backend/base-driver"; - -declare module "@cubejs-backend/elasticsearch-driver" { - export type ElasticSearchDriverOptions = Pick & { - url?: string; - queryFormat?: string; - openDistro?: boolean; - }; - - export default class ElasticSearchDriver extends BaseDriver { - constructor(options?: ElasticSearchDriverOptions); - } -} diff --git a/packages/cubejs-elasticsearch-driver/jest.config.js b/packages/cubejs-elasticsearch-driver/jest.config.js deleted file mode 100644 index 708af916344d0..0000000000000 --- a/packages/cubejs-elasticsearch-driver/jest.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const base = require('../../jest.base.config'); - -/** @type {import('jest').Config} */ -module.exports = { - ...base, - rootDir: '.', - testMatch: [ - '**/__tests__/**/*.js?(x)', - '**/?(*.)+(spec|test|integration).js?(x)' - ] -}; diff --git a/packages/cubejs-elasticsearch-driver/package.json b/packages/cubejs-elasticsearch-driver/package.json deleted file mode 100644 index 1cc5433eb4c00..0000000000000 --- a/packages/cubejs-elasticsearch-driver/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@cubejs-backend/elasticsearch-driver", - "description": "Cube.js elasticsearch database driver", - "author": "Cube Dev, Inc.", - "version": "1.6.62", - "repository": { - "type": "git", - "url": "https://github.com/cube-js/cube.git", - "directory": "packages/cubejs-elasticsearch-driver" - }, - "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" - }, - "main": "driver/ElasticSearchDriver.js", - "typings": "driver/index.d.ts", - "scripts": { - "lint": "eslint **/*.js", - "lint:fix": "eslint --fix **/*.js", - "integration": "jest --ci ./test/*.integration.js", - "integration:elastic": "yarn run integration" - }, - "files": [ - "driver" - ], - "dependencies": { - "@cubejs-backend/base-driver": "1.6.62", - "@cubejs-backend/shared": "1.6.62", - "@elastic/elasticsearch": "7.12.0", - "sqlstring": "^2.3.1" - }, - "license": "Apache-2.0", - "devDependencies": { - "@cubejs-backend/linter": "1.6.62", - "@types/jest": "^29", - "jest": "^29", - "testcontainers": "^10.28.0" - }, - "eslintConfig": { - "extends": "../cubejs-linter" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/cubejs-elasticsearch-driver/test/ElasticSearchOpenDistro.integration.js b/packages/cubejs-elasticsearch-driver/test/ElasticSearchOpenDistro.integration.js deleted file mode 100644 index 2f9fa67422e8c..0000000000000 --- a/packages/cubejs-elasticsearch-driver/test/ElasticSearchOpenDistro.integration.js +++ /dev/null @@ -1,76 +0,0 @@ -/* globals describe, afterAll, beforeAll, test, expect, jest, it */ -const { GenericContainer, Wait } = require('testcontainers'); -const ElasticSearchDriver = require('../driver/ElasticSearchDriver'); - -describe('ElasticSearchDriver OpenDistro', () => { - let container; - let elasticSearchDriver; - - jest.setTimeout(60 * 2 * 1000); - - const version = process.env.TEST_ELASTIC_OPENDISTRO_VERSION || '1.13.1'; - - const startContainer = () => new GenericContainer(`amazon/opendistro-for-elasticsearch:${version}`) - .withEnvironment({ - 'discovery.type': 'single-node', - 'bootstrap.memory_lock': 'true', - ES_JAVA_OPTS: '-Xms512m -Xmx512m', - }) - .withExposedPorts(9200) - .withHealthCheck({ - test: [ - 'CMD-SHELL', - 'curl -k -u admin:admin --silent --fail https://localhost:9200/_cluster/health || exit 1' - ], - interval: 3 * 1000, - startPeriod: 15 * 1000, - timeout: 500, - retries: 30 - }) - .withWaitStrategy(Wait.forHealthCheck()) - .start(); - - const createDriver = (c) => { - const port = c && c.getMappedPort(9200) || 9200; - - return new ElasticSearchDriver({ - url: `https://localhost:${port}`, - ssl: { - rejectUnauthorized: false, - }, - auth: { - username: 'admin', - password: 'admin', - }, - openDistro: true, - queryFormat: 'json' - }); - }; - - beforeAll(async () => { - container = await startContainer(); - elasticSearchDriver = createDriver(container); - elasticSearchDriver.setLogger((msg, event) => console.log(`${msg}: ${JSON.stringify(event)}`)); - }); - - it('testConnection', async () => { - await elasticSearchDriver.testConnection(); - }); - - // It's not supported in Open Distro, probably it's supported in v2 Query Engine for Open Distro - // it('SELECT 1', async () => { - // await elasticSearchDriver.query('SELECT 1'); - // }); - - afterAll(async () => { - await elasticSearchDriver.release(); - - if (container) { - console.log('[container] Stopping'); - - await container.stop(); - - console.log('[container] Stopped'); - } - }); -}); diff --git a/packages/cubejs-schema-compiler/src/adapter/AWSElasticSearchQuery.ts b/packages/cubejs-schema-compiler/src/adapter/AWSElasticSearchQuery.ts deleted file mode 100644 index 2658ca53183fc..0000000000000 --- a/packages/cubejs-schema-compiler/src/adapter/AWSElasticSearchQuery.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { BaseFilter } from './BaseFilter'; -import { ElasticSearchQuery } from './ElasticSearchQuery'; - -const GRANULARITY_TO_INTERVAL = { - day: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd 00:00:00.000')`, - // eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars - week: (date) => { throw new Error('Week is unsupported'); }, // TODO - hour: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:00:00.000')`, - minute: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:mm:00.000')`, - second: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:mm:ss.000')`, - month: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-01 00:00:00.000')`, - year: (date) => `DATE_FORMAT(${date}, 'yyyy-01-01 00:00:00.000')` -}; - -class AWSElasticSearchQueryFilter extends BaseFilter { - public likeIgnoreCase(column, not, param, type) { - const p = (!type || type === 'contains' || type === 'ends') ? '%' : ''; - const s = (!type || type === 'contains' || type === 'starts') ? '%' : ''; - return `${column}${not ? ' NOT' : ''} LIKE CONCAT('${p}', ${this.allocateParam(param)}, '${s}')`; - } -} - -export class AWSElasticSearchQuery extends ElasticSearchQuery { - public override newFilter(filter) { - return new AWSElasticSearchQueryFilter(this, filter); - } - - public override subtractInterval(date, interval) { - return `DATE_SUB(${date}, INTERVAL ${interval})`; - } - - public override addInterval(date, interval) { - return `DATE_ADD(${date}, INTERVAL ${interval})`; - } - - public override timeGroupedColumn(granularity, dimension) { - return GRANULARITY_TO_INTERVAL[granularity](dimension); - } - - public override unixTimestampSql() { - return 'EXTRACT(EPOCH FROM NOW())'; - } -} diff --git a/packages/cubejs-schema-compiler/src/adapter/ElasticSearchQuery.ts b/packages/cubejs-schema-compiler/src/adapter/ElasticSearchQuery.ts deleted file mode 100644 index 0b009be8d7ecd..0000000000000 --- a/packages/cubejs-schema-compiler/src/adapter/ElasticSearchQuery.ts +++ /dev/null @@ -1,157 +0,0 @@ -/* eslint-disable max-classes-per-file */ -import R from 'ramda'; - -import { findMinGranularityDimension } from '@cubejs-backend/shared'; -import { BaseQuery } from './BaseQuery'; -import { BaseFilter } from './BaseFilter'; -import { BaseMeasure } from './BaseMeasure'; -import { BaseDimension } from './BaseDimension'; -import { BaseTimeDimension } from './BaseTimeDimension'; - -const GRANULARITY_TO_INTERVAL = { - day: date => `DATE_TRUNC('day', ${date}::datetime)`, - week: date => `DATE_TRUNC('week', ${date}::datetime)`, - hour: date => `DATE_TRUNC('hour', ${date}::datetime)`, - minute: date => `DATE_TRUNC('minute', ${date}::datetime)`, - second: date => `DATE_TRUNC('second', ${date}::datetime)`, - month: date => `DATE_TRUNC('month', ${date}::datetime)`, - quarter: date => `DATE_TRUNC('quarter', ${date}::datetime)`, - year: date => `DATE_TRUNC('year', ${date}::datetime)` -}; - -class ElasticSearchQueryFilter extends BaseFilter { - public likeIgnoreCase(column, not, param, type) { - if (type === 'starts') { - return `${not ? ' NOT' : ''} WHERE ${column} LIKE ${this.allocateParam(param)}%`; - } else if (type === 'ends') { - return `${not ? ' NOT' : ''} WHERE ${column} LIKE %${this.allocateParam(param)}`; - } else { - return `${not ? ' NOT' : ''} MATCH(${column}, ${this.allocateParam(param)}, 'fuzziness=AUTO:1,5')`; - } - } -} - -export class ElasticSearchQuery extends BaseQuery { - public override newFilter(filter) { - return new ElasticSearchQueryFilter(this, filter); - } - - public override convertTz(field) { - return `${field}`; // TODO - } - - public override timeStampCast(value) { - return `${value}`; - } - - public override dateTimeCast(value) { - return `${value}`; // TODO - } - - public override subtractInterval(date, interval) { - // TODO: Test this, note sure how value gets populated here - return `${date} - INTERVAL ${interval}`; - } - - public override addInterval(date, interval) { - // TODO: Test this, note sure how value gets populated here - return `${date} + INTERVAL ${interval}`; - } - - public override timeGroupedColumn(granularity, dimension) { - return GRANULARITY_TO_INTERVAL[granularity](dimension); - } - - public override unixTimestampSql() { - return 'TIMESTAMP_DIFF(\'seconds\', \'1970-01-01T00:00:00.000Z\'::datetime, CURRENT_TIMESTAMP())'; - } - - public override groupByClause() { - if (this.ungrouped) { - return ''; - } - const dimensionsForSelect = this.dimensionsForSelect(); - const dimensionColumns = R.flatten( - dimensionsForSelect.map(s => s.selectColumns() && s.dimensionSql()) - ).filter(s => !!s); - - return dimensionColumns.length ? ` GROUP BY ${dimensionColumns.join(', ')}` : ''; - } - - public override orderHashToString(hash: { id: string, desc: boolean }) { - if (!hash || !hash.id) { - return null; - } - - const fieldAlias = this.getFieldAlias(hash.id); - - if (fieldAlias === null) { - return null; - } - - const direction = hash.desc ? 'DESC' : 'ASC'; - return `${fieldAlias} ${direction}`; - } - - /** - * This implementation is a bit different from the one in BaseQuery - * as it uses dimensionSql() as ordering expression - */ - public getFieldAlias(id: string): string | null { - const equalIgnoreCase = (a: any, b: any) => ( - typeof a === 'string' && typeof b === 'string' && a.toUpperCase() === b.toUpperCase() - ); - - let field: BaseMeasure | BaseDimension | undefined; - - const path = id.split('.'); - - // Granularity is specified - if (path.length === 3) { - const memberName = path.slice(0, 2).join('.'); - const granularity = path[2]; - - field = this.timeDimensions - // Not all time dimensions are used in select list, some are just filters, - // but they exist in this.timeDimensions, so need to filter them out - .filter(d => d.selectColumns()) - .find( - d => ( - (equalIgnoreCase(d.dimension, memberName) && (d.granularityObj?.granularity === granularity)) || - equalIgnoreCase(d.expressionName, memberName) - ) - ); - - if (field) { - return field.dimensionSql(); - } - - return null; - } - - const dimensionsForSelect = this.dimensionsForSelect() - // Not all time dimensions are used in select list, some are just filters, - // but they exist in this.timeDimensions, so need to filter them out - .filter(d => d.selectColumns()); - - const found = findMinGranularityDimension(id, dimensionsForSelect); - - if (found?.dimension) { - return (found.dimension as BaseDimension).dimensionSql(); - } - - field = this.measures.find( - d => equalIgnoreCase(d.measure, id) || equalIgnoreCase(d.expressionName, id) - ); - - if (field) { - return field.aliasName(); // TODO isn't supported - } - - return null; - } - - public override escapeColumnName(name) { - return `${name}`; - } -} diff --git a/packages/cubejs-schema-compiler/src/adapter/QueryBuilder.ts b/packages/cubejs-schema-compiler/src/adapter/QueryBuilder.ts index 8ed97484eaf9f..f99bff6277a3e 100644 --- a/packages/cubejs-schema-compiler/src/adapter/QueryBuilder.ts +++ b/packages/cubejs-schema-compiler/src/adapter/QueryBuilder.ts @@ -12,8 +12,6 @@ import { CrateQuery } from './CrateQuery'; import { HiveQuery } from './HiveQuery'; import { OracleQuery } from './OracleQuery'; import { SqliteQuery } from './SqliteQuery'; -import { AWSElasticSearchQuery } from './AWSElasticSearchQuery'; -import { ElasticSearchQuery } from './ElasticSearchQuery'; import { CubeStoreQuery } from './CubeStoreQuery'; import { AthenaQuery } from './AthenaQuery'; import { TrinoQuery } from './TrinoQuery'; @@ -37,8 +35,6 @@ const ADAPTERS = { hive: HiveQuery, oracle: OracleQuery, sqlite: SqliteQuery, - awselasticsearch: AWSElasticSearchQuery, - elasticsearch: ElasticSearchQuery, materialize: PostgresQuery, cubestore: CubeStoreQuery, }; diff --git a/packages/cubejs-schema-compiler/src/adapter/index.ts b/packages/cubejs-schema-compiler/src/adapter/index.ts index 7a4cb76cf5566..fdb9bdfacf9c6 100644 --- a/packages/cubejs-schema-compiler/src/adapter/index.ts +++ b/packages/cubejs-schema-compiler/src/adapter/index.ts @@ -25,10 +25,8 @@ export { PreAggregationReferences } from '../compiler/CubeEvaluator'; // export * from './SnowflakeQuery'; // export * from './SqliteQuery'; // export * from './VerticaQuery'; -// export * from './AWSElasticSearchQuery'; // export * from './BigqueryQuery'; // export * from './ClickHouseQuery'; -// export * from './ElasticSearchQuery'; // export * from './HiveQuery'; // export * from './MongoBiQuery'; // export * from './MssqlQuery'; diff --git a/packages/cubejs-server-core/src/core/DriverDependencies.ts b/packages/cubejs-server-core/src/core/DriverDependencies.ts index 04f42704048aa..313e66e6b1b35 100644 --- a/packages/cubejs-server-core/src/core/DriverDependencies.ts +++ b/packages/cubejs-server-core/src/core/DriverDependencies.ts @@ -19,8 +19,6 @@ const DriverDependencies: Record = { trino: '@cubejs-backend/trino-driver', oracle: '@cubejs-backend/oracle-driver', sqlite: '@cubejs-backend/sqlite-driver', - awselasticsearch: '@cubejs-backend/elasticsearch-driver', - elasticsearch: '@cubejs-backend/elasticsearch-driver', dremio: '@cubejs-backend/dremio-driver', druid: '@cubejs-backend/druid-driver', duckdb: '@cubejs-backend/duckdb-driver', diff --git a/packages/cubejs-server-core/src/core/types.ts b/packages/cubejs-server-core/src/core/types.ts index 9edcdd552139e..e02f480fb18df 100644 --- a/packages/cubejs-server-core/src/core/types.ts +++ b/packages/cubejs-server-core/src/core/types.ts @@ -114,8 +114,6 @@ export type DatabaseType = | 'mssql' | 'mysql' | 'mysqlauroraserverless' - | 'elasticsearch' - | 'awselasticsearch' | 'oracle' | 'postgres' | 'prestodb' diff --git a/yarn.lock b/yarn.lock index 5cef89e2c08a8..5df6e23166071 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2899,17 +2899,6 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz#593da7a17a31a72a874e313677183334a49b01c9" integrity sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA== -"@elastic/elasticsearch@7.12.0": - version "7.12.0" - resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.12.0.tgz#dbb51a2841f644b670a56d8c15899e860928856f" - integrity sha512-GquUEytCijFRPEk3DKkkDdyhspB3qbucVQOwih9uNyz3iz804I+nGBUsFo2LwVvLQmQfEM0IY2+yoYfEz5wMug== - dependencies: - debug "^4.3.1" - hpagent "^0.1.1" - ms "^2.1.3" - pump "^3.0.0" - secure-json-parse "^2.3.1" - "@emnapi/core@1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034" @@ -15842,11 +15831,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -hpagent@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.2.tgz#cab39c66d4df2d4377dbd212295d878deb9bdaa9" - integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ== - html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -23313,11 +23297,6 @@ scroll-into-view-if-needed@^2.2.25: dependencies: compute-scroll-into-view "^1.0.17" -secure-json-parse@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85" - integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== - seek-bzip@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" From f23aa52d72784e4c8bf1822192926b9e8c7b01af Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Wed, 10 Jun 2026 12:08:56 +0200 Subject: [PATCH 02/26] feat(schema-compiler)!: Remove deprecated running_total measure type (#11044) BREAKING CHANGE: The running_total measure type has been removed. Data models that use `type: running_total` will now fail validation. Replace them with a rolling_window measure using an unbounded trailing window. --- DEPRECATION.md | 8 +- .../src/adapter/BaseMeasure.ts | 8 +- .../src/adapter/BaseQuery.js | 12 -- .../src/adapter/BigqueryQuery.ts | 15 -- .../src/compiler/CubeValidator.ts | 6 +- .../clickhouse-graph-builder.test.ts | 119 -------------- .../integration/mssql/mssql-ungrouped.test.ts | 12 -- .../postgres/sql-generation-logic.test.ts | 12 -- .../postgres/sql-generation.test.ts | 115 ------------- .../logical_plan/multistage/rolling_window.rs | 6 +- .../cubesqlplanner/src/physical_plan/join.rs | 37 ----- .../cubesqlplanner/src/physical_plan/mod.rs | 4 +- .../physical_plan/sql_nodes/rolling_window.rs | 2 +- .../processors/multi_stage_rolling_window.rs | 7 - .../planner/planners/multi_stage/member.rs | 14 +- .../multi_stage/member_query_planner.rs | 1 - .../multi_stage/multi_stage_query_planner.rs | 4 +- .../symbols/common/aggregation_type.rs | 16 +- .../src/planner/symbols/measure_kinds/mod.rs | 6 +- .../src/planner/symbols/measure_symbol.rs | 11 +- .../common/integration_rolling_window.yaml | 4 - .../yaml_files/common/measure_kind_tests.yaml | 3 - .../rolling_window/db_time_series.rs | 22 --- .../tests/integration/rolling_window/mod.rs | 1 - .../rolling_window/running_total.rs | 152 ------------------ ...__db_time_series__db_ts_running_total.snap | 17 -- ...al__running_total_and_regular_measure.snap | 22 --- ...ning_total__running_total_and_rolling.snap | 22 --- ...g_total__running_total_no_granularity.snap | 7 - ...l__running_total_with_day_granularity.snap | 22 --- ...g_total__running_total_with_dimension.snap | 44 ----- ...ning_total__running_total_with_filter.snap | 22 --- .../src/tests/measure_symbol.rs | 32 +--- rust/cubesql/cubesql/src/transport/ext.rs | 1 - 34 files changed, 21 insertions(+), 765 deletions(-) delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/running_total.rs delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__db_time_series__db_ts_running_total.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_regular_measure.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_rolling.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_no_granularity.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_day_granularity.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_dimension.snap delete mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_filter.snap diff --git a/DEPRECATION.md b/DEPRECATION.md index 392591f9b00a7..0e4900c0c9c08 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -57,7 +57,7 @@ features: | Removed | [Node.js 14](#nodejs-14) | v0.32.0 | v0.35.0 | | Removed | [Using Redis for in-memory cache and queue](#using-redis-for-in-memory-cache-and-queue) | v0.32.0 | v0.36.0 | | Deprecated | [`SECURITY_CONTEXT`](#security_context) | v0.33.0 | | -| Deprecated | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | | +| Removed | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | v1.7.0 | | Removed | [Top-level `includes` parameter in views](#top-level-includes-parameter-in-views) | v0.34.34 | v1.3.0 | | Removed | [Node.js 16](#nodejs-16) | v0.35.0 | v0.36.0 | | Removed | [MySQL-based SQL API](#mysql-based-sql-api) | v0.35.0 | v0.35.0 | @@ -348,9 +348,11 @@ instead. **Deprecated in Release: v0.33.39** -The `running_total` measure type is now deprecated, and we recommend using +**Removed in Release: v1.7.0** + +The `running_total` measure type has been removed. Use a [`rolling_window`](https://cube.dev/docs/product/data-modeling/reference/measures#rolling_window) -to calculate running totals instead. +with an `unbounded` trailing window to calculate running totals instead. ### Top-level `includes` parameter in views diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseMeasure.ts b/packages/cubejs-schema-compiler/src/adapter/BaseMeasure.ts index 6fff3530ee121..2762ca2223fed 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseMeasure.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BaseMeasure.ts @@ -260,13 +260,10 @@ export class BaseMeasure { } public static isCumulative(definition): boolean { - return definition.type === 'runningTotal' || !!definition.rollingWindow; + return !!definition.rollingWindow; } public rollingWindowDefinition() { - if (this.measureDefinition().type === 'runningTotal') { - throw new UserError('runningTotal rollups aren\'t supported. Please consider replacing runningTotal measure with rollingWindow.'); - } const { type } = this.measureDefinition().rollingWindow; if (type && type !== 'fixed') { throw new UserError(`Only fixed rolling windows are supported by Cube Store but got '${type}' rolling window`); @@ -276,9 +273,6 @@ export class BaseMeasure { public dateJoinCondition() { const definition = this.measureDefinition(); - if (definition.type === 'runningTotal') { - return this.query.runningTotalDateJoinCondition(); - } const { rollingWindow } = definition; if (rollingWindow.type === 'to_date') { return this.query.rollingWindowToDateJoinCondition(rollingWindow.granularity); diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 8a515e8e81906..ad20dac0cdd3a 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -1115,16 +1115,6 @@ export class BaseQuery { }); } - runningTotalDateJoinCondition() { - return this.timeDimensions - .map( - d => [ - d, - (_dateFrom, dateTo, dateField, dimensionDateFrom, _dimensionDateTo) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${dateTo}` - ] - ); - } - rollingWindowToDateJoinCondition(granularity) { return Object.values( this.timeDimensions.reduce((acc, td) => { @@ -3873,8 +3863,6 @@ export class BaseQuery { this.countDistinctApprox(evaluateSql); } else if (symbol.type === 'countDistinct' || symbol.type === 'count' && !symbol.sql && multiplied) { return `count(distinct ${evaluateSql})`; - } else if (symbol.type === 'runningTotal') { - return `sum(${evaluateSql})`; // TODO } if (multiplied) { if (symbol.type === 'number' && evaluateSql === 'count(*)') { diff --git a/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts b/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts index 5ec9906f91110..83834465db018 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts +++ b/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts @@ -195,21 +195,6 @@ export class BigqueryQuery extends BaseQuery { return `UNIX_SECONDS(${this.nowTimestampSql()})`; } - /** - * Should be protected, but BaseQuery is in js - * Overridden from BaseQuery to support BigQuery strict data types for - * joining conditions (note timeStampCast) - */ - public override runningTotalDateJoinCondition() { - return this.timeDimensions - .map( - d => [ - d, - (_dateFrom: string, dateTo: string, dateField: string, dimensionDateFrom: string, _dimensionDateTo: string) => `${dateField} >= ${dimensionDateFrom} AND ${dateField} <= ${this.timeStampCast(dateTo)}` - ] - ); - } - /** * Should be protected, but BaseQuery is in js * Overridden from BaseQuery to support BigQuery strict data types for diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts index 3b501eeca4f51..fa92c29859863 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts @@ -815,15 +815,15 @@ const CubeRefreshKeySchema = condition( ); const measureType = Joi.string().valid( - 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' + 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'countDistinctApprox' ); const measureTypeWithCount = Joi.string().valid( - 'count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' + 'count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'countDistinctApprox' ); const multiStageMeasureType = Joi.string().valid( - 'count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox', 'numberAgg', + 'count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'countDistinctApprox', 'numberAgg', 'rank' ); diff --git a/packages/cubejs-schema-compiler/test/integration/clickhouse/clickhouse-graph-builder.test.ts b/packages/cubejs-schema-compiler/test/integration/clickhouse/clickhouse-graph-builder.test.ts index 8d9b75e08fb8a..bf21fd7127019 100644 --- a/packages/cubejs-schema-compiler/test/integration/clickhouse/clickhouse-graph-builder.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/clickhouse/clickhouse-graph-builder.test.ts @@ -50,10 +50,6 @@ describe('ClickHouse JoinGraph', () => { }] }, per_visitor_revenue: perVisitorRevenueMeasure, - revenueRunning: { - type: 'runningTotal', - sql: 'amount' - }, revenueRolling: { type: 'sum', sql: 'amount', @@ -85,14 +81,6 @@ describe('ClickHouse JoinGraph', () => { offset: 'start' } }, - runningCount: { - type: 'runningTotal', - sql: '1' - }, - runningRevenuePerCount: { - type: 'number', - sql: \`round(\${revenueRunning} / \${runningCount})\` - }, averageCheckins: { type: 'avg', sql: \`\${doubledCheckings}\` @@ -385,68 +373,6 @@ describe('ClickHouse JoinGraph', () => { visitors__per_visitor_revenue: '60' }])); - // FAILS - need to finish query to override ::timestamptz - it.skip('running total', () => { - const result = compiler.compile().then(() => { - const query = new ClickHouseQuery({ joinGraph, cubeEvaluator, compiler }, { - measures: [ - 'visitors.revenueRunning' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - granularity: 'day', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }); - - logSqlAndParams(query); - - // TODO ordering doesn't work for running total - return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { - debugLog(JSON.stringify(res)); - expect(res).toEqual( - [{ - visitors__created_at_day: '2017-01-01T00:00:00.000Z', - visitors__revenue_running: null - }, { - visitors__created_at_day: '2017-01-02T00:00:00.000Z', - visitors__revenue_running: '100' - }, { - visitors__created_at_day: '2017-01-03T00:00:00.000Z', - visitors__revenue_running: '100' - }, { - visitors__created_at_day: '2017-01-04T00:00:00.000Z', - visitors__revenue_running: '300' - }, { - visitors__created_at_day: '2017-01-05T00:00:00.000Z', - visitors__revenue_running: '600' - }, { - visitors__created_at_day: '2017-01-06T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-07T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-08T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-09T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-10T00:00:00.000Z', - visitors__revenue_running: '1500' - }] - ); - }); - }); - - return result; - }); - // FAILS - need to finish query to override ::timestamptz it.skip('rolling', () => runQueryTest({ measures: [ @@ -577,51 +503,6 @@ describe('ClickHouse JoinGraph', () => { { visitors__created_at_sql_utils_day: '2017-01-06T00:00:00.000', visitors__visitor_count: '2' } ])); - it('running total total', () => runQueryTest({ - measures: [ - 'visitors.revenueRunning' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }, [ - { - visitors__revenue_running: '1500' - } - ])); - - // FAILS Unmatched parentheses - it.skip('running total ratio', () => runQueryTest({ - measures: [ - 'visitors.runningRevenuePerCount' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - granularity: 'day', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }, [ - { visitors__created_at_day: '2017-01-01T00:00:00.000Z', visitors__running_revenue_per_count: null }, - { visitors__created_at_day: '2017-01-02T00:00:00.000Z', visitors__running_revenue_per_count: '100' }, - { visitors__created_at_day: '2017-01-03T00:00:00.000Z', visitors__running_revenue_per_count: '100' }, - { visitors__created_at_day: '2017-01-04T00:00:00.000Z', visitors__running_revenue_per_count: '150' }, - { visitors__created_at_day: '2017-01-05T00:00:00.000Z', visitors__running_revenue_per_count: '200' }, - { visitors__created_at_day: '2017-01-06T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-07T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-08T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-09T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-10T00:00:00.000Z', visitors__running_revenue_per_count: '300' } - ])); - // FAILS ClickHouse supports multiple approximate aggregators: // uniq, uniqCombined, uniqHLL12, need to pick one to use and implement it in query it.skip('hll rolling', () => { diff --git a/packages/cubejs-schema-compiler/test/integration/mssql/mssql-ungrouped.test.ts b/packages/cubejs-schema-compiler/test/integration/mssql/mssql-ungrouped.test.ts index 91ff98251519a..94feac38d3384 100644 --- a/packages/cubejs-schema-compiler/test/integration/mssql/mssql-ungrouped.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/mssql/mssql-ungrouped.test.ts @@ -44,10 +44,6 @@ describe('MSSqlUngrouped', () => { }] }, per_visitor_revenue: perVisitorRevenueMeasure, - revenueRunning: { - type: 'runningTotal', - sql: 'amount' - }, revenueRolling: { type: 'sum', sql: 'amount', @@ -79,14 +75,6 @@ describe('MSSqlUngrouped', () => { offset: 'start' } }, - runningCount: { - type: 'runningTotal', - sql: '1' - }, - runningRevenuePerCount: { - type: 'number', - sql: \`round(\${revenueRunning} / \${runningCount})\` - }, averageCheckins: { type: 'avg', sql: \`\${doubledCheckings}\` diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts index 6b608e3599ae5..0e74733c1912e 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts @@ -46,10 +46,6 @@ describe('SQL Generation', () => { }] }, per_visitor_revenue: perVisitorRevenueMeasure, - revenueRunning: { - type: 'runningTotal', - sql: 'amount' - }, revenueRolling: { type: 'sum', sql: 'amount', @@ -81,14 +77,6 @@ describe('SQL Generation', () => { offset: 'start' } }, - runningCount: { - type: 'runningTotal', - sql: '1' - }, - runningRevenuePerCount: { - type: 'number', - sql: \`round(\${revenueRunning} / \${runningCount})\` - }, averageCheckins: { type: 'avg', sql: \`\${doubledCheckings}\` diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts index 4d5d404c5b458..0713f8e716dc8 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts @@ -97,10 +97,6 @@ describe('SQL Generation', () => { }] }, per_visitor_revenue: perVisitorRevenueMeasure, - revenueRunning: { - type: 'runningTotal', - sql: 'amount' - }, revenueRolling: { type: 'sum', sql: 'amount', @@ -227,14 +223,6 @@ describe('SQL Generation', () => { offset: 'start' } }, - runningCount: { - type: 'runningTotal', - sql: '1' - }, - runningRevenuePerCount: { - type: 'number', - sql: \`round(\${revenueRunning} / \${runningCount})\` - }, averageCheckins: { type: 'avg', sql: \`\${doubledCheckings}\` @@ -1066,65 +1054,6 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL } ])); - it('running total', async () => { - await compiler.compile(); - - const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { - measures: [ - 'visitors.revenueRunning' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - granularity: 'day', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }); - - console.log(query.buildSqlAndParams()); - - // TODO ordering doesn't work for running total - return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { - console.log(JSON.stringify(res)); - expect(res).toEqual( - [{ - visitors__created_at_day: '2017-01-01T00:00:00.000Z', - visitors__revenue_running: null - }, { - visitors__created_at_day: '2017-01-02T00:00:00.000Z', - visitors__revenue_running: '100' - }, { - visitors__created_at_day: '2017-01-03T00:00:00.000Z', - visitors__revenue_running: '100' - }, { - visitors__created_at_day: '2017-01-04T00:00:00.000Z', - visitors__revenue_running: '300' - }, { - visitors__created_at_day: '2017-01-05T00:00:00.000Z', - visitors__revenue_running: '600' - }, { - visitors__created_at_day: '2017-01-06T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-07T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-08T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-09T00:00:00.000Z', - visitors__revenue_running: '1500' - }, { - visitors__created_at_day: '2017-01-10T00:00:00.000Z', - visitors__revenue_running: '1500' - }] - ); - }); - }); - it('rolling', async () => runQueryTest({ measures: [ 'visitors.revenueRolling' @@ -2282,50 +2211,6 @@ SELECT 1 AS revenue, cast('2024-01-01' AS timestamp) as time UNION ALL { visitors__created_at_sql_utils_day: '2017-01-06T00:00:00.000Z', visitors__visitor_count: '2' } ])); - it('running total total', async () => runQueryTest({ - measures: [ - 'visitors.revenueRunning' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }, [ - { - visitors__revenue_running: '1500' - } - ])); - - it('running total ratio', async () => runQueryTest({ - measures: [ - 'visitors.runningRevenuePerCount' - ], - timeDimensions: [{ - dimension: 'visitors.created_at', - granularity: 'day', - dateRange: ['2017-01-01', '2017-01-10'] - }], - order: [{ - id: 'visitors.created_at' - }], - timezone: 'America/Los_Angeles' - }, [ - { visitors__created_at_day: '2017-01-01T00:00:00.000Z', visitors__running_revenue_per_count: null }, - { visitors__created_at_day: '2017-01-02T00:00:00.000Z', visitors__running_revenue_per_count: '100' }, - { visitors__created_at_day: '2017-01-03T00:00:00.000Z', visitors__running_revenue_per_count: '100' }, - { visitors__created_at_day: '2017-01-04T00:00:00.000Z', visitors__running_revenue_per_count: '150' }, - { visitors__created_at_day: '2017-01-05T00:00:00.000Z', visitors__running_revenue_per_count: '200' }, - { visitors__created_at_day: '2017-01-06T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-07T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-08T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-09T00:00:00.000Z', visitors__running_revenue_per_count: '300' }, - { visitors__created_at_day: '2017-01-10T00:00:00.000Z', visitors__running_revenue_per_count: '300' } - ])); - it('hll rolling (BigQuery)', async () => { await compiler.compile(); diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/rolling_window.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/rolling_window.rs index 613b52fb5a5d1..d76993892802a 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/rolling_window.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/rolling_window.rs @@ -45,11 +45,10 @@ impl PrettyPrint for MultiStageToDateRollingWindow { } /// Flavour of rolling-window calculation: regular trailing/leading -/// window, `to_date` window, or a running-total accumulation. +/// window or a `to_date` window. pub enum MultiStageRollingWindowType { Regular(MultiStageRegularRollingWindow), ToDate(MultiStageToDateRollingWindow), - RunningTotal, } impl PrettyPrint for MultiStageRollingWindowType { @@ -57,9 +56,6 @@ impl PrettyPrint for MultiStageRollingWindowType { match self { MultiStageRollingWindowType::Regular(window) => window.pretty_print(result, state), MultiStageRollingWindowType::ToDate(window) => window.pretty_print(result, state), - MultiStageRollingWindowType::RunningTotal => { - result.println("Running Total Rolling Window", state) - } } } } diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/join.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/join.rs index ff45fa4e0b641..b97fb8d68cfe3 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/join.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/join.rs @@ -91,34 +91,6 @@ impl RegularRollingWindowJoinCondition { } } -#[derive(Clone)] -pub struct RollingTotalJoinCondition { - time_series_source: String, - time_dimension: Expr, -} - -impl RollingTotalJoinCondition { - pub fn new(time_series_source: String, time_dimension: Expr) -> Self { - Self { - time_series_source, - time_dimension, - } - } - - pub fn to_sql( - &self, - templates: &PlanSqlTemplates, - context: Rc, - ) -> Result { - let date_column = self.time_dimension.to_sql(templates, context)?; - let date_to = - templates.column_reference(&Some(self.time_series_source.clone()), "date_to")?; - let date_to = templates.rolling_window_expr_timestamp_cast(&date_to)?; - let result = format!("{date_column} <= {date_to}"); - Ok(result) - } -} - #[derive(Clone)] pub struct ToDateRollingWindowJoinCondition { time_series_source: String, @@ -223,7 +195,6 @@ pub enum JoinCondition { BaseJoinCondition(Rc), RegularRollingWindowJoinCondition(RegularRollingWindowJoinCondition), ToDateRollingWindowJoinCondition(ToDateRollingWindowJoinCondition), - RollingTotalJoinCondition(RollingTotalJoinCondition), } impl JoinCondition { @@ -261,13 +232,6 @@ impl JoinCondition { )) } - pub fn new_rolling_total_join(time_series_source: String, time_dimension: Expr) -> Self { - Self::RollingTotalJoinCondition(RollingTotalJoinCondition::new( - time_series_source, - time_dimension, - )) - } - pub fn new_base_join(base: Rc) -> Self { Self::BaseJoinCondition(base) } @@ -286,7 +250,6 @@ impl JoinCondition { JoinCondition::ToDateRollingWindowJoinCondition(cond) => { cond.to_sql(templates, context) } - JoinCondition::RollingTotalJoinCondition(cond) => cond.to_sql(templates, context), } } } diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/mod.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/mod.rs index 592efaa12d1bc..9d7c0cfee21bd 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/mod.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/mod.rs @@ -24,9 +24,7 @@ pub use cte::Cte; pub use cube_ref_evaluator::CubeRefEvaluator; pub use expression::{Expr, MemberExpression}; pub use from::{From, FromSource, SingleAliasedSource, SingleSource}; -pub use join::{ - Join, JoinCondition, JoinItem, RegularRollingWindowJoinCondition, RollingTotalJoinCondition, -}; +pub use join::{Join, JoinCondition, JoinItem, RegularRollingWindowJoinCondition}; pub use order::OrderBy; pub use query_plan::QueryPlan; pub use references_builder::ReferencesBuilder; diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/rolling_window.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/rolling_window.rs index 77bea9c59666c..7ad5e6ed2173d 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/rolling_window.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/rolling_window.rs @@ -65,7 +65,7 @@ impl SqlNode for RollingWindowNode { AggregationType::CountDistinctApprox => { templates.hll_cardinality_merge(render_input()?)? } - AggregationType::Sum | AggregationType::RunningTotal => { + AggregationType::Sum => { format!("sum({})", render_input()?) } AggregationType::Min | AggregationType::Max => { diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/multi_stage_rolling_window.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/multi_stage_rolling_window.rs index bfbbb30d139ef..d34a89a2246e0 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/multi_stage_rolling_window.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/multi_stage_rolling_window.rs @@ -72,13 +72,6 @@ impl<'a> LogicalNodeProcessor<'a, MultiStageRollingWindow> query_tools.clone(), ) } - MultiStageRollingWindowType::RunningTotal => JoinCondition::new_rolling_total_join( - root_alias.clone(), - Expr::Reference(QualifiedColumnName::new( - Some(measure_input_alias.clone()), - base_time_dimension_alias, - )), - ), }; join_builder.left_join_table_reference( diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs index 9a429eecdc96b..044a33a07d2f7 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs @@ -37,12 +37,11 @@ pub struct ToDateRollingWindow { } /// Flavour of rolling-window computation: regular trailing/leading -/// window, to-date window, or a running-total accumulation. +/// window or a to-date window. #[derive(Clone)] pub enum RollingWindowType { Regular(RegularRollingWindow), ToDate(ToDateRollingWindow), - RunningTotal, } /// Planner-side description of a rolling window: the time @@ -86,17 +85,6 @@ impl RollingWindowDescription { rolling_window: RollingWindowType::ToDate(ToDateRollingWindow { granularity }), } } - - pub fn new_running_total( - time_dimension: Rc, - base_time_dimension: Rc, - ) -> Self { - Self { - time_dimension, - base_time_dimension, - rolling_window: RollingWindowType::RunningTotal, - } - } } /// Semantic shape of a non-leaf multi-stage CTE: a rank window, diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs index 689d4fc95a3d2..bf9de1789ae9d 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs @@ -168,7 +168,6 @@ impl MultiStageMemberQueryPlanner { granularity_obj: Rc::new(granularity_obj), }) } - RollingWindowType::RunningTotal => MultiStageRollingWindowType::RunningTotal, }; let schema = LogicalSchema::default() diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs index 10f6792f3851b..dcec177db4f05 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs @@ -767,9 +767,7 @@ impl MultiStageQueryPlanner { let alias = scope.next_cte_name(); - let rolling_window_descr = if measure.is_running_total() { - RollingWindowDescription::new_running_total(time_dimension, base_time_dimension) - } else if let Some(granularity) = + let rolling_window_descr = if let Some(granularity) = self.get_to_date_rolling_granularity(&rolling_window)? { RollingWindowDescription::new_to_date( diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/common/aggregation_type.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/common/aggregation_type.rs index c482de005862f..e78d5c68dc941 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/common/aggregation_type.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/common/aggregation_type.rs @@ -11,7 +11,6 @@ pub enum AggregationType { CountDistinct, CountDistinctApprox, NumberAgg, - RunningTotal, } impl AggregationType { @@ -24,7 +23,6 @@ impl AggregationType { "countDistinct" | "count_distinct" => Ok(Self::CountDistinct), "countDistinctApprox" | "count_distinct_approx" => Ok(Self::CountDistinctApprox), "numberAgg" | "number_agg" => Ok(Self::NumberAgg), - "runningTotal" | "running_total" => Ok(Self::RunningTotal), other => Err(CubeError::user(format!( "Unknown aggregation type: '{}'", other @@ -35,7 +33,7 @@ impl AggregationType { pub fn is_additive(&self) -> bool { matches!( self, - Self::Sum | Self::Min | Self::Max | Self::CountDistinctApprox | Self::RunningTotal + Self::Sum | Self::Min | Self::Max | Self::CountDistinctApprox ) } @@ -52,7 +50,6 @@ impl AggregationType { Self::CountDistinct => "countDistinct", Self::CountDistinctApprox => "countDistinctApprox", Self::NumberAgg => "numberAgg", - Self::RunningTotal => "runningTotal", } } } @@ -99,10 +96,6 @@ mod tests { AggregationType::from_str("numberAgg").unwrap(), AggregationType::NumberAgg ); - assert_eq!( - AggregationType::from_str("runningTotal").unwrap(), - AggregationType::RunningTotal - ); } #[test] @@ -119,10 +112,6 @@ mod tests { AggregationType::from_str("number_agg").unwrap(), AggregationType::NumberAgg ); - assert_eq!( - AggregationType::from_str("running_total").unwrap(), - AggregationType::RunningTotal - ); } #[test] @@ -134,7 +123,6 @@ mod tests { assert!(!AggregationType::CountDistinct.is_additive()); assert!(AggregationType::CountDistinctApprox.is_additive()); assert!(!AggregationType::NumberAgg.is_additive()); - assert!(AggregationType::RunningTotal.is_additive()); } #[test] @@ -146,7 +134,6 @@ mod tests { assert!(!AggregationType::Min.is_distinct()); assert!(!AggregationType::Max.is_distinct()); assert!(!AggregationType::NumberAgg.is_distinct()); - assert!(!AggregationType::RunningTotal.is_distinct()); } #[test] @@ -159,7 +146,6 @@ mod tests { AggregationType::CountDistinct, AggregationType::CountDistinctApprox, AggregationType::NumberAgg, - AggregationType::RunningTotal, ]; for v in &variants { let s = v.as_str(); diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_kinds/mod.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_kinds/mod.rs index a16fb633c8175..5ec4591d53c99 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_kinds/mod.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_kinds/mod.rs @@ -28,8 +28,7 @@ pub enum AggregateWrap<'a> { /// - `Count` — `type: count`. Counts rows; falls back to the cube's /// primary keys when no explicit `sql` is given. /// - `Aggregated` — built-in aggregation (`sum`, `avg`, `min`, `max`, -/// `count_distinct`, `count_distinct_approx`, `number_agg`, -/// `running_total`). +/// `count_distinct`, `count_distinct_approx`, `number_agg`). /// - `Calculated` — `type: number / string / time / boolean`. A /// plain expression with no aggregation wrapper. /// - `Rank` — `type: rank`. Window-function rank, no `sql`. @@ -180,7 +179,7 @@ impl MeasureKind { /// True if extra `measure_filters` can be merged into the kind. /// Counts and the basic aggregations support it; `number_agg`, - /// `running_total`, calculated and rank measures do not. + /// calculated and rank measures do not. pub fn supports_additional_filters(&self) -> bool { match self { Self::Count(_) | Self::MultipliedCount(_) => true, @@ -219,7 +218,6 @@ impl MeasureKind { AggregationType::NumberAgg => AggregateWrap::PassThrough, AggregationType::CountDistinctApprox => AggregateWrap::CountDistinctApprox, AggregationType::CountDistinct => AggregateWrap::CountDistinct, - AggregationType::RunningTotal => AggregateWrap::Function("sum"), _ => AggregateWrap::Function(a.agg_type().as_str()), }, Self::Count(_) => AggregateWrap::Function("count"), diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_symbol.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_symbol.rs index bafb42701de38..f12c0277f0030 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_symbol.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/measure_symbol.rs @@ -1,4 +1,4 @@ -use super::common::{AggregationType, Case, CompiledMemberPath, MultiStageProperties}; +use super::common::{Case, CompiledMemberPath, MultiStageProperties}; use super::measure_kinds::{CalculatedMeasure, CalculatedMeasureType, MeasureKind}; use super::SymbolPath; use super::{MemberSymbol, SymbolFactory}; @@ -450,14 +450,9 @@ impl MeasureSymbol { self.rolling_window().is_some() } - pub fn is_running_total(&self) -> bool { - matches!(&self.kind, MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::RunningTotal) - } - - /// True for rolling-window measures and running-total - /// aggregations. + /// True for rolling-window measures. pub fn is_cumulative(&self) -> bool { - self.is_rolling_window() || self.is_running_total() + self.is_rolling_window() } pub fn measure_filters(&self) -> &Vec> { diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_rolling_window.yaml b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_rolling_window.yaml index f00b81a9436ef..61d7349051ccc 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_rolling_window.yaml +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_rolling_window.yaml @@ -177,10 +177,6 @@ cubes: trailing: 3 day leading: 1 day offset: end - # Cat 15 — running total - - name: running_total - type: runningTotal - sql: amount # Cat 16 — count distinct - name: unique_customers type: count_distinct diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/measure_kind_tests.yaml b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/measure_kind_tests.yaml index 2fba7d430b418..c2fc615f6d83b 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/measure_kind_tests.yaml +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/measure_kind_tests.yaml @@ -33,9 +33,6 @@ cubes: - name: approx_count type: countDistinctApprox sql: user_id - - name: running - type: runningTotal - sql: amount - name: number_agg type: numberAgg sql: amount diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/db_time_series.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/db_time_series.rs index 5673a077d6858..0a575a4cf99ef 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/db_time_series.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/db_time_series.rs @@ -151,25 +151,3 @@ async fn test_db_ts_multiple_rolling() { insta::assert_snapshot!(result); } } - -#[tokio::test(flavor = "multi_thread")] -async fn test_db_ts_running_total() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-20" - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/mod.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/mod.rs index b9138cd09277d..1bb0648f1c150 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/mod.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/mod.rs @@ -11,7 +11,6 @@ mod multi_fact; mod multiple_rolling; mod offset_variations; mod order_and_limit; -mod running_total; mod time_dimension_variations; mod timezone; mod to_date_variations; diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/running_total.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/running_total.rs deleted file mode 100644 index 1511155a8dfc2..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/running_total.rs +++ /dev/null @@ -1,152 +0,0 @@ -use crate::test_fixtures::cube_bridge::MockSchema; -use crate::test_fixtures::test_utils::TestContext; -use indoc::indoc; - -fn create_context() -> TestContext { - let schema = MockSchema::from_yaml_file("common/integration_rolling_window.yaml"); - TestContext::new(schema).unwrap() -} - -const SEED: &str = "integration_rolling_window_tables.sql"; - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_no_granularity() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - time_dimensions: - - dimension: orders.created_at - dateRange: - - "2024-01-10" - - "2024-01-25" - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_with_day_granularity() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-25" - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_with_dimension() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - dimensions: - - orders.status - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-25" - order: - - id: orders.status - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_with_filter() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-25" - filters: - - dimension: orders.status - operator: equals - values: - - completed - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_and_rolling() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - - orders.rolling_sum_trailing_7d - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-25" - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} - -#[tokio::test(flavor = "multi_thread")] -async fn test_running_total_and_regular_measure() { - let ctx = create_context(); - - let query = indoc! {r#" - measures: - - orders.running_total - - orders.total_amount - time_dimensions: - - dimension: orders.created_at - granularity: day - dateRange: - - "2024-01-10" - - "2024-01-25" - "#}; - - ctx.build_sql(query).unwrap(); - - if let Some(result) = ctx.try_execute_pg(query, SEED).await { - insta::assert_snapshot!(result); - } -} diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__db_time_series__db_ts_running_total.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__db_time_series__db_ts_running_total.snap deleted file mode 100644 index 05419c20f817f..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__db_time_series__db_ts_running_total.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/db_time_series.rs -expression: result ---- -orders__created_at_day | orders__running_total ------------------------+---------------------- -2024-01-10 00:00:00 | 30.00 -2024-01-11 00:00:00 | 30.00 -2024-01-12 00:00:00 | 380.00 -2024-01-13 00:00:00 | 380.00 -2024-01-14 00:00:00 | 470.00 -2024-01-15 00:00:00 | 530.00 -2024-01-16 00:00:00 | 650.00 -2024-01-17 00:00:00 | 650.00 -2024-01-18 00:00:00 | 830.00 -2024-01-19 00:00:00 | 830.00 -2024-01-20 00:00:00 | 830.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_regular_measure.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_regular_measure.snap deleted file mode 100644 index 5d1a5a767df9b..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_regular_measure.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__created_at_day | orders__running_total | orders__total_amount ------------------------+-----------------------+--------------------- -2024-01-10 00:00:00 | 30.00 | 30.00 -2024-01-11 00:00:00 | 30.00 | NULL -2024-01-12 00:00:00 | 380.00 | 350.00 -2024-01-13 00:00:00 | 380.00 | NULL -2024-01-14 00:00:00 | 470.00 | 90.00 -2024-01-15 00:00:00 | 530.00 | 60.00 -2024-01-16 00:00:00 | 650.00 | 120.00 -2024-01-17 00:00:00 | 650.00 | NULL -2024-01-18 00:00:00 | 830.00 | 180.00 -2024-01-19 00:00:00 | 830.00 | NULL -2024-01-20 00:00:00 | 830.00 | NULL -2024-01-21 00:00:00 | 830.00 | NULL -2024-01-22 00:00:00 | 830.00 | NULL -2024-01-23 00:00:00 | 830.00 | NULL -2024-01-24 00:00:00 | 830.00 | NULL -2024-01-25 00:00:00 | 1080.00 | 250.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_rolling.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_rolling.snap deleted file mode 100644 index defb7f5b94c97..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_and_rolling.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__created_at_day | orders__running_total | orders__rolling_sum_trailing_7d ------------------------+-----------------------+-------------------------------- -2024-01-10 00:00:00 | 30.00 | 305.00 -2024-01-11 00:00:00 | 30.00 | 230.00 -2024-01-12 00:00:00 | 380.00 | 580.00 -2024-01-13 00:00:00 | 380.00 | 580.00 -2024-01-14 00:00:00 | 470.00 | 670.00 -2024-01-15 00:00:00 | 530.00 | 530.00 -2024-01-16 00:00:00 | 650.00 | 650.00 -2024-01-17 00:00:00 | 650.00 | 620.00 -2024-01-18 00:00:00 | 830.00 | 800.00 -2024-01-19 00:00:00 | 830.00 | 450.00 -2024-01-20 00:00:00 | 830.00 | 450.00 -2024-01-21 00:00:00 | 830.00 | 360.00 -2024-01-22 00:00:00 | 830.00 | 300.00 -2024-01-23 00:00:00 | 830.00 | 180.00 -2024-01-24 00:00:00 | 830.00 | 180.00 -2024-01-25 00:00:00 | 1080.00 | 250.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_no_granularity.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_no_granularity.snap deleted file mode 100644 index 99a7814a286da..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_no_granularity.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__running_total ---------------------- -1080.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_day_granularity.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_day_granularity.snap deleted file mode 100644 index 1b0b44df84602..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_day_granularity.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__created_at_day | orders__running_total ------------------------+---------------------- -2024-01-10 00:00:00 | 30.00 -2024-01-11 00:00:00 | 30.00 -2024-01-12 00:00:00 | 380.00 -2024-01-13 00:00:00 | 380.00 -2024-01-14 00:00:00 | 470.00 -2024-01-15 00:00:00 | 530.00 -2024-01-16 00:00:00 | 650.00 -2024-01-17 00:00:00 | 650.00 -2024-01-18 00:00:00 | 830.00 -2024-01-19 00:00:00 | 830.00 -2024-01-20 00:00:00 | 830.00 -2024-01-21 00:00:00 | 830.00 -2024-01-22 00:00:00 | 830.00 -2024-01-23 00:00:00 | 830.00 -2024-01-24 00:00:00 | 830.00 -2024-01-25 00:00:00 | 1080.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_dimension.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_dimension.snap deleted file mode 100644 index 4e015591f72e0..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_dimension.snap +++ /dev/null @@ -1,44 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__status | orders__created_at_day | orders__running_total ----------------+------------------------+---------------------- -cancelled | 2024-01-16 00:00:00 | 120.00 -cancelled | 2024-01-17 00:00:00 | 120.00 -cancelled | 2024-01-18 00:00:00 | 120.00 -cancelled | 2024-01-19 00:00:00 | 120.00 -cancelled | 2024-01-20 00:00:00 | 120.00 -cancelled | 2024-01-21 00:00:00 | 120.00 -cancelled | 2024-01-22 00:00:00 | 120.00 -cancelled | 2024-01-23 00:00:00 | 120.00 -cancelled | 2024-01-24 00:00:00 | 120.00 -cancelled | 2024-01-25 00:00:00 | 120.00 -completed | 2024-01-10 00:00:00 | 30.00 -completed | 2024-01-11 00:00:00 | 30.00 -completed | 2024-01-12 00:00:00 | 380.00 -completed | 2024-01-13 00:00:00 | 380.00 -completed | 2024-01-14 00:00:00 | 380.00 -completed | 2024-01-15 00:00:00 | 440.00 -completed | 2024-01-16 00:00:00 | 440.00 -completed | 2024-01-17 00:00:00 | 440.00 -completed | 2024-01-18 00:00:00 | 620.00 -completed | 2024-01-19 00:00:00 | 620.00 -completed | 2024-01-20 00:00:00 | 620.00 -completed | 2024-01-21 00:00:00 | 620.00 -completed | 2024-01-22 00:00:00 | 620.00 -completed | 2024-01-23 00:00:00 | 620.00 -completed | 2024-01-24 00:00:00 | 620.00 -completed | 2024-01-25 00:00:00 | 870.00 -pending | 2024-01-14 00:00:00 | 90.00 -pending | 2024-01-15 00:00:00 | 90.00 -pending | 2024-01-16 00:00:00 | 90.00 -pending | 2024-01-17 00:00:00 | 90.00 -pending | 2024-01-18 00:00:00 | 90.00 -pending | 2024-01-19 00:00:00 | 90.00 -pending | 2024-01-20 00:00:00 | 90.00 -pending | 2024-01-21 00:00:00 | 90.00 -pending | 2024-01-22 00:00:00 | 90.00 -pending | 2024-01-23 00:00:00 | 90.00 -pending | 2024-01-24 00:00:00 | 90.00 -pending | 2024-01-25 00:00:00 | 90.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_filter.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_filter.snap deleted file mode 100644 index d8a6cd41e95c1..0000000000000 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/rolling_window/snapshots/cubesqlplanner__tests__integration__rolling_window__running_total__running_total_with_filter.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: cubesqlplanner/src/tests/integration/rolling_window/running_total.rs -expression: result ---- -orders__created_at_day | orders__running_total ------------------------+---------------------- -2024-01-10 00:00:00 | 30.00 -2024-01-11 00:00:00 | 30.00 -2024-01-12 00:00:00 | 380.00 -2024-01-13 00:00:00 | 380.00 -2024-01-14 00:00:00 | 380.00 -2024-01-15 00:00:00 | 440.00 -2024-01-16 00:00:00 | 440.00 -2024-01-17 00:00:00 | 440.00 -2024-01-18 00:00:00 | 620.00 -2024-01-19 00:00:00 | 620.00 -2024-01-20 00:00:00 | 620.00 -2024-01-21 00:00:00 | 620.00 -2024-01-22 00:00:00 | 620.00 -2024-01-23 00:00:00 | 620.00 -2024-01-24 00:00:00 | 620.00 -2024-01-25 00:00:00 | 870.00 diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/measure_symbol.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/measure_symbol.rs index c390cc4fb8fd2..1de8d4d2869d8 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/measure_symbol.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/measure_symbol.rs @@ -25,7 +25,6 @@ fn measure_count_properties() { assert!(matches!(measure.kind(), MeasureKind::Count(_))); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_rolling_window()); assert!(!measure.is_cumulative()); assert!(measure.is_additive()); @@ -42,7 +41,6 @@ fn measure_sum_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::Sum )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_rolling_window()); assert!(!measure.is_cumulative()); assert!(measure.is_additive()); @@ -59,7 +57,6 @@ fn measure_avg_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::Avg )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(!measure.is_additive()); } @@ -75,7 +72,6 @@ fn measure_min_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::Min )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(measure.is_additive()); } @@ -91,7 +87,6 @@ fn measure_max_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::Max )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(measure.is_additive()); } @@ -107,7 +102,6 @@ fn measure_count_distinct_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::CountDistinct )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(!measure.is_additive()); } @@ -123,28 +117,10 @@ fn measure_count_distinct_approx_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::CountDistinctApprox )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(measure.is_additive()); } -#[test] -fn measure_running_total_properties() { - let ctx = ctx(); - let m = ctx.create_measure("test_measures.running").unwrap(); - let measure = m.as_measure().unwrap(); - - assert!(matches!( - measure.kind(), - MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::RunningTotal - )); - assert!(!measure.is_calculated()); - assert!(measure.is_running_total()); - assert!(!measure.is_rolling_window()); - assert!(measure.is_cumulative()); - assert!(measure.is_additive()); -} - #[test] fn measure_number_agg_properties() { let ctx = ctx(); @@ -156,7 +132,6 @@ fn measure_number_agg_properties() { MeasureKind::Aggregated(a) if a.agg_type() == AggregationType::NumberAgg )); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(!measure.is_additive()); } @@ -172,7 +147,6 @@ fn measure_calculated_number_properties() { MeasureKind::Calculated(c) if c.calc_type() == CalculatedMeasureType::Number )); assert!(measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(!measure.is_additive()); } @@ -185,7 +159,6 @@ fn measure_rank_properties() { assert!(matches!(measure.kind(), MeasureKind::Rank)); assert!(!measure.is_calculated()); - assert!(!measure.is_running_total()); assert!(!measure.is_cumulative()); assert!(!measure.is_additive()); } @@ -202,7 +175,6 @@ fn measure_rolling_window_properties() { )); assert!(measure.is_rolling_window()); assert!(measure.is_cumulative()); - assert!(!measure.is_running_total()); } // ─── new_patched: valid type replacements ─────────────────────────────────── @@ -287,7 +259,7 @@ fn new_patched_sum_invalid_targets() { let m = ctx.create_measure("test_measures.total").unwrap(); let measure = m.as_measure().unwrap(); - for invalid in ["number", "count", "runningTotal", "rank", "numberAgg"] { + for invalid in ["number", "count", "rank", "numberAgg"] { assert!( measure .new_patched(Some(invalid.to_string()), vec![]) @@ -317,7 +289,6 @@ fn new_patched_non_patchable_types() { "test_measures.cnt", "test_measures.calculated", "test_measures.rank_measure", - "test_measures.running", ]; for path in non_patchable { let m = ctx.create_measure(path).unwrap(); @@ -417,7 +388,6 @@ fn new_patched_filters_rejected_for_non_aggregatable_types() { let reject_filters = [ "test_measures.calculated", - "test_measures.running", "test_measures.rank_measure", "test_measures.number_agg", ]; diff --git a/rust/cubesql/cubesql/src/transport/ext.rs b/rust/cubesql/cubesql/src/transport/ext.rs index 7502d6564dcc4..b27e897910a3e 100644 --- a/rust/cubesql/cubesql/src/transport/ext.rs +++ b/rust/cubesql/cubesql/src/transport/ext.rs @@ -116,7 +116,6 @@ impl V1CubeMetaMeasureExt for CubeMetaMeasure { "avg" => ColumnType::Double, "min" => ColumnType::Double, "max" => ColumnType::Double, - "runningTotal" => ColumnType::Double, _ => from_type, }, _ => from_type, From 626b1cd5a2307815ac3c3c60bf6196e94b9cb620 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Wed, 10 Jun 2026 12:09:58 +0200 Subject: [PATCH 03/26] feat!: Remove deprecated CUBEJS_SCHEDULED_REFRESH_CONCURRENCY env variable (#11048) BREAKING CHANGE: The CUBEJS_SCHEDULED_REFRESH_CONCURRENCY environment variable has been removed. It was deprecated in v1.2.7. Use CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID instead. --- DEPRECATION.md | 4 +++- .../configuration/environment-variables.mdx | 6 ------ .../reference/environment-variables.mdx | 6 ------ packages/cubejs-backend-shared/src/env.ts | 18 +----------------- 4 files changed, 4 insertions(+), 30 deletions(-) diff --git a/DEPRECATION.md b/DEPRECATION.md index 0e4900c0c9c08..9d18224818dc8 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -64,7 +64,7 @@ features: | Removed | [`initApp` hook](#initapp-hook) | v0.35.0 | v0.35.0 | | Removed | [`/v1/run-scheduled-refresh` REST API endpoint](#v1run-scheduled-refresh-rest-api-endpoint) | v0.35.0 | v0.36.0 | | Removed | [Node.js 18](#nodejs-18) | v0.36.0 | v1.3.0 | -| Deprecated | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | | +| Removed | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | v1.7.0 | | Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | | | Deprecated | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | | | Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 | @@ -403,6 +403,8 @@ no more updates. Please upgrade to Node.js 20 or higher. **Deprecated in Release: v1.2.7** +**Removed in Release: v1.7.0** + This environment variable was renamed to [`CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID`](https://cube.dev/docs/reference/configuration/environment-variables#cubejs_scheduled_refresh_queries_per_app_id). Please use the new name. ### Node.js 18 diff --git a/docs-mintlify/reference/configuration/environment-variables.mdx b/docs-mintlify/reference/configuration/environment-variables.mdx index 82a72ba574b36..34dcfdff490f7 100644 --- a/docs-mintlify/reference/configuration/environment-variables.mdx +++ b/docs-mintlify/reference/configuration/environment-variables.mdx @@ -154,12 +154,6 @@ it should be adjusted accordingly. | ------------------------------------ | ---------------------- | --------------------- | | A valid number of concurrent queries | 10 | 10 | - - -Previously, this environment variable was named `CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`. - - - ## `CUBEJS_CUBESTORE_HOST` The hostname of the Cube Store deployment diff --git a/docs/content/product/configuration/reference/environment-variables.mdx b/docs/content/product/configuration/reference/environment-variables.mdx index 49849a804ff95..149795d5cc6a0 100644 --- a/docs/content/product/configuration/reference/environment-variables.mdx +++ b/docs/content/product/configuration/reference/environment-variables.mdx @@ -151,12 +151,6 @@ it should be adjusted accordingly. | ------------------------------------ | ---------------------- | --------------------- | | A valid number of concurrent queries | 10 | 10 | - - -Previously, this environment variable was named CUBEJS_SCHEDULED_REFRESH_CONCURRENCY. - - - ## `CUBEJS_CUBESTORE_HOST` The hostname of the Cube Store deployment diff --git a/packages/cubejs-backend-shared/src/env.ts b/packages/cubejs-backend-shared/src/env.ts index 8cee3656ba94e..5d9d3cd3678d7 100644 --- a/packages/cubejs-backend-shared/src/env.ts +++ b/packages/cubejs-backend-shared/src/env.ts @@ -266,23 +266,7 @@ const variables: Record any> = { // It's true by default for development return process.env.NODE_ENV !== 'production'; }, - scheduledRefreshQueriesPerAppId: () => { - const refreshQueries = get('CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID').asIntPositive(); - - if (refreshQueries) { - return refreshQueries; - } - - const refreshConcurrency = get('CUBEJS_SCHEDULED_REFRESH_CONCURRENCY').asIntPositive(); - - if (refreshConcurrency) { - console.warn( - 'The CUBEJS_SCHEDULED_REFRESH_CONCURRENCY is deprecated. Please, use the CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID instead.' - ); - } - - return refreshConcurrency; - }, + scheduledRefreshQueriesPerAppId: () => get('CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID').asIntPositive(), refreshWorkerConcurrency: () => get('CUBEJS_REFRESH_WORKER_CONCURRENCY') .asIntPositive(), // eslint-disable-next-line consistent-return From 1d1b0b8621f0a257e7214b0d139fbbb3cfc140fb Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 18:29:03 +0200 Subject: [PATCH 04/26] feat(api-gateway)!: Remove deprecated renewQuery parameter (#11050) BREAKING CHANGE: The `renewQuery` parameter of the `/v1/load` REST endpoint and the GraphQL `cube` query has been removed. Use the `cache` parameter instead: `cache: 'must-revalidate'` replaces `renewQuery: true`, and the default `stale-if-slow` replaces `renewQuery: false`. --- DEPRECATION.md | 8 +-- .../core-data-apis/graphql-api/reference.mdx | 1 - .../core-data-apis/rest-api/query-format.mdx | 19 ------- .../reference/cubejs-client-core.mdx | 1 - .../core-data-apis/graphql-api/reference.mdx | 1 - .../core-data-apis/rest-api/query-format.mdx | 21 -------- packages/cubejs-api-gateway/src/graphql.ts | 4 +- packages/cubejs-api-gateway/src/query.js | 9 ---- .../cubejs-api-gateway/src/types/query.ts | 2 - .../cubejs-api-gateway/src/types/request.ts | 1 - .../cubejs-backend-shared/src/shared-types.ts | 4 +- packages/cubejs-client-core/src/types.ts | 6 +-- packages/cubejs-client-dx/index.d.ts | 2 - .../cubejs-client-vue3/src/QueryBuilder.js | 9 ---- .../tests/unit/QueryBuilder.spec.js | 28 ---------- .../QueryBuilderV2/utils/validate-query.ts | 5 -- .../src/components/CachePane.tsx | 3 +- .../src/orchestrator/PreAggregations.ts | 4 +- .../src/orchestrator/QueryCache.ts | 7 +-- .../test/unit/PreAggregations.test.ts | 4 +- .../test/unit/QueryOrchestrator.test.js | 54 +++++++++---------- .../postgres/views-join-order-2.test.ts | 1 - .../cubeorchestrator/benches/transform.rs | 1 - .../src/query_result_transform.rs | 1 - rust/cube/cubeorchestrator/src/transport.rs | 2 - 25 files changed, 44 insertions(+), 154 deletions(-) diff --git a/DEPRECATION.md b/DEPRECATION.md index 9d18224818dc8..9cf128f27c8bc 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -66,7 +66,7 @@ features: | Removed | [Node.js 18](#nodejs-18) | v0.36.0 | v1.3.0 | | Removed | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | v1.7.0 | | Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | | -| Deprecated | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | | +| Removed | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | v1.7.0 | | Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 | | Deprecated | [`context_to_roles`](#context-to-roles) | v1.6.4 | | @@ -424,8 +424,10 @@ no more new features, only security updates. Please upgrade to Node.js 22 or hig **Deprecated in Release: v1.3.73** -This parameter is deprecated and will be removed in future releases. See [cache control](https://cube.dev/docs/product/apis-integrations/rest-api#cache-control) -options and use the new `cache` parameter of the `/v1/load` endpoint instead. +**Removed in Release: v1.7.0** + +This parameter has been removed. See [cache control](https://cube.dev/docs/product/apis-integrations/rest-api#cache-control) +options and use the `cache` parameter of the `/v1/load` endpoint instead. ### Elasticsearch driver diff --git a/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx b/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx index 4dfa238678fc3..eba1746674fcb 100644 --- a/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx +++ b/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx @@ -40,7 +40,6 @@ object with query metadata: - **`timezone` (`String`):** The [time zone][ref-time-zone] for your query. You can set the desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database) format, e.g., `America/Los_Angeles`. -- **`renewQuery` (`Boolean`):** If `renewQuery` is set to `true`, Cube will renew all `refreshKey` for queries and query results in the foreground. The default value is `false`. - **`ungrouped` (`Boolean`):** If set to `true`, Cube will run an [ungrouped query][ref-ungrouped-query]. diff --git a/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx b/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx index b881a7dc8f37d..654c66fd0eeae 100644 --- a/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx +++ b/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx @@ -45,23 +45,6 @@ The default value is `false`. - `timezone`: A [time zone][ref-time-zone] for your query. You can set the desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database) format, e.g., `America/Los_Angeles`. -- `renewQuery`: If `renewQuery` is set to `true`, Cube will renew all - [`refreshKey`][ref-schema-ref-preaggs-refreshkey] for queries and query - results in the foreground. However, if the - [`refreshKey`][ref-schema-ref-preaggs-refreshkey] (or - [`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every]) doesn't - indicate that there's a need for an update this setting has no effect. The - default value is `false`. - - - -Cube provides only eventual consistency guarantee. Using a small -[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every] value together -with `renewQuery` to achieve immediate consistency can lead to endless -refresh loops and overall system instability. - - - - `ungrouped`: If set to `true`, Cube will run an [ungrouped query][ref-ungrouped-query]. - `joinHints`: Query-time [join hints][ref-join-hints], provided as an array of @@ -675,8 +658,6 @@ refer to its documentation for more examples. [ref-client-core-resultset-drilldown]: /reference/javascript-sdk/reference/cubejs-client-core#drilldown -[ref-schema-ref-preaggs-refreshkey]: /reference/data-modeling/pre-aggregations#refresh_key -[ref-schema-ref-preaggs-refreshkey-every]: /reference/data-modeling/pre-aggregations#every [ref-schema-ref-preaggs-dimensions]: /reference/data-modeling/pre-aggregations#dimensions [ref-schema-ref-preaggs-time-dimension]: /reference/data-modeling/pre-aggregations#time_dimension [ref-relative-date-range]: #relative-date-range diff --git a/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx b/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx index dd34fc532d727..ca8bd6bdce097 100644 --- a/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx +++ b/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx @@ -979,7 +979,6 @@ limit? | number | measures? | string[] | offset? | number | order? | [TQueryOrderObject](#tqueryorderobject) | [TQueryOrderArray](#tqueryorderarray) | -renewQuery? | boolean | segments? | string[] | timeDimensions? | [TimeDimension](#timedimension)[] | timezone? | string | diff --git a/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx b/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx index 66fc15c81ff9c..323317348f092 100644 --- a/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx +++ b/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx @@ -27,7 +27,6 @@ query { - **`timezone` (`String`):** The [time zone][ref-time-zone] for your query. You can set the desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database) format, e.g., `America/Los_Angeles`. -- **`renewQuery` (`Boolean`):** If `renewQuery` is set to `true`, Cube will renew all `refreshKey` for queries and query results in the foreground. The default value is `false`. - **`ungrouped` (`Boolean`):** If set to `true`, Cube will run an [ungrouped query][ref-ungrouped-query]. diff --git a/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx b/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx index 32405961d0d7c..712788ff3582f 100644 --- a/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx +++ b/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx @@ -42,23 +42,6 @@ The default value is `false`. - `timezone`: A [time zone][ref-time-zone] for your query. You can set the desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database) format, e.g., `America/Los_Angeles`. -- `renewQuery`: If `renewQuery` is set to `true`, Cube will renew all - [`refreshKey`][ref-schema-ref-preaggs-refreshkey] for queries and query - results in the foreground. However, if the - [`refreshKey`][ref-schema-ref-preaggs-refreshkey] (or - [`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every]) doesn't - indicate that there's a need for an update this setting has no effect. The - default value is `false`. - - - -Cube provides only eventual consistency guarantee. Using a small -[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every] value together -with `renewQuery` to achieve immediate consistency can lead to endless -refresh loops and overall system instability. - - - - `ungrouped`: If set to `true`, Cube will run an [ungrouped query][ref-ungrouped-query]. - `joinHints`: Query-time [join hints][ref-join-hints], provided as an array of @@ -672,10 +655,6 @@ refer to its documentation for more examples. [ref-client-core-resultset-drilldown]: /product/apis-integrations/javascript-sdk/reference/cubejs-client-core#drilldown -[ref-schema-ref-preaggs-refreshkey]: - /product/data-modeling/reference/pre-aggregations#refresh_key -[ref-schema-ref-preaggs-refreshkey-every]: - /product/data-modeling/reference/pre-aggregations#every [ref-schema-ref-preaggs-dimensions]: /product/data-modeling/reference/pre-aggregations#dimensions [ref-schema-ref-preaggs-time-dimension]: diff --git a/packages/cubejs-api-gateway/src/graphql.ts b/packages/cubejs-api-gateway/src/graphql.ts index b3a8d89fc714f..4a328d1cd6a02 100644 --- a/packages/cubejs-api-gateway/src/graphql.ts +++ b/packages/cubejs-api-gateway/src/graphql.ts @@ -363,7 +363,7 @@ function parseDates(result: any) { } export function getJsonQuery(metaConfig: any, args: Record, infos: GraphQLResolveInfo) { - const { where, limit, offset, timezone, orderBy, renewQuery, ungrouped, cache } = args; + const { where, limit, offset, timezone, orderBy, ungrouped, cache } = args; const measures: string[] = []; const dimensions: string[] = []; @@ -460,7 +460,6 @@ export function getJsonQuery(metaConfig: any, args: Record, infos: ...(offset && { offset }), ...(timezone && { timezone }), ...(filters.length && { filters }), - ...(renewQuery && { renewQuery }), ...(cache && { cache }), ...(ungrouped && { ungrouped }), }; @@ -639,7 +638,6 @@ export function makeSchema(metaConfig: any): GraphQLSchema { limit: intArg(), offset: intArg(), timezone: stringArg(), - renewQuery: booleanArg(), cache: stringArg(), ungrouped: booleanArg(), orderBy: arg({ diff --git a/packages/cubejs-api-gateway/src/query.js b/packages/cubejs-api-gateway/src/query.js index 88d5132648848..07be6953b19f3 100644 --- a/packages/cubejs-api-gateway/src/query.js +++ b/packages/cubejs-api-gateway/src/query.js @@ -187,8 +187,6 @@ const querySchema = Joi.object().keys({ limit: Joi.number().integer().strict().min(0), offset: Joi.number().integer().strict().min(0), total: Joi.boolean(), - // @deprecated - renewQuery: Joi.boolean(), cacheMode: Joi.valid('stale-if-slow', 'stale-while-revalidate', 'must-revalidate', 'no-cache'), cache: Joi.valid('stale-if-slow', 'stale-while-revalidate', 'must-revalidate', 'no-cache'), ungrouped: Joi.boolean(), @@ -304,19 +302,12 @@ function parseInputMemberExpression(expression) { function normalizeQueryCacheMode(query, cacheMode) { if (cacheMode !== undefined) { query.cacheMode = cacheMode; - } else if (!query.cache && query?.renewQuery !== undefined) { - // TODO: Drop this when renewQuery will be removed - query.cacheMode = query.renewQuery === true - ? 'must-revalidate' - : 'stale-if-slow'; } else if (!query.cache) { query.cacheMode = 'stale-if-slow'; } else { query.cacheMode = query.cache; } - // TODO: Drop this when renewQuery will be removed - query.renewQuery = undefined; query.cache = undefined; return query; diff --git a/packages/cubejs-api-gateway/src/types/query.ts b/packages/cubejs-api-gateway/src/types/query.ts index 26b0e26e263da..7b42fd7c046d7 100644 --- a/packages/cubejs-api-gateway/src/types/query.ts +++ b/packages/cubejs-api-gateway/src/types/query.ts @@ -140,8 +140,6 @@ interface Query { totalQuery?: boolean; order?: any; timezone?: string; - // @deprecated - renewQuery?: boolean; cacheMode?: CacheMode; // used after query normalization cache?: CacheMode; // Used in public interface ungrouped?: boolean; diff --git a/packages/cubejs-api-gateway/src/types/request.ts b/packages/cubejs-api-gateway/src/types/request.ts index 8478d008354a2..9b78a1afda503 100644 --- a/packages/cubejs-api-gateway/src/types/request.ts +++ b/packages/cubejs-api-gateway/src/types/request.ts @@ -121,7 +121,6 @@ type BaseRequest = { }; type RequestQuery = Record | Record[] & { - renewQuery?: boolean; cacheMode?: CacheMode; }; diff --git a/packages/cubejs-backend-shared/src/shared-types.ts b/packages/cubejs-backend-shared/src/shared-types.ts index 52eb4fc09db74..9abcc1e2ab266 100644 --- a/packages/cubejs-backend-shared/src/shared-types.ts +++ b/packages/cubejs-backend-shared/src/shared-types.ts @@ -1,5 +1,5 @@ /* -stale-if-slow (default) — equivalent to previously used renewQuery: false +stale-if-slow (default) If refresh keys are up-to-date, returns the value from cache If refresh keys are expired, tries to return the value from the database Returns fresh value from the database if the query executed in the database until the first “Continue wait” interval is reached @@ -10,7 +10,7 @@ stale-while-revalidate — AKA “backgroundRefresh” If refresh keys are expired, returns stale data from cache Updates the cache in background -must-revalidate — equivalent to previously used renewQuery: true +must-revalidate If refresh keys are up-to-date, returns the value from cache If refresh keys are expired, tries to return the value from the database Returns fresh value from the database even if it takes minutes and many “Continue wait” intervals diff --git a/packages/cubejs-client-core/src/types.ts b/packages/cubejs-client-core/src/types.ts index c71cd05c93fe2..4a3ee92658c17 100644 --- a/packages/cubejs-client-core/src/types.ts +++ b/packages/cubejs-client-core/src/types.ts @@ -162,8 +162,6 @@ export interface Query { offset?: number; order?: TQueryOrderObject | TQueryOrderArray; timezone?: string; - // @deprecated - renewQuery?: boolean; ungrouped?: boolean; responseFormat?: 'compact' | 'columnar' | 'default'; total?: boolean; @@ -609,7 +607,7 @@ export type ProgressResponse = { /** * Cache mode options for query execution. * - * - **stale-if-slow** (default): Equivalent to previously used `renewQuery: false`. + * - **stale-if-slow** (default): * If refresh keys are up-to-date, returns the value from cache. * If refresh keys are expired, tries to return the value from the database. * Returns fresh value from the database if the query executed until the first "Continue wait" interval is reached. @@ -620,7 +618,7 @@ export type ProgressResponse = { * If refresh keys are expired, returns stale data from cache. * Updates the cache in background. * - * - **must-revalidate**: Equivalent to previously used `renewQuery: true`. + * - **must-revalidate**: * If refresh keys are up-to-date, returns the value from cache. * If refresh keys are expired, tries to return the value from the database. * Returns fresh value from the database even if it takes minutes and many "Continue wait" intervals. diff --git a/packages/cubejs-client-dx/index.d.ts b/packages/cubejs-client-dx/index.d.ts index c37dcb86385c0..9a43412d0549c 100644 --- a/packages/cubejs-client-dx/index.d.ts +++ b/packages/cubejs-client-dx/index.d.ts @@ -19,8 +19,6 @@ declare module "@cubejs-client/core" { offset?: number; order?: IntrospectedTQueryOrderObject | IntrospectedTQueryOrderArray; timezone?: string; - // @deprecated - renewQuery?: boolean; ungrouped?: boolean; } diff --git a/packages/cubejs-client-vue3/src/QueryBuilder.js b/packages/cubejs-client-vue3/src/QueryBuilder.js index eca777799cc82..26b19c04a97bf 100644 --- a/packages/cubejs-client-vue3/src/QueryBuilder.js +++ b/packages/cubejs-client-vue3/src/QueryBuilder.js @@ -120,7 +120,6 @@ export default { availableSegments: [], limit: null, offset: null, - renewQuery: false, order: null, prevValidatedQuery: null, granularities: GRANULARITIES, @@ -151,7 +150,6 @@ export default { removeLimit, setOffset, removeOffset, - renewQuery, order, orderMembers, } = this; @@ -180,7 +178,6 @@ export default { removeLimit, setOffset, removeOffset, - renewQuery, order, orderMembers, setOrder: this.setOrder, @@ -349,10 +346,6 @@ export default { if (this.order) { validatedQuery.order = this.order; } - - if (this.renewQuery) { - validatedQuery.renewQuery = this.renewQuery; - } } if ( @@ -430,7 +423,6 @@ export default { filters = [], limit, offset, - renewQuery, order, } = query || this.initialQuery; @@ -476,7 +468,6 @@ export default { this.availableSegments = this.meta.membersForQuery({}, 'segments') || []; this.limit = limit || 10000; this.offset = offset || null; - this.renewQuery = renewQuery || false; this.order = order || null; }, addMember(element, member) { diff --git a/packages/cubejs-client-vue3/tests/unit/QueryBuilder.spec.js b/packages/cubejs-client-vue3/tests/unit/QueryBuilder.spec.js index a1bee696981fb..5ddd5269ac686 100644 --- a/packages/cubejs-client-vue3/tests/unit/QueryBuilder.spec.js +++ b/packages/cubejs-client-vue3/tests/unit/QueryBuilder.spec.js @@ -746,34 +746,6 @@ describe('QueryBuilder.vue', () => { expect(wrapper.vm.offset).toBe(10); }); - it('sets renewQuery', async () => { - const cube = createCubeApi(); - jest - .spyOn(cube, 'request') - .mockImplementation(fetchMock(load)) - .mockImplementationOnce(fetchMock(meta)); - - const filter = { - member: 'Orders.status', - operator: 'equals', - values: ['invalid'], - }; - - const wrapper = shallowMount(QueryBuilder, { - props: { - cubeApi: cube, - query: { - filters: [filter], - renewQuery: true, - }, - }, - }); - - await flushPromises(); - - expect(wrapper.vm.renewQuery).toBe(true); - }); - it('ignore order if empty', async () => { const cube = createCubeApi(); jest diff --git a/packages/cubejs-playground/src/QueryBuilderV2/utils/validate-query.ts b/packages/cubejs-playground/src/QueryBuilderV2/utils/validate-query.ts index 513f9bcd2ae3d..fd8ffb0431337 100644 --- a/packages/cubejs-playground/src/QueryBuilderV2/utils/validate-query.ts +++ b/packages/cubejs-playground/src/QueryBuilderV2/utils/validate-query.ts @@ -138,11 +138,6 @@ export function validateQuery(query: Record): Query { sanitizedQuery.timezone = query.timezone; } - // It's not supported yet - // if (query.renewQuery === true) { - // sanitizedQuery.renewQuery = query.renewQuery; - // } - if (query.ungrouped === true) { sanitizedQuery.ungrouped = query.ungrouped; } diff --git a/packages/cubejs-playground/src/components/CachePane.tsx b/packages/cubejs-playground/src/components/CachePane.tsx index 9e65c04711f01..b3d400326bba7 100644 --- a/packages/cubejs-playground/src/components/CachePane.tsx +++ b/packages/cubejs-playground/src/components/CachePane.tsx @@ -9,7 +9,8 @@ import { FatalError } from './Error/FatalError'; const CachePane = ({ query }) => ( { if (error) { return ; diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts b/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts index fc890b7df1b6c..335ba9a9b68c6 100644 --- a/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts +++ b/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts @@ -545,7 +545,7 @@ export class PreAggregations { maxPartitions: this.options.maxPartitions, maxSourceRowLimit: this.options.maxSourceRowLimit, isJob: queryBody.isJob, - waitForRenew: queryBody.cacheMode !== undefined ? queryBody.cacheMode === 'must-revalidate' : queryBody.renewQuery, + waitForRenew: queryBody.cacheMode === 'must-revalidate', // TODO workaround to avoid continuous waiting on building pre-aggregation dependencies forceBuild: i === preAggregations.length - 1 ? queryBody.forceBuildPreAggregations : false, requestId: queryBody.requestId, @@ -664,7 +664,7 @@ export class PreAggregations { { maxPartitions: this.options.maxPartitions, maxSourceRowLimit: this.options.maxSourceRowLimit, - waitForRenew: queryBody.cacheMode !== undefined ? queryBody.cacheMode === 'must-revalidate' : queryBody.renewQuery, + waitForRenew: queryBody.cacheMode === 'must-revalidate', requestId: queryBody.requestId, externalRefresh: this.externalRefresh, compilerCacheFn: queryBody.compilerCacheFn, diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts index a0d892d331ea5..d4d6e85cecb53 100644 --- a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts +++ b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts @@ -70,8 +70,6 @@ export type Query = { preAggregations?: PreAggregationDescription[]; groupedPartitionPreAggregations?: PreAggregationDescription[][]; preAggregationsLoadCacheByDataSource?: any; - // @deprecated - renewQuery?: boolean; cacheMode?: CacheMode; compilerCacheFn?: (subKey: string[], cacheFn: () => T) => T; }; @@ -83,8 +81,6 @@ export type QueryBody = { values?: string[]; loadRefreshKeysOnly?: boolean; scheduledRefresh?: boolean; - // @deprecated - renewQuery?: boolean; cacheMode?: CacheMode; requestId?: string; external?: boolean; @@ -286,8 +282,7 @@ export class QueryCache { } } - // renewQuery has been deprecated, but keeping it for now - if (queryBody.cacheMode === 'must-revalidate' || queryBody.renewQuery) { + if (queryBody.cacheMode === 'must-revalidate') { this.logger('Requested renew', { cacheKey, requestId: queryBody.requestId }); return this.renewQuery( query, diff --git a/packages/cubejs-query-orchestrator/test/unit/PreAggregations.test.ts b/packages/cubejs-query-orchestrator/test/unit/PreAggregations.test.ts index f8e31b4f4eb97..1838a8e083c9e 100644 --- a/packages/cubejs-query-orchestrator/test/unit/PreAggregations.test.ts +++ b/packages/cubejs-query-orchestrator/test/unit/PreAggregations.test.ts @@ -147,8 +147,8 @@ describe('PreAggregations', () => { const basicQuery: any = createBasicQuery(); const basicQueryExternal = createBasicQuery({ preAggregations: [{ ...basicQuery.preAggregations[0], external: true }] }); - const basicQueryWithRenew = createBasicQuery({ renewQuery: true }); - const basicQueryExternalWithRenew = createBasicQuery({ preAggregations: [{ ...basicQuery.preAggregations[0], external: true }], renewQuery: true }); + const basicQueryWithRenew = createBasicQuery({ cacheMode: 'must-revalidate' }); + const basicQueryExternalWithRenew = createBasicQuery({ preAggregations: [{ ...basicQuery.preAggregations[0], external: true }], cacheMode: 'must-revalidate' }); beforeEach(() => { mockDriver = new MockDriver(); diff --git a/packages/cubejs-query-orchestrator/test/unit/QueryOrchestrator.test.js b/packages/cubejs-query-orchestrator/test/unit/QueryOrchestrator.test.js index 6e1346de0acd8..c204758aaf085 100644 --- a/packages/cubejs-query-orchestrator/test/unit/QueryOrchestrator.test.js +++ b/packages/cubejs-query-orchestrator/test/unit/QueryOrchestrator.test.js @@ -357,7 +357,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders_number_and_count20191101 AS SELECT\n date_trunc(\'week\', ("orders".created_at::timestamptz AT TIME ZONE \'UTC\')) "orders__created_at_week", count("orders".id) "orders__count", sum("orders".number) "orders__number"\n FROM\n public.orders AS "orders"\n WHERE ("orders".created_at >= $1::timestamptz AND "orders".created_at <= $2::timestamptz) GROUP BY 1', ['2019-11-01T00:00:00Z', '2019-11-30T23:59:59Z']], invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'basic' }; const promise = queryOrchestrator.fetchQuery(query); @@ -386,7 +386,7 @@ describe('QueryOrchestrator', () => { indexName: 'orders_number_and_count_week20191101' }], }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'indexes' }; const result = await queryOrchestrator.fetchQuery(query); @@ -413,7 +413,7 @@ describe('QueryOrchestrator', () => { indexName: 'orders_number_and_count_week20191102' }], }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'index is part of query key' }); await new Promise(resolve => setTimeout(() => resolve(), 400)); @@ -431,7 +431,7 @@ describe('QueryOrchestrator', () => { invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]], indexesSql: [], }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'index is part of query key' }); console.log(result.data[0]); @@ -457,7 +457,7 @@ describe('QueryOrchestrator', () => { }], external: true }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'external indexes' }; const result = await queryOrchestrator.fetchQuery(query); @@ -489,7 +489,7 @@ describe('QueryOrchestrator', () => { external: true, dataSource: 'bar' }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'external join', dataSource: 'foo', external: true @@ -523,7 +523,7 @@ describe('QueryOrchestrator', () => { external: true, dataSource: 'csv', }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'csv import' }; const result = await queryOrchestrator.fetchQuery(query); @@ -546,7 +546,7 @@ describe('QueryOrchestrator', () => { invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]], dataSource: 'foo' }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'non default data source pre-aggregation', dataSource: 'foo', }; @@ -564,7 +564,7 @@ describe('QueryOrchestrator', () => { renewalThreshold: 21600, queries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]] }, - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'non default data source query', dataSource: 'foo', }; @@ -588,7 +588,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders_number_and_count_and_very_very_very_very_very_very_long20191101 AS SELECT\n date_trunc(\'week\', ("orders".created_at::timestamptz AT TIME ZONE \'UTC\')) "orders__created_at_week", count("orders".id) "orders__count", sum("orders".number) "orders__number"\n FROM\n public.orders AS "orders"\n WHERE ("orders".created_at >= $1::timestamptz AND "orders".created_at <= $2::timestamptz) GROUP BY 1', ['2019-11-01T00:00:00Z', '2019-11-30T23:59:59Z']], invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]], }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'silent truncate' }; let thrown = true; @@ -615,7 +615,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders_number_and_count20181101 AS SELECT\n date_trunc(\'week\', ("orders".created_at::timestamptz AT TIME ZONE \'UTC\')) "orders__created_at_week", count("orders".id) "orders__count", sum("orders".number) "orders__number"\n FROM\n public.orders_too_big AS "orders"\n WHERE ("orders".created_at >= $1::timestamptz AND "orders".created_at <= $2::timestamptz) GROUP BY 1', ['2018-11-01T00:00:00Z', '2018-11-30T23:59:59Z']], invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'cancel pre-aggregation' }; try { @@ -641,7 +641,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders AS SELECT * FROM public.orders', []], invalidateKeyQueries: [['SELECT 1', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'save structure versions' }); @@ -658,7 +658,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders AS SELECT * FROM public.orders1', []], invalidateKeyQueries: [['SELECT 1', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'save structure versions' }); @@ -678,7 +678,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders AS SELECT * FROM public.orders', []], invalidateKeyQueries: [['SELECT 2', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'save structure versions' }); } @@ -777,7 +777,7 @@ describe('QueryOrchestrator', () => { // start renew refresh as scheduled refresh does const refresh = queryOrchestrator.fetchQuery({ ...baseQuery, - renewQuery: true, + cacheMode: 'must-revalidate', requestId: `${requestId}: start refresh` }); @@ -905,7 +905,7 @@ describe('QueryOrchestrator', () => { invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]], external: true, }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'load cache should respect external flag' }; const internalPreAggregation = { @@ -922,7 +922,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.internal AS SELECT\n date_trunc(\'week\', ("orders".created_at::timestamptz AT TIME ZONE \'UTC\')) "orders__created_at_week", count("orders".id) "orders__count", sum("orders".number) "orders__number"\n FROM\n public.orders AS "orders"\n WHERE ("orders".created_at >= $1::timestamptz AND "orders".created_at <= $2::timestamptz) GROUP BY 1', ['2019-11-01T00:00:00Z', '2019-11-30T23:59:59Z']], invalidateKeyQueries: [['SELECT date_trunc(\'hour\', (NOW()::timestamptz AT TIME ZONE \'UTC\')) as current_hour', []]], }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'load cache should respect external flag' }; await queryOrchestrator.fetchQuery(internalPreAggregation); @@ -947,7 +947,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations.orders AS SELECT * FROM public.orders', []], invalidateKeyQueries: [['SELECT 2', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'pre-aggregation version entries' }); @@ -964,7 +964,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE stb_pre_aggregations_2.orders AS SELECT * FROM public.orders', []], invalidateKeyQueries: [['SELECT 3', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'pre-aggregation version entries' }); @@ -1023,7 +1023,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE pre_aggregations_1.orders AS SELECT * FROM public.orders WHERE tenant_id = 1', []], invalidateKeyQueries: [['SELECT 1', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'pre-aggregation schema cache' }); @@ -1040,7 +1040,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE pre_aggregations_2.orders AS SELECT * FROM public.orders WHERE tenant_id = 2', []], invalidateKeyQueries: [['SELECT 2', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'pre-aggregation schema cache' }); @@ -1057,7 +1057,7 @@ describe('QueryOrchestrator', () => { loadSql: ['CREATE TABLE pre_aggregations_1.orders AS SELECT * FROM public.orders WHERE tenant_id = 1', []], invalidateKeyQueries: [['SELECT 1', []]] }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'pre-aggregation schema cache' }); @@ -1499,7 +1499,7 @@ describe('QueryOrchestrator', () => { ] }, preAggregations: [], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'loadRefreshKeys should respect external flag' }; @@ -1562,7 +1562,7 @@ describe('QueryOrchestrator', () => { dataSource: 'mockDriverUnloadWithoutTempTableSupport', external: true, }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'basic' }; @@ -1589,7 +1589,7 @@ describe('QueryOrchestrator', () => { dataSource: 'streaming', external: true, }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'basic' }; @@ -1616,7 +1616,7 @@ describe('QueryOrchestrator', () => { external: true, streamOffset: 'earliest' }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'basic' }; @@ -1646,7 +1646,7 @@ describe('QueryOrchestrator', () => { streamOffset: 'earliest', readOnly: true }], - renewQuery: true, + cacheMode: 'must-revalidate', requestId: 'basic' }; diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/views-join-order-2.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/views-join-order-2.test.ts index 7f278639ff8c5..555567f24e2c1 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/views-join-order-2.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/views-join-order-2.test.ts @@ -158,7 +158,6 @@ cube('D', { segments: [], filters: [], total: true, - renewQuery: false, limit: 1 }, [{ view___a_id: 1, diff --git a/rust/cube/cubeorchestrator/benches/transform.rs b/rust/cube/cubeorchestrator/benches/transform.rs index e3ba6c9ed6dca..57562aeaca7b4 100644 --- a/rust/cube/cubeorchestrator/benches/transform.rs +++ b/rust/cube/cubeorchestrator/benches/transform.rs @@ -126,7 +126,6 @@ fn build_request( total: None, total_query: None, timezone: Some("UTC".to_string()), - renew_query: None, ungrouped: None, response_format: None, filters: None, diff --git a/rust/cube/cubeorchestrator/src/query_result_transform.rs b/rust/cube/cubeorchestrator/src/query_result_transform.rs index a069d8bda04de..f4c8a29c26b27 100644 --- a/rust/cube/cubeorchestrator/src/query_result_transform.rs +++ b/rust/cube/cubeorchestrator/src/query_result_transform.rs @@ -3491,7 +3491,6 @@ mod tests { total: None, total_query: None, timezone: None, - renew_query: None, ungrouped: None, response_format: None, filters: None, diff --git a/rust/cube/cubeorchestrator/src/transport.rs b/rust/cube/cubeorchestrator/src/transport.rs index 6b8ed0b95d7c4..a32ff801b7cc4 100644 --- a/rust/cube/cubeorchestrator/src/transport.rs +++ b/rust/cube/cubeorchestrator/src/transport.rs @@ -304,8 +304,6 @@ pub struct NormalizedQuery { #[serde(skip_serializing_if = "Option::is_none")] pub timezone: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub renew_query: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub ungrouped: Option, #[serde(skip_serializing_if = "Option::is_none")] pub response_format: Option, From d9c6ca6035c55ff5db0877681c877d3c1deb5919 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 18:37:05 +0200 Subject: [PATCH 05/26] feat!: Remove deprecated context_to_roles configuration option (#11055) BREAKING CHANGE: The context_to_roles (contextToRoles) configuration option has been removed. It was deprecated in v1.6.4. Use context_to_groups (contextToGroups) instead. --- DEPRECATION.md | 8 +-- .../data-modeling/data-access-policies.mdx | 1 - .../reference/configuration/config.mdx | 34 ------------- .../product/auth/data-access-policies.mdx | 1 - .../configuration/reference/config.mdx | 34 ------------- .../benchmarks/fixtures/config-async.py | 8 --- .../benchmarks/fixtures/config.py | 8 --- packages/cubejs-backend-native/js/index.ts | 1 - .../python/cube/src/__init__.py | 2 - .../src/python/cube_config.rs | 1 - packages/cubejs-backend-native/test/config.py | 9 ---- .../cubejs-backend-native/test/old-config.py | 6 --- .../cubejs-backend-native/test/python.test.ts | 10 ---- .../src/compiler/CubeSymbols.ts | 1 - .../src/compiler/CubeValidator.ts | 9 ++-- .../unit/__snapshots__/schema.test.ts.snap | 32 ++++++------ .../test/unit/cube-validator.test.ts | 51 +------------------ .../test/unit/fixtures/orders_big.js | 4 +- .../test/unit/fixtures/orders_big.yml | 4 +- .../test/unit/fixtures/orders_ext.js | 2 +- .../test/unit/fixtures/orders_ext.yml | 2 +- .../unit/fixtures/orders_incorrect_acl.yml | 4 +- .../unit/fixtures/orders_nonexist_acl.yml | 4 +- .../test/unit/links.test.ts | 6 +-- .../test/unit/transpilers.test.ts | 16 +++--- .../cubejs-schema-compiler/test/unit/utils.ts | 6 +-- .../test/unit/yaml-schema.test.ts | 10 ++-- .../src/core/CompilerApi.ts | 47 ++++------------- .../src/core/optionsValidate.ts | 1 - .../cubejs-server-core/src/core/server.ts | 2 - packages/cubejs-server-core/src/core/types.ts | 2 - .../test/unit/index.test.ts | 47 ----------------- .../birdbox-fixtures/rbac-graphql/cube.js | 2 +- .../rbac-graphql/model/Orders.js | 6 +-- .../birdbox-fixtures/rbac-python/cube.py | 8 +-- .../rbac-python/model/cubes/products.yaml | 2 +- .../rbac-python/model/cubes/users.yaml | 4 +- .../rbac-python/model/views/users_view.yaml | 2 +- .../birdbox-fixtures/rbac/cube.js | 37 ++++---------- .../model/cubes/conditional_masking_test.yaml | 6 +-- .../rbac/model/cubes/line_items.js | 8 +-- .../rbac/model/cubes/masking_test.yaml | 26 +++++----- .../rbac/model/cubes/orders.js | 4 +- .../rbac/model/cubes/policy_overlap_test.yaml | 4 +- .../rbac/model/cubes/products.yaml | 2 +- .../rbac/model/cubes/region_test.yaml | 2 +- .../rbac/model/cubes/security_context_test.js | 8 +-- .../rbac/model/cubes/users.yaml | 4 +- .../rbac/model/views/users.js | 2 +- .../rbac/model/views/views.yaml | 8 +-- .../test/smoke-rbac-graphql.test.ts | 8 +-- .../cubejs-testing/test/smoke-rbac.test.ts | 50 +++++++++--------- 52 files changed, 150 insertions(+), 416 deletions(-) diff --git a/DEPRECATION.md b/DEPRECATION.md index 9cf128f27c8bc..e044ce1ec3869 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -68,7 +68,7 @@ features: | Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | | | Removed | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | v1.7.0 | | Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 | -| Deprecated | [`context_to_roles`](#context-to-roles) | v1.6.4 | | +| Removed | [`context_to_roles`](#context-to-roles) | v1.6.4 | v1.7.0 | ### Node.js 8 @@ -441,5 +441,7 @@ The Elasticsearch driver has been removed. **Deprecated in Release: v1.6.4** -The `context_to_roles` configuration option is deprecated and will be removed in a future -release. Please use `context_to_groups` instead. \ No newline at end of file +**Removed in Release: v1.7.0** + +The `context_to_roles` configuration option has been removed. Please use `context_to_groups` instead. + diff --git a/docs-mintlify/docs/data-modeling/data-access-policies.mdx b/docs-mintlify/docs/data-modeling/data-access-policies.mdx index a5a811cdabaef..77fbd1d47461d 100644 --- a/docs-mintlify/docs/data-modeling/data-access-policies.mdx +++ b/docs-mintlify/docs/data-modeling/data-access-policies.mdx @@ -773,7 +773,6 @@ cube(`orders`, { [ref-mls-public]: /docs/data-modeling/access-control/member-level-security#managing-member-level-access [ref-sec-ctx]: /docs/data-modeling/access-control/context [ref-ref-dap]: /reference/data-modeling/data-access-policies -[ref-ref-dap-role]: /reference/data-modeling/data-access-policies#role [ref-ref-dap-masking]: /reference/data-modeling/data-access-policies#member-masking [ref-ref-mask-dim]: /reference/data-modeling/dimensions#mask [ref-core-data-apis]: /reference/core-data-apis \ No newline at end of file diff --git a/docs-mintlify/reference/configuration/config.mdx b/docs-mintlify/reference/configuration/config.mdx index 164e21e353403..46bd74a9725c3 100644 --- a/docs-mintlify/reference/configuration/config.mdx +++ b/docs-mintlify/reference/configuration/config.mdx @@ -1515,40 +1515,6 @@ Usually used for [multitenancy][ref-multitenancy]. If not defined, Cube will lookup for environment variable [`CUBEJS_DB_TYPE`](/reference/configuration/environment-variables#cubejs_db_type) to resolve the data source type. -### `context_to_roles` - - - -`context_to_roles` is deprecated and will be removed in a future release. -Use [`context_to_groups`](#context_to_groups) instead. - - - -Used by [access policies][ref-dap]. This option is used to derive a list of -[data access roles][ref-dap-roles] from the [security context][ref-sec-ctx]. - - - -```python title="Python" -from cube import config - -@config('context_to_roles') -def context_to_roles(ctx: dict) -> list[str]: - return ctx['securityContext'].get('roles', ['default']) -``` - -```javascript title="JavaScript" - -module.exports = { - contextToRoles: ({ securityContext }) => { - return securityContext.roles || ['default'] - } -} -``` - - - - [gh-jsonwebtoken-algs]: https://github.com/auth0/node-jsonwebtoken#algorithms-supported [link-express-cors-opts]: diff --git a/docs/content/product/auth/data-access-policies.mdx b/docs/content/product/auth/data-access-policies.mdx index 076b2173efc76..5d6bfa8376860 100644 --- a/docs/content/product/auth/data-access-policies.mdx +++ b/docs/content/product/auth/data-access-policies.mdx @@ -569,7 +569,6 @@ cube(`orders`, { [ref-mls-public]: /product/auth/member-level-security#managing-member-level-access [ref-sec-ctx]: /product/auth/context [ref-ref-dap]: /product/data-modeling/reference/data-access-policies -[ref-ref-dap-role]: /product/data-modeling/reference/data-access-policies#role [ref-ref-dap-masking]: /product/data-modeling/reference/data-access-policies#member-masking [ref-ref-mask-dim]: /product/data-modeling/reference/dimensions#mask [ref-core-data-apis]: /product/apis-integrations/core-data-apis \ No newline at end of file diff --git a/docs/content/product/configuration/reference/config.mdx b/docs/content/product/configuration/reference/config.mdx index be97effe48988..8cbd7a15a0180 100644 --- a/docs/content/product/configuration/reference/config.mdx +++ b/docs/content/product/configuration/reference/config.mdx @@ -1474,40 +1474,6 @@ Usually used for [multitenancy][ref-multitenancy]. If not defined, Cube will lookup for environment variable CUBEJS_DB_TYPE to resolve the data source type. -### `context_to_roles` - - - -`context_to_roles` is deprecated and will be removed in a future release. -Use [`context_to_groups`](#context_to_groups) instead. - - - -Used by [access policies][ref-dap]. This option is used to derive a list of -[data access roles][ref-dap-roles] from the [security context][ref-sec-ctx]. - - - -```python -from cube import config - -@config('context_to_roles') -def context_to_roles(ctx: dict) -> list[str]: - return ctx['securityContext'].get('roles', ['default']) -``` - -```javascript - -module.exports = { - contextToRoles: ({ securityContext }) => { - return securityContext.roles || ['default'] - } -} -``` - - - - [gh-jsonwebtoken-algs]: https://github.com/auth0/node-jsonwebtoken#algorithms-supported [link-express-cors-opts]: diff --git a/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py b/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py index a14a6608d9448..53682050db7cd 100644 --- a/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py +++ b/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py @@ -95,14 +95,6 @@ async def logger(msg, params): pass -@config -async def context_to_roles(ctx): - # Removed print statements for benchmarking - return [ - "admin", - ] - - @config async def context_to_groups(ctx): # Removed print statements for benchmarking diff --git a/packages/cubejs-backend-native/benchmarks/fixtures/config.py b/packages/cubejs-backend-native/benchmarks/fixtures/config.py index b00cce6560e3e..3bab1a5baf764 100644 --- a/packages/cubejs-backend-native/benchmarks/fixtures/config.py +++ b/packages/cubejs-backend-native/benchmarks/fixtures/config.py @@ -95,14 +95,6 @@ def logger(msg, params): pass -@config -def context_to_roles(ctx): - # Removed print statements for benchmarking - return [ - "admin", - ] - - @config def context_to_groups(ctx): # Removed print statements for benchmarking diff --git a/packages/cubejs-backend-native/js/index.ts b/packages/cubejs-backend-native/js/index.ts index b5dbf3cdc4ad2..24715c926b0e0 100644 --- a/packages/cubejs-backend-native/js/index.ts +++ b/packages/cubejs-backend-native/js/index.ts @@ -535,7 +535,6 @@ export interface PyConfiguration { contextToApiScopes?: () => Promise scheduledRefreshContexts?: (ctx: unknown) => Promise scheduledRefreshTimeZones?: (ctx: unknown) => Promise - contextToRoles?: (ctx: unknown) => Promise contextToGroups?: (ctx: unknown) => Promise } diff --git a/packages/cubejs-backend-native/python/cube/src/__init__.py b/packages/cubejs-backend-native/python/cube/src/__init__.py index f779f8d13864f..21dcdf7764826 100644 --- a/packages/cubejs-backend-native/python/cube/src/__init__.py +++ b/packages/cubejs-backend-native/python/cube/src/__init__.py @@ -77,7 +77,6 @@ class Configuration: semantic_layer_sync: Union[Dict, Callable[[], Dict]] pre_aggregations_schema: Union[Callable[[RequestContext], str], str] orchestrator_options: Union[Dict, Callable[[RequestContext], Dict]] - context_to_roles: Callable[[RequestContext], list[str]] context_to_groups: Callable[[RequestContext], list[str]] fast_reload: bool @@ -128,7 +127,6 @@ def __init__(self): self.semantic_layer_sync = None self.pre_aggregations_schema = None self.orchestrator_options = None - self.context_to_roles = None self.context_to_groups = None self.fast_reload = None diff --git a/packages/cubejs-backend-native/src/python/cube_config.rs b/packages/cubejs-backend-native/src/python/cube_config.rs index 0dcb71a44531f..791fd62a70b68 100644 --- a/packages/cubejs-backend-native/src/python/cube_config.rs +++ b/packages/cubejs-backend-native/src/python/cube_config.rs @@ -51,7 +51,6 @@ impl CubeConfigPy { "context_to_app_id", "context_to_orchestrator_id", "context_to_cube_store_router_id", - "context_to_roles", "context_to_groups", "db_type", "driver_factory", diff --git a/packages/cubejs-backend-native/test/config.py b/packages/cubejs-backend-native/test/config.py index daac2b42ab2c0..1ad05ca00bcd4 100644 --- a/packages/cubejs-backend-native/test/config.py +++ b/packages/cubejs-backend-native/test/config.py @@ -99,15 +99,6 @@ def logger(msg, params): print("[python] logger msg", msg, "params=", params) -@config -def context_to_roles(ctx): - print("[python] context_to_roles", ctx) - - return [ - "admin", - ] - - @config def context_to_groups(ctx): print("[python] context_to_groups", ctx) diff --git a/packages/cubejs-backend-native/test/old-config.py b/packages/cubejs-backend-native/test/old-config.py index b81e2f00c8f05..c1d26ff6251a2 100644 --- a/packages/cubejs-backend-native/test/old-config.py +++ b/packages/cubejs-backend-native/test/old-config.py @@ -79,12 +79,6 @@ def logger(msg, params): settings.logger = logger -def context_to_roles(ctx): - print('[python] context_to_roles', ctx) - return ['admin'] - -settings.context_to_roles = context_to_roles - def context_to_groups(ctx): print('[python] context_to_groups', ctx) return ['dev', 'analytics'] diff --git a/packages/cubejs-backend-native/test/python.test.ts b/packages/cubejs-backend-native/test/python.test.ts index 6d83d7066477a..30b3375aae073 100644 --- a/packages/cubejs-backend-native/test/python.test.ts +++ b/packages/cubejs-backend-native/test/python.test.ts @@ -68,7 +68,6 @@ suite('Python Config', () => { queryRewrite: expect.any(Function), repositoryFactory: expect.any(Function), schemaVersion: expect.any(Function), - contextToRoles: expect.any(Function), contextToGroups: expect.any(Function), scheduledRefreshContexts: expect.any(Function), scheduledRefreshTimeZones: expect.any(Function), @@ -92,14 +91,6 @@ suite('Python Config', () => { }); }); - test('context_to_roles', async () => { - if (!config.contextToRoles) { - throw new Error('contextToRoles was not defined in config.py'); - } - - expect(await config.contextToRoles({})).toEqual(['admin']); - }); - test('context_to_groups', async () => { if (!config.contextToGroups) { throw new Error('contextToGroups was not defined in config.py'); @@ -251,7 +242,6 @@ darwinSuite('Old Python Config', () => { queryRewrite: expect.any(Function), repositoryFactory: expect.any(Function), schemaVersion: expect.any(Function), - contextToRoles: expect.any(Function), contextToGroups: expect.any(Function), scheduledRefreshContexts: expect.any(Function), scheduledRefreshTimeZones: expect.any(Function), diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts b/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts index 8d3d88b5c82a4..05bccb946b3c3 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeSymbols.ts @@ -125,7 +125,6 @@ export type Filter = }; export type AccessPolicyDefinition = { - role?: string; group?: string; groups?: string[]; rowLevel?: { diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts index fa92c29859863..a7452ea2bff33 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts @@ -1130,8 +1130,7 @@ const RowLevelPolicySchema = Joi.object().keys({ allowAll: Joi.boolean().valid(true).strict(), }).xor('filters', 'allowAll'); -const RolePolicySchema = Joi.object().keys({ - role: Joi.string(), +const GroupPolicySchema = Joi.object().keys({ group: Joi.string(), groups: Joi.array().items(Joi.string()), memberLevel: MemberLevelPolicySchema, @@ -1142,9 +1141,7 @@ const RolePolicySchema = Joi.object().keys({ })), }) .nand('group', 'groups') // Cannot have both group and groups - .nand('role', 'group') // Cannot have both role and group - .nand('role', 'groups') // Cannot have both role and groups - .or('role', 'group', 'groups') // Must have at least one + .or('group', 'groups') // Must have at least one .with('memberMasking', 'memberLevel'); // memberMasking requires memberLevel /* ***************************** @@ -1199,7 +1196,7 @@ const baseSchema = { dimensions: DimensionsSchema, segments: SegmentsSchema, preAggregations: PreAggregationsAlternatives, - accessPolicy: Joi.array().items(RolePolicySchema.required()), + accessPolicy: Joi.array().items(GroupPolicySchema.required()), hierarchies: hierarchySchema, }; diff --git a/packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap b/packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap index bdd4996198b7f..1e48caa41d7f3 100644 --- a/packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap +++ b/packages/cubejs-schema-compiler/test/unit/__snapshots__/schema.test.ts.snap @@ -404,7 +404,7 @@ Object { exports[`Schema Testing Inheritance CubeB.js correctly extends cubeA.js (no additions): accessPolicy 1`] = ` Array [ Object { - "role": "*", + "group": "*", "rowLevel": Object { "allowAll": true, }, @@ -415,6 +415,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludes": Array [ "status", @@ -433,7 +434,6 @@ Array [ "orders.sfUsers", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -451,7 +451,7 @@ Array [ exports[`Schema Testing Inheritance CubeB.js correctly extends cubeA.js (no additions): accessPolicy 2`] = ` Array [ Object { - "role": "*", + "group": "*", "rowLevel": Object { "allowAll": true, }, @@ -462,6 +462,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludes": Array [ "status", @@ -480,7 +481,6 @@ Array [ "ordersExt.sfUsers", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -701,7 +701,7 @@ Object { exports[`Schema Testing Inheritance CubeB.js correctly extends cubeA.yml (no additions): accessPolicy 1`] = ` Array [ Object { - "role": "common", + "group": "common", "rowLevel": Object { "allowAll": true, }, @@ -712,6 +712,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludesMembers": Array [], "includes": Array [ @@ -721,7 +722,6 @@ Array [ "orders.status", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -771,7 +771,7 @@ Array [ exports[`Schema Testing Inheritance CubeB.js correctly extends cubeA.yml (no additions): accessPolicy 2`] = ` Array [ Object { - "role": "common", + "group": "common", "rowLevel": Object { "allowAll": true, }, @@ -782,6 +782,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludesMembers": Array [], "includes": Array [ @@ -791,7 +792,6 @@ Array [ "ordersExt.status", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -1048,7 +1048,7 @@ Object { exports[`Schema Testing Inheritance CubeB.yml correctly extends cubeA.js (no additions): accessPolicy 1`] = ` Array [ Object { - "role": "*", + "group": "*", "rowLevel": Object { "allowAll": true, }, @@ -1059,6 +1059,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludes": Array [ "status", @@ -1077,7 +1078,6 @@ Array [ "orders.sfUsers", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -1095,7 +1095,7 @@ Array [ exports[`Schema Testing Inheritance CubeB.yml correctly extends cubeA.js (no additions): accessPolicy 2`] = ` Array [ Object { - "role": "*", + "group": "*", "rowLevel": Object { "allowAll": true, }, @@ -1106,6 +1106,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludes": Array [ "status", @@ -1124,7 +1125,6 @@ Array [ "ordersExt.sfUsers", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -1345,7 +1345,7 @@ Object { exports[`Schema Testing Inheritance CubeB.yml correctly extends cubeA.yml (no additions): accessPolicy 1`] = ` Array [ Object { - "role": "common", + "group": "common", "rowLevel": Object { "allowAll": true, }, @@ -1356,6 +1356,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludesMembers": Array [], "includes": Array [ @@ -1365,7 +1366,6 @@ Array [ "orders.status", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { @@ -1415,7 +1415,7 @@ Array [ exports[`Schema Testing Inheritance CubeB.yml correctly extends cubeA.yml (no additions): accessPolicy 2`] = ` Array [ Object { - "role": "common", + "group": "common", "rowLevel": Object { "allowAll": true, }, @@ -1426,6 +1426,7 @@ Array [ "if": [Function], }, ], + "group": "admin", "memberLevel": Object { "excludesMembers": Array [], "includes": Array [ @@ -1435,7 +1436,6 @@ Array [ "ordersExt.status", ], }, - "role": "admin", "rowLevel": Object { "filters": Array [ Object { diff --git a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts index 183b44abe4fcc..3b6bd2f32bd86 100644 --- a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts @@ -1719,7 +1719,7 @@ describe('Cube Validation', () => { describe('Access Policy group/groups support:', () => { const cubeValidator = new CubeValidator(new CubeSymbols()); - it('should allow group instead of role', () => { + it('should allow group', () => { const cube = { name: 'TestCube', fileName: 'test.js', @@ -1749,21 +1749,6 @@ describe('Cube Validation', () => { expect(result.error).toBeFalsy(); }); - it('should allow role as single string (existing behavior)', () => { - const cube = { - name: 'TestCube', - fileName: 'test.js', - sql: () => 'SELECT * FROM test', - accessPolicy: [{ - role: 'admin', - rowLevel: { allowAll: true } - }] - }; - - const result = cubeValidator.validate(cube, new ConsoleErrorReporter()); - expect(result.error).toBeFalsy(); - }); - it('should allow group: "*" syntax', () => { const cube = { name: 'TestCube', @@ -1779,38 +1764,6 @@ describe('Cube Validation', () => { expect(result.error).toBeFalsy(); }); - it('should reject role and group together', () => { - const cube = { - name: 'TestCube', - fileName: 'test.js', - sql: () => 'SELECT * FROM test', - accessPolicy: [{ - role: 'admin', - group: 'admin', - rowLevel: { allowAll: true } - }] - }; - - const result = cubeValidator.validate(cube, new ConsoleErrorReporter()); - expect(result.error).toBeTruthy(); - }); - - it('should reject role and groups together', () => { - const cube = { - name: 'TestCube', - fileName: 'test.js', - sql: () => 'SELECT * FROM test', - accessPolicy: [{ - role: 'admin', - groups: ['user'], - rowLevel: { allowAll: true } - }] - }; - - const result = cubeValidator.validate(cube, new ConsoleErrorReporter()); - expect(result.error).toBeTruthy(); - }); - it('should reject group and groups together', () => { const cube = { name: 'TestCube', @@ -1827,7 +1780,7 @@ describe('Cube Validation', () => { expect(result.error).toBeTruthy(); }); - it('should reject access policy without role/group/groups', () => { + it('should reject access policy without group/groups', () => { const cube = { name: 'TestCube', fileName: 'test.js', diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.js b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.js index 28f788bccf759..e654d5e65d06f 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.js +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.js @@ -72,13 +72,13 @@ cube('orders', { accessPolicy: [ { - role: "*", + group: "*", rowLevel: { allowAll: true } }, { - role: 'admin', + group: 'admin', conditions: [ { if: `true`, diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.yml b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.yml index 259e9bdfd65ef..77564544d69d4 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.yml +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_big.yml @@ -57,10 +57,10 @@ cubes: scheduled_refresh: true accessPolicy: - - role: common + - group: common rowLevel: allowAll: true - - role: admin + - group: admin conditions: - if: "{ security_context.isNotBlocked }" rowLevel: diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.js b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.js index 2af92e7c9a6a3..6494a9e50a6bb 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.js +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.js @@ -46,7 +46,7 @@ cube('ordersExt', { accessPolicy: [ { - role: 'manager', + group: 'manager', conditions: [ { if: security_context.userId === 1, diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.yml b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.yml index 1cf957ebe4fe6..6dde0c6ebfc72 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.yml +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_ext.yml @@ -34,7 +34,7 @@ cubes: dimensions: [city] accessPolicy: - - role: manager + - group: manager memberLevel: excludes: - status diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_incorrect_acl.yml b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_incorrect_acl.yml index efbcd0384a623..e66bbdd105e06 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_incorrect_acl.yml +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_incorrect_acl.yml @@ -57,10 +57,10 @@ cubes: scheduled_refresh: true accessPolicy: - - role: common + - group: common rowLevel: allowAll: true - - role: admin + - group: admin conditions: - if: "{ security_context.isNotBlocked }" rowLevel: diff --git a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_nonexist_acl.yml b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_nonexist_acl.yml index e0434303d4640..c9e56bcd94d2d 100644 --- a/packages/cubejs-schema-compiler/test/unit/fixtures/orders_nonexist_acl.yml +++ b/packages/cubejs-schema-compiler/test/unit/fixtures/orders_nonexist_acl.yml @@ -57,10 +57,10 @@ cubes: scheduled_refresh: true accessPolicy: - - role: common + - group: common rowLevel: allowAll: true - - role: admin + - group: admin conditions: - if: "{ security_context.isNotBlocked }" rowLevel: diff --git a/packages/cubejs-schema-compiler/test/unit/links.test.ts b/packages/cubejs-schema-compiler/test/unit/links.test.ts index bdb810a8f38c8..ac46b24d0eade 100644 --- a/packages/cubejs-schema-compiler/test/unit/links.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/links.test.ts @@ -434,7 +434,7 @@ views: - full_name - email access_policy: - - role: "*" + - group: "*" member_level: includes: - full_name @@ -485,7 +485,7 @@ views: - full_name - email access_policy: - - role: "*" + - group: "*" member_level: includes: - full_name @@ -535,7 +535,7 @@ views: - join_path: users includes: "*" access_policy: - - role: "*" + - group: "*" member_level: includes: "*" `; diff --git a/packages/cubejs-schema-compiler/test/unit/transpilers.test.ts b/packages/cubejs-schema-compiler/test/unit/transpilers.test.ts index 5854317cc0ee2..35295299f8c00 100644 --- a/packages/cubejs-schema-compiler/test/unit/transpilers.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/transpilers.test.ts @@ -63,7 +63,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -96,7 +96,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -129,7 +129,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -162,7 +162,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -195,7 +195,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -228,7 +228,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -261,7 +261,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { @@ -294,7 +294,7 @@ describe('Transpilers', () => { }, accessPolicy: [ { - role: \`*\`, + group: \`*\`, rowLevel: { filters: [ { diff --git a/packages/cubejs-schema-compiler/test/unit/utils.ts b/packages/cubejs-schema-compiler/test/unit/utils.ts index 61d9c68dfe588..2cf604e7ebf1f 100644 --- a/packages/cubejs-schema-compiler/test/unit/utils.ts +++ b/packages/cubejs-schema-compiler/test/unit/utils.ts @@ -165,13 +165,13 @@ export function createCubeSchemaWithAccessPolicy(name: string, extraPolicies: st }, accessPolicy: [ { - role: "*", + group: "*", rowLevel: { allowAll: true } }, { - role: 'admin', + group: 'admin', conditions: [ { if: \`true\`, @@ -192,7 +192,7 @@ export function createCubeSchemaWithAccessPolicy(name: string, extraPolicies: st }, }, { - role: 'manager', + group: 'manager', conditions: [ { if: security_context.userId === 1, diff --git a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts index 265c1c93a43e4..25bfae345e281 100644 --- a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts @@ -859,7 +859,7 @@ cubes: - name: count type: count accessPolicy: - - role: admin + - group: admin conditions: - if: "{ security_context.isNotBlocked }" rowLevel: @@ -888,7 +888,7 @@ cubes: memberLevel: includes: - status - - role: manager + - group: manager memberLevel: excludes: - status @@ -1742,7 +1742,7 @@ cubes: - name: count type: count access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: @@ -1792,7 +1792,7 @@ cubes: - name: count type: count access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: @@ -1825,7 +1825,7 @@ cubes: - name: count type: count access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: diff --git a/packages/cubejs-server-core/src/core/CompilerApi.ts b/packages/cubejs-server-core/src/core/CompilerApi.ts index 8ce288843a5e0..fc4a6f975ccd7 100644 --- a/packages/cubejs-server-core/src/core/CompilerApi.ts +++ b/packages/cubejs-server-core/src/core/CompilerApi.ts @@ -38,7 +38,6 @@ export interface CompilerApiOptions { allowUngroupedWithoutPrimaryKey?: boolean; convertTzForRawTimeDimension?: boolean; schemaVersion?: () => string | object | Promise; - contextToRoles?: (context: Context) => string[] | Promise; contextToGroups?: (context: Context) => string[] | Promise; compileContext?: any; allowJsDuplicatePropsInSchema?: boolean; @@ -103,8 +102,6 @@ export class CompilerApi { public schemaVersion?: () => string | object | Promise; - protected readonly contextToRoles?: (context: Context) => string[] | Promise; - protected readonly contextToGroups?: (context: Context) => string[] | Promise; protected readonly compileContext?: any; @@ -145,7 +142,6 @@ export class CompilerApi { this.allowUngroupedWithoutPrimaryKey = this.options.allowUngroupedWithoutPrimaryKey; this.convertTzForRawTimeDimension = this.options.convertTzForRawTimeDimension; this.schemaVersion = this.options.schemaVersion; - this.contextToRoles = this.options.contextToRoles; this.contextToGroups = this.options.contextToGroups; this.compileContext = options.compileContext; this.allowJsDuplicatePropsInSchema = options.allowJsDuplicatePropsInSchema; @@ -377,13 +373,6 @@ export class CompilerApi { } } - protected async getRolesFromContext(context: Context): Promise> { - if (!this.contextToRoles) { - return new Set(); - } - return new Set(await this.contextToRoles(context)); - } - protected async getGroupsFromContext(context: Context): Promise> { if (!this.contextToGroups) { return new Set(); @@ -391,10 +380,6 @@ export class CompilerApi { return new Set(await this.contextToGroups(context)); } - protected userHasRole(userRoles: Set, role: string): boolean { - return userRoles.has(role) || role === '*'; - } - protected userHasGroup(userGroups: Set, group: string | string[]): boolean { if (Array.isArray(group)) { return group.some(g => userGroups.has(g) || g === '*'); @@ -402,7 +387,7 @@ export class CompilerApi { return userGroups.has(group) || group === '*'; } - protected roleMeetsConditions(evaluatedConditions?: any[]): boolean { + protected policyMeetsConditions(evaluatedConditions?: any[]): boolean { if (evaluatedConditions?.length) { return evaluatedConditions.reduce((a, b) => { if (typeof b !== 'boolean') { @@ -430,19 +415,8 @@ export class CompilerApi { const cache = compilers.compilerCache.getRbacCacheInstance(); const cacheKey = `${cube.name}_${this.hashRequestContext(context)}`; if (!cache.has(cacheKey)) { - const userRoles = await this.getRolesFromContext(context); const userGroups = await this.getGroupsFromContext(context); const policies = cube.accessPolicy.filter((policy: AccessPolicyDefinition) => { - // Validate that policy doesn't have both role and group/groups - this is invalid - if (policy.role && (policy.group || policy.groups)) { - const groupValue = policy.group || policy.groups; - const groupDisplay = Array.isArray(groupValue) ? groupValue.join(', ') : groupValue; - const groupProp = policy.group ? 'group' : 'groups'; - throw new Error( - `Access policy cannot have both 'role' and '${groupProp}' properties.\nPolicy in cube '${cube.name}' has role '${policy.role}' and ${groupProp} '${groupDisplay}'.\nUse either 'role' or '${groupProp}', not both.` - ); - } - // Validate that policy doesn't have both group and groups if (policy.group && policy.groups) { const groupDisplay = Array.isArray(policy.group) ? policy.group.join(', ') : policy.group; @@ -456,22 +430,19 @@ export class CompilerApi { (condition: any) => compilers.cubeEvaluator.evaluateContextFunction(cube, condition.if, context) ); - // Check if policy matches by role, group, or groups + // Check if policy matches by group or groups let hasAccess = false; - if (policy.role) { - hasAccess = this.userHasRole(userRoles, policy.role); - } else if (policy.group) { + if (policy.group) { hasAccess = this.userHasGroup(userGroups, policy.group); } else if (policy.groups) { hasAccess = this.userHasGroup(userGroups, policy.groups); } else { - // If policy has neither role nor group/groups, default to checking role for backward compatibility - hasAccess = this.userHasRole(userRoles, '*'); + // A policy without group/groups applies to everyone + hasAccess = this.userHasGroup(userGroups, '*'); } - const res = hasAccess && this.roleMeetsConditions(evaluatedConditions); - return res; + return hasAccess && this.policyMeetsConditions(evaluatedConditions); }); cache.set(cacheKey, policies); } @@ -503,10 +474,10 @@ export class CompilerApi { * This method rewrites the query according to RBAC row level security policies. * * If RBAC is enabled, it looks at all the Cubes from the query with accessPolicy defined. - * It extracts all policies applicable to for the current user context (contextToRoles() + conditions). + * It extracts all policies applicable to for the current user context (contextToGroups() + conditions). * It then generates a rls filter by - * - combining all filters for the same role with AND - * - combining all filters for different roles with OR + * - combining all filters for the same group with AND + * - combining all filters for different groups with OR * - combining cube and view filters with AND */ public async applyRowLevelSecurity( diff --git a/packages/cubejs-server-core/src/core/optionsValidate.ts b/packages/cubejs-server-core/src/core/optionsValidate.ts index 34eb1f5eee739..e31f39550af45 100644 --- a/packages/cubejs-server-core/src/core/optionsValidate.ts +++ b/packages/cubejs-server-core/src/core/optionsValidate.ts @@ -75,7 +75,6 @@ const schemaOptions = Joi.object().keys({ // cacheAndQueueDriver: Joi.string().valid('cubestore', 'memory'), contextToAppId: Joi.func(), - contextToRoles: Joi.func(), contextToGroups: Joi.func(), contextToOrchestratorId: Joi.func(), contextToCubeStoreRouterId: Joi.func(), diff --git a/packages/cubejs-server-core/src/core/server.ts b/packages/cubejs-server-core/src/core/server.ts index da04f2468415f..48b146c8abb70 100644 --- a/packages/cubejs-server-core/src/core/server.ts +++ b/packages/cubejs-server-core/src/core/server.ts @@ -539,7 +539,6 @@ export class CubejsServerCore { ), externalDialectClass: this.options.externalDialectFactory && this.options.externalDialectFactory(context), schemaVersion: currentSchemaVersion, - contextToRoles: this.options.contextToRoles, contextToGroups: this.options.contextToGroups, preAggregationsSchema: await this.preAggregationsSchema(context), context, @@ -730,7 +729,6 @@ export class CubejsServerCore { protected createCompilerApiOptions(options: Record = {}): CompilerApiOptions { return { schemaVersion: options.schemaVersion || this.options.schemaVersion, - contextToRoles: this.options.contextToRoles, contextToGroups: this.options.contextToGroups, devServer: this.options.devServer, logger: this.logger, diff --git a/packages/cubejs-server-core/src/core/types.ts b/packages/cubejs-server-core/src/core/types.ts index e02f480fb18df..51661178e2e0c 100644 --- a/packages/cubejs-server-core/src/core/types.ts +++ b/packages/cubejs-server-core/src/core/types.ts @@ -131,7 +131,6 @@ export type DatabaseType = | 'databricks-jdbc'; export type ContextToAppIdFn = (context: RequestContext) => string | Promise; -export type ContextToRolesFn = (context: RequestContext) => string[] | Promise; export type ContextToGroupsFn = (context: RequestContext) => string[] | Promise; export type ContextToOrchestratorIdFn = (context: RequestContext) => string | Promise; export type ContextToCubeStoreRouterIdFn = (context: RequestContext) => string | Promise; @@ -205,7 +204,6 @@ export interface CreateOptions { externalDialectFactory?: ExternalDialectFactoryFn; cacheAndQueueDriver?: CacheAndQueryDriverType; contextToAppId?: ContextToAppIdFn; - contextToRoles?: ContextToRolesFn; contextToGroups?: ContextToGroupsFn; contextToOrchestratorId?: ContextToOrchestratorIdFn; contextToCubeStoreRouterId?: ContextToCubeStoreRouterIdFn; diff --git a/packages/cubejs-server-core/test/unit/index.test.ts b/packages/cubejs-server-core/test/unit/index.test.ts index 64c158e944ed9..f769f0c5843ce 100644 --- a/packages/cubejs-server-core/test/unit/index.test.ts +++ b/packages/cubejs-server-core/test/unit/index.test.ts @@ -31,8 +31,6 @@ class CubejsServerCoreOpen extends CubejsServerCore { // Mock to expose protected methods for testing class CompilerApiOpen extends CompilerApi { - public getRolesFromContext = super.getRolesFromContext; - public getGroupsFromContext = super.getGroupsFromContext; } @@ -437,33 +435,6 @@ describe('index.test', () => { }); describe('CompilerApi validation', () => { - test('Should allow both contextToRoles and contextToGroups together', () => { - const logger = jest.fn(() => {}); - - expect(() => new CompilerApi( - repositoryWithoutPreAggregations, - async () => 'mysql', - { - logger, - contextToRoles: async () => ['admin'], - contextToGroups: async () => ['analytics'] - } - )).not.toThrow(); - }); - - test('Should allow only contextToRoles', () => { - const logger = jest.fn(() => {}); - - expect(() => new CompilerApi( - repositoryWithoutPreAggregations, - async () => 'mysql', - { - logger, - contextToRoles: async () => ['admin'] - } - )).not.toThrow(); - }); - test('Should allow only contextToGroups', () => { const logger = jest.fn(() => {}); @@ -477,24 +448,6 @@ describe('index.test', () => { )).not.toThrow(); }); - test('contextToRoles should be called and return expected roles', async () => { - const logger = jest.fn(() => {}); - const contextToRoles = jest.fn(async () => ['admin', 'manager']); - - const compilerApi = new CompilerApiOpen( - repositoryWithoutPreAggregations, - async () => 'mysql', - { - logger, - contextToRoles - } - ); - - const roles = await compilerApi.getRolesFromContext({ securityContext: { userId: 123 } }); - expect(contextToRoles).toHaveBeenCalledWith({ securityContext: { userId: 123 } }); - expect(roles).toEqual(new Set(['admin', 'manager'])); - }); - test('contextToGroups should be called and return expected groups', async () => { const logger = jest.fn(() => {}); const contextToGroups = jest.fn(async () => ['analytics', 'engineering']); diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/cube.js b/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/cube.js index b2e3b46245385..9aad1d937c25a 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/cube.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/cube.js @@ -1,5 +1,5 @@ module.exports = { - contextToRoles: ({ securityContext }) => securityContext?.auth?.roles || ['*'], + contextToGroups: ({ securityContext }) => securityContext?.auth?.groups || ['*'], // Same app ID for all tenants so they share a CompilerApi instance contextToAppId: () => 'CUBEJS_APP_shared', diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/model/Orders.js b/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/model/Orders.js index 3fb6e6f2052fd..33111d72723fe 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/model/Orders.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-graphql/model/Orders.js @@ -33,20 +33,20 @@ cube('Orders', { accessPolicy: [ { - role: '*', + group: '*', memberLevel: { includes: [], }, }, { - role: 'tenant-a', + group: 'tenant-a', memberLevel: { includes: '*', excludes: ['tier'], }, }, { - role: 'tenant-b', + group: 'tenant-b', memberLevel: { includes: '*', excludes: ['internalCode'], diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-python/cube.py b/packages/cubejs-testing/birdbox-fixtures/rbac-python/cube.py index ca5e668d0c81a..7412fd164e8d4 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-python/cube.py +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-python/cube.py @@ -3,9 +3,9 @@ from cube import config -@config('context_to_roles') -def context_to_roles(context): - return context.get("securityContext", {}).get("auth", {}).get("roles", []) +@config('context_to_groups') +def context_to_groups(context): + return context.get("securityContext", {}).get("auth", {}).get("groups", []) def extract_matching_dicts(data): @@ -55,7 +55,7 @@ def check_sql_auth(query: dict, username: str, password: str) -> dict: 'canHaveAdmin': True, 'city': 'New York' }, - 'roles': ['admin'] + 'groups': ['admin'] } } } diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/products.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/products.yaml index db365575426cd..95bc5423f2265 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/products.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/products.yaml @@ -25,4 +25,4 @@ cubes: type: time access_policy: - - role: some_role + - group: some_group diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/users.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/users.yaml index ec2a64b2d26b8..3f7bed31d6c97 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/users.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/cubes/users.yaml @@ -18,13 +18,13 @@ cubes: primary_key: true access_policy: - - role: "*" + - group: "*" row_level: filters: - member: "{CUBE}.city" operator: equals values: ["{ security_context.auth.userAttributes.city }"] - - role: admin + - group: admin conditions: # This thing will fail if there's no auth info in the context # Unfortunately, as of now, there's no way to write more complex expressions diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/views/users_view.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/views/users_view.yaml index 0163cc4e83681..6f67311d539a8 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/views/users_view.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac-python/model/views/users_view.yaml @@ -5,7 +5,7 @@ views: includes: "*" access_policy: - - role: '*' + - group: '*' row_level: filters: - member: id diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/cube.js b/packages/cubejs-testing/birdbox-fixtures/rbac/cube.js index 84a96e7ca9913..9ee4c9a6c5cfb 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/cube.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/cube.js @@ -1,5 +1,4 @@ module.exports = { - contextToRoles: async (context) => context.securityContext.auth?.roles || [], contextToGroups: async (context) => context.securityContext.auth?.groups || [], canSwitchSqlUser: async () => true, checkSqlAuth: async (req, user, password) => { @@ -19,8 +18,7 @@ module.exports = { canHaveAdmin: true, minDefaultId: 10000, }, - roles: ['admin', 'ownder', 'hr'], - groups: ['leadership', 'hr'], + groups: ['leadership', 'hr', 'admin'], }, }, }; @@ -41,8 +39,7 @@ module.exports = { canHaveAdmin: false, minDefaultId: 10000, }, - roles: ['manager'], - groups: ['management'], + groups: ['management', 'manager'], }, }, }; @@ -63,7 +60,6 @@ module.exports = { canHaveAdmin: false, minDefaultId: 20000, }, - roles: [], groups: ['general'], }, }, @@ -85,7 +81,6 @@ module.exports = { canHaveAdmin: true, minDefaultId: 20000, }, - roles: ['restricted'], groups: ['restricted'], }, }, @@ -107,14 +102,13 @@ module.exports = { region: 'CA', allowedCities: ['Los Angeles', 'New York'], }, - roles: [], groups: ['developer'], }, }, }; } // User for testing two-dimensional policy overlap (matches diagram in CompilerApi.ts) - // Has policy2_role, so both Policy 1 (*) and Policy 2 (policy2_role) apply + // Has policy2_group, so both Policy 1 (*) and Policy 2 (policy2_group) apply if (user === 'policy_test') { if (password && password !== 'policy_test_password') { throw new Error(`Password doesn't match for ${user}`); @@ -126,13 +120,12 @@ module.exports = { auth: { username: 'policy_test', userAttributes: {}, - roles: ['policy2_role'], - groups: [], + groups: ['policy2_group'], }, }, }; } - // User for masking tests - no special roles, sees only masked values + // User for masking tests - no special groups, sees only masked values if (user === 'masking_viewer') { if (password && password !== 'masking_viewer_password') { throw new Error(`Password doesn't match for ${user}`); @@ -144,13 +137,12 @@ module.exports = { auth: { username: 'masking_viewer', userAttributes: {}, - roles: [], groups: [], }, }, }; } - // User for masking tests - has full access role + // User for masking tests - has full access group if (user === 'masking_full') { if (password && password !== 'masking_full_password') { throw new Error(`Password doesn't match for ${user}`); @@ -162,8 +154,7 @@ module.exports = { auth: { username: 'masking_full', userAttributes: {}, - roles: ['masking_full_access'], - groups: [], + groups: ['masking_full_access'], }, }, }; @@ -180,8 +171,7 @@ module.exports = { auth: { username: 'masking_partial', userAttributes: {}, - roles: ['masking_partial'], - groups: [], + groups: ['masking_partial'], }, }, }; @@ -199,7 +189,6 @@ module.exports = { userAttributes: { allowedProductIds: [1, 2], }, - roles: [], groups: ['user_group', 'region_group'], }, }, @@ -216,7 +205,6 @@ module.exports = { auth: { username: 'region_user_no_filter', userAttributes: {}, - roles: [], groups: ['user_group'], }, }, @@ -239,7 +227,6 @@ module.exports = { auth: { username: 'sc_test', userAttributes: {}, - roles: [], groups: [], }, }, @@ -256,8 +243,7 @@ module.exports = { auth: { username: 'conditional_mask_user', userAttributes: {}, - roles: ['conditional_mask_role'], - groups: [], + groups: ['conditional_mask_group'], }, }, }; @@ -273,8 +259,7 @@ module.exports = { auth: { username: 'conditional_mask_multi_user', userAttributes: {}, - roles: ['conditional_mask_role', 'conditional_mask_role_extra'], - groups: [], + groups: ['conditional_mask_group', 'conditional_mask_group_extra'], }, }, }; @@ -292,7 +277,6 @@ module.exports = { auth: { username: 'single_policy_measure_user', userAttributes: {}, - roles: [], groups: ['spm_full_group'], }, }, @@ -311,7 +295,6 @@ module.exports = { auth: { username: 'multi_group_user', userAttributes: {}, - roles: [], groups: ['mg_group_a', 'mg_group_c'], }, }, diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/conditional_masking_test.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/conditional_masking_test.yaml index 3d778e72b493d..e1a6ea3c7fdaa 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/conditional_masking_test.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/conditional_masking_test.yaml @@ -26,13 +26,13 @@ cubes: type: sum access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: includes: "*" - - role: "conditional_mask_role" + - group: "conditional_mask_group" member_level: includes: "*" row_level: @@ -42,7 +42,7 @@ cubes: values: - "3" - - role: "conditional_mask_role_extra" + - group: "conditional_mask_group_extra" member_level: includes: "*" row_level: diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/line_items.js b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/line_items.js index 8d35089fdbc43..8ed43922f463c 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/line_items.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/line_items.js @@ -47,7 +47,7 @@ cube('line_items', { accessPolicy: [ { - role: '*', + group: '*', rowLevel: { filters: [{ member: 'id', @@ -61,13 +61,13 @@ cube('line_items', { }, }, { - role: 'restricted', + group: 'restricted', memberLevel: { excludes: ['count', 'price', 'price_dim'], }, }, { - role: 'admin', + group: 'admin', conditions: [ { if: security_context.auth?.userAttributes?.region === 'CA', @@ -82,7 +82,7 @@ cube('line_items', { }, }, { - role: 'manager', + group: 'manager', conditions: [ { if: security_context.auth?.userAttributes?.region === 'CA', diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/masking_test.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/masking_test.yaml index 399b3bbf9f320..d43c917bd06fb 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/masking_test.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/masking_test.yaml @@ -43,19 +43,19 @@ cubes: type: sum access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: includes: "*" - - role: "masking_full_access" + - group: "masking_full_access" member_level: includes: "*" row_level: allow_all: true - - role: "masking_partial" + - group: "masking_partial" member_level: includes: - id @@ -102,7 +102,7 @@ cubes: type: sum access_policy: - - role: "*" + - group: "*" member_level: includes: [] @@ -126,7 +126,7 @@ cubes: type: count access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: @@ -205,7 +205,7 @@ cubes: type: count access_policy: - - role: "*" + - group: "*" member_level: includes: - id @@ -231,7 +231,7 @@ views: - count_d - total_quantity access_policy: - - role: "*" + - group: "*" member_level: includes: "*" row_level: @@ -249,14 +249,14 @@ views: - count_d - total_quantity access_policy: - - role: "*" + - group: "*" member_level: includes: [] member_masking: includes: "*" row_level: allow_all: true - - role: "masking_full_access" + - group: "masking_full_access" member_level: includes: "*" row_level: @@ -274,7 +274,7 @@ views: - count_d - total_quantity access_policy: - - role: "*" + - group: "*" member_level: includes: - public_dim @@ -304,7 +304,7 @@ views: - count access_policy: - - role: "*" + - group: "*" member_level: includes: - view_mask_base_id @@ -330,7 +330,7 @@ views: - count - total_quantity access_policy: - - role: "*" + - group: "*" member_level: includes: - public_dim @@ -339,7 +339,7 @@ views: includes: "*" row_level: allow_all: true - - role: "masking_full_access" + - group: "masking_full_access" member_level: includes: "*" row_level: diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/orders.js b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/orders.js index 029d5928cc7c5..49e1cea14ab09 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/orders.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/orders.js @@ -31,7 +31,7 @@ cube('orders', { access_policy: [ { - role: '*', + group: '*', memberLevel: { // This cube is "private" by default and only accessible via views includes: [], @@ -47,7 +47,7 @@ cube('orders', { }, }, { - role: 'admin', + group: 'admin', memberLevel: { // This cube is "private" by default and only accessible via views includes: [], diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/policy_overlap_test.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/policy_overlap_test.yaml index 9fe920caf8744..2dec37db9eb57 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/policy_overlap_test.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/policy_overlap_test.yaml @@ -51,7 +51,7 @@ views: access_policy: # Policy 1: covers members a, b (and count, id for filtering) with row filter R1 (id < 500) - - role: "*" + - group: "*" member_level: includes: - id @@ -66,7 +66,7 @@ views: - "500" # Policy 2: covers members b, c (and count, id for filtering) with row filter R2 (id >= 500) - - role: "policy2_role" + - group: "policy2_group" member_level: includes: - id diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/products.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/products.yaml index db365575426cd..95bc5423f2265 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/products.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/products.yaml @@ -25,4 +25,4 @@ cubes: type: time access_policy: - - role: some_role + - group: some_group diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/region_test.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/region_test.yaml index 8e4406b849f41..6f225f03936c7 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/region_test.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/region_test.yaml @@ -17,7 +17,7 @@ cubes: type: number access_policy: - - role: "*" + - group: "*" member_level: includes: "*" row_level: diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/security_context_test.js b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/security_context_test.js index 9b674b9a9934d..21ed7a19e9668 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/security_context_test.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/security_context_test.js @@ -96,7 +96,7 @@ cube('sc_ua_mask_test', { accessPolicy: [ { - role: '*', + group: '*', memberLevel: { includes: [], }, @@ -133,7 +133,7 @@ cube('sc_cube_mask_test', { accessPolicy: [ { - role: '*', + group: '*', memberLevel: { includes: [], }, @@ -181,7 +181,7 @@ cube('sc_joined_mask_test', { accessPolicy: [ { - role: '*', + group: '*', memberLevel: { includes: [], }, @@ -215,7 +215,7 @@ cube('sc_groups_shorthand_test', { accessPolicy: [ { - role: '*', + group: '*', rowLevel: { filters: [{ member: 'product_id', diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/users.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/users.yaml index 7904a2199dee2..40ec9ecc80475 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/users.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/cubes/users.yaml @@ -18,13 +18,13 @@ cubes: primary_key: true access_policy: - - role: "*" + - group: "*" row_level: filters: - member: "{CUBE}.city" operator: equals values: ["{ security_context.auth.userAttributes.city }"] - - role: admin + - group: admin conditions: # This thing will fail if there's no auth info in the context # Unfortunately, as of now, there's no way to write more complex expressions diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/users.js b/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/users.js index 1c9488769f092..b0260e0f6c3df 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/users.js +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/users.js @@ -4,7 +4,7 @@ view('users_view', { includes: '*', }], accessPolicy: [{ - role: '*', + group: '*', rowLevel: { filters: [{ member: 'id', diff --git a/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/views.yaml b/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/views.yaml index 93401083bfb88..24c35b2892cfb 100644 --- a/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/views.yaml +++ b/packages/cubejs-testing/birdbox-fixtures/rbac/model/views/views.yaml @@ -4,7 +4,7 @@ views: - join_path: line_items includes: "*" access_policy: - - role: "*" + - group: "*" row_level: filters: - member: "${CUBE}.price_dim" @@ -30,14 +30,14 @@ views: - join_path: orders includes: "*" access_policy: - - role: admin + - group: admin member_level: includes: "*" row_level: allow_all: true # Two-layer row-level filtering: the underlying `orders` cube restricts rows - # to id IN {1, 10, 11} (role "*" → id = 1, role admin → id = 10 OR id = 11), + # to id IN {1, 10, 11} (group "*" → id = 1, group admin → id = 10 OR id = 11), # while this view adds its own row filter id < 11. A row must satisfy BOTH # the cube policy AND the view policy, so the result is id IN {1, 10}. - name: orders_two_layer_test @@ -45,7 +45,7 @@ views: - join_path: orders includes: "*" access_policy: - - role: "*" + - group: "*" member_level: includes: "*" row_level: diff --git a/packages/cubejs-testing/test/smoke-rbac-graphql.test.ts b/packages/cubejs-testing/test/smoke-rbac-graphql.test.ts index 3d74ea33a2e43..d163135290182 100644 --- a/packages/cubejs-testing/test/smoke-rbac-graphql.test.ts +++ b/packages/cubejs-testing/test/smoke-rbac-graphql.test.ts @@ -34,9 +34,9 @@ describe('GraphQL Schema Caching and RBAC', () => { await birdbox.stop(); }, JEST_AFTER_ALL_DEFAULT_TIMEOUT); - async function graphqlRequest(role: string, query: string): Promise { + async function graphqlRequest(group: string, query: string): Promise { const token = sign({ - auth: { roles: [role] }, + auth: { groups: [group] }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '1h' }); const baseUrl = birdbox.configuration.apiUrl.replace('/cubejs-api/v1', ''); @@ -51,7 +51,7 @@ describe('GraphQL Schema Caching and RBAC', () => { return res.json(); } - test('all roles see the same unfiltered schema', async () => { + test('all groups see the same unfiltered schema', async () => { const introspectionQuery = '{ __type(name: "OrdersMembers") { fields { name } } }'; const resultA = await graphqlRequest('tenant-a', introspectionQuery); @@ -106,7 +106,7 @@ describe('GraphQL Schema Caching and RBAC', () => { expect(restrictedResult.errors[0].message).toContain('You requested hidden member'); }); - test('default role cannot query any fields - complete denial returns errors', async () => { + test('default group cannot query any fields - complete denial returns errors', async () => { const result1 = await graphqlRequest('default', `{ cube(where: { orders: {} }) { orders { internalCode } diff --git a/packages/cubejs-testing/test/smoke-rbac.test.ts b/packages/cubejs-testing/test/smoke-rbac.test.ts index ff38e5b2549e0..e11e3b1807316 100644 --- a/packages/cubejs-testing/test/smoke-rbac.test.ts +++ b/packages/cubejs-testing/test/smoke-rbac.test.ts @@ -20,7 +20,6 @@ const DEFAULT_API_TOKEN = sign({ auth: { username: 'nobody', userAttributes: {}, - roles: [], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '2 days' @@ -149,7 +148,7 @@ describe('Cube RBAC Engine', () => { test('row-level filters from cube AND view layers are both applied', async () => { // The underlying `orders` cube policy restricts rows to id IN {1, 10, 11} - // (role "*" → id = 1, role admin → id = 10 OR id = 11). The view adds its + // (group "*" → id = 1, group admin → id = 10 OR id = 11). The view adds its // own row filter id < 11. Both layers must apply (AND), so the visible ids // are the intersection: {1, 10}. const res = await connection.query('SELECT id FROM orders_two_layer_test ORDER BY id'); @@ -302,8 +301,8 @@ describe('Cube RBAC Engine', () => { /** * Two-dimensional policy overlap test (matches diagram in CompilerApi.ts:559-647) * - * Policy 1 (role "*"): covers members a, b, id with row filter R1 (id < 500) - * Policy 2 (role "policy2_role"): covers members b, c, id with row filter R2 (id >= 500) + * Policy 1 (group "*"): covers members a, b, id with row filter R1 (id < 500) + * Policy 2 (group "policy2_group"): covers members b, c, id with row filter R2 (id >= 500) * * Members * ^ @@ -321,7 +320,7 @@ describe('Cube RBAC Engine', () => { let connection: PgClient; beforeAll(async () => { - // User has policy2_role, so both Policy 1 (*) and Policy 2 apply + // User is in group policy2_group, so both Policy 1 (*) and Policy 2 apply connection = await createPostgresClient('policy_test', 'policy_test_password'); }); @@ -447,9 +446,9 @@ describe('Cube RBAC Engine', () => { * - count_d measure: mask with 34567 * * Three user profiles: - * - masking_viewer: role "*" only → all members masked (memberLevel includes=[]) - * - masking_full: has masking_full_access role → full access to all members - * - masking_partial: has masking_partial role → id, public_dim, total_quantity unmasked; rest masked + * - masking_viewer: group "*" only → all members masked (memberLevel includes=[]) + * - masking_full: has masking_full_access group → full access to all members + * - masking_partial: has masking_partial group → id, public_dim, total_quantity unmasked; rest masked */ describe('RBAC data masking via SQL API (masking_viewer)', () => { let connection: PgClient; @@ -555,10 +554,10 @@ describe('Cube RBAC Engine', () => { * Rows matching the filter see unmasked values; other rows see masked values. * * conditional_masking_test cube: - * - role "*": member_level includes=[], member_masking includes="*" - * - role "conditional_mask_role": member_level includes="*", row_level filter product_id <= 3 + * - group "*": member_level includes=[], member_masking includes="*" + * - group "conditional_mask_group": member_level includes="*", row_level filter product_id <= 3 * - * For conditional_mask_user (role: conditional_mask_role): + * For conditional_mask_user (group: conditional_mask_group): * - product_id dimension: rows with product_id <= 3 show real value, others show masked (-1 for price) */ describe('RBAC conditional masking with row-level filters via SQL API', () => { @@ -588,7 +587,7 @@ describe('Cube RBAC Engine', () => { } }); - // Smoke test: only one filter policy matches (conditional_mask_role). For an + // Smoke test: only one filter policy matches (conditional_mask_group). For an // aggregate measure (total_price), a per-row CASE WHEN over the row filter would // reference product_id at row grain while the measure is aggregated. Since // product_id is not in the GROUP BY, the conditional CASE must NOT be triggered — @@ -655,10 +654,10 @@ describe('Cube RBAC Engine', () => { /** * Multiple conditional policies use OR across policies: - * - role "conditional_mask_role": product_id <= 3 - * - role "conditional_mask_role_extra": product_id = 5 + * - group "conditional_mask_group": product_id <= 3 + * - group "conditional_mask_group_extra": product_id = 5 * - * For conditional_mask_multi_user (both roles): + * For conditional_mask_multi_user (both groups): * Unmasked when product_id <= 3 OR product_id = 5, masked otherwise. */ describe('RBAC conditional masking with multiple policies (OR across policies)', () => { @@ -772,7 +771,7 @@ describe('Cube RBAC Engine', () => { await connection.end(); }, JEST_AFTER_ALL_DEFAULT_TIMEOUT); - test('masking_view_masked returns masked values for default role', async () => { + test('masking_view_masked returns masked values for default group', async () => { const res = await connection.query('SELECT * FROM masking_view_masked LIMIT 5'); expect(res.rows.length).toBeGreaterThan(0); for (const row of res.rows) { @@ -783,7 +782,7 @@ describe('Cube RBAC Engine', () => { } }); - test('masking_view_over_hidden_cube returns masked values for default role', async () => { + test('masking_view_over_hidden_cube returns masked values for default group', async () => { const res = await connection.query('SELECT * FROM masking_view_over_hidden_cube LIMIT 5'); expect(res.rows.length).toBeGreaterThan(0); for (const row of res.rows) { @@ -806,7 +805,7 @@ describe('Cube RBAC Engine', () => { await connection.end(); }, JEST_AFTER_ALL_DEFAULT_TIMEOUT); - test('masking_view_masked returns real values for masking_full_access role', async () => { + test('masking_view_masked returns real values for masking_full_access group', async () => { const res = await connection.query('SELECT * FROM masking_view_masked LIMIT 5'); expect(res.rows.length).toBeGreaterThan(0); for (const row of res.rows) { @@ -815,8 +814,8 @@ describe('Cube RBAC Engine', () => { } }); - test('masking_view_over_hidden_cube returns real values for masking_full_access role', async () => { - // The underlying cube hides all members, but masking_full_access role + test('masking_view_over_hidden_cube returns real values for masking_full_access group', async () => { + // The underlying cube hides all members, but masking_full_access group // gets full access through the view's own policy. const res = await connection.query('SELECT * FROM masking_view_over_hidden_cube LIMIT 5'); expect(res.rows.length).toBeGreaterThan(0); @@ -836,7 +835,6 @@ describe('Cube RBAC Engine', () => { auth: { username: 'masking_viewer', userAttributes: {}, - roles: [], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '2 days' @@ -846,7 +844,7 @@ describe('Cube RBAC Engine', () => { auth: { username: 'masking_full', userAttributes: {}, - roles: ['masking_full_access'], + groups: ['masking_full_access'], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '2 days' @@ -856,7 +854,7 @@ describe('Cube RBAC Engine', () => { auth: { username: 'masking_partial', userAttributes: {}, - roles: ['masking_partial'], + groups: ['masking_partial'], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '2 days' @@ -992,7 +990,7 @@ describe('Cube RBAC Engine', () => { test('view: masking_view — cube masking still applied through view', async () => { // masking_view grants full access at view level, but the underlying - // cube masks all members for role "*". Masking follows RLS pattern. + // cube masks all members for group "*". Masking follows RLS pattern. const result = await maskingViewerClient.load({ measures: ['masking_view.count'], dimensions: ['masking_view.secret_number'], @@ -1166,7 +1164,6 @@ describe('Cube RBAC Engine', () => { auth: { username: 'sc_test', userAttributes: {}, - roles: [], groups: [], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { @@ -1401,7 +1398,7 @@ describe('Cube RBAC Engine', () => { canHaveAdmin: true, minDefaultId: 10000, }, - roles: ['admin', 'ownder', 'hr'], + groups: ['admin'], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { expiresIn: '2 days' @@ -1611,7 +1608,6 @@ describe('Cube RBAC Engine [Tesseract]', () => { auth: { username: 'sc_test', userAttributes: {}, - roles: [], groups: [], }, }, DEFAULT_CONFIG.CUBEJS_API_SECRET, { From 0c384518f941efc7bc4413c52ff7a4a1fc1ee7b6 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 18:54:28 +0200 Subject: [PATCH 06/26] feat(native): Initial support for Python 3.13 (#9930) --- .github/workflows/drivers-tests.yml | 2 +- .github/workflows/master.yml | 2 +- .github/workflows/publish.yml | 10 ++-- .github/workflows/push.yml | 4 +- .github/workflows/rust-cubesql.yml | 9 ++- .github/workflows/rust-cubestore-master.yml | 4 +- .github/workflows/rust-cubestore.yml | 4 +- packages/cubejs-backend-native/.gitignore | 3 +- packages/cubejs-backend-native/Cargo.lock | 54 ++++++++++-------- packages/cubejs-backend-native/Cargo.toml | 9 +-- packages/cubejs-backend-native/package.json | 1 + .../cubejs-backend-native/src/cross/clrepr.rs | 8 ++- .../src/cross/clrepr_python.rs | 54 +++++++++++------- .../src/cross/py_in_js.rs | 4 +- .../src/python/cube_config.rs | 7 ++- .../cubejs-backend-native/src/python/entry.rs | 57 +++++++++++-------- .../src/python/neon_py.rs | 2 +- .../src/python/runtime.rs | 23 ++++---- .../cubejs-backend-native/src/python/utils.rs | 12 ++-- .../src/template/mj_value/python.rs | 9 +-- rust/cubestore/Cross.toml | 6 +- 21 files changed, 160 insertions(+), 124 deletions(-) diff --git a/.github/workflows/drivers-tests.yml b/.github/workflows/drivers-tests.yml index 46e3b6e4b8a36..d56ce309d7426 100644 --- a/.github/workflows/drivers-tests.yml +++ b/.github/workflows/drivers-tests.yml @@ -103,7 +103,7 @@ jobs: target: [ "x86_64-unknown-linux-gnu" ] fail-fast: false container: - image: cubejs/rust-cross:${{ matrix.target }}-15082024 + image: cubejs/rust-cross:${{ matrix.target }}-31072025 steps: - name: Checkout diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index b58f3b75adde8..f1977a9a2d00d 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -45,7 +45,7 @@ jobs: timeout-minutes: 60 name: Build Linux Native backend for Dev image container: - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024-python-3.11 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-3.11 steps: - name: Checkout diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a78142e6bfd52..4b9dc62ac1101 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -76,7 +76,7 @@ jobs: strategy: matrix: node-version: [22] - python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] include: - target: x86_64-unknown-linux-gnu @@ -89,7 +89,7 @@ jobs: package_target_libc: glibc fail-fast: false container: - image: cubejs/rust-cross:${{ matrix.target }}-15082024${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }} + image: cubejs/rust-cross:${{ matrix.target }}-31072025${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }} permissions: contents: write steps: @@ -156,7 +156,7 @@ jobs: matrix: node-version: [22.x] target: ["x86_64-apple-darwin", "aarch64-apple-darwin"] - python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] include: - target: x86_64-apple-darwin os-version: macos-15-intel @@ -596,13 +596,13 @@ jobs: # Please use minimal possible version of ubuntu, because it produces constraint on glibc - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025 executable_name: cubestored strip: true compress: false - os: ubuntu-22.04 target: x86_64-unknown-linux-musl - image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025 executable_name: cubestored strip: true # cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index dc15b9d60ced4..da9b3d83ca3b0 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -228,7 +228,7 @@ jobs: timeout-minutes: 60 if: (needs['latest-tag-sha'].outputs.sha != github.sha) container: - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025 steps: - name: Checkout uses: actions/checkout@v4 @@ -267,7 +267,7 @@ jobs: python-version: [ 3.11 ] fail-fast: false container: - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024-python-${{ matrix.python-version }} + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-${{ matrix.python-version }} steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/rust-cubesql.yml b/.github/workflows/rust-cubesql.yml index 860285a48a759..b3dbf5c3787ac 100644 --- a/.github/workflows/rust-cubesql.yml +++ b/.github/workflows/rust-cubesql.yml @@ -22,7 +22,7 @@ jobs: timeout-minutes: 20 name: Check fmt/clippy container: - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025 steps: - name: Checkout @@ -122,7 +122,7 @@ jobs: # Current used version + 1 LTS # TODO: Add 24 after it's been released (don't forget to uncomment excludes below!) node-version: [22] - python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] # minimize number of jobs exclude: @@ -135,7 +135,7 @@ jobs: target: "aarch64-unknown-linux-gnu" fail-fast: false container: - image: cubejs/rust-cross:${{ matrix.target }}-15082024${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }} + image: cubejs/rust-cross:${{ matrix.target }}-31072025${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }} steps: - name: Checkout @@ -240,6 +240,9 @@ jobs: - target: x86_64-apple-darwin os-version: macos-15-intel python-version: "3.12" + - target: x86_64-apple-darwin + os-version: macos-15-intel + python-version: "3.13" - target: x86_64-apple-darwin os-version: macos-15-intel python-version: "fallback" diff --git a/.github/workflows/rust-cubestore-master.yml b/.github/workflows/rust-cubestore-master.yml index b4deccbab7e6a..d80cb7a336fa5 100644 --- a/.github/workflows/rust-cubestore-master.yml +++ b/.github/workflows/rust-cubestore-master.yml @@ -264,13 +264,13 @@ jobs: # Please use minimal possible version of ubuntu, because it produces constraint on glibc - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025 executable_name: cubestored strip: true compress: false - os: ubuntu-22.04 target: x86_64-unknown-linux-musl - image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025 executable_name: cubestored strip: true # cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890 diff --git a/.github/workflows/rust-cubestore.yml b/.github/workflows/rust-cubestore.yml index c76e7e8c0f444..4e15b958e2ffb 100644 --- a/.github/workflows/rust-cubestore.yml +++ b/.github/workflows/rust-cubestore.yml @@ -203,13 +203,13 @@ jobs: # Please use minimal possible version of ubuntu, because it produces constraint on glibc - os: ubuntu-22.04 target: x86_64-unknown-linux-gnu - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025 executable_name: cubestored strip: true compress: false - os: ubuntu-22.04 target: x86_64-unknown-linux-musl - image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024 + image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025 executable_name: cubestored strip: true # cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890 diff --git a/packages/cubejs-backend-native/.gitignore b/packages/cubejs-backend-native/.gitignore index 67cbee8dc09f3..214ec7423edc4 100644 --- a/packages/cubejs-backend-native/.gitignore +++ b/packages/cubejs-backend-native/.gitignore @@ -7,4 +7,5 @@ index.node **/.DS_Store npm-debug.log benchmarks/result.txt -test/__pycache__/ \ No newline at end of file +test/__pycache__/ +test/subdir_for_test/__pycache__/ diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock index b52628243878d..945f3e8f04858 100644 --- a/packages/cubejs-backend-native/Cargo.lock +++ b/packages/cubejs-backend-native/Cargo.lock @@ -742,7 +742,7 @@ dependencies = [ "neon", "once_cell", "pyo3", - "pyo3-asyncio", + "pyo3-async-runtimes", "serde", "serde_json", "simple_logger", @@ -1358,6 +1358,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2508,15 +2514,16 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.20.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b" +checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" dependencies = [ "cfg-if", "indoc", "libc", "memoffset", - "parking_lot", + "once_cell", + "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", @@ -2524,35 +2531,35 @@ dependencies = [ ] [[package]] -name = "pyo3-asyncio" -version = "0.20.0" +name = "pyo3-async-runtimes" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea6b68e93db3622f3bb3bf363246cf948ed5375afe7abff98ccbdd50b184995" +checksum = "2529f0be73ffd2be0cc43c013a640796558aa12d7ca0aab5cc14f375b4733031" dependencies = [ "futures", "once_cell", "pin-project-lite", "pyo3", - "pyo3-asyncio-macros", + "pyo3-async-runtimes-macros", "tokio", ] [[package]] -name = "pyo3-asyncio-macros" -version = "0.20.0" +name = "pyo3-async-runtimes-macros" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c467178e1da6252c95c29ecf898b133f742e9181dca5def15dc24e19d45a39" +checksum = "22c26fd8e9fc19f53f0c1e00bf61471de6789f7eb263056f7f944a9cceb5823e" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] name = "pyo3-build-config" -version = "0.20.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5" +checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" dependencies = [ "once_cell", "target-lexicon", @@ -2560,9 +2567,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.20.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b" +checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" dependencies = [ "libc", "pyo3-build-config", @@ -2570,9 +2577,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.20.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b" +checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -2582,12 +2589,13 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.20.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424" +checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", + "pyo3-build-config", "quote", "syn 2.0.98", ] @@ -3365,9 +3373,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" diff --git a/packages/cubejs-backend-native/Cargo.toml b/packages/cubejs-backend-native/Cargo.toml index 5801a68f9d259..60e9defdcfa8b 100644 --- a/packages/cubejs-backend-native/Cargo.toml +++ b/packages/cubejs-backend-native/Cargo.toml @@ -34,11 +34,8 @@ log-reroute = "0.1" minijinja = { version = "1", features = ["json", "loader"] } once_cell = "1.10" # python -pyo3 = { version = "0.20.0", features = [], optional = true } -pyo3-asyncio = { version = "0.20.0", features = [ - "tokio-runtime", - "attributes", -], optional = true } +pyo3 = { version = "0.22.6", optional = true } +pyo3-async-runtimes = { version = "0.22.0", features = ["tokio-runtime", "attributes"], optional = true } serde = { version = "1.0.217", features = ["derive"] } serde_json = "1.0.127" simple_logger = "1.7.0" @@ -55,7 +52,7 @@ features = ["napi-1", "napi-4", "napi-6", "futures"] default = ["neon-entrypoint", "async-log"] neon-debug = [] neon-entrypoint = [] -python = ["pyo3", "pyo3-asyncio"] +python = ["pyo3", "pyo3-async-runtimes"] async-log = ["log_nonblock"] # Exposes `__testBridge_*` endpoints used by the bridge regression test # harness. Off by default — never enable in production builds. diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json index d9f3f36e91071..7bf86d66f6c14 100644 --- a/packages/cubejs-backend-native/package.json +++ b/packages/cubejs-backend-native/package.json @@ -61,6 +61,7 @@ "value": [ "libpython", [ + "3.13", "3.12", "3.11", "3.10", diff --git a/packages/cubejs-backend-native/src/cross/clrepr.rs b/packages/cubejs-backend-native/src/cross/clrepr.rs index 1326c7b9c780c..2c30694dde6a4 100644 --- a/packages/cubejs-backend-native/src/cross/clrepr.rs +++ b/packages/cubejs-backend-native/src/cross/clrepr.rs @@ -10,6 +10,8 @@ use neon::prelude::*; use neon::result::Throw; use neon::types::JsDate; #[cfg(feature = "python")] +use pyo3::Python; +#[cfg(feature = "python")] use std::cell::RefCell; use std::collections::hash_map::{IntoIter, Iter, Keys}; use std::collections::HashMap; @@ -96,9 +98,9 @@ pub enum StringType { Safe, } -/// Cross language representation is abstraction to transfer values between +/// Cross-language representation is an abstraction to transfer values between /// JavaScript and Python across Rust. Converting between two different languages requires -/// to use Context which is available on the call (one for python and one for js), which result as +/// using Context which is available on the call (one for python and one for js), which results as /// blocking. #[derive(Debug, Clone)] pub enum CLRepr { @@ -240,7 +242,7 @@ impl CLRepr { #[cfg(feature = "python")] if from.is_a::(cx) { let ref_wrap = from.downcast_or_throw::(cx)?; - let fun = ref_wrap.borrow().get_fun().clone(); + let fun = Python::with_gil(|py| ref_wrap.borrow().get_fun().clone_ref(py)); return Ok(CLRepr::PythonRef(PythonRef::PyFunction(fun))); } diff --git a/packages/cubejs-backend-native/src/cross/clrepr_python.rs b/packages/cubejs-backend-native/src/cross/clrepr_python.rs index 387aa42eb1025..34e2a8301ba54 100644 --- a/packages/cubejs-backend-native/src/cross/clrepr_python.rs +++ b/packages/cubejs-backend-native/src/cross/clrepr_python.rs @@ -3,12 +3,14 @@ use crate::cross::{CLRepr, CLReprObjectKind, StringType}; use crate::python::utils::PyAnyHelpers; use pyo3::exceptions::{PyException, PyNotImplementedError, PyTypeError}; use pyo3::types::{ - PyBool, PyComplex, PyDate, PyDateTime, PyDelta, PyDict, PyFloat, PyFrame, PyFrozenSet, - PyFunction, PyInt, PyList, PySequence, PySet, PyString, PyTraceback, PyTuple, + PyAnyMethods, PyBool, PyBoolMethods, PyComplex, PyDate, PyDateTime, PyDelta, PyDict, + PyDictMethods, PyFloat, PyFloatMethods, PyFrame, PyFrozenSet, PyFunction, PyInt, PyList, + PyListMethods, PySequence, PySet, PySetMethods, PyString, PyTraceback, PyTuple, PyTupleMethods, + PyTypeMethods, }; -use pyo3::{Py, PyAny, PyErr, PyObject, Python, ToPyObject}; +use pyo3::{Bound, Py, PyAny, PyErr, PyObject, Python, ToPyObject}; -#[derive(Debug, Clone)] +#[derive(Debug)] pub enum PythonRef { PyObject(PyObject), PyFunction(Py), @@ -17,9 +19,19 @@ pub enum PythonRef { PyExternalFunction(Py), } +impl Clone for PythonRef { + fn clone(&self) -> Self { + Python::with_gil(|py| match self { + PythonRef::PyObject(obj) => PythonRef::PyObject(obj.clone_ref(py)), + PythonRef::PyFunction(fun) => PythonRef::PyFunction(fun.clone_ref(py)), + PythonRef::PyExternalFunction(fun) => PythonRef::PyExternalFunction(fun.clone_ref(py)), + }) + } +} + impl CLRepr { /// Convert python value to CLRepr - pub fn from_python_ref(v: &PyAny) -> Result { + pub fn from_python_ref(v: &Bound<'_, PyAny>) -> Result { if v.is_none() { return Ok(Self::Null); } @@ -31,7 +43,7 @@ impl CLRepr { StringType::Normal }; - Self::String(v.to_string(), string_type) + Self::String(v.str()?.to_string(), string_type) } else if v.get_type().is_subclass_of::()? { Self::Bool(v.downcast::()?.is_true()) } else if v.get_type().is_subclass_of::()? { @@ -48,7 +60,7 @@ impl CLRepr { if k.get_type().is_subclass_of::()? { let key_str = k.downcast::()?; - obj.insert(key_str.to_string(), Self::from_python_ref(v)?); + obj.insert(key_str.to_string(), Self::from_python_ref(&v)?); } } @@ -58,7 +70,7 @@ impl CLRepr { let mut r = Vec::with_capacity(l.len()); for v in l.iter() { - r.push(Self::from_python_ref(v)?); + r.push(Self::from_python_ref(&v)?); } Self::Array(r) @@ -67,7 +79,7 @@ impl CLRepr { let mut r = Vec::with_capacity(l.len()); for v in l.iter() { - r.push(Self::from_python_ref(v)?); + r.push(Self::from_python_ref(&v)?); } Self::Array(r) @@ -76,12 +88,12 @@ impl CLRepr { let mut r = Vec::with_capacity(l.len()); for v in l.iter() { - r.push(Self::from_python_ref(v)?); + r.push(Self::from_python_ref(&v)?); } Self::Tuple(r) } else if v.get_type().is_subclass_of::()? { - let fun: Py = v.downcast::()?.into(); + let fun: Py = v.downcast::()?.clone().unbind(); Self::PythonRef(PythonRef::PyFunction(fun)) } else if v.get_type().is_subclass_of::()? { @@ -140,12 +152,12 @@ impl CLRepr { ))); } else { // Fallback to PyObject, it will lead to throw error in the JS side - Self::PythonRef(PythonRef::PyObject(v.into())) + Self::PythonRef(PythonRef::PyObject(v.clone().unbind())) }) } - fn into_py_dict_impl(obj: CLReprObject, py: Python<'_>) -> Result<&PyDict, PyErr> { - let r = PyDict::new(py); + fn into_py_dict_impl(obj: CLReprObject, py: Python<'_>) -> Result, PyErr> { + let r = PyDict::new_bound(py); for (k, v) in obj.into_iter() { r.set_item(k, Self::into_py_impl(v, py)?)?; @@ -156,11 +168,11 @@ impl CLRepr { fn into_py_impl(from: CLRepr, py: Python) -> Result { Ok(match from { - CLRepr::String(v, _) => PyString::new(py, &v).to_object(py), - CLRepr::Bool(v) => PyBool::new(py, v).to_object(py), - CLRepr::Float(v) => PyFloat::new(py, v).to_object(py), + CLRepr::String(v, _) => PyString::new_bound(py, &v).to_object(py), + CLRepr::Bool(v) => PyBool::new_bound(py, v).to_object(py), + CLRepr::Float(v) => PyFloat::new_bound(py, v).to_object(py), CLRepr::Int(v) => { - let py_int: &PyInt = unsafe { py.from_owned_ptr(pyo3::ffi::PyLong_FromLong(v)) }; + let py_int = unsafe { Bound::from_owned_ptr(py, pyo3::ffi::PyLong_FromLong(v)) }; py_int.to_object(py) } @@ -171,7 +183,7 @@ impl CLRepr { elements.push(Self::into_py_impl(el, py)?); } - PyList::new(py, elements).to_object(py) + PyList::new_bound(py, elements).to_object(py) } CLRepr::Tuple(arr) => { let mut elements = Vec::with_capacity(arr.len()); @@ -180,7 +192,7 @@ impl CLRepr { elements.push(Self::into_py_impl(el, py)?); } - PyTuple::new(py, elements).to_object(py) + PyTuple::new_bound(py, elements).to_object(py) } CLRepr::Object(obj) => { let r = Self::into_py_dict_impl(obj, py)?; @@ -213,7 +225,7 @@ impl CLRepr { }) } - pub fn into_py_dict(self, py: Python<'_>) -> Result<&PyDict, PyErr> { + pub fn into_py_dict(self, py: Python<'_>) -> Result, PyErr> { Ok(match self { CLRepr::Object(obj) => Self::into_py_dict_impl(obj, py)?, other => { diff --git a/packages/cubejs-backend-native/src/cross/py_in_js.rs b/packages/cubejs-backend-native/src/cross/py_in_js.rs index 2d1626d3f3060..fad7fe2dbd40b 100644 --- a/packages/cubejs-backend-native/src/cross/py_in_js.rs +++ b/packages/cubejs-backend-native/src/cross/py_in_js.rs @@ -2,7 +2,7 @@ use crate::cross::CLRepr; use crate::python::runtime::py_runtime; use neon::prelude::*; use pyo3::types::PyFunction; -use pyo3::Py; +use pyo3::{Py, Python}; use std::cell::RefCell; pub struct JsPyFunctionWrapper { @@ -43,7 +43,7 @@ pub fn cl_repr_py_function_wrapper(mut cx: FunctionContext) -> JsResult r, Err(err) => return cx.throw_error(format!("Unable to init python runtime: {:?}", err)), diff --git a/packages/cubejs-backend-native/src/python/cube_config.rs b/packages/cubejs-backend-native/src/python/cube_config.rs index 791fd62a70b68..d5cc91ff9a086 100644 --- a/packages/cubejs-backend-native/src/python/cube_config.rs +++ b/packages/cubejs-backend-native/src/python/cube_config.rs @@ -1,6 +1,7 @@ use convert_case::{Case, Casing}; use neon::prelude::*; -use pyo3::{PyAny, PyResult}; +use pyo3::types::PyAnyMethods; +use pyo3::{Bound, PyAny, PyResult}; use crate::cross::{CLRepr, CLReprObject, CLReprObjectKind}; @@ -68,10 +69,10 @@ impl CubeConfigPy { ] } - pub fn attr(&mut self, config_module: &PyAny, key: &str) -> PyResult<()> { + pub fn attr(&mut self, config_module: &Bound<'_, PyAny>, key: &str) -> PyResult<()> { let v = config_module.getattr(key)?; if !v.is_none() { - let value = CLRepr::from_python_ref(v)?; + let value = CLRepr::from_python_ref(&v)?; self.properties.insert(key.to_case(Case::Camel), value); }; diff --git a/packages/cubejs-backend-native/src/python/entry.rs b/packages/cubejs-backend-native/src/python/entry.rs index 6305a0ab77502..161a75b9f6c0b 100644 --- a/packages/cubejs-backend-native/src/python/entry.rs +++ b/packages/cubejs-backend-native/src/python/entry.rs @@ -6,18 +6,19 @@ use crate::python::runtime::py_runtime_init; use neon::prelude::*; use pyo3::exceptions::PyException; use pyo3::prelude::*; -use pyo3::types::{PyDict, PyFunction, PyList, PyString, PyTuple}; +use pyo3::types::{PyAnyMethods, PyDict, PyFunction, PyList, PyString, PyTuple}; use std::path::Path; fn extend_sys_path(py: Python, file_name: &String) -> PyResult<()> { - let sys_path = py.import("sys")?.getattr("path")?.downcast::()?; + let binding = py.import_bound("sys")?.getattr("path")?; + let sys_path = binding.downcast::()?; let config_dir = Path::new(&file_name) .parent() .unwrap_or_else(|| Path::new(".")); let config_dir_str = config_dir.to_str().unwrap_or("."); - sys_path.insert(0, PyString::new(py, config_dir_str))?; + sys_path.insert(0, PyString::new_bound(py, config_dir_str))?; Ok(()) } @@ -40,9 +41,10 @@ fn python_load_config(mut cx: FunctionContext) -> JsResult { env!("CARGO_MANIFEST_DIR"), "/python/cube/src/__init__.py" )); - PyModule::from_code(py, cube_code, "__init__.py", "cube")?; + PyModule::from_code_bound(py, cube_code, "__init__.py", "cube")?; - let config_module = PyModule::from_code(py, &file_content_arg, &options_file_name, "")?; + let config_module = + PyModule::from_code_bound(py, &file_content_arg, &options_file_name, "")?; let settings_py = if config_module.hasattr("config")? { config_module.getattr("config")? } else { @@ -60,7 +62,7 @@ fn python_load_config(mut cx: FunctionContext) -> JsResult { let mut cube_conf = CubeConfigPy::new(); for attr_name in cube_conf.get_attrs() { - cube_conf.attr(settings_py, attr_name)?; + cube_conf.attr(&settings_py, attr_name)?; } Ok(cube_conf) @@ -90,9 +92,9 @@ fn python_load_model(mut cx: FunctionContext) -> JsResult { env!("CARGO_MANIFEST_DIR"), "/python/cube/src/__init__.py" )); - PyModule::from_code(py, cube_code, "__init__.py", "cube")?; + PyModule::from_code_bound(py, cube_code, "__init__.py", "cube")?; - let model_module = PyModule::from_code(py, &model_content, &model_file_name, "")?; + let model_module = PyModule::from_code_bound(py, &model_content, &model_file_name, "")?; let mut collected_functions = CLReprObject::new(CLReprObjectKind::Object); let mut collected_variables = CLReprObject::new(CLReprObjectKind::Object); @@ -101,48 +103,55 @@ fn python_load_model(mut cx: FunctionContext) -> JsResult { if model_module.hasattr("template")? { let template = model_module.getattr("template")?; - let functions = template.getattr("functions")?.downcast::()?; + let functions_attr = template.getattr("functions")?; + let functions = functions_attr.downcast::()?; for (local_key, local_value) in functions.iter() { if local_value.is_instance_of::() { - let fun: Py = local_value.downcast::()?.into(); + let fun: Py = + local_value.downcast::()?.clone().unbind(); collected_functions.insert( - local_key.to_string(), + local_key.str()?.to_string(), CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)), ); } } - let variables = template.getattr("variables")?.downcast::()?; + let variables_attr = template.getattr("variables")?; + let variables = variables_attr.downcast::()?; for (local_key, local_value) in variables.iter() { - collected_variables - .insert(local_key.to_string(), CLRepr::from_python_ref(local_value)?); + collected_variables.insert( + local_key.str()?.to_string(), + CLRepr::from_python_ref(&local_value)?, + ); } - let filters = template.getattr("filters")?.downcast::()?; + let filters_attr = template.getattr("filters")?; + let filters = filters_attr.downcast::()?; for (local_key, local_value) in filters.iter() { - let fun: Py = local_value.downcast::()?.into(); + let fun: Py = local_value.downcast::()?.clone().unbind(); collected_filters.insert( - local_key.to_string(), + local_key.str()?.to_string(), CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)), ); } } else { // backward compatibility, was used in private preview, not as Public API // TODO: Remove after 1.4 - let inspect_module = py.import("inspect")?; + let inspect_module = py.import_bound("inspect")?; let args = (model_module, inspect_module.getattr("isfunction")?); - let functions_with_names = inspect_module - .call_method1("getmembers", args)? - .downcast::()?; + let getmembers_result = inspect_module.call_method1("getmembers", args)?; + let functions_with_names = getmembers_result.downcast::()?; for function_details in functions_with_names.iter() { let function_details = function_details.downcast::()?; - let fun_name = function_details.get_item(0)?.downcast::()?; - let fun = function_details.get_item(1)?.downcast::()?; + let fun_name_item = function_details.get_item(0)?; + let fun_name = fun_name_item.downcast::()?; + let fun_item = function_details.get_item(1)?; + let fun = fun_item.downcast::()?; let has_attr = fun.hasattr("cube_context_func")?; if has_attr { - let fun: Py = fun.into(); + let fun: Py = fun.clone().unbind(); collected_functions.insert( fun_name.to_string(), CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)), diff --git a/packages/cubejs-backend-native/src/python/neon_py.rs b/packages/cubejs-backend-native/src/python/neon_py.rs index c2049195574f8..573583aff5cdf 100644 --- a/packages/cubejs-backend-native/src/python/neon_py.rs +++ b/packages/cubejs-backend-native/src/python/neon_py.rs @@ -5,7 +5,7 @@ pub(crate) fn format_python_error(py_err: PyErr) -> String { let err = format!("Python error: {}", py_err); let bt = Python::with_gil(move |py| -> PyResult> { - if let Some(trace_back) = py_err.traceback(py) { + if let Some(trace_back) = py_err.traceback_bound(py) { Ok(Some(trace_back.format()?)) } else { Ok(None) diff --git a/packages/cubejs-backend-native/src/python/runtime.rs b/packages/cubejs-backend-native/src/python/runtime.rs index 0746874a3510f..e8d4d9689faab 100644 --- a/packages/cubejs-backend-native/src/python/runtime.rs +++ b/packages/cubejs-backend-native/src/python/runtime.rs @@ -134,25 +134,26 @@ impl PyRuntime { let task_block = panic::AssertUnwindSafe(|| { Python::with_gil(move |py| -> PyResult { let mut prep_tuple = Vec::with_capacity(args.len()); - let mut py_kwargs = None; + let mut kwargs_dict_opt = None; for arg in args { if arg.is_kwarg() { - py_kwargs = Some(arg.into_py_dict(py)?); + kwargs_dict_opt = Some(arg.into_py_dict(py)?); } else { prep_tuple.push(arg.into_py(py)?); } } - let py_args = PyTuple::new(py, prep_tuple); - let call_res = fun.call(py, py_args, py_kwargs)?; + let py_args = PyTuple::new_bound(py, prep_tuple); + let py_kwargs = kwargs_dict_opt.as_ref(); + let call_res = fun.call_bound(py, py_args, py_kwargs)?; if call_res.is_coroutine()? { - let fut = pyo3_asyncio::tokio::into_future(call_res.as_ref(py))?; + let fut = pyo3_async_runtimes::tokio::into_future(call_res.bind(py).clone())?; Ok(PyScheduledFunResult::Poll(Box::pin(fut))) } else { Ok(PyScheduledFunResult::Ready(CLRepr::from_python_ref( - call_res.as_ref(py), + call_res.bind(py), )?)) } }) @@ -203,7 +204,7 @@ impl PyRuntime { Python::with_gil(move |py| -> Result { let res = match fut_res { - Ok(r) => CLRepr::from_python_ref(r.as_ref(py)), + Ok(r) => CLRepr::from_python_ref(r.bind(py)), Err(err) => Err(err), }; @@ -261,12 +262,12 @@ impl PyRuntime { trace!("Initializing executor in a separate thread"); std::thread::spawn(|| { - pyo3_asyncio::tokio::get_runtime() - .block_on(pyo3_asyncio::tokio::re_exports::pending::<()>()) + pyo3_async_runtimes::tokio::get_runtime() + .block_on(pyo3_async_runtimes::tokio::re_exports::pending::<()>()) }); let res = Python::with_gil(|py| -> Result<(), PyErr> { - pyo3_asyncio::tokio::run(py, async move { + pyo3_async_runtimes::tokio::run(py, async move { loop { if let Some(task) = receiver.recv().await { trace!("New task"); @@ -302,7 +303,7 @@ pub fn py_runtime_init<'a, C: Context<'a>>( pyo3::prepare_freethreaded_python(); // it's safe to unwrap - pyo3_asyncio::tokio::init_with_runtime(runtime).unwrap(); + pyo3_async_runtimes::tokio::init_with_runtime(runtime).unwrap(); if PY_RUNTIME.set(PyRuntime::new(channel)).is_err() { cx.throw_error("Error on setting PyRuntime") diff --git a/packages/cubejs-backend-native/src/python/utils.rs b/packages/cubejs-backend-native/src/python/utils.rs index 83b9c1f0996a9..be9447f7dba2c 100644 --- a/packages/cubejs-backend-native/src/python/utils.rs +++ b/packages/cubejs-backend-native/src/python/utils.rs @@ -13,7 +13,7 @@ pub fn python_fn_call_sync(py_fun: &Py, arguments: Vec) -> P args_tuple.push(arg.into_py(py)?); } - let tuple = PyTuple::new(py, args_tuple); + let tuple = PyTuple::new_bound(py, args_tuple); let call_res = py_fun.call1(py, tuple)?; @@ -22,7 +22,7 @@ pub fn python_fn_call_sync(py_fun: &Py, arguments: Vec) -> P "Calling function with async response is not supported", )) } else { - CLRepr::from_python_ref(call_res.as_ref(py)) + CLRepr::from_python_ref(call_res.bind(py)) } }) } @@ -35,7 +35,7 @@ pub fn python_obj_call_sync(py_fun: &PyObject, arguments: Vec) -> PyResu args_tuple.push(arg.into_py(py)?); } - let tuple = PyTuple::new(py, args_tuple); + let tuple = PyTuple::new_bound(py, args_tuple); let call_res = py_fun.call1(py, tuple)?; @@ -44,7 +44,7 @@ pub fn python_obj_call_sync(py_fun: &PyObject, arguments: Vec) -> PyResu "Calling object with async response is not supported", )) } else { - CLRepr::from_python_ref(call_res.as_ref(py)) + CLRepr::from_python_ref(call_res.bind(py)) } }) } @@ -64,7 +64,7 @@ where args_tuple.push(arg.into_py(py)?); } - let tuple = PyTuple::new(py, args_tuple); + let tuple = PyTuple::new_bound(py, args_tuple); let call_res = py_fun.call_method1(py, name, tuple)?; @@ -73,7 +73,7 @@ where "Calling object method with async response is not supported", )) } else { - CLRepr::from_python_ref(call_res.as_ref(py)) + CLRepr::from_python_ref(call_res.bind(py)) } }) } diff --git a/packages/cubejs-backend-native/src/template/mj_value/python.rs b/packages/cubejs-backend-native/src/template/mj_value/python.rs index 510b121fa0c9a..54c6667561e58 100644 --- a/packages/cubejs-backend-native/src/template/mj_value/python.rs +++ b/packages/cubejs-backend-native/src/template/mj_value/python.rs @@ -8,7 +8,7 @@ use log::error; use minijinja as mj; use minijinja::value as mjv; use minijinja::value::{Object, ObjectKind, StructObject, Value}; -use pyo3::types::{PyDict, PyFunction}; +use pyo3::types::{PyDict, PyDictMethods, PyFunction}; use pyo3::{Py, PyObject, PyResult, Python}; use std::convert::TryInto; use std::sync::Arc; @@ -171,7 +171,7 @@ impl StructObject for JinjaPythonObject { let res = Python::with_gil(move |py| -> PyResult { let attr_name = obj_ref.getattr(py, name)?; - CLRepr::from_python_ref(attr_name.as_ref(py)) + CLRepr::from_python_ref(attr_name.bind(py)) }); match res { @@ -190,7 +190,7 @@ impl StructObject for JinjaPythonObject { Python::with_gil(|py| { let mut fields: Vec> = vec![]; - match obj_ref.downcast::(py) { + match obj_ref.downcast_bound::(py) { Ok(dict_ref) => { for key in dict_ref.keys() { fields.push(key.to_string().into()); @@ -254,7 +254,8 @@ impl Object for JinjaPythonFunction { ) })?; - let call_future = py_runtime.call_async(self.inner.clone(), arguments); + let call_future = + Python::with_gil(|py| py_runtime.call_async(self.inner.clone_ref(py), arguments)); let tokio = tokio_runtime().map_err(|err| { mj::Error::new( diff --git a/rust/cubestore/Cross.toml b/rust/cubestore/Cross.toml index 880787846bbc3..a1d340dccc35f 100644 --- a/rust/cubestore/Cross.toml +++ b/rust/cubestore/Cross.toml @@ -1,11 +1,11 @@ [target.x86_64-unknown-linux-gnu] -image = "cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024" +image = "cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025" xargo = false [target.x86_64-unknown-linux-musl] -image = "cubejs/rust-cross:x86_64-unknown-linux-musl-15082024" +image = "cubejs/rust-cross:x86_64-unknown-linux-musl-31072025" xargo = false [target.aarch64-unknown-linux-gnu] -image = "cubejs/rust-cross:aarch64-unknown-linux-gnu-15082024" +image = "cubejs/rust-cross:aarch64-unknown-linux-gnu-31072025" xargo = false From af0f2993100a2ef42e601dfe9a1768902f8871f8 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 19:29:34 +0200 Subject: [PATCH 07/26] feat(server-core)!: Remove deprecated dbType option (#11045) BREAKING CHANGE: CreateOptions.dbType has been removed. Use driverFactory instead. --- DEPRECATION.md | 10 +- .../reference/configuration/config.mdx | 31 ----- .../python/cube/src/__init__.py | 2 - .../src/python/cube_config.rs | 1 - .../cubejs-server-core/src/core/DevServer.ts | 2 +- .../src/core/OptsHandler.ts | 126 +++++------------- .../src/core/optionsValidate.ts | 1 - packages/cubejs-server-core/src/core/types.ts | 3 - .../test/unit/OptsHandler.test.ts | 105 ++------------- .../test/unit/index.test.ts | 83 +++--------- .../src/helpers/getCore.ts | 4 +- .../birdbox-fixtures/lambda/cube.js | 21 +-- .../birdbox-fixtures/multidb/cube.js | 35 +++-- 13 files changed, 97 insertions(+), 327 deletions(-) diff --git a/DEPRECATION.md b/DEPRECATION.md index e044ce1ec3869..6e26d8f15f812 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -52,7 +52,7 @@ features: | Removed | [Node.js 12](#nodejs-12) | v0.29.0 | v0.32.0 | | Deprecated | [`CUBEJS_EXTERNAL_DEFAULT` and `CUBEJS_SCHEDULED_REFRESH_DEFAULT`](#cubejs_external_default-and-cubejs_scheduled_refresh_default) | v0.30.0 | | | Deprecated | [Using external databases for pre-aggregations](#using-external-databases-for-pre-aggregations) | v0.30.0 | | -| Deprecated | [`dbType`](#dbtype) | v0.30.30 | | +| Removed | [`dbType`](#dbtype) | v0.30.30 | v1.7.0 | | Removed | [Serverless Deployments](#serverless-deployments) | v0.31.64 | v0.35.0 | | Removed | [Node.js 14](#nodejs-14) | v0.32.0 | v0.35.0 | | Removed | [Using Redis for in-memory cache and queue](#using-redis-for-in-memory-cache-and-queue) | v0.32.0 | v0.36.0 | @@ -312,9 +312,11 @@ recommend [using Cube Store as a solution][ref-caching-in-prod]. **Deprecated in Release: v0.30.30** -Using `dbType` is now deprecated, and we recommend using -[`driverFactory`][self-driver-factory] to return a `DriverConfig` object -instead. +**Removed in Release: v1.7.0** + +`dbType` has been removed. Passing `CreateOptions.dbType` now throws an error. +Use [`driverFactory`][self-driver-factory] to return a `DriverConfig` object +(`{ type, ... }`) instead, or set the `CUBEJS_DB_TYPE` environment variable. ### Serverless Deployments diff --git a/docs-mintlify/reference/configuration/config.mdx b/docs-mintlify/reference/configuration/config.mdx index 46bd74a9725c3..16121ac4fb150 100644 --- a/docs-mintlify/reference/configuration/config.mdx +++ b/docs-mintlify/reference/configuration/config.mdx @@ -1485,36 +1485,6 @@ module.exports = { -## Deprecated - -### `dbType` - - - -`dbType` is deprecated and will be removed in a future release. -Use [`driverFactory`][self-driver-factory] instead. - - - -Data source type. Called only once per [`appId`][self-opts-ctx-to-appid]. - -```javascript -module.exports = { - // string - dbType: 'snowflake', - - // function - dbType: ({ securityContext }) => 'databricks' -} -``` - -Either `string` or `function` could be passed. Providing a `Function` allows -to dynamically select a database type depending on the security context. -Usually used for [multitenancy][ref-multitenancy]. - -If not defined, Cube will lookup for environment variable -[`CUBEJS_DB_TYPE`](/reference/configuration/environment-variables#cubejs_db_type) to resolve the data source type. - [gh-jsonwebtoken-algs]: https://github.com/auth0/node-jsonwebtoken#algorithms-supported [link-express-cors-opts]: @@ -1534,7 +1504,6 @@ If not defined, Cube will lookup for environment variable [ref-sec-ctx]: /docs/data-modeling/access-control/context [self-pre-aggregations-schema]: #pre_aggregations_schema [self-opts-ctx-to-appid]: #context_to_app_id -[self-driver-factory]: #driver_factory [ref-schema-ref-datasource]: /reference/data-modeling/cube#data_source [self-repofactory]: #repository_factory [ref-exec-environment-globals]: /docs/data-modeling/dynamic/schema-execution-environment#nodejs-globals-processenv-consolelog-and-others diff --git a/packages/cubejs-backend-native/python/cube/src/__init__.py b/packages/cubejs-backend-native/python/cube/src/__init__.py index 21dcdf7764826..c793af0869056 100644 --- a/packages/cubejs-backend-native/python/cube/src/__init__.py +++ b/packages/cubejs-backend-native/python/cube/src/__init__.py @@ -65,7 +65,6 @@ class Configuration: context_to_cube_store_router_id: Union[str, Callable[[RequestContext], str]] driver_factory: Callable[[RequestContext], Dict] external_driver_factory: Callable[[RequestContext], Dict] - db_type: Union[str, Callable[[RequestContext], str]] check_auth: Callable check_sql_auth: Callable can_switch_sql_user: Callable @@ -113,7 +112,6 @@ def __init__(self): self.context_to_cube_store_router_id = None self.driver_factory = None self.external_driver_factory = None - self.db_type = None self.check_auth = None self.check_sql_auth = None self.can_switch_sql_user = None diff --git a/packages/cubejs-backend-native/src/python/cube_config.rs b/packages/cubejs-backend-native/src/python/cube_config.rs index d5cc91ff9a086..aa9a5f38afe25 100644 --- a/packages/cubejs-backend-native/src/python/cube_config.rs +++ b/packages/cubejs-backend-native/src/python/cube_config.rs @@ -53,7 +53,6 @@ impl CubeConfigPy { "context_to_orchestrator_id", "context_to_cube_store_router_id", "context_to_groups", - "db_type", "driver_factory", "extend_context", "external_driver_factory", diff --git a/packages/cubejs-server-core/src/core/DevServer.ts b/packages/cubejs-server-core/src/core/DevServer.ts index 27c21df8b14d6..d1b47b9df0f09 100644 --- a/packages/cubejs-server-core/src/core/DevServer.ts +++ b/packages/cubejs-server-core/src/core/DevServer.ts @@ -119,7 +119,7 @@ export class DevServer { coreServerVersion: this.cubejsServer.coreServerVersion, dockerVersion: this.options.dockerVersion || null, projectFingerprint: this.cubejsServer.projectFingerprint, - dbType: options.dbType || null, + dbType: null, shouldStartConnectionWizardFlow: !this.options.isReadyForQueryProcessing(), livePreview: options.livePreview, isDocker: isDocker(), diff --git a/packages/cubejs-server-core/src/core/OptsHandler.ts b/packages/cubejs-server-core/src/core/OptsHandler.ts index 26260680a91a8..8021bb08bf7b7 100644 --- a/packages/cubejs-server-core/src/core/OptsHandler.ts +++ b/packages/cubejs-server-core/src/core/OptsHandler.ts @@ -48,16 +48,12 @@ export class OptsHandler { ) { this.assertOptions(createOptions); const options = cloneDeep(this.createOptions); - options.driverFactory = this.getDriverFactory(options); - options.dbType = this.getDbType(options); + const driverFactory = this.getDriverFactory(options); + options.driverFactory = driverFactory; + options.dbType = this.getDbType(driverFactory); this.initializedOptions = this.initializeCoreOptions(options); } - /** - * Decorated dbType flag. - */ - private decoratedType = false; - /** * Decorated driverFactory flag. */ @@ -84,35 +80,26 @@ export class OptsHandler { * Assert create options. */ private assertOptions(opts: CreateOptions) { + if ((opts as any).dbType) { + throw new Error( + 'CreateOptions.dbType was removed in v1.7.0. ' + + 'Use driverFactory instead (return a DriverConfig `{ type, ... }`), ' + + 'or set the CUBEJS_DB_TYPE environment variable. ' + + 'See https://github.com/cube-js/cube/blob/master/DEPRECATION.md#dbtype' + ); + } + optionsValidate(opts); if ( !this.isDevMode() && !process.env.CUBEJS_DB_TYPE && - !opts.dbType && !opts.driverFactory ) { throw new Error( - 'Either CUBEJS_DB_TYPE, CreateOptions.dbType or CreateOptions.driverFactory ' + - 'must be specified' + 'Either CUBEJS_DB_TYPE or CreateOptions.driverFactory must be specified' ); } - - // TODO (buntarb): this assertion should be restored after documentation - // will be added. - // - // if (opts.dbType) { - // this.core.logger( - // 'Cube.js `CreateOptions.dbType` Property Deprecation', - // { - // warning: ( - // // TODO (buntarb): add https://github.com/cube-js/cube.js/blob/master/DEPRECATION.md#dbType - // // link once it will be created. - // 'CreateOptions.dbType property is now deprecated, please migrate.' - // ), - // }, - // ); - // } } /** @@ -122,25 +109,6 @@ export class OptsHandler { val: DriverConfig | BaseDriver, ) { if (isDriver(val)) { - // TODO (buntarb): these assertions should be restored after dbType - // deprecation period will be passed. - // - // if (this.decoratedType) { - // throw new Error( - // 'CreateOptions.dbType is required if CreateOptions.driverFactory ' + - // 'returns driver instance' - // ); - // } - // this.core.logger( - // 'Cube.js CreateOptions.driverFactory Property Deprecation', - // { - // warning: ( - // // TODO (buntarb): add https://github.com/cube-js/cube.js/blob/master/DEPRECATION.md#driverFactory - // // link once it will be created. - // 'CreateOptions.driverFactory should return DriverConfig object instead of driver instance, please migrate.' - // ), - // }, - // ); if (!this.driverFactoryType) { this.driverFactoryType = 'BaseDriver'; } else if (this.driverFactoryType !== 'BaseDriver') { @@ -174,20 +142,6 @@ export class OptsHandler { } } - /** - * Assert value returned from the dbType function. - */ - private assertDbTypeResult(val: DatabaseType) { - if (typeof val !== 'string') { - throw new Error(`Unexpected CreateOptions.dbType result type: <${ - typeof val - }>${ - JSON.stringify(val, undefined, 2) - }`); - } - return val; - } - /** * Assert orchestration options. */ @@ -206,22 +160,20 @@ export class OptsHandler { /** * Default database factory function. - */ // eslint-disable-next-line @typescript-eslint/no-unused-vars + */ private defaultDriverFactory(ctx: DriverContext): DriverConfig { const type = getEnv('dbType', { dataSource: assertDataSource(ctx.dataSource), preAggregations: ctx.preAggregations, }); + return { type }; } - /** - * Async driver factory getter. - */ private getDriverFactory(opts: CreateOptions): DriverFactoryInternalFn { - const { dbType, driverFactory } = opts; - this.decoratedType = !dbType; + const { driverFactory } = opts; this.decoratedFactory = !driverFactory; + return async (ctx: DriverContext) => { if (!driverFactory) { if (!this.driverFactoryType) { @@ -232,6 +184,7 @@ export class OptsHandler { 'BaseDriver or DriverConfig.' ); } + // TODO (buntarb): wrapping this call with assertDriverFactoryResult // change assertions sequence and cause a fail of few tests. Review it. return this.defaultDriverFactory(ctx); @@ -243,36 +196,27 @@ export class OptsHandler { }; } - /** - * Async driver type getter. - */ private getDbType( - opts: CreateOptions & { - driverFactory: DriverFactoryInternalFn, - }, + driverFactory: DriverFactoryInternalFn, ): DbTypeInternalFn { - const { dbType, driverFactory } = opts; return async (ctx: DriverContext) => { - if (!dbType) { - let val: undefined | BaseDriver | DriverConfig; - let type: DatabaseType; - if (!this.driverFactoryType) { - val = await driverFactory(ctx); - } - if ( - this.driverFactoryType === 'BaseDriver' && - process.env.CUBEJS_DB_TYPE - ) { - type = process.env.CUBEJS_DB_TYPE; - } else if (this.driverFactoryType === 'DriverConfig') { - type = ((val || await driverFactory(ctx))).type; - } - return type; - } else if (typeof dbType === 'function') { - return this.assertDbTypeResult(await dbType(ctx)); - } else { - return dbType; + let val: undefined | BaseDriver | DriverConfig; + let type: DatabaseType; + + if (!this.driverFactoryType) { + val = await driverFactory(ctx); } + + if ( + this.driverFactoryType === 'BaseDriver' && + process.env.CUBEJS_DB_TYPE + ) { + type = process.env.CUBEJS_DB_TYPE; + } else if (this.driverFactoryType === 'DriverConfig') { + type = ((val || await driverFactory(ctx))).type; + } + + return type; }; } diff --git a/packages/cubejs-server-core/src/core/optionsValidate.ts b/packages/cubejs-server-core/src/core/optionsValidate.ts index e31f39550af45..0ba331d9f9476 100644 --- a/packages/cubejs-server-core/src/core/optionsValidate.ts +++ b/packages/cubejs-server-core/src/core/optionsValidate.ts @@ -58,7 +58,6 @@ const schemaOptions = Joi.object().keys({ processSubscriptionsInterval: Joi.number(), webSocketsBasePath: Joi.string(), // server-core CoreCreateOptions - dbType: dbTypes, externalDbType: dbTypes, schemaPath: Joi.string(), basePath: Joi.string(), diff --git a/packages/cubejs-server-core/src/core/types.ts b/packages/cubejs-server-core/src/core/types.ts index 51661178e2e0c..3d1cfee7d79ee 100644 --- a/packages/cubejs-server-core/src/core/types.ts +++ b/packages/cubejs-server-core/src/core/types.ts @@ -161,8 +161,6 @@ export type DriverConfig = { type: DatabaseType, } & DriverOptions; -export type DbTypeFn = (context: DriverContext) => - DatabaseType | Promise; export type DriverFactoryFn = (context: DriverContext) => Promise | BaseDriver | DriverConfig; @@ -189,7 +187,6 @@ export type BiToolSyncConfig = { }; export interface CreateOptions { - dbType?: DatabaseType | DbTypeFn; externalDbType?: DatabaseType | ExternalDbTypeFn; schemaPath?: string; basePath?: string; diff --git a/packages/cubejs-server-core/test/unit/OptsHandler.test.ts b/packages/cubejs-server-core/test/unit/OptsHandler.test.ts index 3362cd0e78a0b..db97854bbe5a5 100644 --- a/packages/cubejs-server-core/test/unit/OptsHandler.test.ts +++ b/packages/cubejs-server-core/test/unit/OptsHandler.test.ts @@ -1,9 +1,8 @@ -/* globals jest, describe, beforeEach, test, expect */ +/* globals jest, describe, test, expect */ import { BaseDriver as OriginalBaseDriver } from '@cubejs-backend/query-orchestrator'; import type { DatabaseType, - DbTypeFn, DbTypeInternalFn, ExternalDbTypeFn, DriverFactoryFn, @@ -43,12 +42,10 @@ class CubejsServerCoreExposed extends CubejsServerCore { } } -let message: string; - const conf = { apiSecret: 'testApiSecretToSuppressWarning', - logger: (msg: string) => { - message = msg; + logger: (_msg: string) => { + // noop }, externalDbType: 'postgres', externalDriverFactory: async () => ({ @@ -58,24 +55,13 @@ const conf = { }; describe('OptsHandler class', () => { - beforeEach(() => { - message = ''; + test('must throw if CreateOptions.dbType is specified', () => { + expect(() => new CubejsServerCoreExposed({ + ...conf, + dbType: (() => 'postgres'), + })).toThrow('CreateOptions.dbType was removed in v1.7.0'); }); - test.skip( - 'deprecation warning must be printed if dbType was specified -- ' + - 'need to be restored after documentation will be added', - async () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const core = new CubejsServerCoreExposed({ - ...conf, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - dbType: ((context: DriverContext) => 'postgres'), - }); - expect(message).toEqual('Cube.js `CreateOptions.dbType` Property Deprecation'); - } - ); - test('must handle vanilla CreateOptions', async () => { process.env.CUBEJS_DB_TYPE = 'postgres'; @@ -83,7 +69,6 @@ describe('OptsHandler class', () => { { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: undefined, }); @@ -129,7 +114,6 @@ describe('OptsHandler class', () => { { const core = new CubejsServerCoreExposed({ ...conf, - dbType: 'postgres', driverFactory: ({ dataSource }) => createMockDriver(dataSource), }); @@ -151,7 +135,6 @@ describe('OptsHandler class', () => { { const core = new CubejsServerCoreExposed({ ...conf, - dbType: () => 'postgres', driverFactory: ({ dataSource }) => createMockDriver(dataSource), }); @@ -173,7 +156,6 @@ describe('OptsHandler class', () => { { const core = new CubejsServerCoreExposed({ ...conf, - dbType: () => 'postgres', driverFactory: async ({ dataSource }) => createMockDriver(dataSource), }); @@ -200,7 +182,6 @@ describe('OptsHandler class', () => { // Case 1 core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE, }), @@ -220,7 +201,6 @@ describe('OptsHandler class', () => { // Case 2 core = new CubejsServerCoreExposed({ ...conf, - dbType: 'postgres', driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE, }), @@ -240,7 +220,6 @@ describe('OptsHandler class', () => { // Case 3 core = new CubejsServerCoreExposed({ ...conf, - dbType: 'postgres', driverFactory: async () => ({ type: process.env.CUBEJS_DB_TYPE, }), @@ -260,7 +239,6 @@ describe('OptsHandler class', () => { // Case 4 core = new CubejsServerCoreExposed({ ...conf, - dbType: (async () => 'postgres'), driverFactory: async () => ({ type: process.env.CUBEJS_DB_TYPE, }), @@ -287,7 +265,6 @@ describe('OptsHandler class', () => { await expect(async () => { core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: (() => true) as unknown as DriverFactoryFn, }); await core.options.driverFactory({ dataSource: 'default' }); @@ -300,7 +277,6 @@ describe('OptsHandler class', () => { await expect(async () => { core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: 1 as unknown as DriverFactoryFn, }); await core.options.driverFactory({ dataSource: 'default' }); @@ -308,49 +284,7 @@ describe('OptsHandler class', () => { 'Invalid cube-server-core options: "driverFactory" must be of type function' ); - // Case 3 -- need to be restored after assertion will be restored. - // - // await expect(async () => { - // const core = new CubejsServerCoreExposed({ - // ...conf, - // dbType: undefined, - // driverFactory: () => CubejsServerCore.createDriver('postgres'), - // }); - // await core.options.driverFactory({ dataSource: 'default' }); - // }).rejects.toThrow( - // 'CreateOptions.dbType is required if CreateOptions.driverFactory ' + - // 'returns driver instance' - // ); - - // Case 4 - await expect(async () => { - core = new CubejsServerCoreExposed({ - ...conf, - dbType: (() => true) as unknown as DbTypeFn, - driverFactory: async () => ({ - type: process.env.CUBEJS_DB_TYPE, - }), - }); - await core.options.dbType({ dataSource: 'default' }); - }).rejects.toThrow( - 'Unexpected CreateOptions.dbType result type: true' - ); - - // Case 5 - await expect(async () => { - core = new CubejsServerCoreExposed({ - ...conf, - dbType: true as unknown as DbTypeFn, - driverFactory: async () => ({ - type: process.env.CUBEJS_DB_TYPE, - }), - }); - await core.options.dbType({ dataSource: 'default' }); - }).rejects.toThrow( - 'Invalid cube-server-core options: "dbType" does not match any of the allowed types' - ); - - // Case 6 + // Case 3 expect(() => { process.env.CUBEJS_DB_TYPE = undefined; process.env.NODE_ENV = 'production'; @@ -358,14 +292,13 @@ describe('OptsHandler class', () => { core = new CubejsServerCoreExposed({ ...conf, apiSecret: undefined, - dbType: undefined, driverFactory: undefined, }); }).toThrow( 'apiSecret is required option(s)' ); - // Case 7 + // Case 4 expect(() => { delete process.env.CUBEJS_DB_TYPE; process.env.NODE_ENV = 'production'; @@ -373,12 +306,10 @@ describe('OptsHandler class', () => { core = new CubejsServerCoreExposed({ ...conf, apiSecret: 'apiSecret', - dbType: undefined, driverFactory: undefined, }); }).toThrow( - 'Either CUBEJS_DB_TYPE, CreateOptions.dbType or ' + - 'CreateOptions.driverFactory must be specified' + 'Either CUBEJS_DB_TYPE or CreateOptions.driverFactory must be specified' ); delete process.env.NODE_ENV; @@ -387,7 +318,6 @@ describe('OptsHandler class', () => { test('must configure/reconfigure contextToDbType', async () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: undefined, }); @@ -424,7 +354,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, apiSecret: '44b87d4309471e5d9d18738450db0e49', - dbType: () => 'postgres', driverFactory: async () => (new CustomDriver()) as unknown as OriginalBaseDriver, orchestratorOptions: {}, }); @@ -494,7 +423,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, apiSecret: '44b87d4309471e5d9d18738450db0e49', - dbType: () => 'postgres', contextToOrchestratorId: ({ securityContext }) => ( `ID_${securityContext.tenantId}` ), @@ -541,7 +469,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: {}, }); @@ -571,7 +498,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: {}, }); @@ -601,7 +527,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({}), }); @@ -631,7 +556,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({}), }); @@ -661,7 +585,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({}), }); @@ -694,7 +617,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({}), }); @@ -729,7 +651,6 @@ describe('OptsHandler class', () => { const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({}), }); @@ -762,7 +683,6 @@ describe('OptsHandler class', () => { const concurrency = 15; const core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({ queryCacheOptions: { @@ -809,7 +729,6 @@ describe('OptsHandler class', () => { // Case 1 core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({ queryCacheOptions: { @@ -834,7 +753,6 @@ describe('OptsHandler class', () => { // Case 2 core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE, testConnectionTimeout, @@ -861,7 +779,6 @@ describe('OptsHandler class', () => { // Case 3 core = new CubejsServerCoreExposed({ ...conf, - dbType: undefined, driverFactory: () => ({ type: process.env.CUBEJS_DB_TYPE }), orchestratorOptions: () => ({ queryCacheOptions: { diff --git a/packages/cubejs-server-core/test/unit/index.test.ts b/packages/cubejs-server-core/test/unit/index.test.ts index f769f0c5843ce..4bdc5d8be3460 100644 --- a/packages/cubejs-server-core/test/unit/index.test.ts +++ b/packages/cubejs-server-core/test/unit/index.test.ts @@ -101,29 +101,18 @@ describe('index.test', () => { process.env.CUBEJS_API_SECRET = 'api-secret'; }); - test('Should create instance of CubejsServerCore, dbType as string', () => { - expect(new CubejsServerCore({ - dbType: 'mysql' - })).toBeInstanceOf(CubejsServerCore); + test('Should throw error, dbType has been removed (string)', () => { + expect(() => new CubejsServerCore({ dbType: 'mysql' })) + .toThrowError(/CreateOptions.dbType was removed in v1\.7\.0/); }); - test('Should create instance of CubejsServerCore, dbType as func', () => { - const options = { dbType: () => 'postgres' }; - - expect(new CubejsServerCore(options)) - .toBeInstanceOf(CubejsServerCore); - }); - - test('Should throw error, unknown dbType', () => { - const options = { dbType: 'unknown-db' }; - - expect(() => new CubejsServerCore(options)) - .toThrowError(/"dbType" must be one of/); + test('Should throw error, dbType has been removed (func)', () => { + expect(() => new CubejsServerCore({ dbType: () => 'postgres' })) + .toThrowError(/CreateOptions.dbType was removed in v1\.7\.0/); }); test('Should throw error, invalid options', () => { const options = { - dbType: 'mysql', externalDbType: 'mysql', schemaPath: '/test/path/test/', basePath: '/basePath', @@ -137,7 +126,10 @@ describe('index.test', () => { }); test('Should create instance of CubejsServerCore, orchestratorOptions as func', () => { - const options = { dbType: 'mysql', orchestratorOptions: () => {} }; + const options = { + driverFactory: () => ({ type: 'mysql' }), + orchestratorOptions: () => {} + }; expect(new CubejsServerCore(options)) .toBeInstanceOf(CubejsServerCore); @@ -158,23 +150,8 @@ describe('index.test', () => { return createOrchestratorApiSpy.mock.calls[0]; }; - test('dbType should return string, failure', async () => { - const options: CreateOptions = { dbType: () => null }; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [driverFactory, orchestratorOptions] = await getCreateOrchestratorOptionsFromServer(options); - - try { - await driverFactory('mongo'); - - throw new Error('driverFactory will call dbType and dbType must throw an exception'); - } catch (e: any) { - expect(e.message).toEqual('Unexpected CreateOptions.dbType result type: null'); - } - }); - test('driverFactory should return driver, failure', async () => { - const options: CreateOptions = { dbType: () => 'mongo', driverFactory: () => null, }; + const options: CreateOptions = { driverFactory: () => null, }; const [driverFactory, _orchestratorOptions] = await getCreateOrchestratorOptionsFromServer(options); @@ -188,7 +165,7 @@ describe('index.test', () => { }); test('externalDriverFactory should return driver, failure', async () => { - const options: CreateOptions = { dbType: () => 'mongo', externalDriverFactory: () => null, }; + const options: CreateOptions = { externalDriverFactory: () => null, }; const [_driverFactory, orchestratorOptions] = await getCreateOrchestratorOptionsFromServer(options); @@ -213,7 +190,6 @@ describe('index.test', () => { }; const options = { - dbType: 'mysql', externalDbType: 'cubestore', schemaPath: '/test/path/test/', basePath: '/basePath', @@ -222,11 +198,7 @@ describe('index.test', () => { devServer: false, apiSecret: 'randomstring', logger: () => {}, - driverFactory: () => { - setLogger: () => {}, - testConnection: async () => {}, - release: () => {} - }, + driverFactory: () => ({ type: 'mysql' }), dialectFactory: () => {}, externalDriverFactory: () => { setLogger: () => {}, @@ -548,21 +520,6 @@ describe('index.test', () => { ]); }); - // TODO (buntarb): This test doesn't have any sense anymore, because dbType - // property is deprecated and doesn't required in any mode. Need to be removed - test.skip('Should throw error, options are required (dev mode)', () => { - delete process.env.CUBEJS_API_SECRET; - process.env.CUBEJS_DEV_MODE = 'true'; - - expect(() => { - jest.spyOn(CubejsServerCoreOpen.prototype, 'isReadyForQueryProcessing').mockImplementation(() => true); - // eslint-disable-next-line - new CubejsServerCoreOpen({}); - jest.restoreAllMocks(); - }) - .toThrowError(/dbType is required/); - }); - test('Pass all required (dev mode) without apiSecret (should be autogenerated)', () => { delete process.env.CUBEJS_API_SECRET; @@ -582,7 +539,7 @@ describe('index.test', () => { new CubejsServerCoreOpen({}); jest.restoreAllMocks(); }) - .toThrowError('Either CUBEJS_DB_TYPE, CreateOptions.dbType or CreateOptions.driverFactory must be specified'); + .toThrowError('Either CUBEJS_DB_TYPE or CreateOptions.driverFactory must be specified'); }); test('Should throw error, options are required (production mode with jwkUrl)', () => { @@ -594,7 +551,7 @@ describe('index.test', () => { new CubejsServerCoreOpen({ jwt: { jwkUrl: 'https://test.com/j.json' } }); jest.restoreAllMocks(); }) - .toThrowError('Either CUBEJS_DB_TYPE, CreateOptions.dbType or CreateOptions.driverFactory must be specified'); + .toThrowError('Either CUBEJS_DB_TYPE or CreateOptions.driverFactory must be specified'); }); test('Pass all required props (production mode with JWK URL)', () => { @@ -623,7 +580,7 @@ describe('index.test', () => { } const cubejsServerCore = new CubejsServerCoreOpen({ - dbType: 'mysql', + driverFactory: () => ({ type: 'mysql' }), apiSecret: 'secret', scheduledRefreshTimer: input }); @@ -652,7 +609,7 @@ describe('index.test', () => { process.env.CUBEJS_REFRESH_WORKER = 'false'; const cubejsServerCore = new CubejsServerCoreOpen({ - dbType: 'mysql', + driverFactory: () => ({ type: 'mysql' }), apiSecret: 'secret', }); expect(cubejsServerCore).toBeInstanceOf(CubejsServerCore); @@ -698,7 +655,7 @@ describe('index.test', () => { process.env.CUBEJS_ROLLUP_ONLY = rollupOnlyMode.toString(); const cubejsServerCore = new CubejsServerCoreOpen({ - dbType: 'mysql', + driverFactory: () => ({ type: 'mysql' }), apiSecret: 'secret', ...options, }); @@ -817,7 +774,7 @@ describe('index.test', () => { ); const cubejsServerCore = new CubejsServerCoreOpen({ - dbType: 'mysql', + driverFactory: () => ({ type: 'mysql' }), apiSecret: 'secret', // 250ms scheduledRefreshTimer: 1, @@ -917,7 +874,7 @@ describe('index.test', () => { let counter = 0; const cubejsServerCore = new CubejsServerCoreOpen({ - dbType: 'mysql', + driverFactory: () => ({ type: 'mysql' }), apiSecret: 'secret', // 250ms scheduledRefreshTimer: 1, diff --git a/packages/cubejs-testing-drivers/src/helpers/getCore.ts b/packages/cubejs-testing-drivers/src/helpers/getCore.ts index 0cd2e53da0c7f..9d257d25408e9 100644 --- a/packages/cubejs-testing-drivers/src/helpers/getCore.ts +++ b/packages/cubejs-testing-drivers/src/helpers/getCore.ts @@ -11,6 +11,9 @@ export function getCore( storage: BaseDriver, ): CubejsServerCoreExposed { const _path = path.resolve(process.cwd(), './.temp/model/ecommerce.yaml'); + // CreateOptions.dbType has been removed; the driver type for a driverFactory + // returning a BaseDriver instance is resolved from CUBEJS_DB_TYPE. + process.env.CUBEJS_DB_TYPE = sourceType; return new CubejsServerCore({ apiSecret: 'mysupersecret', // devServer: true, @@ -18,7 +21,6 @@ export function getCore( logger: (msg: string, params: Record) => { // process.stdout.write(`${msg}\n${JSON.stringify(params, undefined, 2)}\n`); }, - dbType: sourceType, driverFactory: async () => source, externalDbType: storageType, externalDriverFactory: async () => storage, diff --git a/packages/cubejs-testing/birdbox-fixtures/lambda/cube.js b/packages/cubejs-testing/birdbox-fixtures/lambda/cube.js index 813926a2d547c..21abbc8756f49 100644 --- a/packages/cubejs-testing/birdbox-fixtures/lambda/cube.js +++ b/packages/cubejs-testing/birdbox-fixtures/lambda/cube.js @@ -1,6 +1,3 @@ -const PostgresDriver = require("@cubejs-backend/postgres-driver"); -const KsqlDriver = require("@cubejs-backend/ksql-driver"); - module.exports = { orchestratorOptions: { preAggregationsOptions: { @@ -10,22 +7,16 @@ module.exports = { contextToApiScopes: async () => new Promise((resolve) => { resolve(['graphql', 'meta', 'data', 'jobs']); }), - dbType: ({ dataSource }) => { - if (dataSource === 'default') { - return 'postgres'; - } - - return dataSource || 'postgres'; - }, - driverFactory: async ({ dataSource }) => { - if (dataSource === "ksql") { - return new KsqlDriver({ + driverFactory: ({ dataSource }) => { + if (dataSource === 'ksql') { + return { + type: 'ksql', url: process.env.KSQL_URL, kafkaHost: process.env.KSQL_KAFKA_HOST, kafkaUseSsl: false, - }); + }; } - return new PostgresDriver(); + return { type: 'postgres' }; } }; diff --git a/packages/cubejs-testing/birdbox-fixtures/multidb/cube.js b/packages/cubejs-testing/birdbox-fixtures/multidb/cube.js index aaca1137f6ead..9f141b0947062 100644 --- a/packages/cubejs-testing/birdbox-fixtures/multidb/cube.js +++ b/packages/cubejs-testing/birdbox-fixtures/multidb/cube.js @@ -1,26 +1,21 @@ -const PostgresDriver = require('@cubejs-backend/postgres-driver'); -const MySqlDriver = require("@cubejs-backend/mysql-driver"); - module.exports = { - dbType: ({ dataSource }) => { - switch (dataSource) { - case 'suppliers': return 'postgres'; - case 'products': return 'mysql'; - default: return 'postgres'; - } - }, - driverFactory: ({ dataSource }) => { switch (dataSource) { - case 'suppliers': return new PostgresDriver({}); - case 'products': return new MySqlDriver({ - host: process.env.CUBEJS_DB_HOST2, - port: process.env.CUBEJS_DB_PORT2, - database: process.env.CUBEJS_DB_NAME2, - user: process.env.CUBEJS_DB_USER2, - password: process.env.CUBEJS_DB_PASS2, - }); - default: throw new Error(`driverFactory: Invalid dataSource '${dataSource}'`); + case 'suppliers': + return { type: 'postgres' }; + case 'products': + return { + type: 'mysql', + host: process.env.CUBEJS_DB_HOST2, + port: process.env.CUBEJS_DB_PORT2, + database: process.env.CUBEJS_DB_NAME2, + user: process.env.CUBEJS_DB_USER2, + password: process.env.CUBEJS_DB_PASS2, + }; + case 'default': + return { type: 'postgres' }; + default: + throw new Error(`driverFactory: Invalid dataSource '${dataSource}'`); } }, }; From 2053657e671390eb6edd8c4173406dd2c2cc130d Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 21:19:36 +0200 Subject: [PATCH 08/26] chore!: Drop support for node.js v20, deprecate v22 Node.js 20 reached EOL on April 30, 2026; Node.js 22 is in maintenance mode since October 21, 2025. The minimal supported version is now 22. --- DEPRECATION.md | 15 +++++++++++---- package.json | 2 +- packages/cubejs-api-gateway/package.json | 2 +- packages/cubejs-athena-driver/package.json | 2 +- packages/cubejs-backend-cloud/package.json | 2 +- packages/cubejs-backend-maven/package.json | 4 ++-- packages/cubejs-backend-native/package.json | 4 ++-- packages/cubejs-backend-shared/package.json | 4 ++-- .../cubejs-backend-shared/src/node-check.ts | 2 +- packages/cubejs-base-driver/package.json | 4 ++-- packages/cubejs-bigquery-driver/package.json | 2 +- packages/cubejs-cli/package.json | 4 ++-- packages/cubejs-clickhouse-driver/package.json | 2 +- packages/cubejs-crate-driver/package.json | 2 +- packages/cubejs-cubestore-driver/package.json | 4 ++-- .../cubejs-databricks-jdbc-driver/package.json | 4 ++-- .../cubejs-dbt-schema-extension/package.json | 2 +- packages/cubejs-docker/package.json | 2 +- packages/cubejs-dremio-driver/package.json | 2 +- packages/cubejs-druid-driver/package.json | 4 ++-- packages/cubejs-duckdb-driver/package.json | 4 ++-- packages/cubejs-firebolt-driver/package.json | 2 +- packages/cubejs-hive-driver/package.json | 2 +- packages/cubejs-jdbc-driver/package.json | 4 ++-- packages/cubejs-ksql-driver/package.json | 2 +- packages/cubejs-linter/package.json | 2 +- .../cubejs-materialize-driver/package.json | 2 +- packages/cubejs-mongobi-driver/package.json | 4 ++-- packages/cubejs-mssql-driver/package.json | 4 ++-- .../package.json | 2 +- packages/cubejs-mysql-driver/package.json | 2 +- packages/cubejs-oracle-driver/package.json | 2 +- packages/cubejs-pinot-driver/package.json | 2 +- packages/cubejs-playground/package.json | 2 +- packages/cubejs-postgres-driver/package.json | 2 +- packages/cubejs-prestodb-driver/package.json | 2 +- .../cubejs-query-orchestrator/package.json | 4 ++-- packages/cubejs-questdb-driver/package.json | 2 +- packages/cubejs-redshift-driver/package.json | 2 +- packages/cubejs-schema-compiler/package.json | 4 ++-- packages/cubejs-server-core/package.json | 4 ++-- packages/cubejs-server/package.json | 4 ++-- packages/cubejs-sqlite-driver/package.json | 2 +- packages/cubejs-templates/package.json | 2 +- packages/cubejs-testing-drivers/package.json | 4 ++-- packages/cubejs-testing-shared/package.json | 4 ++-- packages/cubejs-testing/package.json | 4 ++-- packages/cubejs-trino-driver/package.json | 2 +- packages/cubejs-vertica-driver/package.json | 2 +- yarn.lock | 18 +++++++++--------- 50 files changed, 87 insertions(+), 80 deletions(-) diff --git a/DEPRECATION.md b/DEPRECATION.md index 6e26d8f15f812..144218e4f3e9a 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -65,10 +65,11 @@ features: | Removed | [`/v1/run-scheduled-refresh` REST API endpoint](#v1run-scheduled-refresh-rest-api-endpoint) | v0.35.0 | v0.36.0 | | Removed | [Node.js 18](#nodejs-18) | v0.36.0 | v1.3.0 | | Removed | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | v1.7.0 | -| Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | | +| Removed | [Node.js 20](#nodejs-20) | v1.3.0 | v1.7.0 | | Removed | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | v1.7.0 | | Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 | | Removed | [`context_to_roles`](#context-to-roles) | v1.6.4 | v1.7.0 | +| Deprecated | [Node.js 22](#nodejs-22) | v1.7.0 | | ### Node.js 8 @@ -417,10 +418,10 @@ This environment variable was renamed to [`CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_ ### Node.js 20 -**Deprecated in Release: v1.3.0** +**Removed in Release: v1.7.0** -Node.js 20 is in maintenance mode from [November 22, 2024][link-nodejs-eol]. This means -no more new features, only security updates. Please upgrade to Node.js 22 or higher. +Node.js 20 reached [End of Life on April 30, 2026][link-nodejs-eol]. This means +no more updates. Please upgrade to Node.js 22 or higher. ### `renewQuery` parameter of the `/v1/load` endpoint @@ -447,3 +448,9 @@ The Elasticsearch driver has been removed. The `context_to_roles` configuration option has been removed. Please use `context_to_groups` instead. +### Node.js 22 + +**Deprecated in Release: v1.7.0** + +Node.js 22 is in maintenance mode from [October 21, 2025][link-nodejs-eol]. This means +no more new features, only security updates. Please upgrade to Node.js 24 or higher. diff --git a/package.json b/package.json index b2fa0414be60d..a7c17a9587f89 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "resolutions": { "es5-ext": "0.10.53", "lodash": "^4.17.0", - "@types/node": "^20", + "@types/node": "^22", "@types/ramda": "0.27.40", "thrift": "0.20.0" }, diff --git a/packages/cubejs-api-gateway/package.json b/packages/cubejs-api-gateway/package.json index 7787d91e0431e..c406c3921bd38 100644 --- a/packages/cubejs-api-gateway/package.json +++ b/packages/cubejs-api-gateway/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-api-gateway" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", diff --git a/packages/cubejs-athena-driver/package.json b/packages/cubejs-athena-driver/package.json index c4680876e0017..5adff993c9499 100644 --- a/packages/cubejs-athena-driver/package.json +++ b/packages/cubejs-athena-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-athena-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "build": "rm -rf dist && npm run tsc", diff --git a/packages/cubejs-backend-cloud/package.json b/packages/cubejs-backend-cloud/package.json index 49b20d840c46a..278099f569817 100644 --- a/packages/cubejs-backend-cloud/package.json +++ b/packages/cubejs-backend-cloud/package.json @@ -18,7 +18,7 @@ "dist/src/*" ], "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "author": "Cube Dev, Inc.", "repository": { diff --git a/packages/cubejs-backend-maven/package.json b/packages/cubejs-backend-maven/package.json index 156a140ac8444..a11b0d7260942 100644 --- a/packages/cubejs-backend-maven/package.json +++ b/packages/cubejs-backend-maven/package.json @@ -10,7 +10,7 @@ "directory": "packages/cubejs-druid-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "bin": { "maven-resolve": "bin/maven-resolve" @@ -38,7 +38,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "jest": "^29", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json index 7bf86d66f6c14..fb7539e380696 100644 --- a/packages/cubejs-backend-native/package.json +++ b/packages/cubejs-backend-native/package.json @@ -33,7 +33,7 @@ "lint:fix": "eslint --fix test/ js/ --ext .ts" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/js" @@ -41,7 +41,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "cargo-cp-artifact": "^0.1.9", "jest": "^29", "jest-bench": "^29", diff --git a/packages/cubejs-backend-shared/package.json b/packages/cubejs-backend-shared/package.json index 11820c89371e3..5e74dc0540685 100644 --- a/packages/cubejs-backend-shared/package.json +++ b/packages/cubejs-backend-shared/package.json @@ -17,7 +17,7 @@ "dist/src/*" ], "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "author": "Cube Dev, Inc.", "repository": { @@ -32,7 +32,7 @@ "@types/cli-progress": "^3.9.1", "@types/decompress": "^4.2.7", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "@types/node-fetch": "^2.5.8", "@types/shelljs": "^0.8.5", "@types/throttle-debounce": "^2.1.0", diff --git a/packages/cubejs-backend-shared/src/node-check.ts b/packages/cubejs-backend-shared/src/node-check.ts index 8088012d45058..a80b972a7f8da 100644 --- a/packages/cubejs-backend-shared/src/node-check.ts +++ b/packages/cubejs-backend-shared/src/node-check.ts @@ -1,7 +1,7 @@ import process from 'process'; import color from '@oclif/color'; -const leastSupportedVersion = 20; +const leastSupportedVersion = 22; const currentNodeVersion = process.versions.node; const semver = currentNodeVersion.split('.'); const major = parseInt( semver[0], 10); diff --git a/packages/cubejs-base-driver/package.json b/packages/cubejs-base-driver/package.json index 5250a42d0dc44..a70ca65c963ad 100644 --- a/packages/cubejs-base-driver/package.json +++ b/packages/cubejs-base-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-base-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -39,7 +39,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "jest": "^29", "ts-jest": "^29", "typescript": "~5.2.2" diff --git a/packages/cubejs-bigquery-driver/package.json b/packages/cubejs-bigquery-driver/package.json index 67d883302a50c..111448d8922ab 100644 --- a/packages/cubejs-bigquery-driver/package.json +++ b/packages/cubejs-bigquery-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-bigquery-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "build": "rm -rf dist && npm run tsc", diff --git a/packages/cubejs-cli/package.json b/packages/cubejs-cli/package.json index 37025cab1fd47..bac6419a2cab5 100644 --- a/packages/cubejs-cli/package.json +++ b/packages/cubejs-cli/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-cli" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "bin": { "cubejs": "dist/src/index.js" @@ -59,7 +59,7 @@ "@types/inquirer": "^7.3.1", "@types/jest": "^29", "@types/jsonwebtoken": "^9.0.2", - "@types/node": "^20", + "@types/node": "^22", "@types/semver": "^7.5.8", "husky": "^4.2.3", "jest": "^29", diff --git a/packages/cubejs-clickhouse-driver/package.json b/packages/cubejs-clickhouse-driver/package.json index e9ad577147488..326756d780f55 100644 --- a/packages/cubejs-clickhouse-driver/package.json +++ b/packages/cubejs-clickhouse-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-clickhouse-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-crate-driver/package.json b/packages/cubejs-crate-driver/package.json index 6aab0d3daa1fc..1e58e0cb39a67 100644 --- a/packages/cubejs-crate-driver/package.json +++ b/packages/cubejs-crate-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-crate-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-cubestore-driver/package.json b/packages/cubejs-cubestore-driver/package.json index 84a20cc9600e9..1fb24f5f3829b 100644 --- a/packages/cubejs-cubestore-driver/package.json +++ b/packages/cubejs-cubestore-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-cubestore-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "README.md", @@ -43,7 +43,7 @@ "@cubejs-backend/linter": "1.6.62", "@types/csv-write-stream": "^2.0.0", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "@types/ws": "^7.4.0", "jest": "^29", "typescript": "~5.2.2" diff --git a/packages/cubejs-databricks-jdbc-driver/package.json b/packages/cubejs-databricks-jdbc-driver/package.json index f277e91863b36..0d3b967fa1574 100644 --- a/packages/cubejs-databricks-jdbc-driver/package.json +++ b/packages/cubejs-databricks-jdbc-driver/package.json @@ -10,7 +10,7 @@ "directory": "packages/cubejs-databricks-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -42,7 +42,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "@types/ramda": "^0.27.34", "@types/uuid": "^8.3.4", "jest": "^29", diff --git a/packages/cubejs-dbt-schema-extension/package.json b/packages/cubejs-dbt-schema-extension/package.json index c9f8f097635b1..eed670dd072bf 100644 --- a/packages/cubejs-dbt-schema-extension/package.json +++ b/packages/cubejs-dbt-schema-extension/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-dbt-schema-extension" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-docker/package.json b/packages/cubejs-docker/package.json index 129331edcd073..686a7b4a0ec33 100644 --- a/packages/cubejs-docker/package.json +++ b/packages/cubejs-docker/package.json @@ -6,7 +6,7 @@ "license": "Apache-2.0", "private": true, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "dependencies": { "@cubejs-backend/athena-driver": "1.6.62", diff --git a/packages/cubejs-dremio-driver/package.json b/packages/cubejs-dremio-driver/package.json index a0cd2e7b9c5c3..2d3a54badf6aa 100644 --- a/packages/cubejs-dremio-driver/package.json +++ b/packages/cubejs-dremio-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-dremio-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "driver/DremioDriver.js", "scripts": { diff --git a/packages/cubejs-druid-driver/package.json b/packages/cubejs-druid-driver/package.json index d96041abc6c17..c86303a1bfcfd 100644 --- a/packages/cubejs-druid-driver/package.json +++ b/packages/cubejs-druid-driver/package.json @@ -10,7 +10,7 @@ "directory": "packages/cubejs-druid-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -36,7 +36,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "jest": "^29", "testcontainers": "^10.28.0", "typescript": "~5.2.2" diff --git a/packages/cubejs-duckdb-driver/package.json b/packages/cubejs-duckdb-driver/package.json index a518c228e2739..62a501ebee68b 100644 --- a/packages/cubejs-duckdb-driver/package.json +++ b/packages/cubejs-duckdb-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-duckdb-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", @@ -37,7 +37,7 @@ "@cubejs-backend/linter": "1.6.62", "@cubejs-backend/testing-shared": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "jest": "^29", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-firebolt-driver/package.json b/packages/cubejs-firebolt-driver/package.json index 7826bb9caa4d6..4d1e87bbf3504 100644 --- a/packages/cubejs-firebolt-driver/package.json +++ b/packages/cubejs-firebolt-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-firebolt-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-hive-driver/package.json b/packages/cubejs-hive-driver/package.json index 10552cd6917e0..47edebbb5083b 100644 --- a/packages/cubejs-hive-driver/package.json +++ b/packages/cubejs-hive-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-hive-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "src/HiveDriver.js", "scripts": { diff --git a/packages/cubejs-jdbc-driver/package.json b/packages/cubejs-jdbc-driver/package.json index 179347e2e1ac8..c5303585e9354 100644 --- a/packages/cubejs-jdbc-driver/package.json +++ b/packages/cubejs-jdbc-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-jdbc-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "index.js", "typings": "dist/src/index.d.ts", @@ -43,7 +43,7 @@ }, "devDependencies": { "@cubejs-backend/linter": "1.6.62", - "@types/node": "^20", + "@types/node": "^22", "@types/sqlstring": "^2.3.0", "typescript": "~5.2.2" } diff --git a/packages/cubejs-ksql-driver/package.json b/packages/cubejs-ksql-driver/package.json index 37b053c056776..290908756654a 100644 --- a/packages/cubejs-ksql-driver/package.json +++ b/packages/cubejs-ksql-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-ksql-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-linter/package.json b/packages/cubejs-linter/package.json index 2417ccff12cf5..7c3c103b6f053 100644 --- a/packages/cubejs-linter/package.json +++ b/packages/cubejs-linter/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-mssql-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "index.js", "peerDependencies": { diff --git a/packages/cubejs-materialize-driver/package.json b/packages/cubejs-materialize-driver/package.json index 396daa1ff51c4..0eff53b73682e 100644 --- a/packages/cubejs-materialize-driver/package.json +++ b/packages/cubejs-materialize-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-materialize-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-mongobi-driver/package.json b/packages/cubejs-mongobi-driver/package.json index c9512b1a70a6f..2cac598eff742 100644 --- a/packages/cubejs-mongobi-driver/package.json +++ b/packages/cubejs-mongobi-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-mongobi-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", @@ -29,7 +29,7 @@ "dependencies": { "@cubejs-backend/base-driver": "1.6.62", "@cubejs-backend/shared": "1.6.62", - "@types/node": "^20", + "@types/node": "^22", "moment": "^2.29.1", "mysql2": "^3.11.5" }, diff --git a/packages/cubejs-mssql-driver/package.json b/packages/cubejs-mssql-driver/package.json index 8cb8118890f54..3e497854f6dd9 100644 --- a/packages/cubejs-mssql-driver/package.json +++ b/packages/cubejs-mssql-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-mssql-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", @@ -31,7 +31,7 @@ }, "devDependencies": { "@types/mssql": "^9.1.7", - "@types/node": "^20" + "@types/node": "^22" }, "jest": { "testEnvironment": "node" diff --git a/packages/cubejs-mysql-aurora-serverless-driver/package.json b/packages/cubejs-mysql-aurora-serverless-driver/package.json index a3cd3b327c44f..8ad8268c83506 100644 --- a/packages/cubejs-mysql-aurora-serverless-driver/package.json +++ b/packages/cubejs-mysql-aurora-serverless-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-mysql-aurora-serverless-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "driver/AuroraServerlessMySqlDriver.js", "typings": "driver/index.d.ts", diff --git a/packages/cubejs-mysql-driver/package.json b/packages/cubejs-mysql-driver/package.json index d17c5125fad11..ba8ce500540c7 100644 --- a/packages/cubejs-mysql-driver/package.json +++ b/packages/cubejs-mysql-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-mysql-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-oracle-driver/package.json b/packages/cubejs-oracle-driver/package.json index 276787979262f..d5e899a567890 100644 --- a/packages/cubejs-oracle-driver/package.json +++ b/packages/cubejs-oracle-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-oracle-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "driver/OracleDriver.js", "dependencies": { diff --git a/packages/cubejs-pinot-driver/package.json b/packages/cubejs-pinot-driver/package.json index 8d2b449a95402..ee5b9308fddfa 100644 --- a/packages/cubejs-pinot-driver/package.json +++ b/packages/cubejs-pinot-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-pinot-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-playground/package.json b/packages/cubejs-playground/package.json index 5ebfbccfd66ba..61dadb49c9c7c 100644 --- a/packages/cubejs-playground/package.json +++ b/packages/cubejs-playground/package.json @@ -71,7 +71,7 @@ "@cubejs-client/core": "1.6.62", "@cubejs-client/react": "1.6.62", "@types/flexsearch": "^0.7.3", - "@types/node": "^20", + "@types/node": "^22", "@types/react": "^18.3.4", "@types/react-beautiful-dnd": "^13.0.0", "@types/react-dom": "^18.3.0", diff --git a/packages/cubejs-postgres-driver/package.json b/packages/cubejs-postgres-driver/package.json index 28a6e3d58eec1..a39368162aaae 100644 --- a/packages/cubejs-postgres-driver/package.json +++ b/packages/cubejs-postgres-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-postgres-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-prestodb-driver/package.json b/packages/cubejs-prestodb-driver/package.json index aeea46636cb46..dd5012022aba0 100644 --- a/packages/cubejs-prestodb-driver/package.json +++ b/packages/cubejs-prestodb-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-prestodb-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-query-orchestrator/package.json b/packages/cubejs-query-orchestrator/package.json index ca02388263878..5125a26813446 100644 --- a/packages/cubejs-query-orchestrator/package.json +++ b/packages/cubejs-query-orchestrator/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-query-orchestrator" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -39,7 +39,7 @@ "devDependencies": { "@cubejs-backend/linter": "1.6.62", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "@types/ramda": "^0.27.32", "@types/uuid": "^8.3.0", "jest": "^29", diff --git a/packages/cubejs-questdb-driver/package.json b/packages/cubejs-questdb-driver/package.json index f462881e7a024..bf9835c9dfbad 100644 --- a/packages/cubejs-questdb-driver/package.json +++ b/packages/cubejs-questdb-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-questdb-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-redshift-driver/package.json b/packages/cubejs-redshift-driver/package.json index b1de663ba28d6..181797ec92e62 100644 --- a/packages/cubejs-redshift-driver/package.json +++ b/packages/cubejs-redshift-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-postgres-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-schema-compiler/package.json b/packages/cubejs-schema-compiler/package.json index 98cf6f6e35c81..d75cd1fa79677 100644 --- a/packages/cubejs-schema-compiler/package.json +++ b/packages/cubejs-schema-compiler/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-schema-compiler" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src" @@ -69,7 +69,7 @@ "@types/inflection": "^1.5.28", "@types/jest": "^29", "@types/js-yaml": "^4.0.9", - "@types/node": "^20", + "@types/node": "^22", "@types/node-dijkstra": "^2.5.6", "@types/ramda": "^0.27.34", "@types/sqlstring": "^2.3.0", diff --git a/packages/cubejs-server-core/package.json b/packages/cubejs-server-core/package.json index 4b63684b349c6..6b39a7c4599fe 100644 --- a/packages/cubejs-server-core/package.json +++ b/packages/cubejs-server-core/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-server-core" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "index.js", "types": "dist/src/index.d.ts", @@ -69,7 +69,7 @@ "@types/fs-extra": "^9.0.8", "@types/jest": "^29", "@types/jsonwebtoken": "^9.0.2", - "@types/node": "^20", + "@types/node": "^22", "@types/node-fetch": "^2.5.7", "@types/ramda": "^0.27.34", "@types/uuid": "^8.3.0", diff --git a/packages/cubejs-server/package.json b/packages/cubejs-server/package.json index dc643001f72ac..5284e8b40bed9 100644 --- a/packages/cubejs-server/package.json +++ b/packages/cubejs-server/package.json @@ -10,7 +10,7 @@ "directory": "packages/cubejs-server" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "index.js", "typings": "dist/src/index.d.ts", @@ -68,7 +68,7 @@ "@types/cors": "^2.8.8", "@types/express": "^4.17.21", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "@types/semver": "^7.5.8", "@types/ws": "^7.2.9", "@types/yarnpkg__lockfile": "^1.1.4", diff --git a/packages/cubejs-sqlite-driver/package.json b/packages/cubejs-sqlite-driver/package.json index c5cd27b308b42..c9a6a7370fe02 100644 --- a/packages/cubejs-sqlite-driver/package.json +++ b/packages/cubejs-sqlite-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-sqlite-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "driver/SqliteDriver.js", "typings": "driver/index.d.ts", diff --git a/packages/cubejs-templates/package.json b/packages/cubejs-templates/package.json index f51e86d650fb0..2106bd8c3549b 100644 --- a/packages/cubejs-templates/package.json +++ b/packages/cubejs-templates/package.json @@ -12,7 +12,7 @@ "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "build": "rm -rf dist && npm run tsc", diff --git a/packages/cubejs-testing-drivers/package.json b/packages/cubejs-testing-drivers/package.json index 445207fea1ee4..f7095256b592b 100644 --- a/packages/cubejs-testing-drivers/package.json +++ b/packages/cubejs-testing-drivers/package.json @@ -12,7 +12,7 @@ "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "tsc": "tsc", @@ -93,7 +93,7 @@ "@cubejs-client/ws-transport": "1.6.62", "@jest/globals": "^29", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "dotenv": "^16.0.3", "env-var": "^6.3.0", "fs-extra": "^11.1.1", diff --git a/packages/cubejs-testing-shared/package.json b/packages/cubejs-testing-shared/package.json index f52b09fce218c..13696c32f39dd 100644 --- a/packages/cubejs-testing-shared/package.json +++ b/packages/cubejs-testing-shared/package.json @@ -12,7 +12,7 @@ "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "build": "rm -rf dist && npm run tsc", @@ -39,7 +39,7 @@ "@jest/globals": "^29", "@types/dedent": "^0.7.0", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "jest": "^29", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-testing/package.json b/packages/cubejs-testing/package.json index c36904cf68626..8ea144fe03a50 100644 --- a/packages/cubejs-testing/package.json +++ b/packages/cubejs-testing/package.json @@ -12,7 +12,7 @@ "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "scripts": { "cypress:open": "kill-port 4000 && TEST_PLAYGROUND_PORT=3080 yarn cypress:birdbox", @@ -127,7 +127,7 @@ "@types/dedent": "^0.7.0", "@types/http-proxy": "^1.17.5", "@types/jest": "^29", - "@types/node": "^20", + "@types/node": "^22", "cypress": "14.0.0", "cypress-image-snapshot": "^4.0.1", "cypress-localstorage-commands": "^1.4.5", diff --git a/packages/cubejs-trino-driver/package.json b/packages/cubejs-trino-driver/package.json index c25f6e77e4cd0..2d3bf3fc31259 100644 --- a/packages/cubejs-trino-driver/package.json +++ b/packages/cubejs-trino-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-trino-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "files": [ "dist/src", diff --git a/packages/cubejs-vertica-driver/package.json b/packages/cubejs-vertica-driver/package.json index 5c465df4e485f..64fb1de0f095b 100644 --- a/packages/cubejs-vertica-driver/package.json +++ b/packages/cubejs-vertica-driver/package.json @@ -9,7 +9,7 @@ "directory": "packages/cubejs-vertica-driver" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" }, "main": "src/VerticaDriver.js", "scripts": { diff --git a/yarn.lock b/yarn.lock index 5df6e23166071..4ca0601de64a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8604,12 +8604,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0", "@types/node@>=18", "@types/node@^18", "@types/node@^20", "@types/node@^22.5.5": - version "20.17.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.28.tgz#c10436f3a3c996f535919a9b082e2c47f19c40a1" - integrity sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ== +"@types/node@*", "@types/node@>=13.7.0", "@types/node@>=18", "@types/node@^18", "@types/node@^22", "@types/node@^22.5.5": + version "22.19.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.21.tgz#5c9d843ea385b31ee937a9f743443830620a32de" + integrity sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA== dependencies: - undici-types "~6.19.2" + undici-types "~6.21.0" "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -25363,10 +25363,10 @@ unbzip2-stream@^1.0.9: buffer "^5.2.1" through "^2.3.8" -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici@^5.29.0: version "5.29.0" From 99bab5482bed6355ddaa63f9b9b83594c8b1f5e3 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 11 Jun 2026 21:20:08 +0200 Subject: [PATCH 09/26] feat(docker): Upgrade Node.js to v24 (24.16.0) --- .github/workflows/bridge-tests.yml | 2 +- .github/workflows/drivers-tests.yml | 6 +-- .github/workflows/master.yml | 4 +- .github/workflows/post-release.yml | 10 ++-- .github/workflows/publish.yml | 10 ++-- .github/workflows/push.yml | 38 +++++++++------ .github/workflows/rust-cubesql.yml | 14 +++--- .nvmrc | 2 +- packages/cubejs-docker/dev.Dockerfile | 2 +- .../latest-debian-jdk.Dockerfile | 4 +- packages/cubejs-docker/latest.Dockerfile | 4 +- packages/cubejs-docker/local.Dockerfile | 2 +- .../cubejs-docker/testing-drivers.Dockerfile | 2 +- packages/cubejs-jdbc-driver/package.json | 4 +- yarn.lock | 47 +++++++++---------- 15 files changed, 79 insertions(+), 72 deletions(-) diff --git a/.github/workflows/bridge-tests.yml b/.github/workflows/bridge-tests.yml index 30469aa1df583..cb6e2348b9dd1 100644 --- a/.github/workflows/bridge-tests.yml +++ b/.github/workflows/bridge-tests.yml @@ -36,7 +36,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x - name: Set Yarn version run: yarn policies set-version v1.22.22 - name: Get yarn cache directory path diff --git a/.github/workflows/drivers-tests.yml b/.github/workflows/drivers-tests.yml index d56ce309d7426..588b9fb4d6fc2 100644 --- a/.github/workflows/drivers-tests.yml +++ b/.github/workflows/drivers-tests.yml @@ -98,7 +98,7 @@ jobs: name: Build native Linux ${{ matrix.node-version }} ${{ matrix.target }} Python ${{ matrix.python-version }} strategy: matrix: - node-version: [ 22 ] + node-version: [ 24 ] python-version: [ "fallback" ] target: [ "x86_64-unknown-linux-gnu" ] fail-fast: false @@ -305,10 +305,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 22.x + - name: Install Node.js 24.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x - name: Configure `yarn` run: yarn policies set-version v1.22.22 diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index f1977a9a2d00d..555c390366e80 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -64,10 +64,10 @@ jobs: workspaces: ./rust/cubesql -> target key: cubesql-x86_64-unknown-linux-gnu shared-key: cubesql-x86_64-unknown-linux-gnu - - name: Install Node.js 22 + - name: Install Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 - name: Install Yarn run: npm install -g yarn - name: Set Yarn version diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml index 13663db586b1f..25bcfa04d0f77 100644 --- a/.github/workflows/post-release.yml +++ b/.github/workflows/post-release.yml @@ -28,7 +28,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [22.x] + node-version: [24.x] steps: - name: Checkout uses: actions/checkout@v4 @@ -106,10 +106,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 22.x + - name: Install Node.js 24.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x - name: Restore lerna uses: actions/cache@v4 with: @@ -170,10 +170,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Install Node.js 22.x + - name: Install Node.js 24.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x - name: Restore lerna uses: actions/cache@v4 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4b9dc62ac1101..1c9fea2ad1fdf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,10 +27,10 @@ jobs: # override: true # this is by default on rustflags: "" components: rustfmt - - name: Install Node.js 22.x + - name: Install Node.js 24.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x registry-url: 'https://registry.npmjs.org/' - name: Upgrade npm for OIDC support run: npm install -g npm@11.7.0 @@ -75,7 +75,7 @@ jobs: name: Build native Linux ${{ matrix.node-version }} ${{ matrix.target }} Python ${{ matrix.python-version }} strategy: matrix: - node-version: [22] + node-version: [24] python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] include: @@ -154,7 +154,7 @@ jobs: name: Build ${{ matrix.os-version }} ${{ matrix.target }} ${{ matrix.node-version }} Python ${{ matrix.python-version }} strategy: matrix: - node-version: [22.x] + node-version: [24.x] target: ["x86_64-apple-darwin", "aarch64-apple-darwin"] python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] include: @@ -243,7 +243,7 @@ jobs: name: Build ${{ matrix.os-version }} ${{ matrix.node-version }} Python ${{ matrix.python-version }} strategy: matrix: - node-version: [22.x] + node-version: [24.x] python-version: ["fallback"] os-version: [windows-2022] include: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index da9b3d83ca3b0..c467fdb216408 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -75,8 +75,10 @@ jobs: strategy: matrix: # Current docker version + next LTS - # TODO: Add 24 after it's been released - node-version: [22.x] + # TODO: Re-add 26.x after cubejs-duckdb-driver migrates off the frozen `duckdb` + # package (no prebuilt binaries for Node.js 26) + # node-version: [24.x, 26.x] + node-version: [24.x] # Don't forget to update build-native-release python-version: [3.11] fail-fast: false @@ -134,16 +136,16 @@ jobs: - name: Lerna test run: yarn lerna run --concurrency 1 --stream --no-prefix unit - name: Fix lcov paths - if: (matrix.node-version == '22.x') + if: (matrix.node-version == '24.x') run: | ./.github/actions/codecov-fix.sh - name: Combine all fixed LCOV files - if: (matrix.node-version == '22.x') + if: (matrix.node-version == '24.x') run: | echo "" > ./combined-unit.lcov find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-unit.lcov || true - name: Upload coverage artifact - if: (matrix.node-version == '22.x') + if: (matrix.node-version == '24.x') uses: actions/upload-artifact@v4 with: name: coverage-unit @@ -165,10 +167,10 @@ jobs: # override: true # this is by default on rustflags: "" components: rustfmt - - name: Install Node.js 22.x + - name: Install Node.js 24.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 24.x - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> "$GITHUB_OUTPUT" @@ -285,10 +287,10 @@ jobs: workspaces: ./packages/cubejs-backend-native key: native-${{ runner.OS }}-x86_64-unknown-linux-gnu shared-key: native-${{ runner.OS }}-x86_64-unknown-linux-gnu - - name: Install Node.js 22 + - name: Install Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 - name: Install Yarn run: npm install -g yarn - name: Set Yarn version @@ -317,7 +319,7 @@ jobs: strategy: matrix: - node-version: [22.x] + node-version: [24.x] fail-fast: false steps: @@ -394,7 +396,10 @@ jobs: strategy: matrix: - node-version: [22.x] + # TODO: Re-add 26.x after cubejs-duckdb-driver migrates off the frozen `duckdb` + # package (no prebuilt binaries for Node.js 26) + # node-version: [24.x, 26.x] + node-version: [24.x] # Vertica tests are disabled because around 20.08.2025 someone # totally removed all vertica-ce docker repository from dockerhub. # @see https://github.com/vertica/vertica-containers/issues/64 @@ -408,10 +413,10 @@ jobs: use_tesseract_sql_planner: [ false ] include: - db: postgres - node-version: 22.x + node-version: 24.x use_tesseract_sql_planner: true - db: mssql - node-version: 22.x + node-version: 24.x use_tesseract_sql_planner: true fail-fast: false @@ -503,13 +508,16 @@ jobs: DRIVERS_TESTS_SNOWFLAKE_CUBEJS_DB_USER: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_USER }} DRIVERS_TESTS_SNOWFLAKE_CUBEJS_DB_PASS: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_PASS }} - name: Fix lcov paths + if: (matrix.node-version == '24.x') run: | ./.github/actions/codecov-fix.sh - name: Combine all fixed LCOV files + if: (matrix.node-version == '24.x') run: | echo "" > ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov || true - name: Upload coverage artifact + if: (matrix.node-version == '24.x') uses: actions/upload-artifact@v4 with: name: coverage-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }} @@ -523,7 +531,7 @@ jobs: strategy: matrix: - node-version: [ 22.x ] + node-version: [ 24.x ] python-version: [ 3.11 ] use_tesseract_sql_planner: [ true, false ] fail-fast: false @@ -618,7 +626,7 @@ jobs: - 5000:5000 strategy: matrix: - node-version: [ 22 ] + node-version: [ 24 ] target: [ "x86_64-unknown-linux-gnu" ] dockerfile: - dev.Dockerfile diff --git a/.github/workflows/rust-cubesql.yml b/.github/workflows/rust-cubesql.yml index b3dbf5c3787ac..a5a089855b97b 100644 --- a/.github/workflows/rust-cubesql.yml +++ b/.github/workflows/rust-cubesql.yml @@ -120,14 +120,16 @@ jobs: strategy: matrix: # Current used version + 1 LTS - # TODO: Add 24 after it's been released (don't forget to uncomment excludes below!) - node-version: [22] + # TODO: Re-add 26 after cubejs-duckdb-driver migrates off the frozen `duckdb` + # package (no prebuilt binaries for Node.js 26, don't forget to uncomment excludes below!) + # node-version: [24, 26] + node-version: [24] python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"] target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] # minimize number of jobs exclude: -# TODO: uncomment after adding v24 -# - node-version: 22 +# TODO: uncomment after re-adding v26 +# - node-version: 26 # target: "aarch64-unknown-linux-gnu" - python-version: 3.10 target: "aarch64-unknown-linux-gnu" @@ -225,7 +227,7 @@ jobs: strategy: matrix: # We do not need to test under all versions, we do it under linux - node-version: [22.x] + node-version: [24.x] target: ["x86_64-apple-darwin", "aarch64-apple-darwin"] include: - target: x86_64-apple-darwin @@ -326,7 +328,7 @@ jobs: strategy: matrix: # We do not need to test under all versions, we do it under linux - node-version: [22.x] + node-version: [24.x] os-version: [windows-2022] python-version: ["fallback"] fail-fast: false diff --git a/.nvmrc b/.nvmrc index 85e502778f623..b832e4001dbc9 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.22.0 +24.16.0 diff --git a/packages/cubejs-docker/dev.Dockerfile b/packages/cubejs-docker/dev.Dockerfile index 9cf9ca88cbd16..06f4de3e8f37b 100644 --- a/packages/cubejs-docker/dev.Dockerfile +++ b/packages/cubejs-docker/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.22.0-bookworm-slim AS base +FROM node:24.16.0-bookworm-slim AS base ARG IMAGE_VERSION=dev diff --git a/packages/cubejs-docker/latest-debian-jdk.Dockerfile b/packages/cubejs-docker/latest-debian-jdk.Dockerfile index 76f756b8421d9..832cc16054fa2 100644 --- a/packages/cubejs-docker/latest-debian-jdk.Dockerfile +++ b/packages/cubejs-docker/latest-debian-jdk.Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile-upstream:master-experimental -FROM node:22.22.0-bookworm-slim AS builder +FROM node:24.16.0-bookworm-slim AS builder WORKDIR /cube COPY . . @@ -22,7 +22,7 @@ RUN yarn install --prod \ && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean -FROM node:22.22.0-bookworm-slim +FROM node:24.16.0-bookworm-slim ARG IMAGE_VERSION=unknown diff --git a/packages/cubejs-docker/latest.Dockerfile b/packages/cubejs-docker/latest.Dockerfile index 78f1b59be2af0..80a5419a26c6e 100644 --- a/packages/cubejs-docker/latest.Dockerfile +++ b/packages/cubejs-docker/latest.Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.22.0-bookworm-slim AS builder +FROM node:24.16.0-bookworm-slim AS builder WORKDIR /cube COPY . . @@ -21,7 +21,7 @@ RUN yarn install --prod \ && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean -FROM node:22.22.0-bookworm-slim +FROM node:24.16.0-bookworm-slim ARG IMAGE_VERSION=unknown diff --git a/packages/cubejs-docker/local.Dockerfile b/packages/cubejs-docker/local.Dockerfile index fca70e19193b9..58e44a6c350b6 100644 --- a/packages/cubejs-docker/local.Dockerfile +++ b/packages/cubejs-docker/local.Dockerfile @@ -1,7 +1,7 @@ ARG DEV_BUILD_IMAGE=cubejs/cube:build FROM $DEV_BUILD_IMAGE AS build -FROM node:22.22.0-bookworm-slim +FROM node:24.16.0-bookworm-slim ARG IMAGE_VERSION=dev diff --git a/packages/cubejs-docker/testing-drivers.Dockerfile b/packages/cubejs-docker/testing-drivers.Dockerfile index a5f9427a1721e..cb6a5af43016b 100644 --- a/packages/cubejs-docker/testing-drivers.Dockerfile +++ b/packages/cubejs-docker/testing-drivers.Dockerfile @@ -1,7 +1,7 @@ ###################################################################### # Base image # ###################################################################### -FROM node:22.22.0-bookworm-slim AS base +FROM node:24.16.0-bookworm-slim AS base ARG IMAGE_VERSION=dev diff --git a/packages/cubejs-jdbc-driver/package.json b/packages/cubejs-jdbc-driver/package.json index c5303585e9354..1445a914f1696 100644 --- a/packages/cubejs-jdbc-driver/package.json +++ b/packages/cubejs-jdbc-driver/package.json @@ -31,8 +31,8 @@ "sqlstring": "^2.3.0" }, "optionalDependencies": { - "@cubejs-backend/jdbc": "^0.8.1", - "java": "^0.14.0" + "@cubejs-backend/jdbc": "^0.9.0", + "java": "^0.18.0" }, "license": "Apache-2.0", "eslintConfig": { diff --git a/yarn.lock b/yarn.lock index 4ca0601de64a0..afbb0de90d9a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,9 +13,9 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@achrinza/node-ipc@^9.2.5": - version "9.2.9" - resolved "https://registry.yarnpkg.com/@achrinza/node-ipc/-/node-ipc-9.2.9.tgz#ab4815d9b16f1c83a479fe8791522a3abebb1c6a" - integrity sha512-7s0VcTwiK/0tNOVdSX9FWMeFdOEcsAOz9HesBldXxFMaGvIak7KC2z9tV9EgsQXn6KUsWsfIkViMNuIo0GoZDQ== + version "9.2.10" + resolved "https://registry.yarnpkg.com/@achrinza/node-ipc/-/node-ipc-9.2.10.tgz#aa17def30e134e8c0a8738ffc13e50c08a753ff0" + integrity sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A== dependencies: "@node-ipc/js-queue" "2.0.3" event-pubsub "4.3.0" @@ -2799,14 +2799,13 @@ resolved "https://registry.yarnpkg.com/@cubejs-backend/dotenv/-/dotenv-9.0.2.tgz#c3679091b702f0fd38de120c5a63943fcdc0dcbf" integrity sha512-yC1juhXEjM7K97KfXubDm7WGipd4Lpxe+AT8XeTRE9meRULrKlw0wtE2E8AQkGOfTBn+P1SCkePQ/BzIbOh1VA== -"@cubejs-backend/jdbc@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cubejs-backend/jdbc/-/jdbc-0.8.1.tgz#32e21fcbf35f91028864396503620c83c2779261" - integrity sha512-dM/9V4IFe6vEcgHqAAAJ84EUnjxk1KjqJW26q2zKvDDW+31Fk9WzLEbzR1KdfYySWK7j+rMdOqGvHp8w89XGTQ== +"@cubejs-backend/jdbc@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@cubejs-backend/jdbc/-/jdbc-0.9.0.tgz#793494ba9e17aab94d3d776e80d7c74837390fd9" + integrity sha512-6CupwVoqA9riWAyBlU3+HwRdVKBY85mX8tgSBQKJxXN5wcJYV2drOErnhY6C0uIshWuMPnFUHKme00JON29wWQ== dependencies: async "^3.2.6" - java "^0.14" - lodash "^4.17.21" + java "^0.18" uuid "^11.1.0" winston "^3.17.0" @@ -10398,7 +10397,7 @@ async@^2.6.4: dependencies: lodash "^4.17.14" -async@^3.2.0, async@^3.2.3, async@^3.2.4, async@^3.2.5, async@^3.2.6: +async@^3.2.0, async@^3.2.3, async@^3.2.4, async@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -16981,17 +16980,15 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -java@^0.14, java@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/java/-/java-0.14.0.tgz#28528f462aa23cca7b99e07fbc3130460ff70493" - integrity sha512-fXqNZvzQTl9cOFK4Rx7lobpgdWh9HKyjD56aerCZ9ETrVepvI6/wH1PUodieUc2ekf4cUOsHfM7aliWZAwU5Zg== +java@^0.18, java@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/java/-/java-0.18.0.tgz#8a339bc872c76755909f0e376cd465fa1985e997" + integrity sha512-DX9IJcYRMIGII4MIbw27xsU64h4EBfa+JHo0WpDQ2T61RYiRJXnEWdr4DNcTl18T6l8KjQGomEvdCSUYFKvkUw== dependencies: - async "^3.2.5" find-java-home "^2.0.0" - glob "^10.3.10" - lodash "^4.17.21" - nan "^2.18.0" - node-gyp "^10.0.1" + glob "^11.0.3" + nan "^2.23.0" + node-gyp "^11.5.0" javascript-stringify@^2.0.1: version "2.1.0" @@ -19343,10 +19340,10 @@ named-placeholders@^1.1.3: dependencies: lru-cache "^7.14.1" -nan@^2.18.0, nan@^2.19.0, nan@^2.20.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== +nan@^2.19.0, nan@^2.20.0, nan@^2.23.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.27.0.tgz#804e389f4c0e39b729a17eca85c80ebc4355c4c4" + integrity sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ== nanoid@^3.3.11: version "3.3.11" @@ -19592,7 +19589,7 @@ node-gyp@8.x: tar "^6.1.2" which "^2.0.2" -node-gyp@^10.0.0, node-gyp@^10.0.1: +node-gyp@^10.0.0: version "10.3.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a" integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== @@ -19608,7 +19605,7 @@ node-gyp@^10.0.0, node-gyp@^10.0.1: tar "^6.2.1" which "^4.0.0" -node-gyp@^11.0.0: +node-gyp@^11.0.0, node-gyp@^11.5.0: version "11.5.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.5.0.tgz#82661b5f40647a7361efe918e3cea76d297fcc56" integrity sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ== From df06720ce22cc6b946459b3cb9d831d588d21cc3 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 12 Jun 2026 11:12:46 +0200 Subject: [PATCH 10/26] chore(client-vue3): Drop legacy vue toolkit Toolkit has a dependecy on @achrinza/node-ipc that blocks migration for new Node.js everytime. More funny, that it still doesn't support Node.js 26, which I wan to declare in testing matrix. We don't define any .vue files, that's why we can use babel without anything especiall, moreover we build this package outside it folder. We define config in the root directory for rollup bundler # Conflicts: # yarn.lock --- packages/cubejs-client-react/package.json | 1 + packages/cubejs-client-vue3/babel.config.js | 3 +- packages/cubejs-client-vue3/jest.config.js | 3 +- packages/cubejs-client-vue3/package.json | 27 +- yarn.lock | 3278 +++++-------------- 5 files changed, 858 insertions(+), 2454 deletions(-) diff --git a/packages/cubejs-client-react/package.json b/packages/cubejs-client-react/package.json index d422fc369b43e..c57d3518d1e36 100644 --- a/packages/cubejs-client-react/package.json +++ b/packages/cubejs-client-react/package.json @@ -31,6 +31,7 @@ "devDependencies": { "@types/ramda": "^0.27.40", "@types/react": "^16.9.41", + "babel-eslint": "^9.0.0", "eslint": "^7.21.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-airbnb-base": "^14.0.0", diff --git a/packages/cubejs-client-vue3/babel.config.js b/packages/cubejs-client-vue3/babel.config.js index f39476ec32b69..c74fb53e2804f 100644 --- a/packages/cubejs-client-vue3/babel.config.js +++ b/packages/cubejs-client-vue3/babel.config.js @@ -1,4 +1,3 @@ module.exports = { - presets: ['@vue/app'], - plugins: ['@babel/plugin-proposal-optional-chaining'], + presets: [['@babel/preset-env', { targets: { node: 'current' } }]], }; diff --git a/packages/cubejs-client-vue3/jest.config.js b/packages/cubejs-client-vue3/jest.config.js index 3fd37846fdd0c..529a9b1cb9b64 100644 --- a/packages/cubejs-client-vue3/jest.config.js +++ b/packages/cubejs-client-vue3/jest.config.js @@ -1,7 +1,6 @@ module.exports = { - moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + moduleFileExtensions: ['js', 'jsx', 'json'], transform: { - '^.+\\.vue$': '@vue/vue3-jest', '^.+\\.js$': 'babel-jest', }, transformIgnorePatterns: ['/node_modules/'], diff --git a/packages/cubejs-client-vue3/package.json b/packages/cubejs-client-vue3/package.json index 29da7c8ed6b24..395e3427b9364 100644 --- a/packages/cubejs-client-vue3/package.json +++ b/packages/cubejs-client-vue3/package.json @@ -14,8 +14,7 @@ "Cube Dev, Inc." ], "scripts": { - "serve": "vue-cli-service serve", - "lint": "vue-cli-service lint", + "lint": "eslint src tests", "test": "jest", "unit": "npm run test:unit", "test:unit": "jest", @@ -32,18 +31,11 @@ "ramda": "^0.27.0" }, "devDependencies": { - "@babel/plugin-proposal-optional-chaining": "^7", - "@vue/babel-preset-app": "^5", - "@vue/cli-plugin-babel": "^5.0", - "@vue/cli-plugin-eslint": "^5.0", - "@vue/cli-service": "^5.0", + "@babel/core": "^7", + "@babel/preset-env": "^7", "@vue/test-utils": "^2.4", - "@vue/vue3-jest": "^29", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "^10.1.0", "babel-jest": "^29", "eslint": "^7.21.0", - "eslint-plugin-vue": "^6.2.1", "jest": "^29", "jest-environment-jsdom": "^29", "vue": "^3.0" @@ -54,20 +46,17 @@ "eslintConfig": { "root": true, "env": { - "node": true + "es2021": true, + "node": true, + "jest": true }, "extends": [ - "plugin:vue/essential", "eslint:recommended" ], "rules": {}, "parserOptions": { - "parser": "babel-eslint" - } - }, - "postcss": { - "plugins": { - "autoprefixer": {} + "ecmaVersion": 2021, + "sourceType": "module" } }, "browserslist": [ diff --git a/yarn.lock b/yarn.lock index afbb0de90d9a5..b51aeaf1fd28d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,15 +12,6 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@achrinza/node-ipc@^9.2.5": - version "9.2.10" - resolved "https://registry.yarnpkg.com/@achrinza/node-ipc/-/node-ipc-9.2.10.tgz#aa17def30e134e8c0a8738ffc13e50c08a753ff0" - integrity sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A== - dependencies: - "@node-ipc/js-queue" "2.0.3" - event-pubsub "4.3.0" - js-message "1.0.7" - "@ampproject/remapping@2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -1378,19 +1369,19 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.29.7" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.8", "@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" - integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.8", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== "@babel/core@7.25.2": version "7.25.2" @@ -1434,20 +1425,20 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.11.6", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.13.8", "@babel/core@^7.23.9", "@babel/core@^7.24", "@babel/core@^7.24.5", "@babel/core@^7.25.2", "@babel/core@^7.3.3": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" - integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" +"@babel/core@^7", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.8", "@babel/core@^7.23.9", "@babel/core@^7.24", "@babel/core@^7.24.5", "@babel/core@^7.25.2", "@babel/core@^7.3.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -1466,13 +1457,13 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.24", "@babel/generator@^7.25.0", "@babel/generator@^7.26.10", "@babel/generator@^7.28.5", "@babel/generator@^7.7.2": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" - integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== +"@babel/generator@^7.24", "@babel/generator@^7.25.0", "@babel/generator@^7.26.10", "@babel/generator@^7.29.7", "@babel/generator@^7.7.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== dependencies: - "@babel/parser" "^7.28.5" - "@babel/types" "^7.28.5" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" @@ -1491,124 +1482,124 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== dependencies: - "@babel/types" "^7.27.3" + "@babel/types" "^7.29.7" -"@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.25.2", "@babel/helper-compilation-targets@^7.26.5", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-compilation-targets@^7.25.2", "@babel/helper-compilation-targets@^7.26.5", "@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3", "@babel/helper-create-class-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz#472d0c28028850968979ad89f173594a6995da46" - integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.5" +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-annotate-as-pure" "^7.29.7" regexpu-core "^6.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.5": - version "0.6.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" - integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - debug "^4.4.1" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + debug "^4.4.3" lodash.debounce "^4.0.8" - resolve "^1.22.10" + resolve "^1.22.11" -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== -"@babel/helper-member-expression-to-functions@^7.27.1", "@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.25.9", "@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.25.9", "@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-transforms@^7.25.2", "@babel/helper-module-transforms@^7.26.0", "@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== +"@babel/helper-module-transforms@^7.25.2", "@babel/helper-module-transforms@^7.26.0", "@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== dependencies: - "@babel/types" "^7.27.1" + "@babel/types" "^7.29.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== -"@babel/helper-remap-async-to-generator@^7.25.9", "@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== +"@babel/helper-remap-async-to-generator@^7.25.9", "@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-replace-supers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" - integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== dependencies: - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@babel/helper-split-export-declaration@7.24.7": version "7.24.7" @@ -1617,37 +1608,37 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== -"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== +"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== -"@babel/helper-validator-option@^7.25.9", "@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== +"@babel/helper-validator-option@^7.25.9", "@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== -"@babel/helper-wrap-function@^7.27.1": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz#fe4872092bc1438ffd0ce579e6f699609f9d0a7a" - integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== dependencies: - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helpers@^7.25.0", "@babel/helpers@^7.26.10", "@babel/helpers@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" - integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== +"@babel/helpers@^7.25.0", "@babel/helpers@^7.26.10", "@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" "@babel/highlight@^7.10.4": version "7.25.9" @@ -1659,84 +1650,59 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24", "@babel/parser@^7.25.0", "@babel/parser@^7.26.10", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5", "@babel/parser@^7.7.0": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" - integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== - dependencies: - "@babel/types" "^7.28.5" - -"@babel/parser@^7.29.0": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" - integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== - dependencies: - "@babel/types" "^7.29.0" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24", "@babel/parser@^7.25.0", "@babel/parser@^7.26.10", "@babel/parser@^7.29.0", "@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/types" "^7.29.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz#373f6e2de0016f73caf8f27004f61d167743742a" - integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-class-properties@^7.12.13": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz#759a857c46c4d2a6199685cf71070d81ae5f743a" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-proposal-decorators@^7.12.13": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz#419c8acc31088e05a774344c021800f7ddc39bf0" - integrity sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-decorators" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" -"@babel/plugin-proposal-optional-chaining@^7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -1764,26 +1730,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz#ee7dd9590aeebc05f9d4c8c0560007b05979a63d" - integrity sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-import-assertions@^7.26.0", "@babel/plugin-syntax-import-assertions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" - integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== +"@babel/plugin-syntax-import-assertions@^7.26.0", "@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-import-attributes@7.24.7": version "7.24.7" @@ -1792,12 +1744,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@^7.26.0", "@babel/plugin-syntax-import-attributes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== +"@babel/plugin-syntax-import-attributes@^7.26.0", "@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -1813,12 +1765,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== +"@babel/plugin-syntax-jsx@^7.29.7", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -1869,12 +1821,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.27.1", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== +"@babel/plugin-syntax-typescript@^7.29.7", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -1884,12 +1836,12 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.25.9", "@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== +"@babel/plugin-transform-arrow-functions@^7.25.9", "@babel/plugin-transform-arrow-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-async-generator-functions@7.26.8": version "7.26.8" @@ -1900,14 +1852,14 @@ "@babel/helper-remap-async-to-generator" "^7.25.9" "@babel/traverse" "^7.26.8" -"@babel/plugin-transform-async-generator-functions@^7.26.8", "@babel/plugin-transform-async-generator-functions@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" - integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== +"@babel/plugin-transform-async-generator-functions@^7.26.8", "@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-async-to-generator@7.25.9": version "7.25.9" @@ -1918,366 +1870,366 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.25.9", "@babel/plugin-transform-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" - integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== +"@babel/plugin-transform-async-to-generator@^7.25.9", "@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" -"@babel/plugin-transform-block-scoped-functions@^7.26.5", "@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== +"@babel/plugin-transform-block-scoped-functions@^7.26.5", "@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-block-scoping@^7.25.9", "@babel/plugin-transform-block-scoping@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz#e0d3af63bd8c80de2e567e690a54e84d85eb16f6" - integrity sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g== +"@babel/plugin-transform-block-scoping@^7.25.9", "@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-properties@^7.25.9", "@babel/plugin-transform-class-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" - integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== +"@babel/plugin-transform-class-properties@^7.25.9", "@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-static-block@^7.26.0", "@babel/plugin-transform-class-static-block@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852" - integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== +"@babel/plugin-transform-class-static-block@^7.26.0", "@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-classes@^7.25.9", "@babel/plugin-transform-classes@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c" - integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== +"@babel/plugin-transform-classes@^7.25.9", "@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.4" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-computed-properties@^7.25.9", "@babel/plugin-transform-computed-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" - integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== +"@babel/plugin-transform-computed-properties@^7.25.9", "@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/template" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" -"@babel/plugin-transform-destructuring@^7.25.9", "@babel/plugin-transform-destructuring@^7.28.0", "@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== +"@babel/plugin-transform-destructuring@^7.25.9", "@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-dotall-regex@^7.25.9", "@babel/plugin-transform-dotall-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" - integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== +"@babel/plugin-transform-dotall-regex@^7.25.9", "@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-keys@^7.25.9", "@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== +"@babel/plugin-transform-duplicate-keys@^7.25.9", "@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" - integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-dynamic-import@^7.25.9", "@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== +"@babel/plugin-transform-dynamic-import@^7.25.9", "@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-explicit-resource-management@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" - integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz#65c8b9f76ec915b02a0e1df703125a0fca58abaa" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" -"@babel/plugin-transform-exponentiation-operator@^7.26.3", "@babel/plugin-transform-exponentiation-operator@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz#7cc90a8170e83532676cfa505278e147056e94fe" - integrity sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw== +"@babel/plugin-transform-exponentiation-operator@^7.26.3", "@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-export-namespace-from@^7.25.9", "@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== +"@babel/plugin-transform-export-namespace-from@^7.25.9", "@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-for-of@^7.26.9", "@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== +"@babel/plugin-transform-for-of@^7.26.9", "@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-function-name@^7.25.9", "@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== +"@babel/plugin-transform-function-name@^7.25.9", "@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-json-strings@^7.25.9", "@babel/plugin-transform-json-strings@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" - integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== +"@babel/plugin-transform-json-strings@^7.25.9", "@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-literals@^7.25.9", "@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== +"@babel/plugin-transform-literals@^7.25.9", "@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-logical-assignment-operators@^7.25.9", "@babel/plugin-transform-logical-assignment-operators@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz#d028fd6db8c081dee4abebc812c2325e24a85b0e" - integrity sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA== +"@babel/plugin-transform-logical-assignment-operators@^7.25.9", "@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-member-expression-literals@^7.25.9", "@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== +"@babel/plugin-transform-member-expression-literals@^7.25.9", "@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-amd@^7.25.9", "@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== +"@babel/plugin-transform-modules-amd@^7.25.9", "@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.26.3", "@babel/plugin-transform-modules-commonjs@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" - integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== +"@babel/plugin-transform-modules-commonjs@^7.26.3", "@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-systemjs@^7.25.9", "@babel/plugin-transform-modules-systemjs@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz#7439e592a92d7670dfcb95d0cbc04bd3e64801d2" - integrity sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== +"@babel/plugin-transform-modules-systemjs@^7.25.9", "@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz#e575dd2ab9882906de120ff7dc9dee9914d8b6f3" + integrity sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ== dependencies: - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.5" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-modules-umd@^7.25.9", "@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== +"@babel/plugin-transform-modules-umd@^7.25.9", "@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" - integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-new-target@^7.25.9", "@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== +"@babel/plugin-transform-new-target@^7.25.9", "@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6", "@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" - integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6", "@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-numeric-separator@^7.25.9", "@babel/plugin-transform-numeric-separator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" - integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== +"@babel/plugin-transform-numeric-separator@^7.25.9", "@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-object-rest-spread@^7.25.9", "@babel/plugin-transform-object-rest-spread@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d" - integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== +"@babel/plugin-transform-object-rest-spread@^7.25.9", "@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.4" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-object-super@^7.25.9", "@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== +"@babel/plugin-transform-object-super@^7.25.9", "@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" -"@babel/plugin-transform-optional-catch-binding@^7.25.9", "@babel/plugin-transform-optional-catch-binding@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" - integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== +"@babel/plugin-transform-optional-catch-binding@^7.25.9", "@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-optional-chaining@^7.25.9", "@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz#8238c785f9d5c1c515a90bf196efb50d075a4b26" - integrity sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ== +"@babel/plugin-transform-optional-chaining@^7.25.9", "@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-parameters@^7.25.9", "@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== +"@babel/plugin-transform-parameters@^7.25.9", "@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-methods@^7.25.9", "@babel/plugin-transform-private-methods@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" - integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== +"@babel/plugin-transform-private-methods@^7.25.9", "@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-property-in-object@^7.25.9", "@babel/plugin-transform-private-property-in-object@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" - integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== +"@babel/plugin-transform-private-property-in-object@^7.25.9", "@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-property-literals@^7.25.9", "@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== +"@babel/plugin-transform-property-literals@^7.25.9", "@babel/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-display-name@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== +"@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz#bf161a6d750267b79db7ff6f8fb89c3369b02df3" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz#64e6aacb5cb43b9e80d3d5f19ddefc158a624f09" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.29.7" "@babel/plugin-transform-react-jsx-self@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz#c24424527858220624fd59a5b1eab4fa413c803a" + integrity sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-react-jsx-source@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz#5cf25a3689906b58e2f0a2f2b374789e6627b15f" + integrity sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" - integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== +"@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz#3d16a0e5773f079400a8c82a190709cdf92ee204" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/plugin-transform-react-pure-annotations@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz#76445c90112dd0a7371b63264563bfa9a4fcd6e3" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regenerator@^7.25.9", "@babel/plugin-transform-regenerator@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51" - integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== +"@babel/plugin-transform-regenerator@^7.25.9", "@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz#0f42626a7dbb0e7a7f52e036d3e43deebdc3ea4e" + integrity sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regexp-modifiers@^7.26.0", "@babel/plugin-transform-regexp-modifiers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" - integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== +"@babel/plugin-transform-regexp-modifiers@^7.26.0", "@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-reserved-words@^7.25.9", "@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== +"@babel/plugin-transform-reserved-words@^7.25.9", "@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-runtime@7.26.10": version "7.26.10" @@ -2291,95 +2243,95 @@ babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-runtime@^7.12.15", "@babel/plugin-transform-runtime@^7.13.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz#ae3e21fbefe2831ebac04dfa6b463691696afe17" - integrity sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w== +"@babel/plugin-transform-runtime@^7.13.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz#7c7fb6e2a46dce67e278b6cc84421c1d16da5695" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.25.9", "@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== +"@babel/plugin-transform-shorthand-properties@^7.25.9", "@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-spread@^7.25.9", "@babel/plugin-transform-spread@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" - integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== +"@babel/plugin-transform-spread@^7.25.9", "@babel/plugin-transform-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz#a128bcdd6b5e5e47054907b2e50bc19c3f856edd" + integrity sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-sticky-regex@^7.25.9", "@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== +"@babel/plugin-transform-sticky-regex@^7.25.9", "@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-template-literals@^7.26.8", "@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== +"@babel/plugin-transform-template-literals@^7.26.8", "@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typeof-symbol@^7.26.7", "@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== +"@babel/plugin-transform-typeof-symbol@^7.26.7", "@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typescript@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz#441c5f9a4a1315039516c6c612fc66d5f4594e72" - integrity sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA== +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" -"@babel/plugin-transform-unicode-escapes@^7.25.9", "@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== +"@babel/plugin-transform-unicode-escapes@^7.25.9", "@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-property-regex@^7.25.9", "@babel/plugin-transform-unicode-property-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" - integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== +"@babel/plugin-transform-unicode-property-regex@^7.25.9", "@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-regex@^7.25.9", "@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== +"@babel/plugin-transform-unicode-regex@^7.25.9", "@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-sets-regex@^7.25.9", "@babel/plugin-transform-unicode-sets-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" - integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== +"@babel/plugin-transform-unicode-sets-regex@^7.25.9", "@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/preset-env@7.26.9": version "7.26.9" @@ -2456,80 +2408,81 @@ core-js-compat "^3.40.0" semver "^6.3.1" -"@babel/preset-env@^7.12.16", "@babel/preset-env@^7.13.9", "@babel/preset-env@^7.24", "@babel/preset-env@^7.24.5", "@babel/preset-env@^7.3.1": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.5.tgz#82dd159d1563f219a1ce94324b3071eb89e280b0" - integrity sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg== - dependencies: - "@babel/compat-data" "^7.28.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.3" +"@babel/preset-env@^7", "@babel/preset-env@^7.13.9", "@babel/preset-env@^7.24", "@babel/preset-env@^7.24.5", "@babel/preset-env@^7.3.1": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.7.tgz#5e2ab5e764b493fdefc99c43aeaa70a9533a37fd" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.29.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.27.1" - "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-import-assertions" "^7.29.7" + "@babel/plugin-syntax-import-attributes" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.5" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.28.3" - "@babel/plugin-transform-classes" "^7.28.4" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-dotall-regex" "^7.27.1" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.28.5" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.27.1" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.28.5" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.28.5" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" - "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.4" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.27.1" - "@babel/plugin-transform-private-property-in-object" "^7.27.1" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.4" - "@babel/plugin-transform-regexp-modifiers" "^7.27.1" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.27.1" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.27.1" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/plugin-transform-arrow-functions" "^7.29.7" + "@babel/plugin-transform-async-generator-functions" "^7.29.7" + "@babel/plugin-transform-async-to-generator" "^7.29.7" + "@babel/plugin-transform-block-scoped-functions" "^7.29.7" + "@babel/plugin-transform-block-scoping" "^7.29.7" + "@babel/plugin-transform-class-properties" "^7.29.7" + "@babel/plugin-transform-class-static-block" "^7.29.7" + "@babel/plugin-transform-classes" "^7.29.7" + "@babel/plugin-transform-computed-properties" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-dotall-regex" "^7.29.7" + "@babel/plugin-transform-duplicate-keys" "^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-dynamic-import" "^7.29.7" + "@babel/plugin-transform-explicit-resource-management" "^7.29.7" + "@babel/plugin-transform-exponentiation-operator" "^7.29.7" + "@babel/plugin-transform-export-namespace-from" "^7.29.7" + "@babel/plugin-transform-for-of" "^7.29.7" + "@babel/plugin-transform-function-name" "^7.29.7" + "@babel/plugin-transform-json-strings" "^7.29.7" + "@babel/plugin-transform-literals" "^7.29.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.29.7" + "@babel/plugin-transform-member-expression-literals" "^7.29.7" + "@babel/plugin-transform-modules-amd" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-modules-systemjs" "^7.29.7" + "@babel/plugin-transform-modules-umd" "^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-new-target" "^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.29.7" + "@babel/plugin-transform-numeric-separator" "^7.29.7" + "@babel/plugin-transform-object-rest-spread" "^7.29.7" + "@babel/plugin-transform-object-super" "^7.29.7" + "@babel/plugin-transform-optional-catch-binding" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/plugin-transform-private-methods" "^7.29.7" + "@babel/plugin-transform-private-property-in-object" "^7.29.7" + "@babel/plugin-transform-property-literals" "^7.29.7" + "@babel/plugin-transform-regenerator" "^7.29.7" + "@babel/plugin-transform-regexp-modifiers" "^7.29.7" + "@babel/plugin-transform-reserved-words" "^7.29.7" + "@babel/plugin-transform-shorthand-properties" "^7.29.7" + "@babel/plugin-transform-spread" "^7.29.7" + "@babel/plugin-transform-sticky-regex" "^7.29.7" + "@babel/plugin-transform-template-literals" "^7.29.7" + "@babel/plugin-transform-typeof-symbol" "^7.29.7" + "@babel/plugin-transform-unicode-escapes" "^7.29.7" + "@babel/plugin-transform-unicode-property-regex" "^7.29.7" + "@babel/plugin-transform-unicode-regex" "^7.29.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.29.7" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" + babel-plugin-polyfill-corejs2 "^0.4.15" + babel-plugin-polyfill-corejs3 "^0.14.0" + babel-plugin-polyfill-regenerator "^0.6.6" + core-js-compat "^3.48.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -2542,34 +2495,34 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.13": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9" - integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.29.7.tgz#2ed18366e38c2081bbf1760dc01e88fa5674eb17" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.28.0" - "@babel/plugin-transform-react-jsx" "^7.27.1" - "@babel/plugin-transform-react-jsx-development" "^7.27.1" - "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" "@babel/preset-typescript@^7.12.1", "@babel/preset-typescript@^7.13.0": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" - integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.28.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" "@babel/runtime-corejs3@^7.10.2": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz#c25be39c7997ce2f130d70b9baecb8ed94df93fa" - integrity sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz#2030fda34f3433647818660093751fb1ca2debf0" + integrity sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ== dependencies: - core-js-pure "^3.43.0" + core-js-pure "^3.48.0" "@babel/runtime@7.26.10": version "7.26.10" @@ -2579,52 +2532,44 @@ regenerator-runtime "^0.14.0" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.9", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" - integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== "@babel/standalone@^7.24": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.28.5.tgz#4fced2b23f9670a04b30cc4942c3e4b87bce4eff" - integrity sha512-1DViPYJpRU50irpGMfLBQ9B4kyfQuL6X7SS7pwTeWeZX0mNkjzPi0XFqxCjSdddZXUQy4AhnQnnesA/ZHnvAdw== - -"@babel/template@^7.0.0", "@babel/template@^7.25.0", "@babel/template@^7.26.9", "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.24", "@babel/traverse@^7.25.2", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.28.5", "@babel/traverse@^7.7.0": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" - integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.5" + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.29.7.tgz#3944717636f63cabc134962e1b00b46fe594db0e" + integrity sha512-oFh9XoGL20UuHIeIuBQHOvF7r2dOCRnZW0r4SageGb9SWnt6HhbuPLREykNaEnP7/SRpMUwr50SSMJLrmeHvnQ== + +"@babel/template@^7.25.0", "@babel/template@^7.26.9", "@babel/template@^7.29.7", "@babel/template@^7.3.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.24", "@babel/traverse@^7.25.2", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8", "@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24", "@babel/types@^7.24.7", "@babel/types@^7.25.2", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" - integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24", "@babel/types@^7.24.7", "@babel/types@^7.25.2", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.29.0", "@babel/types@^7.29.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@babel/types@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" "@balena/dockerignore@^1.0.2": version "1.0.2" @@ -2888,11 +2833,6 @@ enabled "2.0.x" kuler "^2.0.0" -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - "@discoveryjs/json-ext@0.6.1": version "0.6.1" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz#593da7a17a31a72a874e313677183334a49b01c9" @@ -4877,13 +4817,6 @@ resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-2.1.0.tgz#f543e5c6446720d4cf9e498a83019dd159973bc2" integrity sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA== -"@node-ipc/js-queue@2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz#ac7fe33d766fa53e233ef8fedaf3443a01c5a4cd" - integrity sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw== - dependencies: - easy-stack "1.0.1" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -5808,11 +5741,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.23" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" - integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -7988,21 +7916,6 @@ dependencies: tslib "^2.6.2" -"@soda/friendly-errors-webpack-plugin@^1.8.0": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz#4d4fbb1108993aaa362116247c3d18188a2c6c85" - integrity sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg== - dependencies: - chalk "^3.0.0" - error-stack-parser "^2.0.6" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -"@soda/get-current-script@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz#a53515db25d8038374381b73af20bb4f2e508d87" - integrity sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w== - "@standard-schema/spec@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" @@ -8146,7 +8059,7 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.13", "@types/bonjour@^3.5.9": +"@types/bonjour@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== @@ -8178,7 +8091,7 @@ dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5", "@types/connect-history-api-fallback@^1.5.4": +"@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== @@ -8320,23 +8233,7 @@ "@types/node" "*" "@types/ssh2" "*" -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.44.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5" - integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.5": version "1.0.7" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== @@ -8390,7 +8287,7 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/express@^4.17.13", "@types/express@^4.17.21": +"@types/express@^4.17.21": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -8440,11 +8337,6 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - "@types/http-errors@*": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" @@ -8516,7 +8408,7 @@ resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.1.tgz#201062a6990119a8cc18023cfe1fed12fc2fc8a7" integrity sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw== -"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -8756,11 +8648,6 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - "@types/retry@0.12.2": version "0.12.2" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" @@ -8784,14 +8671,14 @@ "@types/mime" "^1" "@types/node" "*" -"@types/serve-index@^1.9.1", "@types/serve-index@^1.9.4": +"@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10", "@types/serve-static@^1.15.5": +"@types/serve-static@*", "@types/serve-static@^1.15.5": version "1.15.7" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== @@ -8818,7 +8705,7 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== -"@types/sockjs@^0.3.33", "@types/sockjs@^0.3.36": +"@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== @@ -8850,16 +8737,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/strip-bom@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" - integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= - -"@types/strip-json-comments@0.0.30": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" - integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== - "@types/styled-components@^5.1.34": version "5.1.34" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.34.tgz#4107df8ef8a7eaba4fa6b05f78f93fba4daf0300" @@ -8942,13 +8819,6 @@ dependencies: "@types/node" "*" -"@types/ws@^8.5.5": - version "8.5.14" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" - integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== - dependencies: - "@types/node" "*" - "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -9167,247 +9037,6 @@ convert-source-map "^2.0.0" tinyrainbow "^3.1.0" -"@vue/babel-helper-vue-jsx-merge-props@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2" - integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== - -"@vue/babel-helper-vue-transform-on@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" - integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== - -"@vue/babel-plugin-jsx@^1.0.3": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1" - integrity sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - "@vue/babel-helper-vue-transform-on" "^1.0.2" - camelcase "^6.0.0" - html-tags "^3.1.0" - svg-tags "^1.0.0" - -"@vue/babel-plugin-transform-vue-jsx@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz#4d4b3d46a39ea62b7467dd6e26ce47f7ceafb2fe" - integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - html-tags "^2.0.0" - lodash.kebabcase "^4.1.1" - svg-tags "^1.0.0" - -"@vue/babel-preset-app@^5", "@vue/babel-preset-app@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz#ce38f76314f5265d62a89756ef264c21f1d351a1" - integrity sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg== - dependencies: - "@babel/core" "^7.12.16" - "@babel/helper-compilation-targets" "^7.12.16" - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-decorators" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/plugin-transform-runtime" "^7.12.15" - "@babel/preset-env" "^7.12.16" - "@babel/runtime" "^7.12.13" - "@vue/babel-plugin-jsx" "^1.0.3" - "@vue/babel-preset-jsx" "^1.1.2" - babel-plugin-dynamic-import-node "^2.3.3" - core-js "^3.8.3" - core-js-compat "^3.8.3" - semver "^7.3.4" - -"@vue/babel-preset-jsx@^1.1.2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz#f4914ba314235ab097bc4372ed67473c0780bfcc" - integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== - dependencies: - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" - "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" - "@vue/babel-sugar-functional-vue" "^1.4.0" - "@vue/babel-sugar-inject-h" "^1.4.0" - "@vue/babel-sugar-v-model" "^1.4.0" - "@vue/babel-sugar-v-on" "^1.4.0" - -"@vue/babel-sugar-composition-api-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz#187e1389f8871d89ece743bb50aed713be9d6c85" - integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-composition-api-render-instance@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz#2c1607ae6dffdab47e785bc01fa45ba756e992c1" - integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-functional-vue@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz#60da31068567082287c7337c66ef4df04e0a1029" - integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz#bf39aa6631fb1d0399b1c49b4c59e1c8899b4363" - integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-v-model@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz#a51d986609f430c4f70ada3a93cc560a2970f720" - integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - html-tags "^2.0.0" - svg-tags "^1.0.0" - -"@vue/babel-sugar-v-on@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz#43b7106a9672d8cbeefc0eb8afe1d376edc6166e" - integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - -"@vue/cli-overlay@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz#b61477acdc43bbd42fce6326d228471201ecdcdd" - integrity sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ== - -"@vue/cli-plugin-babel@^5.0": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz#54f9a07900f29baff54803dcfa916c602894feb7" - integrity sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ== - dependencies: - "@babel/core" "^7.12.16" - "@vue/babel-preset-app" "^5.0.8" - "@vue/cli-shared-utils" "^5.0.8" - babel-loader "^8.2.2" - thread-loader "^3.0.0" - webpack "^5.54.0" - -"@vue/cli-plugin-eslint@^5.0": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz#754939265c2c5b746fa36c7d7705a89138e193bf" - integrity sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg== - dependencies: - "@vue/cli-shared-utils" "^5.0.8" - eslint-webpack-plugin "^3.1.0" - globby "^11.0.2" - webpack "^5.54.0" - yorkie "^2.0.0" - -"@vue/cli-plugin-router@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz#a113ec626f3d4216d20496c42d35533bce9e889f" - integrity sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg== - dependencies: - "@vue/cli-shared-utils" "^5.0.8" - -"@vue/cli-plugin-vuex@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz#0d4cb3020f9102bea9288d750729dde176c66ccd" - integrity sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA== - -"@vue/cli-service@^5.0": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-5.0.8.tgz#cf3f6f1b7bf0fba9cdab86b6bec4f9897f982dac" - integrity sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw== - dependencies: - "@babel/helper-compilation-targets" "^7.12.16" - "@soda/friendly-errors-webpack-plugin" "^1.8.0" - "@soda/get-current-script" "^1.0.2" - "@types/minimist" "^1.2.0" - "@vue/cli-overlay" "^5.0.8" - "@vue/cli-plugin-router" "^5.0.8" - "@vue/cli-plugin-vuex" "^5.0.8" - "@vue/cli-shared-utils" "^5.0.8" - "@vue/component-compiler-utils" "^3.3.0" - "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" - "@vue/web-component-wrapper" "^1.3.0" - acorn "^8.0.5" - acorn-walk "^8.0.2" - address "^1.1.2" - autoprefixer "^10.2.4" - browserslist "^4.16.3" - case-sensitive-paths-webpack-plugin "^2.3.0" - cli-highlight "^2.1.10" - clipboardy "^2.3.0" - cliui "^7.0.4" - copy-webpack-plugin "^9.0.1" - css-loader "^6.5.0" - css-minimizer-webpack-plugin "^3.0.2" - cssnano "^5.0.0" - debug "^4.1.1" - default-gateway "^6.0.3" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - fs-extra "^9.1.0" - globby "^11.0.2" - hash-sum "^2.0.0" - html-webpack-plugin "^5.1.0" - is-file-esm "^1.0.0" - launch-editor-middleware "^2.2.1" - lodash.defaultsdeep "^4.6.1" - lodash.mapvalues "^4.6.0" - mini-css-extract-plugin "^2.5.3" - minimist "^1.2.5" - module-alias "^2.2.2" - portfinder "^1.0.26" - postcss "^8.2.6" - postcss-loader "^6.1.1" - progress-webpack-plugin "^1.0.12" - ssri "^8.0.1" - terser-webpack-plugin "^5.1.1" - thread-loader "^3.0.0" - vue-loader "^17.0.0" - vue-style-loader "^4.1.3" - webpack "^5.54.0" - webpack-bundle-analyzer "^4.4.0" - webpack-chain "^6.5.1" - webpack-dev-server "^4.7.3" - webpack-merge "^5.7.3" - webpack-virtual-modules "^0.4.2" - whatwg-fetch "^3.6.2" - -"@vue/cli-shared-utils@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz#75fc96528eba2b1c7e33cb7e989a984ddef99c8a" - integrity sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ== - dependencies: - "@achrinza/node-ipc" "^9.2.5" - chalk "^4.1.2" - execa "^1.0.0" - joi "^17.4.0" - launch-editor "^2.2.1" - lru-cache "^6.0.0" - node-fetch "^2.6.7" - open "^8.0.2" - ora "^5.3.0" - read-pkg "^5.1.1" - semver "^7.3.4" - strip-ansi "^6.0.0" - "@vue/compiler-core@3.3.8": version "3.3.8" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.8.tgz#301bb60d0245265a88ed5b30e200fbf223acb313" @@ -9450,22 +9079,6 @@ "@vue/compiler-dom" "3.3.8" "@vue/shared" "3.3.8" -"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" - integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== - dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^7.0.36" - postcss-selector-parser "^6.0.2" - source-map "~0.6.1" - vue-template-es2015-compiler "^1.9.0" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" - "@vue/reactivity-transform@3.3.8": version "3.3.8" resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz#6d07649013b0be5c670f0ab6cc7ddd3150ad03f2" @@ -9522,35 +9135,7 @@ js-beautify "^1.14.9" vue-component-type-helpers "^1.8.21" -"@vue/vue-loader-v15@npm:vue-loader@^15.9.7": - version "15.11.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.11.1.tgz#dee91169211276ed43c5715caef88a56b1f497b0" - integrity sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q== - dependencies: - "@vue/component-compiler-utils" "^3.1.0" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" - -"@vue/vue3-jest@^29": - version "29.2.6" - resolved "https://registry.yarnpkg.com/@vue/vue3-jest/-/vue3-jest-29.2.6.tgz#2b32c61d99efa4e72a7d1365972dcf43b595b3f0" - integrity sha512-Hy4i2BsV5fUmER5LplYiAeRkLTDCSB3ZbnAeEawXtjto/ILaOnamBAoAvEqARgPpR6NRtiYjSgGKmllMtnFd9g== - dependencies: - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - chalk "^2.1.0" - convert-source-map "^1.6.0" - css-tree "^2.0.1" - source-map "0.5.6" - tsconfig "^7.0.0" - -"@vue/web-component-wrapper@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" - integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@^1.14.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -9616,7 +9201,7 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1", "@webassemblyjs/wasm-edit@^1.14.1": +"@webassemblyjs/wasm-edit@^1.12.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== @@ -9651,7 +9236,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@^1.14.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -9802,7 +9387,7 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -9821,26 +9406,26 @@ acorn-walk@^7.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.0, acorn-walk@^8.0.2: +acorn-walk@^8.0.2: version "8.3.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== -acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.0.0, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.0.5, acorn@^8.14.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - acorn@^8.1.0, acorn@^8.8.1: version "8.16.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== +acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + add-dom-event-listener@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" @@ -9853,11 +9438,6 @@ add-stream@^1.0.0: resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== -address@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" @@ -9959,7 +9539,7 @@ ansi-colors@4.1.3, ansi-colors@^4.1.1, ansi-colors@^4.1.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: +ansi-escapes@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -9988,11 +9568,6 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - ansi-regex@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" @@ -10099,7 +9674,7 @@ any-base@^1.1.0: resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== -any-promise@^1.0.0, any-promise@^1.1.0: +any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= @@ -10124,7 +9699,7 @@ aproba@2.0.0, "aproba@^1.0.3 || ^2.0.0": resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -arch@^2.1.1, arch@^2.2.0: +arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== @@ -10390,13 +9965,6 @@ async-validator@~1.11.3: resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.11.5.tgz#9d43cf49ef6bb76be5442388d19fb9a6e47597ea" integrity sha512-XNtCsMAeAH1pdLMEg1z8/Bb3a8cdCbui9QbJATRFHHHW5kT6+NPI3zSVQUXgikTFITzsg+kYY5NTWhM2Orwt9w== -async@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.2.0, async@^3.2.3, async@^3.2.4, async@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -10412,7 +9980,7 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@10.4.20, autoprefixer@^10.2.4: +autoprefixer@10.4.20: version "10.4.20" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== @@ -10495,22 +10063,17 @@ b4a@^1.6.4: resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== -babel-core@7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== +babel-eslint@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" + integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" babel-jest@^29, babel-jest@^29.7.0: version "29.7.0" @@ -10533,23 +10096,6 @@ babel-loader@9.1.3: find-cache-dir "^4.0.0" schema-utils "^4.0.0" -babel-loader@^8.2.2: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -10589,6 +10135,15 @@ babel-plugin-polyfill-corejs2@^0.4.14: "@babel/helper-define-polyfill-provider" "^0.6.5" semver "^6.3.1" +babel-plugin-polyfill-corejs2@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" + semver "^6.3.1" + babel-plugin-polyfill-corejs3@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" @@ -10605,6 +10160,14 @@ babel-plugin-polyfill-corejs3@^0.13.0: "@babel/helper-define-polyfill-provider" "^0.6.5" core-js-compat "^3.43.0" +babel-plugin-polyfill-corejs3@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" + core-js-compat "^3.48.0" + babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" @@ -10619,6 +10182,13 @@ babel-plugin-polyfill-regenerator@^0.6.5: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.5" +babel-plugin-polyfill-regenerator@^0.6.6: + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -10711,6 +10281,11 @@ base64id@2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== +baseline-browser-mapping@^2.10.12: + version "2.10.36" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.36.tgz#ff3c7c87095c70075b1ac787160fd4fc98750a74" + integrity sha512-lVq/Df7LXlO79MVaaUHztSwWiG9oXoWHlgvNS51v8Dpd4+G4/VIy6qYePTw31nAVls33nUtnfezYeLkYAak9dg== + baseline-browser-mapping@^2.8.25: version "2.8.31" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz#16c0f1814638257932e0486dbfdbb3348d0a5710" @@ -10846,7 +10421,7 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== -bluebird@^3.1.1, bluebird@^3.7.2: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -10879,7 +10454,7 @@ body-parser@1.20.3, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.0.11, bonjour-service@^1.2.1: +bonjour-service@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== @@ -10934,7 +10509,7 @@ browser-request@^0.3.3: resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" integrity sha1-ns5bWsqJopkyJC4Yv5M975h2zBc= -browserslist@^4.0.0, browserslist@^4.16.3, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.22.1, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4: +browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.22.1, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4: version "4.24.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -10955,6 +10530,17 @@ browserslist@^4.28.0: node-releases "^2.0.27" update-browserslist-db "^1.1.4" +browserslist@^4.28.1: + version "4.28.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" + integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== + dependencies: + baseline-browser-mapping "^2.10.12" + caniuse-lite "^1.0.30001782" + electron-to-chromium "^1.5.328" + node-releases "^2.0.36" + update-browserslist-db "^1.2.3" + bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -11238,7 +10824,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== @@ -11248,21 +10834,16 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001754: +caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001754: version "1.0.30001757" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz#a46ff91449c69522a462996c6aac4ef95d7ccc5e" integrity sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ== +caniuse-lite@^1.0.30001782: + version "1.0.30001799" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz#5c909138c27f1a61219d3e092071c1cc7d32dc55" + integrity sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw== + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -11276,11 +10857,6 @@ cargo-cp-artifact@^0.1.9: resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" integrity sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA== -case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -11310,7 +10886,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -11404,11 +10980,6 @@ chrono-node@2.6.2: dependencies: dayjs "^1.10.0" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -11434,13 +11005,6 @@ classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classna resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== -clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -11460,13 +11024,6 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-cursor@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" @@ -11474,18 +11031,6 @@ cli-cursor@^5.0.0: dependencies: restore-cursor "^5.0.0" -cli-highlight@^2.1.10: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - cli-progress@^3.10, cli-progress@^3.4.0, cli-progress@^3.9.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.10.0.tgz#63fd9d6343c598c93542fdfa3563a8b59887d78a" @@ -11570,16 +11115,7 @@ clipboard-copy@^4.0.1: resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-4.0.1.tgz#326ef9726d4ffe72d9a82a7bbe19379de692017d" integrity sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng== -clipboardy@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" - integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== - dependencies: - arch "^2.1.1" - execa "^1.0.0" - is-wsl "^2.1.1" - -cliui@^7.0.2, cliui@^7.0.4: +cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== @@ -11713,11 +11249,6 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" -colord@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" - integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== - colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -11771,16 +11302,6 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -11925,13 +11446,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" - integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== - dependencies: - bluebird "^3.1.1" - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -12017,7 +11531,7 @@ conventional-recommended-bump@7.0.1: git-semver-tags "^5.0.0" meow "^8.1.2" -convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -12075,19 +11589,7 @@ copy-webpack-plugin@12.0.2: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -copy-webpack-plugin@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b" - integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^11.0.3" - normalize-path "^3.0.0" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - -core-js-compat@^3.40.0, core-js-compat@^3.8.3: +core-js-compat@^3.40.0: version "3.41.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== @@ -12101,10 +11603,17 @@ core-js-compat@^3.43.0: dependencies: browserslist "^4.28.0" -core-js-pure@^3.43.0: - version "3.47.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.47.0.tgz#1104df8a3b6eb9189fcc559b5a65b90f66e7e887" - integrity sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw== +core-js-compat@^3.48.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== + dependencies: + browserslist "^4.28.1" + +core-js-pure@^3.48.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.49.0.tgz#ff8436b7251a3832f5fdbbe3e10f7f2e58e51fb1" + integrity sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw== core-js@^1.0.0: version "1.2.7" @@ -12116,7 +11625,7 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.34.0, core-js@^3.4.1, core-js@^3.6.5, core-js@^3.8.3: +core-js@^3.34.0, core-js@^3.4.1, core-js@^3.6.5: version "3.34.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.34.0.tgz#5705e6ad5982678612e96987d05b27c6c7c274a5" integrity sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag== @@ -12237,15 +11746,6 @@ cross-fetch@^3.0.2: dependencies: node-fetch "2.6.7" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" @@ -12291,11 +11791,6 @@ css-color-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - css-loader@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" @@ -12310,48 +11805,11 @@ css-loader@7.1.2: postcss-value-parser "^4.2.0" semver "^7.5.4" -css-loader@^6.5.0: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - css-mediaquery@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" integrity sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA= -css-minimizer-webpack-plugin@^3.0.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== - dependencies: - boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -12372,27 +11830,6 @@ css-to-react-native@3.2.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-tree@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -css-what@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== - css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" @@ -12403,62 +11840,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.0, cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - cssom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" @@ -12776,11 +12157,6 @@ dayjs@1.x, dayjs@^1.10.0, dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -12802,7 +12178,7 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.4.1: +debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -12926,11 +12302,6 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" - integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== - deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -13187,13 +12558,6 @@ dom-align@^1.7.0: resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -13207,15 +12571,6 @@ dom-scroll-into-view@1.x, dom-scroll-into-view@^1.2.0: resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" integrity sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4= -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" @@ -13230,7 +12585,7 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -13242,13 +12597,6 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -13256,15 +12604,6 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@^2.5.2, domutils@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - domutils@^3.0.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -13274,14 +12613,6 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.3" -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -13289,11 +12620,6 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - dotenv-expand@~11.0.6: version "11.0.7" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" @@ -13301,11 +12627,6 @@ dotenv-expand@~11.0.6: dependencies: dotenv "^16.4.5" -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - dotenv@^16.0.3: version "16.0.3" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" @@ -13343,11 +12664,6 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - duplexify@^4.0.0, duplexify@^4.1.1, duplexify@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" @@ -13363,11 +12679,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -easy-stack@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066" - integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w== - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -13418,6 +12729,11 @@ electron-to-chromium@^1.5.249: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz#c31eed591c6628908451c9ca0f0758ed514aa003" integrity sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ== +electron-to-chromium@^1.5.328: + version "1.5.371" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz#fa5684f2a514c57368823f9e75553f9a7c5ef0be" + integrity sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w== + electron-to-chromium@^1.5.73: version "1.5.79" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz#4424f23f319db7a653cf9ee76102e4ac283e6b3e" @@ -13622,13 +12938,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - dependencies: - stackframe "^1.1.1" - es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0: version "1.23.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" @@ -14023,14 +13332,13 @@ eslint-plugin-react@^7.15.1, eslint-plugin-react@^7.20.0: semver "^6.3.0" string.prototype.matchall "^4.0.6" -eslint-plugin-vue@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" - integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ== +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha512-ivpbtpUgg9SJS4TLjK7KdcDhqc/E3CGItsvQbBNLkNGUeMhd5qnJcryba/brESS+dg3vrLqPuc/UcS7jRJdN5A== dependencies: - natural-compare "^1.4.0" - semver "^5.6.0" - vue-eslint-parser "^7.0.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -14077,17 +13385,6 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-webpack-plugin@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - eslint@^7.21.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -14178,15 +13475,6 @@ eslint@^8.54.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -14217,7 +13505,7 @@ esquery@^1.4.0, esquery@^1.4.2: dependencies: estraverse "^5.1.0" -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -14261,11 +13549,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-pubsub@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" - integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== - event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" @@ -14339,19 +13622,6 @@ execa@^0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -14555,7 +13825,7 @@ fast-glob@3.3.2: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.0.3, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2, fast-glob@^3.3.3: +fast-glob@^3.0.3, fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -14676,13 +13946,6 @@ figures@3.2.0, figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -14742,7 +14005,7 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.1, find-cache-dir@^3.3.2: +find-cache-dir@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -15022,11 +14285,6 @@ fs-minipass@^3.0.0: dependencies: minipass "^7.0.3" -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -15461,7 +14719,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4, globby@^11.1.0: +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -15598,13 +14856,6 @@ gtoken@^8.0.0: gaxios "^7.0.0" jws "^4.0.0" -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -15697,16 +14948,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= - -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -15722,16 +14963,6 @@ hasown@^2.0.0, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -15844,60 +15075,16 @@ html-encoding-sniffer@^4.0.0: dependencies: whatwg-encoding "^3.1.1" -html-entities@^2.3.2, html-entities@^2.3.3, html-entities@^2.4.0, html-entities@^2.5.2: +html-entities@^2.3.3, html-entities@^2.4.0, html-entities@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== -html-escaper@^2.0.0, html-escaper@^2.0.2: +html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" - integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= - -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== - -html-webpack-plugin@^5.1.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - htmlparser2@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -16394,7 +15581,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1, ipaddr.js@^2.1.0: +ipaddr.js@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== @@ -16464,13 +15651,6 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -16514,18 +15694,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-file-esm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-file-esm/-/is-file-esm-1.0.0.tgz#987086b0f5a5318179e9d30f4f2f8d37321e1b5f" - integrity sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA== - dependencies: - read-pkg-up "^7.0.1" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -16990,11 +16158,6 @@ java@^0.18, java@^0.18.0: nan "^2.23.0" node-gyp "^11.5.0" -javascript-stringify@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" - integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== - jest-bench@^29: version "29.7.1" resolved "https://registry.yarnpkg.com/jest-bench/-/jest-bench-29.7.1.tgz#2fd94552d9c8f4a6df8351785b067cc052ec2b19" @@ -17384,7 +16547,7 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^27.0.2, jest-worker@^27.4.5: +jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -17393,15 +16556,6 @@ jest-worker@^27.0.2, jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" @@ -17444,7 +16598,7 @@ jmespath@0.16.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== -joi@^17.13.3, joi@^17.4.0: +joi@^17.13.3: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -17485,11 +16639,6 @@ js-md4@^0.3.2: resolved "https://registry.yarnpkg.com/js-md4/-/js-md4-0.3.2.tgz#cd3b3dc045b0c404556c81ddb5756c23e59d7cf5" integrity sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA== -js-message@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47" - integrity sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA== - js-object-pretty-print@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/js-object-pretty-print/-/js-object-pretty-print-0.3.0.tgz#4670e450066ee1eccf35174c7d197f5aa38bcf74" @@ -17620,7 +16769,7 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -17822,11 +16971,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" @@ -17844,14 +16988,7 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -launch-editor-middleware@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" - integrity sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg== - dependencies: - launch-editor "^2.2.1" - -launch-editor@^2.2.1, launch-editor@^2.6.0, launch-editor@^2.6.1: +launch-editor@^2.6.1: version "2.10.0" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.10.0.tgz#5ca3edfcb9667df1e8721310f3a40f1127d4bc42" integrity sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA== @@ -18133,11 +17270,6 @@ lightningcss@^1.32.0: lightningcss-win32-arm64-msvc "1.32.0" lightningcss-win32-x64-msvc "1.32.0" -lilconfig@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - lines-and-columns@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" @@ -18233,7 +17365,7 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-runner@^4.1.0, loader-runner@^4.2.0: +loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== @@ -18243,15 +17375,6 @@ loader-utils@3.3.1: resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -18313,11 +17436,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaultsdeep@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" - integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== - lodash.flow@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" @@ -18358,16 +17476,6 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= - -lodash.mapvalues@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -18388,17 +17496,12 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - lodash.upperfirst@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= -lodash@^3.10.1, lodash@^4.16.5, lodash@^4.17.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^3.10.1, lodash@^4.16.5, lodash@^4.17.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.23" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== @@ -18411,15 +17514,6 @@ log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -18487,14 +17581,6 @@ lru-cache@^11.1.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== -lru-cache@^4.0.1, lru-cache@^4.1.2: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -18581,7 +17667,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -18746,16 +17832,6 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -18766,13 +17842,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - memfs@^4.6.0: version "4.17.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.17.0.tgz#a3c4b5490b9b1e7df5d433adc163e08208ce7ca2" @@ -18827,13 +17896,6 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -18889,11 +17951,6 @@ mime@^3.0.0: resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -18929,7 +17986,7 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-css-extract-plugin@2.9.0, mini-css-extract-plugin@^2.5.3: +mini-css-extract-plugin@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== @@ -19166,7 +18223,7 @@ mkdirp@0.3.0: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= -mkdirp@^0.5.1, mkdirp@^0.5.6: +mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -19188,11 +18245,6 @@ modify-values@^1.0.1: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -module-alias@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.3.tgz#ec2e85c68973bda6ab71ce7c93b763ec96053221" - integrity sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q== - moment-range@*, moment-range@^4.0.1, moment-range@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/moment-range/-/moment-range-4.0.2.tgz#f7c3863df2a1ed7fd1822ba5a7bcf53a78701be9" @@ -19217,11 +18269,6 @@ mrmime@2.0.0: resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -19324,15 +18371,6 @@ mysql@^2.18.1: safe-buffer "5.1.2" sqlstring "2.3.1" -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - named-placeholders@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" @@ -19678,6 +18716,11 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== +node-releases@^2.0.36: + version "2.0.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.47.tgz#521bb2786da8eb140b748841c0b3b3a75334ffc4" + integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og== + nopt@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -19749,11 +18792,6 @@ normalize-package-data@^6.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -19764,11 +18802,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - npm-bundled@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" @@ -19998,7 +19031,7 @@ npmlog@^6.0.0: gauge "^4.0.0" set-blocking "^2.0.0" -nth-check@^2.0.0, nth-check@^2.0.1: +nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== @@ -20185,13 +19218,6 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -20224,7 +19250,7 @@ open@^7.3.1: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.0.2, open@^8.0.9, open@^8.4.0: +open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -20238,11 +19264,6 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - optimism@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" @@ -20291,7 +19312,7 @@ ora@5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@5.4.1, ora@^5.1.0, ora@^5.3.0: +ora@5.4.1, ora@^5.1.0: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -20429,14 +19450,6 @@ p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - p-retry@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" @@ -20576,14 +19589,6 @@ pako@^1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -20674,13 +19679,6 @@ parse5-html-rewriting-stream@7.0.0: parse5 "^7.0.0" parse5-sax-parser "^7.0.0" -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" @@ -20688,16 +19686,6 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^7.0.0: version "7.2.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" @@ -20964,11 +19952,6 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -21132,66 +20115,11 @@ pngjs@^4.0.1: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== -portfinder@^1.0.26: - version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== - dependencies: - async "^2.6.4" - debug "^3.2.7" - mkdirp "^0.5.6" - possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - postcss-loader@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.1.1.tgz#2822589e7522927344954acb55bbf26e8b195dfe" @@ -21201,76 +20129,17 @@ postcss-loader@8.1.1: jiti "^1.20.0" semver "^7.5.4" -postcss-loader@^6.1.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - postcss-media-query-parser@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0, postcss-modules-extract-imports@^3.1.0: +postcss-modules-extract-imports@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.3, postcss-modules-local-by-default@^4.0.5: +postcss-modules-local-by-default@^4.0.5: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== @@ -21279,7 +20148,7 @@ postcss-modules-local-by-default@^4.0.3, postcss-modules-local-by-default@^4.0.5 postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0, postcss-modules-scope@^3.2.0: +postcss-modules-scope@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== @@ -21293,100 +20162,6 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - postcss-selector-parser@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" @@ -21395,21 +20170,6 @@ postcss-selector-parser@^7.0.0: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" @@ -21433,15 +20193,7 @@ postcss@8.4.41: picocolors "^1.0.1" source-map-js "^1.2.0" -postcss@^7.0.36: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.2.14, postcss@^8.2.6, postcss@^8.2.8, postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.43: +postcss@^8.2.14, postcss@^8.2.8, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.43: version "8.5.3" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== @@ -21521,7 +20273,7 @@ prettier@^1.16.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -"prettier@^1.18.2 || ^2.0.0", prettier@^2.0.5: +prettier@^2.0.5: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== @@ -21531,14 +20283,6 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - pretty-format@30.2.0: version "30.2.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe" @@ -21597,15 +20341,6 @@ proggy@^3.0.0: resolved "https://registry.yarnpkg.com/proggy/-/proggy-3.0.0.tgz#874e91fed27fe00a511758e83216a6b65148bd6c" integrity sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q== -progress-webpack-plugin@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz#278f5c1afd21af783aad72c5ec95241520230fe5" - integrity sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA== - dependencies: - chalk "^2.1.0" - figures "^2.0.0" - log-update "^2.3.0" - progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -21756,11 +20491,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -22594,7 +21324,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -read-pkg@^5.1.1, read-pkg@^5.2.0: +read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== @@ -22801,22 +21531,6 @@ rehackt@^0.1.0: resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw== -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -22891,7 +21605,7 @@ resolve@1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.10: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.11" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== @@ -22900,6 +21614,16 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.17 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.11: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== + dependencies: + es-errors "^1.3.0" + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" @@ -22914,14 +21638,6 @@ response-iterator@^0.2.6: resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -23240,11 +21956,6 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -sax@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.5.0.tgz#b5549b671069b7aa392df55ec7574cf411179eb8" - integrity sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA== - saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -23259,16 +21970,7 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -23306,7 +22008,7 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^2.1.1, selfsigned@^2.4.1: +selfsigned@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== @@ -23334,7 +22036,7 @@ semver@7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@7.7.2, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: +semver@7.7.2, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2: version "7.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== @@ -23368,7 +22070,7 @@ seq-queue@^0.0.5: resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4= -serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: +serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -23622,15 +22324,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sirv@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" - integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^3.0.0" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -23835,7 +22528,7 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -23864,11 +22557,6 @@ source-map-support@0.5.21, source-map-support@^0.5.10, source-map-support@^0.5.1 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= - source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -24082,11 +22770,6 @@ ssri@^9.0.0: dependencies: minipass "^3.1.1" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -24104,11 +22787,6 @@ stackback@0.0.2: resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -24184,14 +22862,6 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -24280,13 +22950,6 @@ strip-ansi@^3.0.0: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -24335,11 +22998,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -24347,16 +23005,16 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -24392,14 +23050,6 @@ styled-components@6.1.12: stylis "4.3.2" tslib "2.6.2" -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - stylis@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" @@ -24468,24 +23118,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= - -svgo@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.2.tgz#8e99b7ba5ac9ed7e3a446063865f61e03223fe6b" - integrity sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA== - dependencies: - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - sax "^1.5.0" - stable "^0.1.8" - symbol-observable@4.0.0, symbol-observable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" @@ -24514,7 +23146,7 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -24669,7 +23301,7 @@ term-img@^4.0.0: ansi-escapes "^4.1.0" iterm2-version "^4.1.0" -terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.10: +terser-webpack-plugin@^5.3.10: version "5.3.11" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz#93c21f44ca86634257cac176f884f942b7ba3832" integrity sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ== @@ -24690,7 +23322,7 @@ terser@5.31.6: commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.10.0, terser@^5.31.1: +terser@^5.31.1: version "5.38.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.38.1.tgz#a18d83c8acf3175e847ab0b66839f3c318167c58" integrity sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA== @@ -24757,36 +23389,11 @@ textextensions@^2.5.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - thingies@^1.20.0: version "1.21.0" resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== -thread-loader@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-3.0.4.tgz#c392e4c0241fbc80430eb680e4886819b504a31b" - integrity sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA== - dependencies: - json-parse-better-errors "^1.0.2" - loader-runner "^4.1.0" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - thrift@0.20.0, thrift@^0.20.0, thrift@^0.9.3: version "0.20.0" resolved "https://registry.yarnpkg.com/thrift/-/thrift-0.20.0.tgz#b2dbeaaf7c2385aed2eba59d442c87f033fa8e5e" @@ -24965,11 +23572,6 @@ toml@^3.0.0: resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - tough-cookie@^4.1.2: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" @@ -25104,16 +23706,6 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" - integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== - dependencies: - "@types/strip-bom" "^3.0.0" - "@types/strip-json-comments" "0.0.30" - strip-bom "^3.0.0" - strip-json-comments "^2.0.0" - tslib@2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" @@ -25535,6 +24127,14 @@ update-browserslist-db@^1.1.4: escalade "^3.2.0" picocolors "^1.1.1" +update-browserslist-db@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -25618,11 +24218,6 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -25823,46 +24418,6 @@ vue-component-type-helpers@^1.8.21: resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-1.8.22.tgz#24c1f324885e5652c7bcc5d9cbd76800b0af3809" integrity sha512-LK3wJHs3vJxHG292C8cnsRusgyC5SEZDCzDCD01mdE/AoREFMl2tzLRuzwyuEsOIz13tqgBcnvysN3Lxsa14Fw== -vue-eslint-parser@^7.0.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" - integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg== - dependencies: - debug "^4.1.1" - eslint-scope "^5.1.1" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^6.3.0" - -vue-hot-reload-api@^2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" - integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== - -vue-loader@^17.0.0: - version "17.3.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-17.3.1.tgz#03b80e7f65727894ed6b29c65dd54ad215a40c38" - integrity sha512-nmVu7KU8geOyzsStyyaxID/uBGDMS8BkPXb6Lu2SNkMawriIbb+hYrNtgftHMKxOSkjjjTF5OSSwPo3KP59egg== - dependencies: - chalk "^4.1.0" - hash-sum "^2.0.0" - watchpack "^2.4.0" - -vue-style-loader@^4.1.0, vue-style-loader@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-template-es2015-compiler@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" - integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== - vue@^3.0: version "3.3.8" resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.8.tgz#532ff071af24f6a69e5ecc53a66858a9ee874ffc" @@ -25920,7 +24475,7 @@ watchpack@2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -watchpack@^2.4.0, watchpack@^2.4.1: +watchpack@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== @@ -25962,32 +24517,6 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-bundle-analyzer@^4.4.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" - integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - commander "^7.2.0" - debounce "^1.2.1" - escape-string-regexp "^4.0.0" - gzip-size "^6.0.0" - html-escaper "^2.0.2" - opener "^1.5.2" - picocolors "^1.0.0" - sirv "^2.0.3" - ws "^7.3.1" - -webpack-chain@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206" - integrity sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA== - dependencies: - deepmerge "^1.5.2" - javascript-stringify "^2.0.1" - webpack-dev-middleware@7.4.2, webpack-dev-middleware@^7.1.0: version "7.4.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz#40e265a3d3d26795585cff8207630d3a8ff05877" @@ -26000,17 +24529,6 @@ webpack-dev-middleware@7.4.2, webpack-dev-middleware@^7.1.0: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-middleware@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - webpack-dev-server@5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz#cb6ea47ff796b9251ec49a94f24a425e12e3c9b8" @@ -26047,42 +24565,6 @@ webpack-dev-server@5.0.4: webpack-dev-middleware "^7.1.0" ws "^8.16.0" -webpack-dev-server@^4.7.3: - version "4.15.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" - integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.4" - ws "^8.13.0" - webpack-merge@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" @@ -26092,15 +24574,6 @@ webpack-merge@6.0.1: flat "^5.0.2" wildcard "^2.0.1" -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - webpack-sources@^3.0.0, webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -26113,11 +24586,6 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -webpack-virtual-modules@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" - integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== - webpack@5.94.0: version "5.94.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" @@ -26147,35 +24615,6 @@ webpack@5.94.0: watchpack "^2.4.1" webpack-sources "^3.2.3" -webpack@^5.54.0: - version "5.97.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" - integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.6" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.14.0" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -26204,7 +24643,7 @@ whatwg-encoding@^3.1.1: dependencies: iconv-lite "0.6.3" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0, whatwg-fetch@^3.6.2: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: version "3.6.19" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== @@ -26341,7 +24780,7 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -wildcard@^2.0.0, wildcard@^2.0.1: +wildcard@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== @@ -26401,14 +24840,6 @@ workerpool@^9.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -26543,7 +24974,7 @@ ws@^8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== -ws@^8.13.0, ws@^8.16.0: +ws@^8.16.0: version "8.18.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== @@ -26635,11 +25066,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -26696,7 +25122,7 @@ yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.1, yargs@ y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^16.0.0, yargs@^16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -26742,16 +25168,6 @@ yoctocolors-cjs@^2.1.3: resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== -yorkie@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" - integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== - dependencies: - execa "^0.8.0" - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" - zen-observable-ts@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" From c250810fe7e601c1eed22b91b979401b97d309a8 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 12 Jun 2026 15:39:14 +0200 Subject: [PATCH 11/26] chore(client-react,client-dx): Migrate babel-eslint to @babel/eslint-parser babel-eslint has been deprecated since 2020 and was only resolving via hoisting from the legacy vue-cli toolkit until it was dropped. Use the maintained @babel/eslint-parser instead and declare it explicitly in both packages that reference it. --- packages/cubejs-client-dx/.eslintrc.js | 2 +- packages/cubejs-client-dx/package.json | 3 +- packages/cubejs-client-react/.eslintrc.js | 8 +++- packages/cubejs-client-react/package.json | 3 +- yarn.lock | 46 +++++++++++------------ 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/packages/cubejs-client-dx/.eslintrc.js b/packages/cubejs-client-dx/.eslintrc.js index 341ab49edc8e6..947ccc6f5d58a 100644 --- a/packages/cubejs-client-dx/.eslintrc.js +++ b/packages/cubejs-client-dx/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { plugins: [ 'import' ], - parser: 'babel-eslint', + parser: '@babel/eslint-parser', rules: { 'max-classes-per-file': 0, 'prefer-object-spread': 0, diff --git a/packages/cubejs-client-dx/package.json b/packages/cubejs-client-dx/package.json index 1f5620774bd76..59b1db89dcdef 100644 --- a/packages/cubejs-client-dx/package.json +++ b/packages/cubejs-client-dx/package.json @@ -26,7 +26,8 @@ ], "license": "MIT", "devDependencies": { - "@babel/core": "^7.3.3", + "@babel/core": "^7.13.8", + "@babel/eslint-parser": "^7", "@babel/preset-env": "^7.3.1", "@types/jest": "^29", "babel-jest": "^29", diff --git a/packages/cubejs-client-react/.eslintrc.js b/packages/cubejs-client-react/.eslintrc.js index 6485a14bbe6a6..21f61bfbb9bec 100644 --- a/packages/cubejs-client-react/.eslintrc.js +++ b/packages/cubejs-client-react/.eslintrc.js @@ -1,7 +1,13 @@ module.exports = { extends: 'airbnb', plugins: ['react', 'jsx-a11y', 'import'], - parser: 'babel-eslint', + parser: '@babel/eslint-parser', + parserOptions: { + requireConfigFile: false, + babelOptions: { + parserOpts: { plugins: ['jsx'] }, + }, + }, rules: { 'object-curly-newline': 0, 'react/jsx-no-bind': 0, diff --git a/packages/cubejs-client-react/package.json b/packages/cubejs-client-react/package.json index c57d3518d1e36..b0c8bfe3ab0a3 100644 --- a/packages/cubejs-client-react/package.json +++ b/packages/cubejs-client-react/package.json @@ -29,9 +29,10 @@ "ramda": "^0.27.2" }, "devDependencies": { + "@babel/core": "^7.13.8", + "@babel/eslint-parser": "^7", "@types/ramda": "^0.27.40", "@types/react": "^16.9.41", - "babel-eslint": "^9.0.0", "eslint": "^7.21.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-airbnb-base": "^14.0.0", diff --git a/yarn.lock b/yarn.lock index b51aeaf1fd28d..688569322a66f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1446,6 +1446,15 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/eslint-parser@^7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz#272cc7531972ff45bc0db96c45349cb7304d21e1" + integrity sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + "@babel/generator@7.26.10": version "7.26.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.10.tgz#a60d9de49caca16744e6340c3658dfef6138c3f7" @@ -1650,7 +1659,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24", "@babel/parser@^7.25.0", "@babel/parser@^7.26.10", "@babel/parser@^7.29.0", "@babel/parser@^7.29.7": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24", "@babel/parser@^7.25.0", "@babel/parser@^7.26.10", "@babel/parser@^7.29.0", "@babel/parser@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== @@ -2550,7 +2559,7 @@ "@babel/parser" "^7.29.7" "@babel/types" "^7.29.7" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.24", "@babel/traverse@^7.25.2", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8", "@babel/traverse@^7.29.7": +"@babel/traverse@^7.24", "@babel/traverse@^7.25.2", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.8", "@babel/traverse@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== @@ -4812,6 +4821,13 @@ resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-18.2.19.tgz#b5ba332a47bdf8660abbfb5369f2d4d0588bfefc" integrity sha512-bExj5JrByKPibsqBbn5Pjn8lo91AUOTsyP2hgKpnOnmSr62rhWSiRwXltgz2MCiZRmuUznpt93WiOLixgYfYvQ== +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodable/entities@2.1.0", "@nodable/entities@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-2.1.0.tgz#f543e5c6446720d4cf9e498a83019dd159973bc2" @@ -10063,18 +10079,6 @@ b4a@^1.6.4: resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== -babel-eslint@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" - integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - babel-jest@^29, babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -13332,14 +13336,6 @@ eslint-plugin-react@^7.15.1, eslint-plugin-react@^7.20.0: semver "^6.3.0" string.prototype.matchall "^4.0.6" -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha512-ivpbtpUgg9SJS4TLjK7KdcDhqc/E3CGItsvQbBNLkNGUeMhd5qnJcryba/brESS+dg3vrLqPuc/UcS7jRJdN5A== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -13370,12 +13366,12 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -13505,7 +13501,7 @@ esquery@^1.4.0, esquery@^1.4.2: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== From 99eddb2d26b6b01e2e6abccec185bb65da9bb681 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 18 Jun 2026 22:37:23 +0200 Subject: [PATCH 12/26] feat(cubestore): Upgrade docker image to Debian trixie and LLVM 22 --- .github/workflows/publish.yml | 2 +- .github/workflows/rust-cubestore-master.yml | 2 +- .github/workflows/rust-cubestore.yml | 4 ++-- rust/cubestore/CLAUDE.md | 6 +++--- rust/cubestore/Dockerfile | 6 +++--- rust/cubestore/builder.Dockerfile | 16 +++++++-------- rust/cubestore/docker-bake.hcl | 22 ++++++++++----------- 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1c9fea2ad1fdf..92d806deee2b3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -729,7 +729,7 @@ jobs: run: vcpkg integrate install; vcpkg install openssl:x64-windows - name: Instal LLVM for Windows if: ${{ startsWith(matrix.os, 'windows') }} - run: choco install -y --force llvm --version 18.1.6 + run: choco install -y --force llvm --version 22.1.0 - name: Set Env Variables for Windows uses: allenevans/set-env@v4.0.0 if: ${{ startsWith(matrix.os, 'windows') }} diff --git a/.github/workflows/rust-cubestore-master.yml b/.github/workflows/rust-cubestore-master.yml index d80cb7a336fa5..88dbace7749e9 100644 --- a/.github/workflows/rust-cubestore-master.yml +++ b/.github/workflows/rust-cubestore-master.yml @@ -211,7 +211,7 @@ jobs: run: vcpkg integrate install; vcpkg install openssl:x64-windows - name: Instal LLVM for Windows if: ${{ startsWith(matrix.os, 'windows') }} - run: choco install -y --force llvm --version 18.1.6 + run: choco install -y --force llvm --version 22.1.0 - name: Set Env Variables for Windows uses: allenevans/set-env@v4.0.0 if: ${{ startsWith(matrix.os, 'windows') }} diff --git a/.github/workflows/rust-cubestore.yml b/.github/workflows/rust-cubestore.yml index 4e15b958e2ffb..6e55bee599df1 100644 --- a/.github/workflows/rust-cubestore.yml +++ b/.github/workflows/rust-cubestore.yml @@ -28,7 +28,7 @@ jobs: matrix: rust: [nightly-2025-08-01] container: - image: cubejs/rust-builder:bookworm-llvm-18 + image: cubejs/rust-builder:trixie-llvm-22 env: RUST: ${{ matrix.rust }} steps: @@ -150,7 +150,7 @@ jobs: run: vcpkg integrate install; vcpkg install openssl:x64-windows - name: Instal LLVM for Windows if: ${{ startsWith(matrix.os, 'windows') }} - run: choco install -y --force llvm --version 18.1.6 + run: choco install -y --force llvm --version 22.1.0 - name: Set Env Variables for Windows uses: allenevans/set-env@v4.0.0 if: ${{ startsWith(matrix.os, 'windows') }} diff --git a/rust/cubestore/CLAUDE.md b/rust/cubestore/CLAUDE.md index 8ed13d4deeaf0..0a10da86ce11a 100644 --- a/rust/cubestore/CLAUDE.md +++ b/rust/cubestore/CLAUDE.md @@ -143,8 +143,8 @@ The codebase uses a custom dependency injection system defined in `config/inject The project includes Docker configurations for building and deploying CubeStore: -- **`builder.Dockerfile`**: Defines the base build image with Rust nightly-2025-08-01, LLVM 18, and build dependencies -- **`Dockerfile`**: Production Dockerfile that uses `cubejs/rust-builder:bookworm-llvm-18` base image and copies rust-toolchain.toml +- **`builder.Dockerfile`**: Defines the base build image with Rust nightly-2025-08-01, LLVM 22, and build dependencies +- **`Dockerfile`**: Production Dockerfile that uses `cubejs/rust-builder:trixie-llvm-22` base image (Debian 13 trixie) and copies rust-toolchain.toml - **GitHub Actions**: Multiple CI/CD workflows use the same Rust version ## Updating Rust Version @@ -156,4 +156,4 @@ When updating the Rust version, ensure ALL these files are kept in sync: 3. **`Dockerfile`** - Copies rust-toolchain.toml (no manual update needed if builder image is updated) 4. **GitHub Workflows** - Update all occurrences of the Rust nightly version in `.github/workflows/` directory -**Note**: The `cubejs/rust-builder:bookworm-llvm-18` Docker image tag may also need updating if the builder.Dockerfile changes significantly. +**Note**: The `cubejs/rust-builder:trixie-llvm-22` Docker image tag may also need updating if the builder.Dockerfile changes significantly. diff --git a/rust/cubestore/Dockerfile b/rust/cubestore/Dockerfile index f8c9bef78976d..451b91304601f 100644 --- a/rust/cubestore/Dockerfile +++ b/rust/cubestore/Dockerfile @@ -1,4 +1,4 @@ -FROM cubejs/rust-builder:bookworm-llvm-18 AS builder +FROM cubejs/rust-builder:trixie-llvm-22 AS builder WORKDIR /build/cubestore @@ -28,13 +28,13 @@ COPY cubestore/cubestore cubestore RUN [ "$WITH_AVX2" -eq "1" ] && export RUSTFLAGS="-C target-feature=+avx2"; \ cargo build --release -p cubestore -FROM debian:bookworm-slim +FROM debian:trixie-slim WORKDIR /cube RUN set -ex; \ apt-get update; \ - apt-get install -y libssl3 ca-certificates + apt-get install -y libssl3t64 ca-certificates COPY --from=builder /build/cubestore/target/release/cubestored . diff --git a/rust/cubestore/builder.Dockerfile b/rust/cubestore/builder.Dockerfile index 0f0a424703028..87f74088036d0 100644 --- a/rust/cubestore/builder.Dockerfile +++ b/rust/cubestore/builder.Dockerfile @@ -1,10 +1,10 @@ -ARG RUST_TAG=bookworm-slim -ARG OS_NAME=bookworm +ARG RUST_TAG=trixie-slim +ARG OS_NAME=trixie FROM rust:$RUST_TAG AS base -ARG OS_NAME=bookworm -ARG LLVM_VERSION=18 +ARG OS_NAME=trixie +ARG LLVM_VERSION=22 RUN rustup update && \ rustup default nightly-2025-08-01 && \ @@ -12,11 +12,9 @@ RUN rustup update && \ RUN apt update \ && apt upgrade -y \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y software-properties-common libssl-dev pkg-config wget gnupg git apt-transport-https ca-certificates \ - && wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \ - # https://github.com/llvm/llvm-project/issues/62475 \ - && add-apt-repository --yes "deb https://apt.llvm.org/$OS_NAME/ llvm-toolchain-$OS_NAME-$LLVM_VERSION main" \ - && add-apt-repository --yes "deb https://apt.llvm.org/$OS_NAME/ llvm-toolchain-$OS_NAME-$LLVM_VERSION main" \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y libssl-dev pkg-config wget gnupg git apt-transport-https ca-certificates \ + && wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /usr/share/keyrings/llvm-snapshot.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/llvm-snapshot.gpg] https://apt.llvm.org/$OS_NAME/ llvm-toolchain-$OS_NAME-$LLVM_VERSION main" > /etc/apt/sources.list.d/llvm.list \ && apt update \ && apt install -y git llvm-$LLVM_VERSION clang-$LLVM_VERSION libclang-$LLVM_VERSION-dev clang-$LLVM_VERSION lld-$LLVM_VERSION cmake \ && rm -rf /var/lib/apt/lists/*; diff --git a/rust/cubestore/docker-bake.hcl b/rust/cubestore/docker-bake.hcl index 87076611bf1fe..55923c025fe1f 100644 --- a/rust/cubestore/docker-bake.hcl +++ b/rust/cubestore/docker-bake.hcl @@ -1,25 +1,25 @@ -# EOL LTS 2028-06-30 -target "rust-builder-bookworm" { +# EOL LTS 2030-06-30 +target "rust-builder-trixie" { context = "." dockerfile = "builder.Dockerfile" args = { - RUST_TAG = "1-slim-bookworm" - OS_NAME = "bookworm" - LLVM_VERSION = "18" + RUST_TAG = "1-slim-trixie" + OS_NAME = "trixie" + LLVM_VERSION = "22" } - tags = ["cubejs/rust-builder:bookworm-llvm-18"] + tags = ["cubejs/rust-builder:trixie-llvm-22"] platforms = ["linux/amd64", "linux/arm64"] } -# EOL LTS 2026-08-31 -target "rust-builder-bullseye" { +# EOL LTS 2028-06-30 +target "rust-builder-bookworm" { context = "." dockerfile = "builder.Dockerfile" args = { - RUST_TAG = "1-slim-bullseye" - OS_NAME = "bullseye" + RUST_TAG = "1-slim-bookworm" + OS_NAME = "bookworm" LLVM_VERSION = "18" } - tags = ["cubejs/rust-builder:bullseye-llvm-18"] + tags = ["cubejs/rust-builder:bookworm-llvm-18"] platforms = ["linux/amd64", "linux/arm64"] } From 4554d3399971c68b458f2d674eef6c0b58d6e2d8 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 18 Jun 2026 23:05:49 +0200 Subject: [PATCH 13/26] feat(docker)!: Upgrade Python from 3.11 to 3.13 BREAKING CHANGE: Users who install custom Python packages into the Cube image (e.g. for Python/Jinja data models) must target Python 3.13. Packages built for 3.11 will not load. --- .github/workflows/master.yml | 8 ++++---- .github/workflows/push.yml | 8 ++++---- packages/cubejs-docker/dev.Dockerfile | 4 ++-- packages/cubejs-docker/latest-debian-jdk.Dockerfile | 4 ++-- packages/cubejs-docker/latest.Dockerfile | 4 ++-- packages/cubejs-docker/local.Dockerfile | 2 +- packages/cubejs-docker/testing-drivers.Dockerfile | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 555c390366e80..ab0c6d65571d5 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -45,7 +45,7 @@ jobs: timeout-minutes: 60 name: Build Linux Native backend for Dev image container: - image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-3.11 + image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-3.13 steps: - name: Checkout @@ -77,14 +77,14 @@ jobs: run: npm install -g cargo-cp-artifact@0.1 - name: Build native (with Python) env: - PYO3_PYTHON: python3.11 + PYO3_PYTHON: python3.13 CARGO_BUILD_TARGET: x86_64-unknown-linux-gnu working-directory: ./packages/cubejs-backend-native run: yarn run native:build-debug-python - name: Store build artifact for dev image uses: actions/upload-artifact@v4 with: - name: "native-linux-x64-glibc-3.11.node" # this name is referenced below in docker-image-dev + name: "native-linux-x64-glibc-3.13.node" # this name is referenced below in docker-image-dev path: ./packages/cubejs-backend-native/index.node overwrite: true @@ -99,7 +99,7 @@ jobs: - name: Download backend-native artifact uses: actions/download-artifact@v4 with: - name: "native-linux-x64-glibc-3.11.node" # this name is referenced in above in native_linux + name: "native-linux-x64-glibc-3.13.node" # this name is referenced in above in native_linux path: ./packages/cubejs-backend-native/ - name: Login to DockerHub uses: docker/login-action@v3 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index c467fdb216408..941f3504aecc1 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -40,7 +40,7 @@ on: env: # Current user version for Python. Should be aligned between build-native & docker-dev - PYTHON_VERSION_CURRENT: 3.11 + PYTHON_VERSION_CURRENT: 3.13 jobs: latest-tag-sha: @@ -80,7 +80,7 @@ jobs: # node-version: [24.x, 26.x] node-version: [24.x] # Don't forget to update build-native-release - python-version: [3.11] + python-version: [3.13] fail-fast: false steps: @@ -266,7 +266,7 @@ jobs: strategy: matrix: # Don't forget to align with PYTHON_VERSION_CURRENT - python-version: [ 3.11 ] + python-version: [ 3.13 ] fail-fast: false container: image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-${{ matrix.python-version }} @@ -532,7 +532,7 @@ jobs: strategy: matrix: node-version: [ 24.x ] - python-version: [ 3.11 ] + python-version: [ 3.13 ] use_tesseract_sql_planner: [ true, false ] fail-fast: false diff --git a/packages/cubejs-docker/dev.Dockerfile b/packages/cubejs-docker/dev.Dockerfile index 06f4de3e8f37b..fc9595516ee3e 100644 --- a/packages/cubejs-docker/dev.Dockerfile +++ b/packages/cubejs-docker/dev.Dockerfile @@ -10,7 +10,7 @@ RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp && apt-get install -y --no-install-recommends libssl3 curl \ - cmake python3 python3.11 libpython3.11-dev gcc g++ make cmake openjdk-17-jdk-headless \ + cmake python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-17-jdk-headless \ && rm -rf /var/lib/apt/lists/* ENV RUSTUP_HOME=/usr/local/rustup @@ -171,7 +171,7 @@ FROM base AS final ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ - && apt-get install -y ca-certificates python3.11 libpython3.11-dev \ + && apt-get install -y ca-certificates python3.13 libpython3.13-dev \ && apt-get clean COPY --from=build /cubejs . diff --git a/packages/cubejs-docker/latest-debian-jdk.Dockerfile b/packages/cubejs-docker/latest-debian-jdk.Dockerfile index 832cc16054fa2..b2f640845fea1 100644 --- a/packages/cubejs-docker/latest-debian-jdk.Dockerfile +++ b/packages/cubejs-docker/latest-debian-jdk.Dockerfile @@ -12,7 +12,7 @@ RUN yarn config set network-timeout 120000 -g RUN apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp # libpython3-dev is needed to trigger post-installer to download native with python - && apt-get install -y python3 python3.11 libpython3.11-dev gcc g++ make cmake openjdk-17-jdk-headless \ + && apt-get install -y python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-17-jdk-headless \ && rm -rf /var/lib/apt/lists/* # We are copying root yarn.lock file to the context folder during the Publish GH @@ -32,7 +32,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN groupadd cube && useradd -ms /bin/bash -g cube cube \ && DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 openjdk-17-jre-headless python3.11 libpython3.11-dev \ + && apt-get install -y --no-install-recommends libssl3 openjdk-17-jre-headless python3.13 libpython3.13-dev \ && rm -rf /var/lib/apt/lists/* \ && mkdir cube \ && chown -R cube:cube /tmp /cube /usr diff --git a/packages/cubejs-docker/latest.Dockerfile b/packages/cubejs-docker/latest.Dockerfile index 80a5419a26c6e..1f4b424311338 100644 --- a/packages/cubejs-docker/latest.Dockerfile +++ b/packages/cubejs-docker/latest.Dockerfile @@ -11,7 +11,7 @@ RUN yarn config set network-timeout 120000 -g RUN apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp # libpython3-dev is needed to trigger post-installer to download native with python - && apt-get install -y python3 python3.11 libpython3.11-dev gcc g++ make cmake ca-certificates \ + && apt-get install -y python3 python3.13 libpython3.13-dev gcc g++ make cmake ca-certificates \ && rm -rf /var/lib/apt/lists/* # We are copying root yarn.lock file to the context folder during the Publish GH @@ -30,7 +30,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 python3.11 libpython3.11-dev \ + && apt-get install -y --no-install-recommends libssl3 python3.13 libpython3.13-dev \ && rm -rf /var/lib/apt/lists/* RUN yarn policies set-version v1.22.22 diff --git a/packages/cubejs-docker/local.Dockerfile b/packages/cubejs-docker/local.Dockerfile index 58e44a6c350b6..1c880c61a7185 100644 --- a/packages/cubejs-docker/local.Dockerfile +++ b/packages/cubejs-docker/local.Dockerfile @@ -11,7 +11,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp - && apt-get install -y --no-install-recommends libssl3 python3 python3.11 libpython3.11-dev ca-certificates \ + && apt-get install -y --no-install-recommends libssl3 python3 python3.13 libpython3.13-dev ca-certificates \ && rm -rf /var/lib/apt/lists/* ENV NODE_ENV=production diff --git a/packages/cubejs-docker/testing-drivers.Dockerfile b/packages/cubejs-docker/testing-drivers.Dockerfile index cb6a5af43016b..c04b55a289c24 100644 --- a/packages/cubejs-docker/testing-drivers.Dockerfile +++ b/packages/cubejs-docker/testing-drivers.Dockerfile @@ -167,7 +167,7 @@ FROM base AS final ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ - && apt-get install -y ca-certificates python3.11 libpython3.11-dev \ + && apt-get install -y ca-certificates python3.13 libpython3.13-dev \ && apt-get clean COPY --from=build /cubejs . From edd44c7eb68d088da85d204cc326d58fb9b4a99d Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 18 Jun 2026 23:09:28 +0200 Subject: [PATCH 14/26] feat(docker)!: Upgrade OpenJDK from 17 to 21 BREAKING CHANGE: The -jdk image now runs Java 21. JDBC drivers and custom JARs must be compatible with OpenJDK 21. --- packages/cubejs-docker/dev.Dockerfile | 2 +- packages/cubejs-docker/latest-debian-jdk.Dockerfile | 4 ++-- packages/cubejs-docker/testing-drivers.Dockerfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cubejs-docker/dev.Dockerfile b/packages/cubejs-docker/dev.Dockerfile index fc9595516ee3e..f16b67b616535 100644 --- a/packages/cubejs-docker/dev.Dockerfile +++ b/packages/cubejs-docker/dev.Dockerfile @@ -10,7 +10,7 @@ RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp && apt-get install -y --no-install-recommends libssl3 curl \ - cmake python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-17-jdk-headless \ + cmake python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-21-jdk-headless \ && rm -rf /var/lib/apt/lists/* ENV RUSTUP_HOME=/usr/local/rustup diff --git a/packages/cubejs-docker/latest-debian-jdk.Dockerfile b/packages/cubejs-docker/latest-debian-jdk.Dockerfile index b2f640845fea1..28c014f1297b0 100644 --- a/packages/cubejs-docker/latest-debian-jdk.Dockerfile +++ b/packages/cubejs-docker/latest-debian-jdk.Dockerfile @@ -12,7 +12,7 @@ RUN yarn config set network-timeout 120000 -g RUN apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp # libpython3-dev is needed to trigger post-installer to download native with python - && apt-get install -y python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-17-jdk-headless \ + && apt-get install -y python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-21-jdk-headless \ && rm -rf /var/lib/apt/lists/* # We are copying root yarn.lock file to the context folder during the Publish GH @@ -32,7 +32,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN groupadd cube && useradd -ms /bin/bash -g cube cube \ && DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 openjdk-17-jre-headless python3.13 libpython3.13-dev \ + && apt-get install -y --no-install-recommends libssl3 openjdk-21-jre-headless python3.13 libpython3.13-dev \ && rm -rf /var/lib/apt/lists/* \ && mkdir cube \ && chown -R cube:cube /tmp /cube /usr diff --git a/packages/cubejs-docker/testing-drivers.Dockerfile b/packages/cubejs-docker/testing-drivers.Dockerfile index c04b55a289c24..6326523e91318 100644 --- a/packages/cubejs-docker/testing-drivers.Dockerfile +++ b/packages/cubejs-docker/testing-drivers.Dockerfile @@ -13,7 +13,7 @@ ENV CI=0 RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ && apt-get install -y --no-install-recommends libssl3 curl \ - cmake python3 gcc g++ make cmake openjdk-17-jdk-headless unzip \ + cmake python3 gcc g++ make cmake openjdk-21-jdk-headless unzip \ && rm -rf /var/lib/apt/lists/* ENV CUBESTORE_SKIP_POST_INSTALL=true From 92c3e1098b46b2c7cebbe94a476bbce45497a589 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 18 Jun 2026 23:11:07 +0200 Subject: [PATCH 15/26] feat(docker): Upgrade Debian to Trixie --- packages/cubejs-docker/dev.Dockerfile | 4 ++-- packages/cubejs-docker/latest-debian-jdk.Dockerfile | 6 +++--- packages/cubejs-docker/latest.Dockerfile | 6 +++--- packages/cubejs-docker/local.Dockerfile | 4 ++-- packages/cubejs-docker/testing-drivers.Dockerfile | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/cubejs-docker/dev.Dockerfile b/packages/cubejs-docker/dev.Dockerfile index f16b67b616535..53d5df9220610 100644 --- a/packages/cubejs-docker/dev.Dockerfile +++ b/packages/cubejs-docker/dev.Dockerfile @@ -1,4 +1,4 @@ -FROM node:24.16.0-bookworm-slim AS base +FROM node:24.16.0-trixie-slim AS base ARG IMAGE_VERSION=dev @@ -9,7 +9,7 @@ ENV CI=0 RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp - && apt-get install -y --no-install-recommends libssl3 curl \ + && apt-get install -y --no-install-recommends libssl3t64 curl \ cmake python3 python3.13 libpython3.13-dev gcc g++ make cmake openjdk-21-jdk-headless \ && rm -rf /var/lib/apt/lists/* diff --git a/packages/cubejs-docker/latest-debian-jdk.Dockerfile b/packages/cubejs-docker/latest-debian-jdk.Dockerfile index 28c014f1297b0..4fee461b4d159 100644 --- a/packages/cubejs-docker/latest-debian-jdk.Dockerfile +++ b/packages/cubejs-docker/latest-debian-jdk.Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile-upstream:master-experimental -FROM node:24.16.0-bookworm-slim AS builder +FROM node:24.16.0-trixie-slim AS builder WORKDIR /cube COPY . . @@ -22,7 +22,7 @@ RUN yarn install --prod \ && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean -FROM node:24.16.0-bookworm-slim +FROM node:24.16.0-trixie-slim ARG IMAGE_VERSION=unknown @@ -32,7 +32,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN groupadd cube && useradd -ms /bin/bash -g cube cube \ && DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 openjdk-21-jre-headless python3.13 libpython3.13-dev \ + && apt-get install -y --no-install-recommends libssl3t64 openjdk-21-jre-headless python3.13 libpython3.13-dev \ && rm -rf /var/lib/apt/lists/* \ && mkdir cube \ && chown -R cube:cube /tmp /cube /usr diff --git a/packages/cubejs-docker/latest.Dockerfile b/packages/cubejs-docker/latest.Dockerfile index 1f4b424311338..6cbc6d90973ef 100644 --- a/packages/cubejs-docker/latest.Dockerfile +++ b/packages/cubejs-docker/latest.Dockerfile @@ -1,4 +1,4 @@ -FROM node:24.16.0-bookworm-slim AS builder +FROM node:24.16.0-trixie-slim AS builder WORKDIR /cube COPY . . @@ -21,7 +21,7 @@ RUN yarn install --prod \ && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean -FROM node:24.16.0-bookworm-slim +FROM node:24.16.0-trixie-slim ARG IMAGE_VERSION=unknown @@ -30,7 +30,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 python3.13 libpython3.13-dev \ + && apt-get install -y --no-install-recommends libssl3t64 python3.13 libpython3.13-dev \ && rm -rf /var/lib/apt/lists/* RUN yarn policies set-version v1.22.22 diff --git a/packages/cubejs-docker/local.Dockerfile b/packages/cubejs-docker/local.Dockerfile index 1c880c61a7185..0f1daa5651c7b 100644 --- a/packages/cubejs-docker/local.Dockerfile +++ b/packages/cubejs-docker/local.Dockerfile @@ -1,7 +1,7 @@ ARG DEV_BUILD_IMAGE=cubejs/cube:build FROM $DEV_BUILD_IMAGE AS build -FROM node:24.16.0-bookworm-slim +FROM node:24.16.0-trixie-slim ARG IMAGE_VERSION=dev @@ -11,7 +11,7 @@ ENV CUBEJS_DOCKER_IMAGE_TAG=latest RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ # python3 package is necessary to install `python3` executable for node-gyp - && apt-get install -y --no-install-recommends libssl3 python3 python3.13 libpython3.13-dev ca-certificates \ + && apt-get install -y --no-install-recommends libssl3t64 python3 python3.13 libpython3.13-dev ca-certificates \ && rm -rf /var/lib/apt/lists/* ENV NODE_ENV=production diff --git a/packages/cubejs-docker/testing-drivers.Dockerfile b/packages/cubejs-docker/testing-drivers.Dockerfile index 6326523e91318..e50fedd002981 100644 --- a/packages/cubejs-docker/testing-drivers.Dockerfile +++ b/packages/cubejs-docker/testing-drivers.Dockerfile @@ -1,7 +1,7 @@ ###################################################################### # Base image # ###################################################################### -FROM node:24.16.0-bookworm-slim AS base +FROM node:24.16.0-trixie-slim AS base ARG IMAGE_VERSION=dev @@ -12,7 +12,7 @@ ENV CI=0 RUN DEBIAN_FRONTEND=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends libssl3 curl \ + && apt-get install -y --no-install-recommends libssl3t64 curl \ cmake python3 gcc g++ make cmake openjdk-21-jdk-headless unzip \ && rm -rf /var/lib/apt/lists/* From 8fb29baaefc49ccd4b003c1a71cc15508695e084 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 12:20:04 +0200 Subject: [PATCH 16/26] feat(tesseract)!: Enable Tesseract planner and pre-aggregations by default Tesseract is now the default SQL planner. CUBEJS_TESSERACT_SQL_PLANNER defaults to true (TS env + Rust cubesql config); explicitly disabling it falls back to the legacy planner and emits a one-time deprecation warning, since the legacy planner will be removed in the near future. Tesseract pre-aggregation planning is no longer independently configurable: the CUBEJS_TESSERACT_PRE_AGGREGATIONS env var is dropped, and pre-aggregation planning now follows CUBEJS_TESSERACT_SQL_PLANNER. BaseQuery still honors neverUseSqlPlannerPreaggregation() so CubeStoreQuery stays opted out for correctness (HLL/multi-stage). --- .github/workflows/drivers-tests.yml | 22 ++++---- .github/workflows/push.yml | 8 ++- CLAUDE.md | 2 +- .../data-modeling/concepts/calendar-cubes.mdx | 3 +- docs-mintlify/docs/data-modeling/measures.mdx | 4 +- .../docs/data-modeling/multi-fact-views.mdx | 4 +- .../matching-pre-aggregations.mdx | 5 +- .../data-modeling/period-over-period.mdx | 3 +- .../recipes/data-modeling/share-of-total.mdx | 4 +- docs-mintlify/recipes/data-modeling/xirr.mdx | 3 +- .../configuration/environment-variables.mdx | 16 +++--- .../reference/data-modeling/dimensions.mdx | 3 +- .../reference/data-modeling/measures.mdx | 10 ++-- .../reference/environment-variables.mdx | 16 +++--- .../data-modeling/concepts/calendar-cubes.mdx | 3 +- .../concepts/multi-fact-queries.mdx | 3 +- .../concepts/multi-stage-calculations.mdx | 3 +- .../recipes/period-over-period.mdx | 3 +- .../product/data-modeling/recipes/xirr.mdx | 3 +- .../data-modeling/reference/measures.mdx | 7 +-- .../reference/types-and-formats.mdx | 6 +-- packages/cubejs-backend-shared/src/env.ts | 17 ++++-- .../src/adapter/BaseQuery.js | 10 ++-- .../pre-aggregations-string-measure.test.ts | 2 +- .../postgres/pre-aggregations.test.ts | 2 +- .../__snapshots__/smoke-cubesql.test.ts.snap | 54 +++++++++---------- rust/cubesql/cubesql/src/config/mod.rs | 2 +- 27 files changed, 96 insertions(+), 122 deletions(-) diff --git a/.github/workflows/drivers-tests.yml b/.github/workflows/drivers-tests.yml index 588b9fb4d6fc2..e7454ff7043cc 100644 --- a/.github/workflows/drivers-tests.yml +++ b/.github/workflows/drivers-tests.yml @@ -62,7 +62,7 @@ on: use_tesseract_sql_planner: description: 'Enable TESSERACT_SQL_PLANNER?' required: true - default: 'false' + default: 'true' type: choice options: - 'true' @@ -279,26 +279,26 @@ jobs: - snowflake-export-bucket-azure-via-storage-integration - snowflake-export-bucket-gcs - snowflake-export-bucket-gcs-prefix - use_tesseract_sql_planner: [ false ] + use_tesseract_sql_planner: [ true ] include: - database: postgres - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: snowflake - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: redshift - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: bigquery-export-bucket-gcs - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: athena-export-bucket-s3 - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: databricks-jdbc - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: mysql - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: clickhouse - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - database: mssql - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false fail-fast: false steps: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 941f3504aecc1..edc3e50c56a8a 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -410,14 +410,14 @@ jobs: # 'dremio' # Commented out because of flaky integration tests # 'vertica' ] - use_tesseract_sql_planner: [ false ] + use_tesseract_sql_planner: [ true ] include: - db: postgres node-version: 24.x - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false - db: mssql node-version: 24.x - use_tesseract_sql_planner: true + use_tesseract_sql_planner: false fail-fast: false steps: @@ -484,7 +484,6 @@ jobs: (!contains(env.CLOUD_DATABASES, matrix.db)) env: CUBEJS_TESSERACT_SQL_PLANNER: ${{ matrix.use_tesseract_sql_planner }} - CUBEJS_TESSERACT_PRE_AGGREGATIONS: ${{ matrix.use_tesseract_sql_planner }} # Firebolt Integration DRIVERS_TESTS_FIREBOLT_CUBEJS_FIREBOLT_ENGINE_NAME: ${{ secrets.DRIVERS_TESTS_FIREBOLT_CUBEJS_FIREBOLT_ENGINE_NAME }} @@ -595,7 +594,6 @@ jobs: timeout-minutes: 30 env: CUBEJS_TESSERACT_SQL_PLANNER: ${{ matrix.use_tesseract_sql_planner }} - CUBEJS_TESSERACT_PRE_AGGREGATIONS: ${{ matrix.use_tesseract_sql_planner }} run: ./.github/actions/smoke.sh docker-image-latest-set-tag: diff --git a/CLAUDE.md b/CLAUDE.md index db985ff947ba3..d390d624cce7e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -87,7 +87,7 @@ yarn dev # Start the Mintlify dev server 3. **API Gateway**: Provides REST, GraphQL, and SQL APIs 4. **CubeSQL**: Postgres-compatible SQL interface (Rust) 5. **CubeStore**: Distributed OLAP storage engine (Rust) -6. **Tesseract**: Native SQL planner (Rust) located in `/rust/cube/cubesqlplanner` - enabled via `CUBESQL_SQL_PUSH_DOWN=true` environment variable +6. **Tesseract**: Native SQL planner (Rust) located in `/rust/cube/cubesqlplanner` - the default planner; set `CUBEJS_TESSERACT_SQL_PLANNER=false` to fall back to the deprecated legacy planner. Tesseract pre-aggregation planning follows this flag and cannot be toggled independently ### Package Management - Uses Yarn workspaces with Lerna for package management diff --git a/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx b/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx index a7f952f0f68fa..6752eb65647af 100644 --- a/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx +++ b/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx @@ -13,8 +13,7 @@ the default granularities of time dimensions. Calendar cubes are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/docs/data-modeling/measures.mdx b/docs-mintlify/docs/data-modeling/measures.mdx index 22a889d1d37fd..11d1b15416888 100644 --- a/docs-mintlify/docs/data-modeling/measures.mdx +++ b/docs-mintlify/docs/data-modeling/measures.mdx @@ -210,9 +210,7 @@ CTEs in the generated SQL query. Multi-stage measures are powered by Tesseract, the [next-generation data -modeling engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to -enable it. +modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/docs/data-modeling/multi-fact-views.mdx b/docs-mintlify/docs/data-modeling/multi-fact-views.mdx index d957b1d535f27..102d5f91b1948 100644 --- a/docs-mintlify/docs/data-modeling/multi-fact-views.mdx +++ b/docs-mintlify/docs/data-modeling/multi-fact-views.mdx @@ -43,9 +43,7 @@ No fanout, no manual workarounds. Multi-fact views are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to -enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx b/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx index 0697c613b7466..e96b03c3b6d68 100644 --- a/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx +++ b/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx @@ -115,10 +115,7 @@ requiring a single pre-aggregation that covers the whole query. Matching separate pre-aggregations to multi-fact and multi-stage subqueries is -powered by Tesseract, the [next-generation data modeling engine][link-tesseract]. -Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to -enable it. +powered by Tesseract, the [next-generation data modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/recipes/data-modeling/period-over-period.mdx b/docs-mintlify/recipes/data-modeling/period-over-period.mdx index e0052ae572217..dec13d92e64fa 100644 --- a/docs-mintlify/recipes/data-modeling/period-over-period.mdx +++ b/docs-mintlify/recipes/data-modeling/period-over-period.mdx @@ -22,8 +22,7 @@ these measures and uses them in a calculation, e.g., divides or subtracts them. Multi-stage calculations are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/recipes/data-modeling/share-of-total.mdx b/docs-mintlify/recipes/data-modeling/share-of-total.mdx index 5b84327ba9a0f..a2cc3a8ed5029 100644 --- a/docs-mintlify/recipes/data-modeling/share-of-total.mdx +++ b/docs-mintlify/recipes/data-modeling/share-of-total.mdx @@ -66,9 +66,7 @@ back and groups by the query's dimensions as usual. Multi-stage calculations are powered by Tesseract, the [next-generation data -modeling engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) -environment variable to enable it. +modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/recipes/data-modeling/xirr.mdx b/docs-mintlify/recipes/data-modeling/xirr.mdx index e2da7ca1a89ae..9b5f2f5eeb965 100644 --- a/docs-mintlify/recipes/data-modeling/xirr.mdx +++ b/docs-mintlify/recipes/data-modeling/xirr.mdx @@ -29,8 +29,7 @@ Consequently, queries that don't hit pre-aggregations would fail with the follow Multi-stage calculations are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/reference/configuration/environment-variables.mdx b/docs-mintlify/reference/configuration/environment-variables.mdx index 34dcfdff490f7..fc6914f04a9e2 100644 --- a/docs-mintlify/reference/configuration/environment-variables.mdx +++ b/docs-mintlify/reference/configuration/environment-variables.mdx @@ -1667,18 +1667,18 @@ If `true`, then use WebSocket for data fetching. ## `CUBEJS_TESSERACT_SQL_PLANNER` -If `true`, enables Tesseract, the [next-generation data modeling engine][link-tesseract]. -Tesseract powers [multi-stage calculations][ref-multi-stage-calculations]. +Enables Tesseract, the [next-generation data modeling engine][link-tesseract], +which is the default SQL planner and powers +[multi-stage calculations][ref-multi-stage-calculations]. In versions before v1.7.0, +Tesseract was not enabled by default. Set to `false` to fall back to the legacy +planner, which is deprecated and will be removed in the near future. | Possible Values | Default in Development | Default in Production | | --------------- | ---------------------- | --------------------- | -| `true`, `false` | `false` | `false` | - - - -Tesseract is currently in preview. +| `true`, `false` | `true` | `true` | - +Tesseract-based pre-aggregation matching and planning follows this flag and cannot be +toggled independently. ## `CUBESTORE_AWS_ACCESS_KEY_ID` diff --git a/docs-mintlify/reference/data-modeling/dimensions.mdx b/docs-mintlify/reference/data-modeling/dimensions.mdx index 0cf4d9f40f4b1..574239b0ade9c 100644 --- a/docs-mintlify/reference/data-modeling/dimensions.mdx +++ b/docs-mintlify/reference/data-modeling/dimensions.mdx @@ -923,8 +923,7 @@ a dimension. A dimension can only have one type. `switch` dimensions are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs-mintlify/reference/data-modeling/measures.mdx b/docs-mintlify/reference/data-modeling/measures.mdx index 80fb96c84da3c..3c5da051b5e57 100644 --- a/docs-mintlify/reference/data-modeling/measures.mdx +++ b/docs-mintlify/reference/data-modeling/measures.mdx @@ -380,8 +380,7 @@ a measure. A measure can only have one type. The `number_agg` type is only available in Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. @@ -462,9 +461,7 @@ with a provided date range. It is used to calculate the minimum and maximum valu for the series of time windows. With Tesseract, the [next-generation data modeling engine][link-tesseract], -rolling window calculations don't require the date range for the time dimension. -Tesseract is currently in preview. Use the [`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) -environment variable to enable it. +rolling window calculations don't require the date range for the time dimension. In versions before v1.7.0, Tesseract was not enabled by default. @@ -1186,8 +1183,7 @@ calculated based on the value of a [`switch` dimension][ref-switch-dimensions]. `case` measures are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/configuration/reference/environment-variables.mdx b/docs/content/product/configuration/reference/environment-variables.mdx index 149795d5cc6a0..2cbb59678d717 100644 --- a/docs/content/product/configuration/reference/environment-variables.mdx +++ b/docs/content/product/configuration/reference/environment-variables.mdx @@ -1465,18 +1465,18 @@ If `true`, then use WebSocket for data fetching. ## `CUBEJS_TESSERACT_SQL_PLANNER` -If `true`, enables Tesseract, the [next-generation data modeling engine][link-tesseract]. -Tesseract powers [multi-stage calculations][ref-multi-stage-calculations]. +Enables Tesseract, the [next-generation data modeling engine][link-tesseract], +which is the default SQL planner and powers +[multi-stage calculations][ref-multi-stage-calculations]. In versions before v1.7.0, +Tesseract was not enabled by default. Set to `false` to fall back to the legacy +planner, which is deprecated and will be removed in the near future. | Possible Values | Default in Development | Default in Production | | --------------- | ---------------------- | --------------------- | -| `true`, `false` | `false` | `false` | - - - -Tesseract is currently in preview. +| `true`, `false` | `true` | `true` | - +Tesseract-based pre-aggregation matching and planning follows this flag and cannot be +toggled independently. ## `CUBESTORE_AWS_ACCESS_KEY_ID` diff --git a/docs/content/product/data-modeling/concepts/calendar-cubes.mdx b/docs/content/product/data-modeling/concepts/calendar-cubes.mdx index 22ee578c23514..7e666baf8a966 100644 --- a/docs/content/product/data-modeling/concepts/calendar-cubes.mdx +++ b/docs/content/product/data-modeling/concepts/calendar-cubes.mdx @@ -10,8 +10,7 @@ the default granularities of time dimensions. Calendar cubes are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx b/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx index 5c4df921fd423..d946ecdcc2842 100644 --- a/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx +++ b/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx @@ -9,8 +9,7 @@ common dimensions. Multi-fact queries are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx b/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx index 8aad5d477ebeb..d444ee230e655 100644 --- a/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx +++ b/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx @@ -11,8 +11,7 @@ aggregated data. Each stage results in one or more [common table expressions][li Multi-stage calculations are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/recipes/period-over-period.mdx b/docs/content/product/data-modeling/recipes/period-over-period.mdx index e872e549649a5..c325df1507ed6 100644 --- a/docs/content/product/data-modeling/recipes/period-over-period.mdx +++ b/docs/content/product/data-modeling/recipes/period-over-period.mdx @@ -19,8 +19,7 @@ these measures and uses them in a calculation, e.g., divides or subtracts them. Multi-stage calculations are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/recipes/xirr.mdx b/docs/content/product/data-modeling/recipes/xirr.mdx index 9aff36e1bc3b5..1057142991385 100644 --- a/docs/content/product/data-modeling/recipes/xirr.mdx +++ b/docs/content/product/data-modeling/recipes/xirr.mdx @@ -25,8 +25,7 @@ Consequently, queries that don't hit pre-aggregations would fail with the follow Multi-stage calculations are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/reference/measures.mdx b/docs/content/product/data-modeling/reference/measures.mdx index 1a2c817469e19..b32817091f36c 100644 --- a/docs/content/product/data-modeling/reference/measures.mdx +++ b/docs/content/product/data-modeling/reference/measures.mdx @@ -396,9 +396,7 @@ with a provided date range. It is used to calculate the minimum and maximum valu for the series of time windows. With Tesseract, the [next-generation data modeling engine][link-tesseract], -rolling window calculations don't require the date range for the time dimension. -Tesseract is currently in preview. Use the CUBEJS_TESSERACT_SQL_PLANNER -environment variable to enable it. +rolling window calculations don't require the date range for the time dimension. In versions before v1.7.0, Tesseract was not enabled by default. @@ -1056,8 +1054,7 @@ calculated based on the value of a [`switch` dimension][ref-switch-dimensions]. `case` measures are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/docs/content/product/data-modeling/reference/types-and-formats.mdx b/docs/content/product/data-modeling/reference/types-and-formats.mdx index e6011881eb927..f7ba64198d789 100644 --- a/docs/content/product/data-modeling/reference/types-and-formats.mdx +++ b/docs/content/product/data-modeling/reference/types-and-formats.mdx @@ -209,8 +209,7 @@ in the `sql` parameter that isn't covered by standard measure types like `sum`, The `number_agg` type is only available in Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. @@ -881,8 +880,7 @@ particularly useful for defining [`case` measures][ref-case-measures]. `switch` dimensions are powered by Tesseract, the [next-generation data modeling -engine][link-tesseract]. Tesseract is currently in preview. Use the -CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it. +engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default. diff --git a/packages/cubejs-backend-shared/src/env.ts b/packages/cubejs-backend-shared/src/env.ts index 5d9d3cd3678d7..e226090f99f34 100644 --- a/packages/cubejs-backend-shared/src/env.ts +++ b/packages/cubejs-backend-shared/src/env.ts @@ -1,6 +1,6 @@ /* eslint-disable no-restricted-syntax */ import { get } from 'env-var'; -import { displayCLIWarning } from './cli'; +import { displayCLIWarning, displayCLIWarningOnce } from './cli'; import { isNativeSupported } from './platform'; export class InvalidConfiguration extends Error { @@ -299,8 +299,19 @@ const variables: Record any> = { scheduledRefreshBatchSize: () => get('CUBEJS_SCHEDULED_REFRESH_BATCH_SIZE') .default('1') .asInt(), - nativeSqlPlanner: () => get('CUBEJS_TESSERACT_SQL_PLANNER').default('false').asBool(), - nativeSqlPlannerPreAggregations: () => get('CUBEJS_TESSERACT_PRE_AGGREGATIONS').default('false').asBool(), + nativeSqlPlanner: () => { + const explicitlySet = process.env.CUBEJS_TESSERACT_SQL_PLANNER !== undefined; + const enabled = get('CUBEJS_TESSERACT_SQL_PLANNER').default('true').asBool(); + + if (explicitlySet && !enabled) { + displayCLIWarningOnce( + 'CUBEJS_TESSERACT_SQL_PLANNER', + 'Tesseract planner is a default one, but you are trying to use a legacy planner which will be removed in the near future.' + ); + } + + return enabled; + }, transpilationWorkerThreads: () => { const enabled = get('CUBEJS_TRANSPILATION_WORKER_THREADS') .default('true') diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index ad20dac0cdd3a..3a689fe6732ba 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -345,12 +345,10 @@ export class BaseQuery { */ this.customSubQueryJoins = this.options.subqueryJoins ?? []; this.useNativeSqlPlanner = this.options.useNativeSqlPlanner ?? getEnv('nativeSqlPlanner'); - this.canUseNativeSqlPlannerPreAggregation = getEnv('nativeSqlPlannerPreAggregations'); - if (this.useNativeSqlPlanner && !this.canUseNativeSqlPlannerPreAggregation && !this.neverUseSqlPlannerPreaggregation()) { - const fullAggregateMeasures = this.fullKeyQueryAggregateMeasures({ hasMultipliedForPreAggregation: true }); - - this.canUseNativeSqlPlannerPreAggregation = fullAggregateMeasures.multiStageMembers.length > 0; - } + // Tesseract pre-aggregation planning always follows the SQL planner and can't be + // toggled independently. The neverUseSqlPlannerPreaggregation() guard still opts + // specific query types (e.g. CubeStoreQuery) out for correctness. + this.canUseNativeSqlPlannerPreAggregation = this.useNativeSqlPlanner && !this.neverUseSqlPlannerPreaggregation(); this.queryLevelJoinHints = this.options.joinHints ?? []; this.prebuildJoin(); diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations-string-measure.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations-string-measure.test.ts index 4d60a6222e35f..c26f9f6d7b20c 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations-string-measure.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations-string-measure.test.ts @@ -102,7 +102,7 @@ describe('PreAggregations string type measure', () => { }); }); - if (getEnv('nativeSqlPlanner') && getEnv('nativeSqlPlannerPreAggregations')) { + if (getEnv('nativeSqlPlanner')) { it('string type measure with pre-aggregation', async () => { await compiler.compile(); diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations.test.ts index b06a635c87e57..ef11ceba0a2e8 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations.test.ts @@ -3013,7 +3013,7 @@ describe('PreAggregations', () => { }); }); - if (getEnv('nativeSqlPlanner') && getEnv('nativeSqlPlannerPreAggregations')) { + if (getEnv('nativeSqlPlanner')) { it('rollup lambda', async () => { await compiler.compile(); diff --git a/packages/cubejs-testing/test/__snapshots__/smoke-cubesql.test.ts.snap b/packages/cubejs-testing/test/__snapshots__/smoke-cubesql.test.ts.snap index 01836b7ba2047..38e9a467edb0d 100644 --- a/packages/cubejs-testing/test/__snapshots__/smoke-cubesql.test.ts.snap +++ b/packages/cubejs-testing/test/__snapshots__/smoke-cubesql.test.ts.snap @@ -130,10 +130,8 @@ Object { FROM ( SELECT AVG(\\"t\\".\\"total\\") \\"avg_t_total_\\" FROM ( - SELECT - \\"orders\\".status \\"status\\", sum(\\"orders\\".amount) \\"total\\" - FROM - ( + SELECT \\"orders\\".status \\"status\\", sum(\\"orders\\".amount) \\"total\\" + FROM ( select 1 as id, 100 as amount, 'new' status, '2024-01-01'::timestamptz created_at, '2025-01-01'::timestamptz updated_at UNION ALL select 2 as id, 200 as amount, 'new' status, '2024-01-02'::timestamptz created_at, '2025-01-02'::timestamptz updated_at @@ -143,7 +141,8 @@ FROM ( select 4 as id, 500 as amount, 'processed' status, '2024-01-04'::timestamptz created_at, '2025-01-04'::timestamptz updated_at UNION ALL select 5 as id, 600 as amount, 'shipped' status, '2024-01-05'::timestamptz created_at, '2025-01-05'::timestamptz updated_at - ) AS \\"orders\\" GROUP BY 1 + ) AS \\"orders\\" + GROUP BY 1 ) AS \\"t\\" ) AS \\"t\\"", Array [], @@ -160,7 +159,7 @@ FROM ( "keep-alive", ], "content-length": Array [ - "1068", + "1049", ], "content-type": Array [ "application/json; charset=utf-8", @@ -184,10 +183,8 @@ Object { "sql": Object { "query_type": "regular", "sql": Array [ - "SELECT - sum(\\"orders\\".amount) \\"total\\" - FROM - ( + "SELECT sum(\\"orders\\".amount) \\"total\\" +FROM ( select 1 as id, 100 as amount, 'new' status, '2024-01-01'::timestamptz created_at, '2025-01-01'::timestamptz updated_at UNION ALL select 2 as id, 200 as amount, 'new' status, '2024-01-02'::timestamptz created_at, '2025-01-02'::timestamptz updated_at @@ -197,7 +194,7 @@ Object { select 4 as id, 500 as amount, 'processed' status, '2024-01-04'::timestamptz created_at, '2025-01-04'::timestamptz updated_at UNION ALL select 5 as id, 600 as amount, 'shipped' status, '2024-01-05'::timestamptz created_at, '2025-01-05'::timestamptz updated_at - ) AS \\"orders\\" ", + ) AS \\"orders\\"", Array [], ], "status": "ok", @@ -212,7 +209,7 @@ Object { "keep-alive", ], "content-length": Array [ - "828", + "812", ], "content-type": Array [ "application/json; charset=utf-8", @@ -269,10 +266,8 @@ Object { "sql": Object { "query_type": "regular", "sql": Array [ - "SELECT - sum(\\"orders\\".amount) \\"total\\" - FROM - ( + "SELECT sum(\\"orders\\".amount) \\"total\\" +FROM ( select 1 as id, 100 as amount, 'new' status, '2024-01-01'::timestamptz created_at, '2025-01-01'::timestamptz updated_at UNION ALL select 2 as id, 200 as amount, 'new' status, '2024-01-02'::timestamptz created_at, '2025-01-02'::timestamptz updated_at @@ -282,7 +277,8 @@ Object { select 4 as id, 500 as amount, 'processed' status, '2024-01-04'::timestamptz created_at, '2025-01-04'::timestamptz updated_at UNION ALL select 5 as id, 600 as amount, 'shipped' status, '2024-01-05'::timestamptz created_at, '2025-01-05'::timestamptz updated_at - ) AS \\"orders\\" WHERE (\\"orders\\".status = $1)", + ) AS \\"orders\\" +WHERE (\\"orders\\".status = $1)", Array [ "foo", ], @@ -299,7 +295,7 @@ Object { "keep-alive", ], "content-length": Array [ - "864", + "849", ], "content-type": Array [ "application/json; charset=utf-8", @@ -430,10 +426,8 @@ Object { "sql": Array [ "SELECT \\"Orders\\".\\"sum_orders_total\\" \\"total\\" FROM ( - SELECT - sum(\\"orders\\".amount) \\"sum_orders_total\\" - FROM - ( + SELECT sum(\\"orders\\".amount) \\"sum_orders_total\\" + FROM ( select 1 as id, 100 as amount, 'new' status, '2024-01-01'::timestamptz created_at, '2025-01-01'::timestamptz updated_at UNION ALL select 2 as id, 200 as amount, 'new' status, '2024-01-02'::timestamptz created_at, '2025-01-02'::timestamptz updated_at @@ -443,7 +437,8 @@ FROM ( select 4 as id, 500 as amount, 'processed' status, '2024-01-04'::timestamptz created_at, '2025-01-04'::timestamptz updated_at UNION ALL select 5 as id, 600 as amount, 'shipped' status, '2024-01-05'::timestamptz created_at, '2025-01-05'::timestamptz updated_at - ) AS \\"orders\\" WHERE ((LOWER(\\"orders\\".status) = UPPER(\\"orders\\".status))) + ) AS \\"orders\\" + WHERE ((LOWER(\\"orders\\".status) = UPPER(\\"orders\\".status))) ) AS \\"Orders\\"", Array [], ], @@ -459,7 +454,7 @@ FROM ( "keep-alive", ], "content-length": Array [ - "1006", + "989", ], "content-type": Array [ "application/json; charset=utf-8", @@ -485,10 +480,8 @@ Object { "sql": Array [ "SELECT \\"Orders\\".\\"sum_orders_total\\" \\"total\\" FROM ( - SELECT - sum(\\"orders\\".amount) \\"sum_orders_total\\" - FROM - ( + SELECT sum(\\"orders\\".amount) \\"sum_orders_total\\" + FROM ( select 1 as id, 100 as amount, 'new' status, '2024-01-01'::timestamptz created_at, '2025-01-01'::timestamptz updated_at UNION ALL select 2 as id, 200 as amount, 'new' status, '2024-01-02'::timestamptz created_at, '2025-01-02'::timestamptz updated_at @@ -498,7 +491,8 @@ FROM ( select 4 as id, 500 as amount, 'processed' status, '2024-01-04'::timestamptz created_at, '2025-01-04'::timestamptz updated_at UNION ALL select 5 as id, 600 as amount, 'shipped' status, '2024-01-05'::timestamptz created_at, '2025-01-05'::timestamptz updated_at - ) AS \\"orders\\" WHERE ((LOWER(\\"orders\\".status) = $1)) + ) AS \\"orders\\" + WHERE ((LOWER(\\"orders\\".status) = $1)) ) AS \\"Orders\\"", Array [ "foo", @@ -516,7 +510,7 @@ FROM ( "keep-alive", ], "content-length": Array [ - "989", + "972", ], "content-type": Array [ "application/json; charset=utf-8", diff --git a/rust/cubesql/cubesql/src/config/mod.rs b/rust/cubesql/cubesql/src/config/mod.rs index 6dc13293ab64d..7fa59539a8365 100644 --- a/rust/cubesql/cubesql/src/config/mod.rs +++ b/rust/cubesql/cubesql/src/config/mod.rs @@ -184,7 +184,7 @@ impl ConfigObjImpl { non_streaming_query_max_row_limit: env_parse("CUBEJS_DB_QUERY_LIMIT", 50000), max_sessions: env_parse("CUBEJS_MAX_SESSIONS", 1024), no_implicit_order: env_parse("CUBESQL_SQL_NO_IMPLICIT_ORDER", true), - tesseract_sql_planner: env_parse("CUBEJS_TESSERACT_SQL_PLANNER", false), + tesseract_sql_planner: env_parse("CUBEJS_TESSERACT_SQL_PLANNER", true), } } } From e59a69538dffd49cf158cf375b16defbbb596a61 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 15:58:46 +0200 Subject: [PATCH 17/26] fix(tesseract): Honor memberToAlias for granularized time dimensions In a wrapped SQL-API query, cubesql pushes a grouped CubeScan whose granularized time-dimension column it references by an explicit alias, sent via `memberToAlias` keyed `{member}.{granularity}` (e.g. `orders.created_at.month` -> `datetrunc_utf8__`). Regular dimensions and measures already honor this override, but `TimeDimensionSymbol` computed its alias as `{base alias}_{granularity}` (`orders__created_at_month`) and ignored the override. The wrapper then referenced a column the CubeScan never emitted -> `column "datetrunc_utf8__" does not exist`. Look up the `memberToAlias` override for the granularized member in `compile_time_dimensions` and pass it through a new `TimeDimensionSymbol::new_with_alias`. When no override is present the alias is unchanged, so non-pushdown queries are unaffected. --- .../src/planner/query_properties_compiler.rs | 26 ++++++++++---- .../planner/symbols/time_dimension_symbol.rs | 16 ++++++++- .../src/tests/common_sql_generation.rs | 35 +++++++++++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/query_properties_compiler.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/query_properties_compiler.rs index 5979a16cd2352..3f6dc85a092d0 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/query_properties_compiler.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/query_properties_compiler.rs @@ -253,12 +253,26 @@ impl QueryPropertiesCompiler { } else { None }; - Ok(MemberSymbol::new_time_dimension(TimeDimensionSymbol::new( - base_symbol, - d.granularity.clone(), - granularity_obj, - date_range_tuple, - ))) + // Honor an explicit `memberToAlias` override for the granularized + // member. The SQL API (cubesql) keys it `{member}.{granularity}` + // (dotted) and references the CubeScan column by that alias; the + // default `{base alias}_{granularity}` would otherwise mismatch. + let alias_override = d.granularity.as_ref().and_then(|granularity| { + evaluator_compiler.alias_for_member(&format!( + "{}.{}", + base_symbol.full_name(), + granularity + )) + }); + Ok(MemberSymbol::new_time_dimension( + TimeDimensionSymbol::new_with_alias( + base_symbol, + d.granularity.clone(), + granularity_obj, + date_range_tuple, + alias_override, + ), + )) }) .collect() } diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/time_dimension_symbol.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/time_dimension_symbol.rs index efdccc541eeee..599d585c43e88 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/time_dimension_symbol.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/symbols/time_dimension_symbol.rs @@ -30,6 +30,19 @@ impl TimeDimensionSymbol { granularity: Option, granularity_obj: Option, date_range: Option<(String, String)>, + ) -> Rc { + Self::new_with_alias(base_symbol, granularity, granularity_obj, date_range, None) + } + + /// Like [`Self::new`] but with an explicit alias override (e.g. the SQL + /// API's `memberToAlias` entry for the granularized member). When `None`, + /// the alias falls back to `{base alias}_{granularity}`. + pub fn new_with_alias( + base_symbol: Rc, + granularity: Option, + granularity_obj: Option, + date_range: Option<(String, String)>, + alias_override: Option, ) -> Rc { let name_suffix = if let Some(granularity) = &granularity { granularity.clone() @@ -37,7 +50,8 @@ impl TimeDimensionSymbol { "day".to_string() }; let full_name = format!("{}_{}", base_symbol.full_name(), name_suffix); - let alias = format!("{}_{}", base_symbol.alias(), name_suffix); + let alias = + alias_override.unwrap_or_else(|| format!("{}_{}", base_symbol.alias(), name_suffix)); let compiled_path = CompiledMemberPath::new( base_symbol.compiled_path().cube().clone(), full_name, diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/common_sql_generation.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/common_sql_generation.rs index faa1aa45c5a92..44a1f06c1d06a 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/common_sql_generation.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/common_sql_generation.rs @@ -1,5 +1,6 @@ use crate::test_fixtures::cube_bridge::{members_from_strings, MockBaseQueryOptions, MockSchema}; use crate::test_fixtures::test_utils::TestContext; +use cubenativeutils::CubeError; use indoc::indoc; use std::rc::Rc; @@ -40,6 +41,40 @@ fn test_member_to_alias() { ); } +#[test] +fn test_member_to_alias_time_dimension_granularity() -> Result<(), CubeError> { + let schema = MockSchema::from_yaml_file("common/visitors.yaml"); + let test_context = TestContext::new(schema)?; + + // The SQL API references a granularized time-dimension column by an alias + // sent via `memberToAlias` keyed `{member}.{granularity}`. The planner must + // honor it instead of defaulting to `{base alias}_{granularity}`. + let query_yaml = indoc! {r#" + measures: + - visitors.count + time_dimensions: + - dimension: visitors.created_at + granularity: month + memberToAlias: + visitors.created_at.month: "td_month_alias" + "#}; + + let sql = test_context.build_sql(query_yaml)?; + + // The override must be used as the projected alias … + assert!( + sql.contains("\"td_month_alias\""), + "expected granularized memberToAlias override, got: {sql}" + ); + // … instead of the default `{base alias}_{granularity}`. + assert!( + !sql.contains("visitors__created_at_month"), + "should not fall back to default granularized alias, got: {sql}" + ); + + Ok(()) +} + #[tokio::test(flavor = "multi_thread")] async fn test_simple_join_sql() { let schema = MockSchema::from_yaml_file("common/diamond_joins.yaml"); From 4b5829f80f2741ed02bc783a890ad2353033fe50 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 16:54:14 +0200 Subject: [PATCH 18/26] fix(tesseract): Set query context for native planner JS callbacks The legacy planner wraps SQL generation in compiler.withQuery() so JS extensions can resolve compiler.contextQuery() during member-SQL evaluation. The Tesseract path (buildSqlAndParamsRust) skipped this, so extensions like Funnels/RefreshKeys hit `contextQuery()` undefined when the native planner calls back into JS. --- packages/cubejs-schema-compiler/src/adapter/BaseQuery.js | 5 ++++- packages/cubejs-schema-compiler/test/unit/extensions.test.ts | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 3a689fe6732ba..dd657a389eabf 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -965,7 +965,10 @@ export class BaseQuery { }; try { - const buildResult = nativeBuildSqlAndParams(queryParams); + // Establish the current query context (as the legacy planner does via withQuery) + // so JS extensions like Funnels/RefreshKeys can resolve compiler.contextQuery() + // during the member-SQL callbacks the native planner makes back into JS. + const buildResult = this.compilers.compiler.withQuery(this, () => nativeBuildSqlAndParams(queryParams)); const [query, params, preAggResult] = buildResult; const paramsArray = [...params]; diff --git a/packages/cubejs-schema-compiler/test/unit/extensions.test.ts b/packages/cubejs-schema-compiler/test/unit/extensions.test.ts index fac7bb5877688..6d30dbf11a9a9 100644 --- a/packages/cubejs-schema-compiler/test/unit/extensions.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/extensions.test.ts @@ -68,7 +68,7 @@ describe('Extensions', () => { timeDimensions: [{ dimension: 'VisitorsFunnel.time', granularity: 'day', - dateRange: { from: '2017-01-01', to: '2017-01-30' } + dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles' }); @@ -92,7 +92,7 @@ describe('Extensions', () => { timeDimensions: [{ dimension: 'FooBar.time', granularity: 'day', - dateRange: { from: '2017-01-01', to: '2017-01-30' } + dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles' }); From 4f756a8cba6d77932de0bf1f1f9342d0fbeede54 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 20:37:12 +0200 Subject: [PATCH 19/26] fix(tesseract): render dimension mask filters on grouped masked measures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A masked aggregate measure whose conditional row-level mask filter references a dimension that is in the GROUP BY crashed the native planner with "Measure filter node processor called for wrong node". `MaskedSqlNode::resolve_mask` rendered the mask filter through `self.input` — the measure processor chain (`CaseSqlNode -> MeasureFilterSqlNode -> ...`). When the filter evaluated a dimension reference it reached `MeasureFilterSqlNode`, which only accepts measures and errored. Build a second, kind-dispatching "unmasked" processor tree (a `RootSqlNode` with masking disabled via a new `skip` flag) and render the mask filter through it, so a dimension reference routes through the dimension chain and a filter member that is itself masked does not recurse — mirroring the legacy planner's `skipMasking` behaviour in `conditionalMemberMaskSql`. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test/unit/yaml-schema.test.ts | 3 +- .../src/physical_plan/sql_nodes/factory.rs | 35 +++++++++-- .../src/physical_plan/sql_nodes/masked.rs | 63 ++++++++++++++----- 3 files changed, 82 insertions(+), 19 deletions(-) diff --git a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts index 25bfae345e281..38bdaf9e10b7f 100644 --- a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts @@ -2192,7 +2192,8 @@ cubes: const [sql] = query.buildSqlAndParams(); expect(sql).not.toMatch(/CASE\s+WHEN/); expect(sql).not.toMatch(/owner_id\s*=/); - expect(sql).toMatch(/-1\s+"transactions__total_cost"/); + // The Tesseract planner parenthesizes the masked literal, e.g. `(-1)`. + expect(sql).toMatch(/\(?-1\)?\s+"transactions__total_cost"/); }); it('still applies conditional CASE WHEN masking for aggregate measures when the filter member is in the group by', async () => { diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/factory.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/factory.rs index 24c9fd7fc969f..43b395250da43 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/factory.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/factory.rs @@ -171,8 +171,25 @@ impl SqlNodesFactory { /// a top-level `RenderReferencesSqlNode` for query-wide reference /// substitution. pub fn default_node_processor(&self) -> Rc { - let evaluate_sql_processor = - MaskedSqlNode::new(EvaluateSqlNode::new(), self.group_by_members.clone()); + // Build an "unmasked" copy of the tree first (masking disabled, but still + // dispatching by member kind). It is handed to the masked nodes so they + // can render mask-filter member references through it — routing + // dimensions through the dimension chain and avoiding mask recursion. + let unmasked_root = self.build_node_processor(true, None); + self.build_node_processor(false, Some(unmasked_root)) + } + + fn build_node_processor( + &self, + skip_masking: bool, + unmasked_root: Option>, + ) -> Rc { + let evaluate_sql_processor = MaskedSqlNode::new( + EvaluateSqlNode::new(), + self.group_by_members.clone(), + skip_masking, + unmasked_root.clone(), + ); let auto_prefix_processor = AutoPrefixSqlNode::new( evaluate_sql_processor.clone(), self.cube_name_references.clone(), @@ -188,9 +205,19 @@ impl SqlNodesFactory { // Wrap the entire measure chain with MaskedSqlNode so masked measures // are intercepted before aggregation/ungrouped wrapping. let measure_processor = if self.ungrouped || self.ungrouped_measure { - MaskedSqlNode::new_ungrouped(measure_processor, self.group_by_members.clone()) + MaskedSqlNode::new_ungrouped( + measure_processor, + self.group_by_members.clone(), + skip_masking, + unmasked_root.clone(), + ) } else { - MaskedSqlNode::new(measure_processor, self.group_by_members.clone()) + MaskedSqlNode::new( + measure_processor, + self.group_by_members.clone(), + skip_masking, + unmasked_root.clone(), + ) }; let measure_processor = self .add_multi_stage_window_if_needed(measure_processor, measure_filter_processor.clone()); diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/masked.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/masked.rs index a6ec82223d89a..427b539d1d377 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/masked.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/sql_nodes/masked.rs @@ -20,22 +20,47 @@ pub struct MaskedSqlNode { // Full names of the members present in the query GROUP BY. Used to decide // whether conditional masking can be applied to an aggregate measure. group_by_members: HashSet, + // When true this node never applies masking and just delegates to `input`. + // Used to build an "unmasked" copy of the whole processor tree that still + // dispatches by member kind (see `unmasked_root`). + skip: bool, + // A kind-dispatching processor (a full `RootSqlNode`-based tree built in + // `skip` mode) used to render mask-filter member references. It routes a + // dimension reference through the dimension chain and a measure reference + // through the measure chain, while skipping masking — so a measure mask + // filter that references a dimension is rendered correctly and a filter + // member that is itself masked does not recurse. + unmasked_root: Option>, } impl MaskedSqlNode { - pub fn new(input: Rc, group_by_members: HashSet) -> Rc { + pub fn new( + input: Rc, + group_by_members: HashSet, + skip: bool, + unmasked_root: Option>, + ) -> Rc { Rc::new(Self { input, ungrouped: false, group_by_members, + skip, + unmasked_root, }) } - pub fn new_ungrouped(input: Rc, group_by_members: HashSet) -> Rc { + pub fn new_ungrouped( + input: Rc, + group_by_members: HashSet, + skip: bool, + unmasked_root: Option>, + ) -> Rc { Rc::new(Self { input, ungrouped: true, group_by_members, + skip, + unmasked_root, }) } @@ -106,12 +131,20 @@ impl MaskedSqlNode { )?; // TODO: support FILTER_PARAMS in mask filter SQL by passing // proper FiltersContext with filter_params_columns. - // Use self.input as node_processor so member references inside the filter - // resolve through the unmasked chain — prevents recursion through MaskedSqlNode - // when the filter member is itself masked. + // Render the filter through the unmasked, kind-dispatching root so a + // filter member that is a dimension (e.g. an aggregate measure masked by + // a row filter on a group-by dimension) is routed through the dimension + // chain instead of the measure chain (which only accepts measures and + // would otherwise error). `skip` masking also prevents recursion when the + // filter member is itself masked. Falls back to `self.input` if no + // unmasked root was wired in. + let filter_processor = self + .unmasked_root + .clone() + .unwrap_or_else(|| self.input.clone()); let filter_sql = filter_item.to_sql( visitor, - self.input.clone(), + filter_processor, query_tools, templates, &FiltersContext::default(), @@ -137,14 +170,16 @@ impl SqlNode for MaskedSqlNode { node_processor: Rc, templates: &PlanSqlTemplates, ) -> Result { - if let Some(masked) = self.resolve_mask( - node, - visitor, - node_processor.clone(), - query_tools.clone(), - templates, - )? { - return Ok(masked); + if !self.skip { + if let Some(masked) = self.resolve_mask( + node, + visitor, + node_processor.clone(), + query_tools.clone(), + templates, + )? { + return Ok(masked); + } } self.input .to_sql(visitor, node, query_tools, node_processor, templates) From fad8d553bd59cd597b86e748c55011e62fad51eb Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 20:37:30 +0200 Subject: [PATCH 20/26] fix(schema-compiler): emit valid Oracle SQL under the native planner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OracleQuery only overrode legacy-planner methods (asSyntaxTable, groupByDimensionLimit, groupByClause), so the native planner fell back to the generic templates and produced invalid Oracle: `AS` before table / subquery aliases, `LIMIT`, and positional `GROUP BY`. Add `sqlTemplates()` overrides so the native planner emits Oracle-compatible SQL: no `AS` before aliases (query_aliased + FROM subquery), expression-based GROUP BY, and `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY`. Update the unit tests for the native planner: drive row limiting via `rowLimit` (the option the planner reads — the native planner applies no default limit), and accept the planner's quoted subquery aliases. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/adapter/OracleQuery.ts | 36 +++++++++++++++++++ .../test/unit/oracle-query.test.ts | 23 ++++++------ 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/OracleQuery.ts b/packages/cubejs-schema-compiler/src/adapter/OracleQuery.ts index d0417847fe8f2..d3830f3d58d8b 100644 --- a/packages/cubejs-schema-compiler/src/adapter/OracleQuery.ts +++ b/packages/cubejs-schema-compiler/src/adapter/OracleQuery.ts @@ -179,6 +179,42 @@ export class OracleQuery extends BaseQuery { return res; } + /** + * Dialect templates for the Tesseract (native) planner. The legacy-planner + * overrides above (`asSyntaxTable`, `groupByDimensionLimit`, `groupByClause`) + * don't apply to the native planner, which renders SQL purely from these + * templates. Oracle needs three deviations from the defaults: + * - no `AS` keyword before table / subquery aliases, + * - `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY` instead of `LIMIT`/`OFFSET`, + * - expression-based `GROUP BY` (Oracle has no positional GROUP BY). + */ + public sqlTemplates() { + const templates = super.sqlTemplates(); + // Oracle forbids `AS` before a table/subquery alias. + templates.expressions.query_aliased = '{{ query }} {{ quoted_alias }}'; + // Oracle does not support positional GROUP BY — group by expressions. + templates.statements.group_by_exprs = '{{ group_by | map(attribute=\'expr\') | join(\', \') }}'; + // No `AS` before the FROM subquery alias, and Oracle row-limiting syntax. + templates.statements.select = '{% if ctes %} WITH \n' + + '{{ ctes | join(\',\n\') }}\n' + + '{% endif %}' + + 'SELECT {% if distinct %}DISTINCT {% endif %}' + + '{{ select_concat | map(attribute=\'aliased\') | join(\', \') }} {% if from %}\n' + + 'FROM (\n' + + '{{ from | indent(2, true) }}\n' + + ') {{ from_alias }}{% elif from_prepared %}\n' + + 'FROM {{ from_prepared }}' + + '{% endif %}' + + '{% for join in joins %}\n{{ join }}{% endfor %}' + + '{% if filter %}\nWHERE {{ filter }}{% endif %}' + + '{% if group_by %}\nGROUP BY {{ group_by }}{% endif %}' + + '{% if having %}\nHAVING {{ having }}{% endif %}' + + '{% if order_by %}\nORDER BY {{ order_by | map(attribute=\'expr\') | join(\', \') }}{% endif %}' + + '{% if offset is not none %}\nOFFSET {{ offset }} ROWS{% endif %}' + + '{% if limit is not none %}\nFETCH NEXT {{ limit }} ROWS ONLY{% endif %}'; + return templates; + } + public newFilter(filter) { return new OracleFilter(this, filter); } diff --git a/packages/cubejs-schema-compiler/test/unit/oracle-query.test.ts b/packages/cubejs-schema-compiler/test/unit/oracle-query.test.ts index 307a5cc5400e5..e8c63d596ca67 100644 --- a/packages/cubejs-schema-compiler/test/unit/oracle-query.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/oracle-query.test.ts @@ -119,7 +119,8 @@ describe('OracleQuery', () => { 'visitors.count' ], timeDimensions: [], - timezone: 'UTC' + timezone: 'UTC', + rowLimit: 10000, }); const queryAndParams = query.buildSqlAndParams(); @@ -157,8 +158,9 @@ describe('OracleQuery', () => { expect(sql).not.toMatch(/\bAS\s+q_\d+/i); expect(sql).not.toMatch(/\bas\s+q_\d+/); - // Should have q_0 alias (with space around it, indicating no AS) - expect(sql).toMatch(/\)\s+q_0\s+/); + // Should have q_0 alias (with space around it, indicating no AS). + // The native planner quotes the alias ("q_0"). + expect(sql).toMatch(/\)\s+"?q_0"?/); }); it('does not use AS keyword with multiple rolling window measures (YoY scenario)', async () => { @@ -188,8 +190,8 @@ describe('OracleQuery', () => { expect(sql).not.toMatch(/\bAS\s+q_\d+/i); expect(sql).not.toMatch(/\bas\s+q_\d+/); - // Verify pattern is ) q_X not ) AS q_X - expect(sql).toMatch(/\)\s+q_\d+/); + // Verify pattern is ) q_X not ) AS q_X (the native planner quotes the alias) + expect(sql).toMatch(/\)\s+"?q_\d+"?/); }); it('does not use AS keyword in INNER JOIN subqueries', async () => { @@ -221,7 +223,7 @@ describe('OracleQuery', () => { 'visitors.count' ], timezone: 'UTC', - limit: 100 + rowLimit: 100 }); const queryAndParams = query.buildSqlAndParams(); @@ -247,7 +249,7 @@ describe('OracleQuery', () => { dateRange: ['2020-01-01', '2020-12-31'] }], timezone: 'UTC', - limit: 50 + rowLimit: 50 }); const queryAndParams = query.buildSqlAndParams(); @@ -276,9 +278,10 @@ describe('OracleQuery', () => { const queryAndParams = query.buildSqlAndParams(); const sql = queryAndParams[0]; - // Should have multiple subquery aliases - expect(sql).toMatch(/\)\s+q_0\s+,/); - expect(sql).toMatch(/\)\s+q_1\s+/); + // Should have multiple subquery aliases without AS (the native planner + // quotes the aliases and joins subqueries explicitly rather than with commas). + expect(sql).toMatch(/\)\s+"?q_0"?/); + expect(sql).toMatch(/\)\s+"?q_1"?/); // Should NOT have AS before q_ aliases expect(sql).not.toMatch(/\bAS\s+q_\d+/i); From de09669b93c31c210de5b716f2918fa7e82d7a33 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 20:58:59 +0200 Subject: [PATCH 21/26] test(schema-compiler): align unit SQL expectations with the native planner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The native (Tesseract) planner — now the default — emits semantically equivalent SQL with different formatting from the legacy planner. Update the expectations accordingly: - single-line SQL with the planner's whitespace (e.g. `FROM t AS "t"`, `ORDER BY 2 ASC`) in base-query syntax-sugar and join tests; - fewer wrapping parens in FILTER_PARAMS / FILTER_GROUP substitutions (`(type = ?)` vs `((type = ?))`); - quoted subquery aliases (`AS "q_0"`); - multi-granularity auto-order emits every granularity column (result- equivalent to the legacy min-granularity-only ordering); - MSSQL rolling-window queries group by the calculated-granularity expression instead of a time-series CTE alias. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test/unit/base-query.test.ts | 120 +++++++++--------- .../test/unit/mssql-query.test.ts | 16 +-- .../test/unit/postgres-query.test.ts | 21 +-- 3 files changed, 76 insertions(+), 81 deletions(-) diff --git a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts index b00945d95dc42..ccea8b7b2ff78 100644 --- a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts @@ -52,10 +52,8 @@ describe('SQL Generation', () => { filters: [], }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' count("cards".id) "cards__count"\n' + - ' FROM\n' + - ' card_tbl AS "cards" '; + const expected = 'SELECT count("cards".id) "cards__count" \n' + + 'FROM card_tbl AS "cards"'; expect(queryAndParams[0]).toContain('card_tbl'); expect(queryAndParams[0]).toEqual(expected); }); @@ -71,10 +69,8 @@ describe('SQL Generation', () => { filters: [], }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' sum("cards".amount) "cards__sum"\n' + - ' FROM\n' + - ' card_tbl AS "cards" '; + const expected = 'SELECT sum("cards".amount) "cards__sum" \n' + + 'FROM card_tbl AS "cards"'; expect(queryAndParams[0]).toContain('card_tbl'); expect(queryAndParams[0]).toEqual(expected); }); @@ -93,10 +89,10 @@ describe('SQL Generation', () => { filters: [], }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".type "cards__type", count("cards".id) "cards__count"\n' + - ' FROM\n' + - ' card_tbl AS "cards" GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT "cards".type "cards__type", count("cards".id) "cards__count" \n' + + 'FROM card_tbl AS "cards"\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); }); it('Simple query - time dimension', async () => { @@ -124,7 +120,7 @@ describe('SQL Generation', () => { expect(queryAndParams[0]).toContain('"cards".type "cards__type", date_trunc(\'day\', ("cards".created_at::timestamptz AT TIME ZONE \'America/Los_Angeles\')) "cards__created_at_day"'); expect(queryAndParams[0]).toContain('GROUP BY 1, 2'); - expect(queryAndParams[0]).toContain('ORDER BY 2'); + expect(queryAndParams[0]).toContain('ORDER BY 2'); }); it('Simple query - complex measure', async () => { await compilers.compiler.compile(); @@ -137,10 +133,8 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' max("cards".amount) - min("cards".amount) "cards__diff"\n' + - ' FROM\n' + - ' card_tbl AS "cards" '; + const expected = 'SELECT max("cards".amount) - min("cards".amount) "cards__diff" \n' + + 'FROM card_tbl AS "cards"'; expect(queryAndParams[0]).toEqual(expected); }); it('Simple query - complex dimension', async () => { @@ -157,10 +151,10 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' CONCAT("cards".type, \' \', "cards".location) "cards__type_complex", max("cards".amount) - min("cards".amount) "cards__diff"\n' + - ' FROM\n' + - ' card_tbl AS "cards" GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT CONCAT("cards".type, \' \', "cards".location) "cards__type_complex", max("cards".amount) - min("cards".amount) "cards__diff" \n' + + 'FROM card_tbl AS "cards"\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); }); it('Simple query - CUBE dimension', async () => { @@ -177,10 +171,10 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".type "cards__type_with_cube", max("cards".amount) - min("cards".amount) "cards__diff"\n' + - ' FROM\n' + - ' card_tbl AS "cards" GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT "cards".type "cards__type_with_cube", max("cards".amount) - min("cards".amount) "cards__diff" \n' + + 'FROM card_tbl AS "cards"\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); }); it('Simple query - CUBE id', async () => { @@ -197,10 +191,10 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".id "cards__id_cube", max("cards".amount) - min("cards".amount) "cards__diff"\n' + - ' FROM\n' + - ' card_tbl AS "cards" GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT "cards".id "cards__id_cube", max("cards".amount) - min("cards".amount) "cards__diff" \n' + + 'FROM card_tbl AS "cards"\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); }); it('Simple query - simple filter', async () => { @@ -238,10 +232,11 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".type "cards__type", count("cards".id) "cards__count"\n' + - ' FROM\n' + - ' card_tbl AS "cards" WHERE (("cards".type = $1) OR ("cards".type <> $2 OR "cards".type IS NULL)) AND ("cards".type = $3) GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT "cards".type "cards__type", count("cards".id) "cards__count" \n' + + 'FROM card_tbl AS "cards"\n' + + 'WHERE (("cards".type = $1) OR ("cards".type <> $2 OR "cards".type IS NULL)) AND ("cards".type = $3)\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); const expectedParams = ['type_value', 'not_type_value', 'type_value']; expect(queryAndParams[1]).toEqual(expectedParams); @@ -309,10 +304,11 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".type "cards__type", count("cards".id) "cards__count"\n' + - ' FROM\n' + - ' card_tbl AS "cards" WHERE (("cards".type IS NULL) OR ("cards".type IS NOT NULL)) AND (("cards".type IN ($1, $2)) OR ("cards".type NOT IN ($3, $4) OR "cards".type IS NULL)) AND (("cards".type IN ($5, $6) OR "cards".type IS NULL) OR ("cards".type NOT IN ($7, $8))) GROUP BY 1 ORDER BY 2 DESC'; + const expected = 'SELECT "cards".type "cards__type", count("cards".id) "cards__count" \n' + + 'FROM card_tbl AS "cards"\n' + + 'WHERE (("cards".type IS NULL) OR ("cards".type IS NOT NULL)) AND (("cards".type IN ($1, $2)) OR ("cards".type NOT IN ($3, $4) OR "cards".type IS NULL)) AND (("cards".type IN ($5, $6) OR "cards".type IS NULL) OR ("cards".type NOT IN ($7, $8)))\n' + + 'GROUP BY 1\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); // let expectedParams = [ 'type_value', 'not_type_value', 'type_value' ]; // expect(queryAndParams[1]).toEqual(expectedParams); @@ -353,10 +349,12 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); - const expected = 'SELECT\n' + - ' "cards".type "cards__type", count("cards".id) "cards__count"\n' + - ' FROM\n' + - ' card_tbl AS "cards" WHERE (("cards".type = $1) OR ("cards".type <> $2 OR "cards".type IS NULL)) GROUP BY 1 HAVING (count("cards".id) = $3) ORDER BY 2 DESC'; + const expected = 'SELECT "cards".type "cards__type", count("cards".id) "cards__count" \n' + + 'FROM card_tbl AS "cards"\n' + + 'WHERE (("cards".type = $1) OR ("cards".type <> $2 OR "cards".type IS NULL))\n' + + 'GROUP BY 1\n' + + 'HAVING (count("cards".id) = $3)\n' + + 'ORDER BY 2 DESC'; expect(queryAndParams[0]).toEqual(expected); const expectedParams = ['type_value', 'not_type_value', '3']; expect(queryAndParams[1]).toEqual(expectedParams); @@ -390,7 +388,7 @@ describe('SQL Generation', () => { }); let queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); + expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); // The order of time dimensions should have no effect on the `ORDER BY` clause @@ -415,7 +413,7 @@ describe('SQL Generation', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); + expect(queryAndParams[0].includes('ORDER BY 1')).toBeTruthy(); }); }); @@ -976,8 +974,8 @@ describe('SQL Generation', () => { const queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); - expect(queryAndParams[0]).toContain('LEFT JOIN card3_tbl AS "cards_c" ON "cards_b".other_id = "cards_c".id'); + expect(queryAndParams[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); + expect(queryAndParams[0]).toContain('LEFT JOIN card3_tbl AS "cards_c" ON "cards_b".other_id = "cards_c".id'); }); it('multiplied join', async () => { @@ -996,8 +994,8 @@ describe('SQL Generation', () => { const _queryAndParams = query.buildSqlAndParams(); - /* expect(queryAndParams[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); - expect(queryAndParams[0]).toContain('LEFT JOIN card3_tbl AS "cards_c" ON "cards_b".other_id = "cards_c".id'); */ + /* expect(queryAndParams[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); + expect(queryAndParams[0]).toContain('LEFT JOIN card3_tbl AS "cards_c" ON "cards_b".other_id = "cards_c".id'); */ }); it('join hint cache', async () => { @@ -1031,7 +1029,7 @@ describe('SQL Generation', () => { ], }); const queryAndParamsWithJoin = queryWithJoin.buildSqlAndParams(); - expect(queryAndParamsWithJoin[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); + expect(queryAndParamsWithJoin[0]).toContain('LEFT JOIN card2_tbl AS "cards_b" ON "cards_a".other_id = "cards_b".id'); // Second query does not require a join and should not be impacted by the first query const queryWithoutJoin = new PostgresQuery(filterParamsCompilers, { @@ -2005,7 +2003,7 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(queryString).toContain('select * from order where ((type = ?))'); + expect(queryString).toContain('select * from order where (type = ?)'); }); it('propagate filter params within cte from view into cube\'s query', async () => { @@ -2056,7 +2054,7 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(/select\s+\*\s+from\s+order\s+where\s+\(\(type\s=\s\?\)\)/.test(queryString)).toBeTruthy(); + expect(/select\s+\*\s+from\s+order\s+where\s+\(type\s=\s\?\)/.test(queryString)).toBeTruthy(); }); it('correctly substitute filter params in cube\'s query dimension used in filter', async () => { @@ -2074,10 +2072,9 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(queryString).toContain(`SELECT - (1 = 1) "order__proxied", count(*) "order__count" - FROM - (select * from order where (1 = 1)) AS "order" WHERE ((1 = 1) = ?)`); + expect(queryString).toContain('1 = 1 "order__proxied"'); + expect(queryString).toContain('(select * from order where 1 = 1) AS "order"'); + expect(queryString).toContain('WHERE (1 = 1 = ?)'); }); it('correctly substitute filter params in cube\'s query measure used in filter', async () => { @@ -2100,10 +2097,9 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(queryString).toContain(`SELECT - "order".type "order__type", avg(CASE WHEN ((category = ?)) THEN "order".product_id END) "order__avg_filtered" - FROM - (select * from order where (type = ?)) AS "order" WHERE ("order".type = ?) AND ("order".category = ?)`); + expect(queryString).toContain('avg(CASE WHEN ((category = ?)) THEN "order".product_id END) "order__avg_filtered"'); + expect(queryString).toContain('(select * from order where (type = ?)) AS "order"'); + expect(queryString).toContain('WHERE ("order".type = ?) AND ("order".category = ?)'); }); it('view referencing cube with FILTER_PARAMS - multiple filters and complex query', async () => { @@ -2262,7 +2258,7 @@ describe('SQL Generation', () => { const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(queryString).toContain('CASE WHEN (((category = $1)))'); + expect(queryString).toContain('CASE WHEN ((category = $1))'); expect(queryString).toMatch(/sum.*CASE WHEN/); expect(queryString).toContain('WHERE ("sales".category = $2)'); expect(queryAndParams[1]).toEqual(['electronics', 'electronics']); @@ -2420,7 +2416,7 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy(); + expect(/select\s+\*\s+from\s+order\s+where\s+\(dim0\s=\s\$1\)/.test(queryString)).toBeTruthy(); }); it('propagate 2 filter params from view into cube\'s query', async () => { @@ -2487,7 +2483,7 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy(); + expect(/select\s+\*\s+from\s+order\s+where\s+\(dim0\s=\s\$1\)/.test(queryString)).toBeTruthy(); }); it('propagate 2 filter params within cte from view into cube\'s query', async () => { @@ -2558,7 +2554,7 @@ describe('SQL Generation', () => { }); const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy(); + expect(/select\s+\*\s+from\s+order\s+where\s+\(dim0\s=\s\$1\)/.test(queryString)).toBeTruthy(); }); }); }); diff --git a/packages/cubejs-schema-compiler/test/unit/mssql-query.test.ts b/packages/cubejs-schema-compiler/test/unit/mssql-query.test.ts index b64153ec8b574..4d13071990f3b 100644 --- a/packages/cubejs-schema-compiler/test/unit/mssql-query.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/mssql-query.test.ts @@ -121,11 +121,9 @@ describe('MssqlQuery', () => { const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - const lastGroupByIdx = queryString.lastIndexOf('GROUP BY'); - const queryCloseIdx = queryString.indexOf(')', lastGroupByIdx + 1); - const finalGroupBy = queryString.substring(lastGroupByIdx, queryCloseIdx); - - expect(finalGroupBy).toEqual('GROUP BY "visitors.createdAt_series"."date_from"'); + // The native planner groups by the calculated-granularity expression + // directly (the legacy planner grouped by a time-series CTE alias). + expect(queryString).toContain('GROUP BY dateadd(week, DATEDIFF(week, 0, CAST("visitors".created_at AT TIME ZONE \'UTC\' AT TIME ZONE \'Pacific Standard Time\' AS DATETIME2)), 0)'); })); it('should group by both time and regular dimensions on rolling windows', @@ -154,11 +152,9 @@ describe('MssqlQuery', () => { const queryAndParams = query.buildSqlAndParams(); const queryString = queryAndParams[0]; - const lastGroupByIdx = queryString.lastIndexOf('GROUP BY'); - const queryCloseIdx = queryString.indexOf(')', lastGroupByIdx + 1); - const finalGroupBy = queryString.substring(lastGroupByIdx, queryCloseIdx); - - expect(finalGroupBy).toEqual('GROUP BY "visitors.createdAt_series"."date_from", "visitors__source"'); + // The native planner groups by the regular dimension and the + // calculated-granularity expression (legacy used a time-series CTE alias). + expect(queryString).toContain('GROUP BY "visitors".source, dateadd(week, DATEDIFF(week, 0, CAST("visitors".created_at AT TIME ZONE \'UTC\' AT TIME ZONE \'Pacific Standard Time\' AS DATETIME2)), 0)'); })); it('should not include order by clauses in subqueries', diff --git a/packages/cubejs-schema-compiler/test/unit/postgres-query.test.ts b/packages/cubejs-schema-compiler/test/unit/postgres-query.test.ts index f2a609b743781..cf59f4c39eab3 100644 --- a/packages/cubejs-schema-compiler/test/unit/postgres-query.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/postgres-query.test.ts @@ -174,8 +174,10 @@ describe('PostgresQuery', () => { timezone: 'America/Los_Angeles' }); + // The native planner orders by all granularity columns (result-equivalent + // to the legacy planner's min-granularity-only ordering). let queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 2 ASC'); + expect(queryAndParams[0]).toContain('ORDER BY 1 ASC, 2 ASC, 3 ASC'); query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { measures: [ @@ -202,7 +204,7 @@ describe('PostgresQuery', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 1 ASC'); + expect(queryAndParams[0]).toContain('ORDER BY 1 ASC, 2 ASC, 3 ASC'); query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { measures: [ @@ -225,7 +227,7 @@ describe('PostgresQuery', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 2 ASC'); + expect(queryAndParams[0]).toContain('ORDER BY 1 ASC, 2 ASC'); }); it('multi granularity ordered by specified granularity', async () => { @@ -252,7 +254,7 @@ describe('PostgresQuery', () => { }); let queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 2 ASC'); + expect(queryAndParams[0]).toMatch(/ORDER BY\s+2\s+ASC/); query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { measures: [ @@ -275,7 +277,7 @@ describe('PostgresQuery', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 1 ASC'); + expect(queryAndParams[0]).toMatch(/ORDER BY\s+1\s+ASC/); query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { measures: [ @@ -298,7 +300,7 @@ describe('PostgresQuery', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 2 ASC'); + expect(queryAndParams[0]).toMatch(/ORDER BY\s+2\s+ASC/); query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { measures: [ @@ -325,7 +327,7 @@ describe('PostgresQuery', () => { }); queryAndParams = query.buildSqlAndParams(); - expect(queryAndParams[0]).toContain('ORDER BY 3 ASC'); + expect(queryAndParams[0]).toMatch(/ORDER BY\s+3\s+ASC/); }); }); @@ -401,7 +403,8 @@ describe('PostgresQuery', () => { const queryAndParams = query.buildSqlAndParams(); const sql = queryAndParams[0]; - // PostgreSQL should use AS keyword for subquery aliases - expect(sql).toMatch(/\s+AS\s+q_0\s+/); + // PostgreSQL should use AS keyword for subquery aliases (the native planner + // quotes the alias, e.g. AS "q_0"). + expect(sql).toMatch(/\s+AS\s+"?q_0"?/); }); }); From 00f49f6775af43263bae53261ffae78831454ce0 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 21:54:03 +0200 Subject: [PATCH 22/26] fix(schema-compiler): default to UTC when converting timezone-less pre-agg dates The native planner computes pre-aggregation partition ranges eagerly during matching, calling `inDbTimeZone`. When the query has no timezone this hit `localTimestampToUtc(undefined, ...)` and threw "Unknown timezone: undefined" (the legacy planner is lazy and never reached it). Default to UTC so a timezone-less query can still match/describe partitioned pre-aggregations. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/cubejs-schema-compiler/src/adapter/BaseQuery.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index dd657a389eabf..9f9c07737e55c 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -4014,7 +4014,10 @@ export class BaseQuery { } inDbTimeZone(date) { - return localTimestampToUtc(this.timezone, this.timestampFormat(), date); + // Pre-aggregation partition ranges are computed eagerly by the native + // planner during matching; default to UTC when the query has no timezone + // so an unset timezone doesn't throw "Unknown timezone: undefined". + return localTimestampToUtc(this.timezone || 'UTC', this.timestampFormat(), date); } /** From 0df0922be7d524de99ae7bf62fcb83a4fd157d34 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 21:54:12 +0200 Subject: [PATCH 23/26] fix(tesseract): reject pre-agg when a measure is multiplied only in the pre-agg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The native pre-aggregation matcher only rejected multiplied measures when the query itself was multiplied, so a query for an unmultiplied measure (e.g. `orders.total_qty`) wrongly matched a pre-aggregation that multiplies it by grouping on a joined cube's dimension — the stored value differs. This ports the JS planner's #9541 rejection. Add `MultiFactJoinGroups::multiplied_measures()` and reject a match when a used measure is multiplied in the pre-aggregation but not in the query. The query's multiplicativity is computed filter-aware (a multiplying filter, like a multi-stage measure, makes the multiplied pre-agg a legitimate match), matching the JS `hasMultipliedMeasures` gate. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../optimizers/pre_aggregation/optimizer.rs | 44 ++++++++++++++++++- .../src/planner/multi_fact_join_groups.rs | 21 ++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs index c7f652b4bf2bf..be15c32f9e7bc 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs @@ -2,6 +2,7 @@ use super::PreAggregationsCompiler; use super::*; use crate::logical_plan::visitor::{LogicalPlanRewriter, NodeRewriteResult}; use crate::logical_plan::*; +use crate::planner::collectors::has_multi_stage_members; use crate::planner::filter::FilterItem; use crate::planner::filter::FilterOp; use crate::planner::join_hints::JoinHints; @@ -509,15 +510,54 @@ impl PreAggregationOptimizer { pre_aggregation, match_state == MatchState::Partial, )?; - if matched.is_none() { + let Some(matched_measures) = matched else { return Ok(None); + }; + + // Even when the query itself has no multiplied measures, a measure that + // is multiplied in the pre-aggregation (because the pre-agg groups by a + // multiplier dimension) stores a different value than the query expects, + // so the pre-aggregation can't serve it. This mirrors the leaf-measure + // additive check in the JS planner, which only applies when the query has + // no multiplied and no multi-stage measures: a multiplying filter (or a + // multi-stage measure) makes the multiplied pre-agg a legitimate match. + let pre_aggr_multiplied = pre_aggregation + .multi_fact_join_groups + .multiplied_measures()?; + if !pre_aggr_multiplied.is_empty() { + // Account for multiplying joins introduced by filters/segments — like + // the JS planner's `hasMultipliedMeasures`, this is filter-aware. + let query_groups_with_filters = MultiFactJoinGroups::try_new( + self.query_tools.clone(), + MeasuresJoinHints::builder(&JoinHints::new()) + .add_dimensions(&schema.dimensions) + .add_dimensions(&schema.time_dimensions) + .add_filters(&filters.dimensions_filters) + .add_filters(&filters.time_dimensions_filters) + .add_filters(&filters.segments) + .build(&all_measures)?, + )?; + let query_has_multi_stage = + all_measures + .iter() + .try_fold(false, |acc, m| -> Result { + Ok(acc || has_multi_stage_members(m, false)?) + })?; + if !query_groups_with_filters.has_multiplied_measures()? + && !query_has_multi_stage + && matched_measures + .iter() + .any(|m| pre_aggr_multiplied.contains(m)) + { + return Ok(None); + } } if !self.are_join_paths_matching(schema, &all_measures, &query_groups, pre_aggregation)? { return Ok(None); } - Ok(matched) + Ok(Some(matched_measures)) } fn query_join_groups( diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/multi_fact_join_groups.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/multi_fact_join_groups.rs index 9323c5e882b01..7efe691b2bf36 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/multi_fact_join_groups.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/multi_fact_join_groups.rs @@ -11,7 +11,7 @@ use crate::planner::JoinTree; use crate::planner::MemberSymbol; use cubenativeutils::CubeError; use itertools::Itertools; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::rc::Rc; /// A single measure paired with the complete set of join hints it @@ -284,6 +284,25 @@ impl MultiFactJoinGroups { Ok(false) } + /// Full names of the (leaf) measures that are multiplied — i.e. sit below a + /// one-to-many join — in these join groups. Like `has_multiplied_measures`, + /// but returns the concrete measures so callers can compare the + /// multiplicativity of a measure between two different groupings (e.g. the + /// query vs a pre-aggregation). + pub fn multiplied_measures(&self) -> Result, CubeError> { + let mut result = HashSet::new(); + for (join, measures) in self.groups.iter() { + for measure in measures.iter() { + for item in collect_multiplied_measures(measure, join)? { + if item.multiplied { + result.insert(item.measure.full_name()); + } + } + } + } + Ok(result) + } + pub fn groups(&self) -> &[(Rc, Vec>)] { &self.groups } From c9601bd193b697477fcfcf3d185c9b37f368513e Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 19 Jun 2026 21:54:21 +0200 Subject: [PATCH 24/26] fix(tesseract): read per-branch aliases in rollupLambda unions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A rollupLambda UNIONs member rollups that can belong to different cubes (e.g. `Requests.batch` ∪ `RequestsStream.stream`, `Orders.*` ∪ `RealTimeOrders.AOrdersByCompletedByHour`). The lambda exposes the first member rollup's symbols, so every member alias is the first cube's (`requests__tenant_id`, `orders__status`). The physical union builder read each branch's dimension columns through `dim.alias()` for all branches, which only holds for same-cube branches — the streaming/real-time branch stores `requests_stream__tenant_id` / `real_time_orders__status`, so the per-branch SELECT referenced a missing column and DataFusion rejected it ("No field named requests__tenant_id …"). Carry each union branch's own member symbols on the union item and resolve every lambda member to that branch's equivalent member, reading through the branch member's alias while projecting under the lambda's unified alias. Matching mirrors the legacy planner's `columnsFor`: exact full-name match first (a dimension from a joined cube is identical across branches, keeping the previous cross-cube-dimension fix), then the short member name within the branch's own cube (a cross-cube union member). Applied uniformly to dimensions, time dimensions and measures; for same-cube branches the read and output aliases coincide, so behavior there is unchanged. Also fixed the off-by-one in the lambda symbol-name validation (`i > 1` → `i >= 1`) so the second member rollup is checked against the first. Adds a Rust regression test over the cross-cube `lambda_union` fixture asserting each branch reads its own columns and projects the unified alias. --- .../compiled_pre_aggregation.rs | 16 ++- .../optimizers/pre_aggregation/optimizer.rs | 11 +- .../pre_aggregations_compiler.rs | 14 ++- .../src/logical_plan/pre_aggregation.rs | 5 +- .../processors/pre_aggregation.rs | 102 +++++++++++++----- .../test_fixtures/test_utils/test_context.rs | 8 +- .../pre_aggregations/sql_generation.rs | 53 +++++++++ 7 files changed, 171 insertions(+), 38 deletions(-) diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/compiled_pre_aggregation.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/compiled_pre_aggregation.rs index db0d707d468a4..60dd590dd8382 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/compiled_pre_aggregation.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/compiled_pre_aggregation.rs @@ -20,7 +20,21 @@ pub struct PreAggregationJoin { #[derive(Clone, Debug)] pub struct PreAggregationUnion { - pub items: Vec>, + pub items: Vec, +} + +/// A single member rollup of a `rollupLambda` union, paired with the +/// member symbols of *that* rollup. The lambda exposes the first member +/// rollup's symbols, but each branch stores its columns under its own +/// cube aliases (e.g. `requests_stream__tenant_id` vs `requests__tenant_id`), +/// so the physical builder needs each branch's own symbols to read the +/// right column while projecting the lambda's unified alias. +#[derive(Clone, Debug)] +pub struct PreAggregationUnionItem { + pub table: Rc, + pub measures: Vec>, + pub dimensions: Vec>, + pub time_dimensions: Vec>, } #[derive(Clone, Debug)] diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs index be15c32f9e7bc..f326e54754326 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs @@ -414,11 +414,14 @@ impl PreAggregationOptimizer { let items = union .items .iter() - .map(|t| { - Rc::new(PreAggregationTable { + .map(|item| PreAggregationUnionItem { + table: Rc::new(PreAggregationTable { usage_index: Some(usage_index), - ..t.as_ref().clone() - }) + ..item.table.as_ref().clone() + }), + measures: item.measures.clone(), + dimensions: item.dimensions.clone(), + time_dimensions: item.time_dimensions.clone(), }) .collect(); Rc::new(PreAggregationSource::Union(PreAggregationUnion { items })) diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/pre_aggregations_compiler.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/pre_aggregations_compiler.rs index 413fe93149967..ed31b21fc2b07 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/pre_aggregations_compiler.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/pre_aggregations_compiler.rs @@ -7,6 +7,7 @@ use crate::logical_plan::PreAggregationJoin; use crate::logical_plan::PreAggregationJoinItem; use crate::logical_plan::PreAggregationTable; use crate::logical_plan::PreAggregationUnion; +use crate::logical_plan::PreAggregationUnionItem; use crate::planner::join_hints::JoinHints; use crate::planner::multi_fact_join_groups::{MeasuresJoinHints, MultiFactJoinGroups}; use crate::planner::planners::JoinPlanner; @@ -302,13 +303,22 @@ impl PreAggregationsCompiler { for (i, rollup) in pre_aggrs_for_lambda.clone().iter().enumerate() { match rollup.source.as_ref() { PreAggregationSource::Single(table) => { - sources.push(Rc::new(table.clone())); + // Carry this branch's own symbols: each member rollup stores its + // columns under its own cube aliases, while the lambda exposes the + // first rollup's symbols. The physical builder maps lambda members + // to each branch's stored column through these. + sources.push(PreAggregationUnionItem { + table: Rc::new(table.clone()), + measures: rollup.measures.clone(), + dimensions: rollup.dimensions.clone(), + time_dimensions: rollup.time_dimensions.clone(), + }); } _ => { return Err(CubeError::user(format!("Rollup lambda can't be nested"))); } } - if i > 1 { + if i >= 1 { Self::match_symbols(&rollup.measures, &pre_aggrs_for_lambda[0].measures)?; Self::match_symbols(&rollup.dimensions, &pre_aggrs_for_lambda[0].dimensions)?; Self::match_time_dimensions( diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/pre_aggregation.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/pre_aggregation.rs index e3f0a0d4893dc..386812d766b2c 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/pre_aggregation.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/pre_aggregation.rs @@ -178,7 +178,10 @@ impl PrettyPrint for PreAggregation { result.println("Union:", &state); let state = state.new_level(); for item in union.items.iter() { - result.println(&format!("-{}.{}", item.cube_name, item.name), &state); + result.println( + &format!("-{}.{}", item.table.cube_name, item.table.name), + &state, + ); } } } diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/pre_aggregation.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/pre_aggregation.rs index 7826a3169bea9..819dfdba36d45 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/pre_aggregation.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/pre_aggregation.rs @@ -11,6 +11,7 @@ use crate::physical_plan::{ }; use crate::physical_plan_builder::PhysicalPlanBuilder; use crate::planner::sql_templates::PlanSqlTemplates; +use crate::planner::MemberSymbol; use crate::planner::SqlJoinCondition; use cubenativeutils::CubeError; use std::rc::Rc; @@ -73,68 +74,115 @@ impl PreAggregationProcessor<'_> { Ok(from) } + /// Resolve the column a union branch stores a lambda member under. The + /// lambda exposes the first member rollup's symbols, but each branch keeps + /// its own cube aliases (e.g. `requests_stream__tenant_id` vs the lambda's + /// `requests__tenant_id`), so we match the lambda member to this branch's + /// equivalent member and read through the branch member's alias. Mirrors + /// the legacy planner's `columnsFor`: prefer an exact member match (a + /// dimension from a joined cube is identical across branches), then fall + /// back to the short member name within the branch's own cube (a cross-cube + /// union member). + fn find_branch_member( + lambda_member: &Rc, + branch_members: &[Rc], + branch_cube_name: &str, + ) -> Result, CubeError> { + if let Some(member) = branch_members + .iter() + .find(|m| m.full_name() == lambda_member.full_name()) + { + return Ok(member.clone()); + } + let short_name = lambda_member.name(); + if let Some(member) = branch_members + .iter() + .find(|m| m.name() == short_name && m.cube_name() == branch_cube_name) + { + return Ok(member.clone()); + } + Err(CubeError::internal(format!( + "Lambda pre-aggregation member '{}' has no match in union branch '{}'", + lambda_member.full_name(), + branch_cube_name + ))) + } + fn make_pre_aggregation_union_source( &self, pre_aggregation: &PreAggregation, union: &PreAggregationUnion, ) -> Result, CubeError> { if union.items.len() == 1 { - let table_source = self.make_pre_aggregation_table_source(&union.items[0])?; + let table_source = self.make_pre_aggregation_table_source(&union.items[0].table)?; return Ok(From::new(FromSource::Single(table_source))); } let query_tools = self.builder.query_tools(); let mut union_sources = Vec::new(); for item in union.items.iter() { - let table_source = self.make_pre_aggregation_table_source(&item)?; + let branch_cube_name = &item.table.cube_name; + let table_source = self.make_pre_aggregation_table_source(&item.table)?; let from = From::new(FromSource::Single(table_source)); let mut select_builder = SelectBuilder::new(from); for dim in pre_aggregation.dimensions().iter() { - let name_in_table = - PlanSqlTemplates::member_alias_name(&item.cube_alias, &dim.name(), &None); - let alias = dim.alias(); + // Read this branch's stored column for the lambda dimension and + // project it under the lambda's unified alias. + let branch_dim = Self::find_branch_member(dim, &item.dimensions, branch_cube_name)?; select_builder.add_projection_reference_member( &dim, - QualifiedColumnName::new(None, name_in_table), - Some(alias), + QualifiedColumnName::new(None, branch_dim.alias()), + Some(dim.alias()), ); } + // Match time dimensions on their base member so the granularity + // suffix is applied consistently on both the read and output sides. + let branch_time_bases = item + .time_dimensions + .iter() + .map(|td| { + if let Ok(t) = td.as_time_dimension() { + t.base_symbol().clone() + } else { + td.clone() + } + }) + .collect::>(); for dim in pre_aggregation.time_dimensions().iter() { - let (alias, granularity) = if let Ok(td) = dim.as_time_dimension() { - (td.base_symbol().alias(), td.granularity().clone()) + let (lambda_base, granularity) = if let Ok(td) = dim.as_time_dimension() { + (td.base_symbol().clone(), td.granularity().clone()) } else { - (dim.alias(), None) + (dim.clone(), None) }; - let name_in_table = PlanSqlTemplates::member_alias_name( - &item.cube_alias, - &dim.name(), - &granularity, - ); + let branch_base = + Self::find_branch_member(&lambda_base, &branch_time_bases, branch_cube_name)?; - let suffix = if let Some(granularity) = granularity { - format!("_{}", granularity.clone()) + let read_suffix = if let Some(granularity) = &granularity { + format!("_{}", granularity) + } else { + String::new() + }; + let name_in_table = format!("{}{}", branch_base.alias(), read_suffix); + + let out_suffix = if let Some(granularity) = &granularity { + format!("_{}", granularity) } else { "_day".to_string() }; - let alias = format!("{}{}", alias, suffix); + let alias = format!("{}{}", lambda_base.alias(), out_suffix); select_builder.add_projection_reference_member( &dim, - QualifiedColumnName::new(None, name_in_table.clone()), + QualifiedColumnName::new(None, name_in_table), Some(alias), ); } for meas in pre_aggregation.measures().iter() { - let name_in_table = PlanSqlTemplates::member_alias_name( - &item.cube_alias, - &meas.name(), - &meas.alias_suffix(), - ); - let alias = meas.alias(); + let branch_meas = Self::find_branch_member(meas, &item.measures, branch_cube_name)?; select_builder.add_projection_reference_member( &meas, - QualifiedColumnName::new(None, name_in_table.clone()), - Some(alias), + QualifiedColumnName::new(None, branch_meas.alias()), + Some(meas.alias()), ); } let context = SqlNodesFactory::new(); diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/test_utils/test_context.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/test_utils/test_context.rs index 1b90aaa93717a..43bea3c8dbbd3 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/test_utils/test_context.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/test_utils/test_context.rs @@ -663,9 +663,11 @@ impl TestContext { } tables } - PreAggregationSource::Union(union) => { - union.items.iter().map(|t| t.as_ref().clone()).collect() - } + PreAggregationSource::Union(union) => union + .items + .iter() + .map(|item| item.table.as_ref().clone()) + .collect(), } } diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/pre_aggregations/sql_generation.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/pre_aggregations/sql_generation.rs index 34dbb391c0cff..fd4fc813081cb 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/pre_aggregations/sql_generation.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/pre_aggregations/sql_generation.rs @@ -1287,3 +1287,56 @@ fn test_rollup_build_without_use_original_sql_pre_aggregations_in_pre_aggregatio ); Ok(()) } + +#[tokio::test(flavor = "multi_thread")] +async fn test_rollup_lambda_cross_cube_union_aliases() { + // `lambda_union` UNIONs `visitor_checkins.for_lambda` with + // `visitor_checkins2.for_lambda`. The lambda exposes the first member + // rollup's symbols, so the dimension's unified output alias is + // `visitor_checkins__visitor_id`, but the second branch stores it as + // `visitor_checkins2__visitor_id`. Each branch must read its own column + // while projecting the unified alias. + let schema = MockSchema::from_yaml_file("common/pre_aggregations_test.yaml"); + let ctx = TestContext::new(schema).unwrap(); + + // Force the lambda; otherwise the matcher would pick the plain `for_lambda` + // rollup that the lambda is built from (it is declared first). + let query_yaml = indoc! {" + measures: + - visitor_checkins.count + dimensions: + - visitor_checkins.visitor_id + time_dimensions: + - dimension: visitor_checkins.created_at + granularity: day + pre_aggregation_id: visitor_checkins.lambda_union + "}; + + let (sql, pre_aggrs) = ctx + .build_sql_with_used_pre_aggregations(query_yaml) + .unwrap(); + + assert_eq!(pre_aggrs.len(), 1); + assert_eq!(pre_aggrs[0].name(), "lambda_union"); + + // The second branch (visitor_checkins2) must read its own stored columns and + // project them under the lambda's unified `visitor_checkins__*` aliases. Before + // the fix the branch read `visitor_checkins__visitor_id` (the first cube's alias) + // from the visitor_checkins2 table, which does not exist there. + for (read, out) in [ + ( + "visitor_checkins2__visitor_id", + "visitor_checkins__visitor_id", + ), + ( + "visitor_checkins2__created_at_day", + "visitor_checkins__created_at_day", + ), + ("visitor_checkins2__count", "visitor_checkins__count"), + ] { + assert!( + sql.contains(&format!("\"{}\" \"{}\"", read, out)), + "Expected branch to read {read} and project {out}, got:\n{sql}", + ); + } +} From d3fedf1d5b5da7aac749c2cbe37e73baebda17a7 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Mon, 22 Jun 2026 17:13:47 +0200 Subject: [PATCH 25/26] fix(tesseract): match rolling pre-aggregation without a date range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The native planner identifies a matching pre-aggregation by building the full query SQL. For a rolling-window measure that includes the measure's time series, which requires a date range. The pre-aggregation refresh/metadata path (e.g. the /cubejs-system/v1/pre-aggregations API) builds such a query with no date range, so the native build threw "Date range is required for time series" and the endpoint returned 500. Route that case — cumulative measures with no date range — to the legacy planner, which matches pre-aggregations structurally without building the time series, as it did before Tesseract became the default planner. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../cubejs-schema-compiler/src/adapter/BaseQuery.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 9f9c07737e55c..0d58db4408d81 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -365,6 +365,19 @@ export class BaseQuery { // Temporary workaround to avoid checking for multistage in CubeStoreQuery, since that could lead to errors when HLL functions are present in the query. neverUseSqlPlannerPreaggregation() { + // The native planner determines a matching pre-aggregation by building the full + // query SQL, which for a rolling-window measure includes its time series and + // therefore requires a date range. The pre-aggregation refresh/metadata path + // (e.g. the `/pre-aggregations` API) builds such a query with no date range, so + // the native build throws "Date range is required for time series". Fall back to + // the legacy planner for that case — it matches pre-aggregations structurally, + // exactly as it did before Tesseract became the default. + if ( + this.cumulativeMeasures().length > 0 && + !this.timeDimensions.some(td => td.dateRange) + ) { + return true; + } return false; } From f5f3dc1e7cefaeea1c048cb24d50b9d967a58919 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Mon, 22 Jun 2026 17:13:57 +0200 Subject: [PATCH 26/26] test(cubejs-testing): dense rolling pre-aggregation snapshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With rolling-window pre-aggregation reads fixed, the postgresql-cubestore suite returns a row per time bucket in the requested range (dense) — null/0 for buckets with no data, including the null-source and google-source rows that exist in the seed. Regenerate the stale sparse snapshots for "Rolling Mixed" and "Rolling Prev Period ratio" so they match the other (already-dense) rolling tests. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...x-postgresql-pre-aggregations.test.ts.snap | 74 ++++++++++ ...i-postgresql-pre-aggregations.test.ts.snap | 136 +++++++++--------- 2 files changed, 145 insertions(+), 65 deletions(-) diff --git a/packages/cubejs-testing/test/__snapshots__/birdbox-postgresql-pre-aggregations.test.ts.snap b/packages/cubejs-testing/test/__snapshots__/birdbox-postgresql-pre-aggregations.test.ts.snap index c13b4524d32f2..549a4cfbe49fd 100644 --- a/packages/cubejs-testing/test/__snapshots__/birdbox-postgresql-pre-aggregations.test.ts.snap +++ b/packages/cubejs-testing/test/__snapshots__/birdbox-postgresql-pre-aggregations.test.ts.snap @@ -13,6 +13,13 @@ Array [ exports[`postgresql-cubestore HTTP Transport Rolling Mixed: Rolling Mixed 1`] = ` Array [ + Object { + "visitors.checkinsRolling2day": null, + "visitors.checkinsRollingTotal": "0", + "visitors.count": null, + "visitors.createdAt": "2017-01-02T00:00:00.000", + "visitors.createdAt.day": "2017-01-02T00:00:00.000", + }, Object { "visitors.checkinsRolling2day": "3", "visitors.checkinsRollingTotal": "3", @@ -20,6 +27,13 @@ Array [ "visitors.createdAt": "2017-01-03T00:00:00.000", "visitors.createdAt.day": "2017-01-03T00:00:00.000", }, + Object { + "visitors.checkinsRolling2day": "3", + "visitors.checkinsRollingTotal": "3", + "visitors.count": null, + "visitors.createdAt": "2017-01-04T00:00:00.000", + "visitors.createdAt.day": "2017-01-04T00:00:00.000", + }, Object { "visitors.checkinsRolling2day": "2", "visitors.checkinsRollingTotal": "5", @@ -32,18 +46,78 @@ Array [ exports[`postgresql-cubestore HTTP Transport Rolling Prev Period ratio: Rolling Prev Period ratio 1`] = ` Array [ + Object { + "visitors.createdAt": "2017-02-02T00:00:00.000", + "visitors.createdAt.day": "2017-02-02T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, Object { "visitors.createdAt": "2017-02-02T00:00:00.000", "visitors.createdAt.day": "2017-02-02T00:00:00.000", "visitors.currentMonthToPrevRatio": "0.6666666666666666", "visitors.source": "some", }, + Object { + "visitors.createdAt": "2017-02-02T00:00:00.000", + "visitors.createdAt.day": "2017-02-02T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-03T00:00:00.000", + "visitors.createdAt.day": "2017-02-03T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, Object { "visitors.createdAt": "2017-02-03T00:00:00.000", "visitors.createdAt.day": "2017-02-03T00:00:00.000", "visitors.currentMonthToPrevRatio": "0.6666666666666666", "visitors.source": "some", }, + Object { + "visitors.createdAt": "2017-02-03T00:00:00.000", + "visitors.createdAt.day": "2017-02-03T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "some", + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "some", + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, ] `; diff --git a/packages/cubejs-testing/test/__snapshots__/cli-postgresql-pre-aggregations.test.ts.snap b/packages/cubejs-testing/test/__snapshots__/cli-postgresql-pre-aggregations.test.ts.snap index 45a38f001cd67..a19770408ed7a 100644 --- a/packages/cubejs-testing/test/__snapshots__/cli-postgresql-pre-aggregations.test.ts.snap +++ b/packages/cubejs-testing/test/__snapshots__/cli-postgresql-pre-aggregations.test.ts.snap @@ -11,35 +11,28 @@ Array [ ] `; -exports[`postgresql HTTP Transport Rolling Mixed With Dimension: Rolling Mixed With Dimension 1`] = ` +exports[`postgresql HTTP Transport Rolling Mixed: Rolling Mixed 1`] = ` Array [ + Object { + "visitors.checkinsRolling2day": null, + "visitors.checkinsRollingTotal": "0", + "visitors.count": null, + "visitors.createdAt": "2017-01-02T00:00:00.000", + "visitors.createdAt.day": "2017-01-02T00:00:00.000", + }, Object { "visitors.checkinsRolling2day": "3", "visitors.checkinsRollingTotal": "3", "visitors.count": "1", "visitors.createdAt": "2017-01-03T00:00:00.000", "visitors.createdAt.day": "2017-01-03T00:00:00.000", - "visitors.source": "some", }, - Object { - "visitors.checkinsRolling2day": "2", - "visitors.checkinsRollingTotal": "5", - "visitors.count": "1", - "visitors.createdAt": "2017-01-05T00:00:00.000", - "visitors.createdAt.day": "2017-01-05T00:00:00.000", - "visitors.source": "some", - }, -] -`; - -exports[`postgresql HTTP Transport Rolling Mixed: Rolling Mixed 1`] = ` -Array [ Object { "visitors.checkinsRolling2day": "3", "visitors.checkinsRollingTotal": "3", - "visitors.count": "1", - "visitors.createdAt": "2017-01-03T00:00:00.000", - "visitors.createdAt.day": "2017-01-03T00:00:00.000", + "visitors.count": null, + "visitors.createdAt": "2017-01-04T00:00:00.000", + "visitors.createdAt.day": "2017-01-04T00:00:00.000", }, Object { "visitors.checkinsRolling2day": "2", @@ -53,18 +46,78 @@ Array [ exports[`postgresql HTTP Transport Rolling Prev Period ratio: Rolling Prev Period ratio 1`] = ` Array [ + Object { + "visitors.createdAt": "2017-02-02T00:00:00.000", + "visitors.createdAt.day": "2017-02-02T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, Object { "visitors.createdAt": "2017-02-02T00:00:00.000", "visitors.createdAt.day": "2017-02-02T00:00:00.000", "visitors.currentMonthToPrevRatio": "0.6666666666666666", "visitors.source": "some", }, + Object { + "visitors.createdAt": "2017-02-02T00:00:00.000", + "visitors.createdAt.day": "2017-02-02T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-03T00:00:00.000", + "visitors.createdAt.day": "2017-02-03T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, Object { "visitors.createdAt": "2017-02-03T00:00:00.000", "visitors.createdAt.day": "2017-02-03T00:00:00.000", "visitors.currentMonthToPrevRatio": "0.6666666666666666", "visitors.source": "some", }, + Object { + "visitors.createdAt": "2017-02-03T00:00:00.000", + "visitors.createdAt.day": "2017-02-03T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "some", + }, + Object { + "visitors.createdAt": "2017-02-04T00:00:00.000", + "visitors.createdAt.day": "2017-02-04T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "google", + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": "some", + }, + Object { + "visitors.createdAt": "2017-02-05T00:00:00.000", + "visitors.createdAt.day": "2017-02-05T00:00:00.000", + "visitors.currentMonthToPrevRatio": null, + "visitors.source": null, + }, ] `; @@ -125,50 +178,3 @@ Array [ }, ] `; - -exports[`postgresql HTTP Transport Rolling: Rolling 1`] = ` -Array [ - Object { - "visitors.checkinsRollingTotal": "0", - "visitors.createdAt": "2017-01-02T00:00:00.000", - "visitors.createdAt.day": "2017-01-02T00:00:00.000", - "visitors.source": null, - }, - Object { - "visitors.checkinsRollingTotal": "3", - "visitors.createdAt": "2017-01-03T00:00:00.000", - "visitors.createdAt.day": "2017-01-03T00:00:00.000", - "visitors.source": "some", - }, - Object { - "visitors.checkinsRollingTotal": "0", - "visitors.createdAt": "2017-01-03T00:00:00.000", - "visitors.createdAt.day": "2017-01-03T00:00:00.000", - "visitors.source": null, - }, - Object { - "visitors.checkinsRollingTotal": "3", - "visitors.createdAt": "2017-01-04T00:00:00.000", - "visitors.createdAt.day": "2017-01-04T00:00:00.000", - "visitors.source": "some", - }, - Object { - "visitors.checkinsRollingTotal": "0", - "visitors.createdAt": "2017-01-04T00:00:00.000", - "visitors.createdAt.day": "2017-01-04T00:00:00.000", - "visitors.source": null, - }, - Object { - "visitors.checkinsRollingTotal": "5", - "visitors.createdAt": "2017-01-05T00:00:00.000", - "visitors.createdAt.day": "2017-01-05T00:00:00.000", - "visitors.source": "some", - }, - Object { - "visitors.checkinsRollingTotal": "0", - "visitors.createdAt": "2017-01-05T00:00:00.000", - "visitors.createdAt.day": "2017-01-05T00:00:00.000", - "visitors.source": null, - }, -] -`;