diff --git a/.dockerignore b/.dockerignore index 94ea17ac00fc3..9d0a5a5390c1d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,6 +11,7 @@ !rust/cubestore/bin !rust/cubesql/package.json +packages/cubejs-backend-native/target packages/*/node_modules/ packages/*/dist/ packages/*/coverage/ diff --git a/.github/actions/init-ci/action.yaml b/.github/actions/init-ci/action.yaml index 917e3f87b6aea..4634c32066412 100644 --- a/.github/actions/init-ci/action.yaml +++ b/.github/actions/init-ci/action.yaml @@ -7,11 +7,11 @@ runs: using: "composite" steps: - name: Use Node.js ${{ inputs.node }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ inputs.node }} - name: Cache node modules - uses: actions/cache@v2 + uses: actions/cache@v3 with: # npm cache files are stored in `~/.npm` on Linux/macOS path: ~/.npm diff --git a/.github/actions/integration/clickhouse.sh b/.github/actions/integration/clickhouse.sh index 8900415d690f2..9630f77e3acf1 100755 --- a/.github/actions/integration/clickhouse.sh +++ b/.github/actions/integration/clickhouse.sh @@ -4,23 +4,23 @@ set -eo pipefail # Debug log for test containers export DEBUG=testcontainers -export TEST_CLICKHOUSE_VERSION=21.1.2 +export TEST_CLICKHOUSE_VERSION=23.11 echo "::group::Clickhouse ${TEST_CLICKHOUSE_VERSION}"; -docker pull yandex/clickhouse-server:${TEST_CLICKHOUSE_VERSION} +docker pull clickhouse/clickhouse-server:${TEST_CLICKHOUSE_VERSION} yarn lerna run --concurrency 1 --stream --no-prefix integration:clickhouse echo "::endgroup::" -export TEST_CLICKHOUSE_VERSION=20.6 +export TEST_CLICKHOUSE_VERSION=22.8 echo "::group::Clickhouse ${TEST_CLICKHOUSE_VERSION}"; -docker pull yandex/clickhouse-server:${TEST_CLICKHOUSE_VERSION} +docker pull clickhouse/clickhouse-server:${TEST_CLICKHOUSE_VERSION} yarn lerna run --concurrency 1 --stream --no-prefix integration:clickhouse echo "::endgroup::" -export TEST_CLICKHOUSE_VERSION=19 +export TEST_CLICKHOUSE_VERSION=21.8 echo "::group::Clickhouse ${TEST_CLICKHOUSE_VERSION}"; -docker pull yandex/clickhouse-server:${TEST_CLICKHOUSE_VERSION} +docker pull clickhouse/clickhouse-server:${TEST_CLICKHOUSE_VERSION} yarn lerna run --concurrency 1 --stream --no-prefix integration:clickhouse echo "::endgroup::" diff --git a/.github/actions/integration/druid.sh b/.github/actions/integration/druid.sh index bb1b7c7ef1f5f..11840c126f27f 100755 --- a/.github/actions/integration/druid.sh +++ b/.github/actions/integration/druid.sh @@ -6,7 +6,7 @@ export DEBUG=testcontainers export TEST_POSTGRES_VERSION=13 export TEST_ZOOKEEPER_VERSION=3.5 -export TEST_DRUID_VERSION=0.19.0 +export TEST_DRUID_VERSION=27.0.0 echo "::group::Druid ${TEST_DRUID_VERSION}"; diff --git a/.github/actions/integration/mongobi.sh b/.github/actions/integration/mongobi.sh new file mode 100755 index 0000000000000..e17f856dd869b --- /dev/null +++ b/.github/actions/integration/mongobi.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -eo pipefail + +# Debug log for test containers +export DEBUG=testcontainers + +export TEST_MONGO_TAG=6.0 +export TEST_MONGOBI_VERSION=mongodb-bi-linux-x86_64-ubuntu2004-v2.14.8 + +echo "::group::MongoBI" +yarn lerna run --concurrency 1 --stream --no-prefix integration:mongobi +echo "::endgroup::" diff --git a/.github/actions/integration/snowflake.sh b/.github/actions/integration/snowflake.sh new file mode 100755 index 0000000000000..368030bfc09a3 --- /dev/null +++ b/.github/actions/integration/snowflake.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -eo pipefail + +# Debug log for test containers +export DEBUG=testcontainers + +echo "::group::Snowflake [cloud]" +export CUBEJS_DB_NAME=DEMO_DB +export CUBEJS_DB_SNOWFLAKE_ACCOUNT=lxb31104 +export CUBEJS_DB_SNOWFLAKE_REGION=us-west-2 +export CUBEJS_DB_SNOWFLAKE_WAREHOUSE=COMPUTE_WH + +yarn lerna run --concurrency 1 --stream --no-prefix smoke:snowflake + +echo "::endgroup::" diff --git a/.github/actions/smoke.sh b/.github/actions/smoke.sh new file mode 100755 index 0000000000000..57eceb824b904 --- /dev/null +++ b/.github/actions/smoke.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -eo pipefail + +# Debug log for test containers +export DEBUG=testcontainers + +echo "::group::Oracle" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:oracle +echo "::endgroup::" + +echo "::group::DuckDB" +# Should we create a separate job integration-duckdb? I believe not, because it works fast. +yarn lerna run --concurrency 1 --stream --no-prefix integration:duckdb +yarn lerna run --concurrency 1 --stream --no-prefix smoke:duckdb +echo "::endgroup::" + +echo "::group::Postgres" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:postgres +echo "::endgroup::" + +echo "::group::QuestDB" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:questdb +echo "::endgroup::" + +echo "::group::Crate" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:crate +echo "::endgroup::" + +echo "::group::Lambda" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:lambda +echo "::endgroup::" + +echo "::group::Materialize" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:materialize +echo "::endgroup::" + +echo "::group::Multidb" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:multidb +echo "::endgroup::" + +#echo "::group::Prestodb" +#docker rm -vf $(docker ps -aq) +#docker rmi -f $(docker images -aq) +#docker pull ahanaio/prestodb-sandbox:0.281 +#yarn lerna run --concurrency 1 --stream --no-prefix smoke:prestodb +#echo "::endgroup::" + +echo "::group::Trino" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:trino +echo "::endgroup::" + +echo "::group::MS SQL" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:mssql +echo "::endgroup::" + +echo "::group::MongoBI" +yarn lerna run --concurrency 1 --stream --no-prefix smoke:mongobi +echo "::endgroup::" \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8aa9d365c33e6..15a1e63b7a9a3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,5 +8,6 @@ updates: directory: "/examples" schedule: interval: "monthly" - allow: - - dependency-type: "production" + labels: [ ] + ignore: + - dependency-name: "*" diff --git a/.github/label-actions.yml b/.github/label-actions.yml index dd2caab7b2537..fc714706edd2b 100644 --- a/.github/label-actions.yml +++ b/.github/label-actions.yml @@ -1,5 +1,6 @@ "help wanted": comment: | - If you are interested in working on this issue, please leave a comment below and we will be happy to assign the issue to you. - If this is the first time you are contributing a Pull Request to Cube.js, please check our [contribution guidelines](https://github.com/cube-js/cube.js/blob/master/CONTRIBUTING.md). - You can also post any questions while contributing in the #contributors channel in the [Cube.js Slack](https://slack.cube.dev/). + If you are interested in working on this issue, please go ahead and provide PR for that. + We'd be happy to review it and merge it. + If this is the first time you are contributing a Pull Request to Cube, please check our [contribution guidelines](https://github.com/cube-js/cube/blob/master/CONTRIBUTING.md). + You can also post any questions while contributing in the #contributors channel in the [Cube Slack](https://slack.cube.dev/). diff --git a/.github/workflows/drivers-tests.yml b/.github/workflows/drivers-tests.yml new file mode 100644 index 0000000000000..f0a90352c7d14 --- /dev/null +++ b/.github/workflows/drivers-tests.yml @@ -0,0 +1,268 @@ +name: 'Drivers tests' + +on: + push: + branches: + - 'master' + paths: + - '.github/workflows/drivers-tests.yml' + + - 'packages/cubejs-testing-drivers/**' + - 'packages/cubejs-testing-shared/**' + - 'packages/cubejs-query-orchestrator/src/**' + - 'packages/cubejs-backend-shared/**' + - 'packages/cubejs-server-core/**' + - 'packages/cubejs-schema-compiler/**' + + - 'packages/cubejs-base-driver/src/**' + - 'packages/cubejs-jdbc-driver/src/**' + - 'packages/cubejs-athena-driver/**' + - 'packages/cubejs-bigquery-driver/**' + - 'packages/cubejs-clickhouse-driver/**' + - 'packages/cubejs-databricks-jdbc-driver/**' + - 'packages/cubejs-mssql-driver/**' + - 'packages/cubejs-mysql-driver/**' + - 'packages/cubejs-postgres-driver/**' + - 'packages/cubejs-snowflake-driver/**' + + # To test SQL API Push down + - 'packages/cubejs-backend-native/**' + - 'rust/cubesql/**' + pull_request: + paths: + - '.github/workflows/drivers-tests.yml' + + - 'packages/cubejs-testing-drivers/**' + - 'packages/cubejs-testing-shared/**' + - 'packages/cubejs-query-orchestrator/src/**' + - 'packages/cubejs-backend-shared/**' + - 'packages/cubejs-server-core/**' + - 'packages/cubejs-schema-compiler/**' + + - 'packages/cubejs-base-driver/src/**' + - 'packages/cubejs-jdbc-driver/src/**' + - 'packages/cubejs-athena-driver/**' + - 'packages/cubejs-bigquery-driver/**' + - 'packages/cubejs-clickhouse-driver/**' + - 'packages/cubejs-databricks-jdbc-driver/**' + - 'packages/cubejs-mssql-driver/**' + - 'packages/cubejs-mysql-driver/**' + - 'packages/cubejs-postgres-driver/**' + - 'packages/cubejs-snowflake-driver/**' + + # To test SQL API Push down + - 'packages/cubejs-backend-native/**' + - 'rust/cubesql/**' + +jobs: + latest-tag-sha: + runs-on: ubuntu-20.04 + outputs: + sha: ${{ steps.get-tag.outputs.sha }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - id: git-log + run: git log HEAD~30..HEAD + - id: get-tag-test + run: echo "$SHA $(git rev-list -n 1 $(git tag --contains $SHA))" + env: + SHA: ${{ github.sha }} + - id: get-tag + run: echo "::set-output name=sha::$(git rev-list -n 1 $(git tag --contains $SHA))" + env: + SHA: ${{ github.sha }} + - id: get-tag-out + run: echo "$OUT" + env: + OUT: ${{ steps.get-tag.outputs.sha }} + + native_linux: + runs-on: ubuntu-20.04 + timeout-minutes: 60 + name: Build native Linux ${{ matrix.node-version }} ${{ matrix.target }} Python ${{ matrix.python-version }} + strategy: + matrix: + node-version: [ 18 ] + python-version: [ "fallback" ] + target: [ "x86_64-unknown-linux-gnu" ] + fail-fast: false + container: + image: cubejs/rust-cross:${{ matrix.target }}-02042024 + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2023-12-13 + override: true + components: rustfmt + target: ${{ matrix.target }} + - name: Install Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Install Yarn + run: npm install -g yarn + - name: Set Yarn version + run: yarn policies set-version v1.22.19 + - name: Install cargo-cp-artifact + run: npm install -g cargo-cp-artifact@0.1 + - uses: Swatinem/rust-cache@v2 + with: + 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: Build native (fallback) + if: (matrix.python-version == 'fallback') + env: + CARGO_BUILD_TARGET: ${{ matrix.target }} + run: cd packages/cubejs-backend-native && npm run native:build-release + - name: Setup cross compilation + if: (matrix.target == 'aarch64-unknown-linux-gnu') + uses: allenevans/set-env@v3.0.0 + with: + PYO3_CROSS_PYTHON_VERSION: ${{ matrix.python-version }} + - name: Build native (with Python) + if: (matrix.python-version != 'fallback') + env: + PYO3_PYTHON: python${{ matrix.python-version }} + CARGO_BUILD_TARGET: ${{ matrix.target }} + run: cd packages/cubejs-backend-native && npm run native:build-release-python + - name: Upload native build + uses: actions/upload-artifact@v4 + with: + name: backend-native + path: packages/cubejs-backend-native/index.node + + build: + needs: [latest-tag-sha, native_linux] + if: (needs['latest-tag-sha'].outputs.sha != github.sha) + runs-on: ubuntu-20.04 + timeout-minutes: 30 + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + # Building docker + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Download native build + uses: actions/download-artifact@v4 + with: + name: backend-native + path: packages/cubejs-backend-native/ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + version: v0.10.3 + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./packages/cubejs-docker/testing-drivers.Dockerfile + tags: cubejs/cube:testing-drivers + push: true + + tests: + runs-on: ubuntu-20.04 + timeout-minutes: 30 + needs: [latest-tag-sha, build] + if: (needs['latest-tag-sha'].outputs.sha != github.sha) + strategy: + matrix: + node: + - 18.x + database: + - athena + - bigquery + - clickhouse + - databricks-jdbc + - databricks-jdbc-export-bucket + - mssql + - mysql + - postgres + - snowflake + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Configure `yarn` + run: yarn policies set-version v1.22.19 + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + # We don't want to save it on finish, restore only! + uses: actions/cache/restore@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + uses: nick-invision/retry@v2 + env: + CUBESTORE_SKIP_POST_INSTALL: true + with: + max_attempts: 3 + retry_on: error + retry_wait_seconds: 15 + timeout_minutes: 20 + command: yarn install --frozen-lockfile + + - name: Build client + run: yarn build + + - name: Build packages + run: yarn tsc + + - name: Build tests + run: | + cd packages/cubejs-testing-drivers + yarn tsc + + - name: Run tests + env: + # Athena + DRIVERS_TESTS_ATHENA_CUBEJS_AWS_KEY: ${{ secrets.DRIVERS_TESTS_ATHENA_CUBEJS_AWS_KEY }} + DRIVERS_TESTS_ATHENA_CUBEJS_AWS_SECRET: ${{ secrets.DRIVERS_TESTS_ATHENA_CUBEJS_AWS_SECRET }} + + # BigQuery + DRIVERS_TESTS_CUBEJS_DB_BQ_CREDENTIALS: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_BQ_CREDENTIALS }} + + # Databricks + DRIVERS_TESTS_CUBEJS_DB_DATABRICKS_URL: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_DATABRICKS_URL }} + DRIVERS_TESTS_CUBEJS_DB_DATABRICKS_TOKEN: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_DATABRICKS_TOKEN }} + DRIVERS_TESTS_CUBEJS_DB_EXPORT_BUCKET_AWS_KEY: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_EXPORT_BUCKET_AWS_KEY }} + DRIVERS_TESTS_CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET }} + + # Snowflake + DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_USER: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_USER }} + DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_PASS: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_PASS }} + run: | + cd ./packages/cubejs-testing-drivers + export DEBUG=testcontainers + yarn ${{ matrix.database }}-full diff --git a/.github/workflows/push-cross-images.yml b/.github/workflows/push-cross-images.yml new file mode 100644 index 0000000000000..756160ae4ac4e --- /dev/null +++ b/.github/workflows/push-cross-images.yml @@ -0,0 +1,54 @@ +name: Cross Images + +on: + push: + paths: + - '.github/workflows/push-cross-images.yml' + - 'rust/cubestore/cross/**' + branches: + - 'master' + pull_request: + paths: + - '.github/workflows/push-cross-images.yml' + - 'rust/cubestore/cross/**' + +jobs: + docker-dev: + name: Build cross image for ${{ matrix.target }} target + runs-on: ubuntu-20.04 + timeout-minutes: 120 + strategy: + matrix: + target: + - x86_64-unknown-linux-gnu + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + fail-fast: false + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Login to DockerHub + if: ${{ github.ref == 'refs/heads/master' }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + version: v0.9.1 + driver-opts: network=host + - name: Load .cross file + uses: xom9ikk/dotenv@v2 + with: + path: rust/cubestore/cross/ + - name: Push to Docker Hub + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./rust/cubestore/cross/${{ matrix.target }}.Dockerfile + platforms: linux/amd64 + push: ${{ github.ref == 'refs/heads/master' }} + tags: cubejs/rust-cross:${{ matrix.target }},cubejs/rust-cross:${{ matrix.target }}-${{ env.CROSS_VERSION }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 24b5edfe867a3..9cb3f1d4d62e6 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,14 +1,28 @@ name: Build on: + push: + paths: + - '.github/actions/smoke.sh' + - '.github/workflows/push.yml' + - '.github/workflows/master.yml' + - 'packages/**' + - 'rust/cubestore/**' + - 'rust/cubesql/**' + - '.eslintrc.js' + - '.prettierrc' + - 'package.json' + - 'lerna.json' + - 'rollup.config.js' + - 'yarn.lock' + branches: + - 'master' pull_request: paths: - '.github/workflows/push.yml' - '.github/workflows/master.yml' - 'packages/**' - - 'rust/cubestore/js-wrapper/**' - - 'rust/cubestore/tsconfig.json' - - 'rust/cubestore/package.json' + - 'rust/cubestore/**' - 'rust/cubesql/**' - '.eslintrc.js' - '.prettierrc' @@ -26,7 +40,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 16.x] + node-version: [18.x, 20.x] fail-fast: false steps: @@ -35,36 +49,33 @@ jobs: env: OUT: ${{ needs['latest-tag-sha'].outputs.sha }} - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: # pulls all commits (needed for codecov) fetch-depth: 2 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubestore/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -81,12 +92,12 @@ jobs: run: yarn build - name: Lerna test run: yarn lerna run --concurrency 1 --stream --no-prefix unit - - uses: codecov/codecov-action@v1 - if: (matrix.node-version == '16.x') - with: - files: ./packages/*/coverage/clover.xml - flags: cube-backend - verbose: true # optional (default = false) +# - uses: codecov/codecov-action@v1 +# if: (matrix.node-version == '18.x') +# with: +# files: ./packages/*/coverage/clover.xml +# flags: cube-backend +# verbose: true # optional (default = false) lint: runs-on: ubuntu-20.04 @@ -96,33 +107,30 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt - - name: Install Node.js 14.x - uses: actions/setup-node@v1 + - name: Install Node.js 18.x + uses: actions/setup-node@v3 with: - node-version: 14.x + node-version: 18.x - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubestore/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-14.x-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-14.x- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -146,33 +154,30 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt - - name: Install Node.js 14.x - uses: actions/setup-node@v1 + - name: Install Node.js 18.x + uses: actions/setup-node@v3 with: - node-version: 14.x + node-version: 18.x - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubestore/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-14.x-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-14.x- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -189,58 +194,97 @@ jobs: run: yarn build - name: Build other packages run: yarn lerna run --concurrency 1 build + env: + NODE_OPTIONS: --max_old_space_size=4096 - integration-redis: - needs: [unit, lint, latest-tag-sha] + build-cubestore: + needs: [latest-tag-sha] runs-on: ubuntu-20.04 timeout-minutes: 60 if: (needs['latest-tag-sha'].outputs.sha != github.sha) + steps: + - name: Maximize build space (disk space limitations) + run: | + echo "Before" + df -h + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^mongodb-.*' + sudo apt-get remove -y '^mysql-.*' + sudo apt-get autoremove -y + sudo apt-get clean - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + echo "After" + df -h + - name: Checkout + uses: actions/checkout@v4 + - uses: Swatinem/rust-cache@v2 + with: + workspaces: ./rust/cubestore -> target + # Separate path for release key to protect cache bloating + shared-key: cubestore-release + key: ubuntu-20.04 + - name: Build Cube Store + run: | + cd rust/cubestore + cargo build --release -j 4 + - name: 'Upload cubestored-x86_64-unknown-linux-gnu-release artifact' + uses: actions/upload-artifact@v3 + with: + name: cubestored-x86_64-unknown-linux-gnu-release + path: ./rust/cubestore/target/release/cubestored + retention-days: 5 + + integration-cubestore: + needs: [latest-tag-sha, build-cubestore] + runs-on: ubuntu-20.04 + timeout-minutes: 60 + if: (needs['latest-tag-sha'].outputs.sha != github.sha) strategy: matrix: - node-version: [14.x] + node-version: [18.x] fail-fast: false steps: + - name: Maximize build space (disk space limitations) + run: | + echo "Before" + df -h + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^mongodb-.*' + sudo apt-get remove -y '^mysql-.*' + sudo apt-get autoremove -y + sudo apt-get clean + + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + echo "After" + df -h - name: Checkout - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2022-03-08 - override: true - components: rustfmt + uses: actions/checkout@v4 - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubestore/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -253,34 +297,19 @@ jobs: command: yarn install --frozen-lockfile - name: Lerna tsc run: yarn tsc - - name: Run Redis Integration with Redis Driver - timeout-minutes: 10 + - name: Download cubestored-x86_64-unknown-linux-gnu-release artifact + uses: actions/download-artifact@v3 + with: + path: ./rust/cubestore/target/release/ + name: cubestored-x86_64-unknown-linux-gnu-release + - name: Run Cube Store in background run: | - yarn lerna run --concurrency 1 --stream --no-prefix integration:redis - env: - CUBEJS_REDIS_USE_IOREDIS: false - - name: Run Redis Integration with IORedis Driver + chmod +x ./rust/cubestore/target/release/cubestored + RUNNER_TRACKING_ID="" && ./rust/cubestore/target/release/cubestored & + - name: Run Cubestore Integration timeout-minutes: 10 run: | - yarn lerna run --concurrency 1 --stream --no-prefix integration:redis - env: - CUBEJS_REDIS_USE_IOREDIS: true - - name: Setup Redis Cluster - uses: vishnudxb/redis-cluster@1.0.5 - with: - master1-port: 5000 - master2-port: 5001 - master3-port: 5002 - slave1-port: 5003 - slave2-port: 5004 - slave3-port: 5005 - - name: Run Redis Integration with Cluster - timeout-minutes: 10 - run: | - yarn lerna run --concurrency 1 --stream --no-prefix integration:redis - env: - CUBEJS_REDIS_USE_IOREDIS: true - CUBEJS_REDIS_SENTINEL: "redis+sentinel://localhost:5000,localhost:5001,localhost:5002/mymaster/0" + yarn lerna run --concurrency 1 --stream --no-prefix integration:cubestore integration: needs: [unit, lint, latest-tag-sha] @@ -290,39 +319,39 @@ jobs: strategy: matrix: - node-version: [14.x] - db: ['postgres'] + node-version: [18.x] + db: [ + 'clickhouse', 'druid', 'elasticsearch', 'mssql', 'mysql', 'postgres', 'prestodb', + 'mysql-aurora-serverless', 'crate', 'mongobi' + ] fail-fast: false steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -340,45 +369,52 @@ jobs: run: ./.github/actions/integration/${{ matrix.db }}.sh integration-smoke: - needs: [ latest-tag-sha ] + needs: [ latest-tag-sha, build-cubestore ] runs-on: ubuntu-20.04 - timeout-minutes: 60 + timeout-minutes: 90 if: (needs['latest-tag-sha'].outputs.sha != github.sha) strategy: matrix: - node-version: [ 14.x ] + node-version: [ 18.x ] fail-fast: false steps: + - name: Maximize build space (disk space limitations) + run: | + echo "Before" + df -h + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^mongodb-.*' + sudo apt-get remove -y '^mysql-.*' + sudo apt-get autoremove -y + sudo apt-get clean + + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + echo "After" + df -h - name: Checkout - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2022-06-22 - override: true - components: rustfmt + uses: actions/checkout@v4 - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 - with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Yarn install uses: nick-invision/retry@v2 env: @@ -389,31 +425,23 @@ jobs: retry_wait_seconds: 15 timeout_minutes: 20 command: yarn install --frozen-lockfile + - name: Install instant client for Oracle + uses: GoodManWEN/oracle-client-action@main - name: Build client run: yarn build - name: Lerna tsc run: yarn tsc - - uses: Swatinem/rust-cache@v1 + - name: Download cubestored-x86_64-unknown-linux-gnu-release artifact + uses: actions/download-artifact@v3 with: - working-directory: ./rust/cubestore - key: ubuntu-20.04 - - name: Build cubestore - uses: actions-rs/cargo@v1 - with: - command: build - args: --manifest-path rust/cubestore/Cargo.toml -j 4 + path: rust/cubestore/downloaded/latest/bin/ + name: cubestored-x86_64-unknown-linux-gnu-release + - name: Chmod +x for cubestored + run: | + chmod +x ./rust/cubestore/downloaded/latest/bin/cubestored - name: Run Integration smoke tests timeout-minutes: 30 - run: | - mkdir -p rust/cubestore/downloaded/latest/bin - cp rust/cubestore/target/debug/cubestored rust/cubestore/downloaded/latest/bin/cubestored - cd packages/cubejs-testing/ - yarn run smoke:postgres - yarn run smoke:crate - yarn run smoke:materialize - yarn run smoke:questdb - yarn run smoke:multidb - yarn run smoke:lambda + run: ./.github/actions/smoke.sh docker-image-latest-set-tag: # At least git should be completed pushed up until this moment @@ -424,7 +452,7 @@ jobs: tag: ${{ steps.get-tag.outputs.tag }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - id: get-tag run: echo "::set-output name=tag::$(git tag --contains $GITHUB_SHA)" env: @@ -435,7 +463,7 @@ jobs: outputs: sha: ${{ steps.get-tag.outputs.sha }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - id: git-log @@ -451,4 +479,154 @@ jobs: - id: get-tag-out run: echo "$OUT" env: - OUT: ${{ steps.get-tag.outputs.sha }} \ No newline at end of file + OUT: ${{ steps.get-tag.outputs.sha }} + + docker-dev: + needs: [latest-tag-sha] + if: (needs['latest-tag-sha'].outputs.sha != github.sha) + name: Build & Test :dev for ${{ matrix.name }} without pushing + runs-on: ubuntu-22.04 + timeout-minutes: 60 + services: + registry: + image: registry:2 + ports: + - 5000:5000 + strategy: + matrix: + dockerfile: + - dev.Dockerfile + include: + - dockerfile: dev.Dockerfile + name: Debian + tag: tmp-dev + fail-fast: false + steps: + - name: Maximize build space (disk space limitations) + run: | + echo "Before" + df -h + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^mongodb-.*' + sudo apt-get remove -y '^mysql-.*' + sudo apt-get autoremove -y + sudo apt-get clean + + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + echo "After" + df -h + - name: Checkout + uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + version: v0.9.1 + driver-opts: network=host + - name: Build image + uses: docker/build-push-action@v3 + timeout-minutes: 30 + with: + context: . + file: ./packages/cubejs-docker/${{ matrix.dockerfile }} + platforms: linux/amd64 + push: true + tags: localhost:5000/cubejs/cube:${{ matrix.tag }} + - name: Use Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Set Yarn version + run: yarn policies set-version v1.22.19 + - name: Yarn install + uses: nick-invision/retry@v2 + env: + CUBESTORE_SKIP_POST_INSTALL: true + with: + max_attempts: 3 + retry_on: error + retry_wait_seconds: 15 + timeout_minutes: 20 + command: yarn install --frozen-lockfile + - name: Build client + run: yarn build + - name: Lerna tsc + run: yarn tsc + - name: Testing CubeJS (container mode) via BirdBox + run: | + cd packages/cubejs-testing/ + export BIRDBOX_CUBEJS_VERSION=${{ matrix.tag }} + export BIRDBOX_CUBEJS_REGISTRY_PATH=localhost:5000/ + export DEBUG=testcontainers + yarn run dataset:minimal + yarn run birdbox:postgresql + yarn run birdbox:postgresql-pre-aggregations + # - name: Testing Athena driver (container mode) via BirdBox + # env: + # CUBEJS_AWS_KEY: ${{ secrets.CUBEJS_AWS_KEY }} + # CUBEJS_AWS_SECRET: ${{ secrets.CUBEJS_AWS_SECRET }} + # CUBEJS_AWS_REGION: us-east-1 + # CUBEJS_AWS_S3_OUTPUT_LOCATION: s3://cubejs-opensource/testing/output + # CUBEJS_DB_EXPORT_BUCKET: s3://cubejs-opensource/testing/export + # run: | + # cd packages/cubejs-testing/ + # export BIRDBOX_CUBEJS_VERSION=${{ matrix.tag }} + # export BIRDBOX_CUBEJS_REGISTRY_PATH=localhost:5000/ + # export DEBUG=testcontainers + # yarn run driver:athena --log=ignore --mode=docker + # - name: Testing BigQuery driver (container mode) via BirdBox + # env: + # CUBEJS_DB_BQ_CREDENTIALS: ${{ secrets.CUBEJS_DB_BQ_CREDENTIALS }} + # CUBEJS_DB_BQ_PROJECT_ID: cube-open-source + # CUBEJS_DB_EXPORT_BUCKET: cube-open-source-export-bucket + # run: | + # cd packages/cubejs-testing/ + # export BIRDBOX_CUBEJS_VERSION=${{ matrix.tag }} + # export BIRDBOX_CUBEJS_REGISTRY_PATH=localhost:5000/ + # export DEBUG=testcontainers + # yarn run driver:bigquery --log=ignore --mode=docker + - name: Testing PostgreSQL driver (container mode) via BirdBox + env: + CUBEJS_DB_TYPE: postgres + CUBEJS_DB_USER: postgres + CUBEJS_DB_PASS: postgres + run: | + cd packages/cubejs-testing/ + export BIRDBOX_CUBEJS_VERSION=${{ matrix.tag }} + export BIRDBOX_CUBEJS_REGISTRY_PATH=localhost:5000/ + export DEBUG=testcontainers + yarn run driver:postgres --log=ignore --mode=docker + - name: Testing Docker image via Cypress (Chrome) + env: + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + BIRDBOX_CYPRESS_UPDATE_SCREENSHOTS: ${{ contains(github.event.head_commit.message, '[update screenshots]') }} + run: | + cd packages/cubejs-testing/ + export BIRDBOX_CUBEJS_VERSION=${{ matrix.tag }} + export BIRDBOX_CUBEJS_REGISTRY_PATH=localhost:5000/ + export BIRDBOX_CYPRESS_BROWSER=chrome + export BIRDBOX_CYPRESS_TARGET=postgresql + export DEBUG=testcontainers + yarn run cypress:install + yarn run cypress:birdbox + - name: Upload screenshots on failure + uses: actions/upload-artifact@v2 + if: failure() + with: + name: cypress-screenshots-docker-dev-${{ matrix.name }} + path: packages/cubejs-testing/cypress/screenshots diff --git a/.github/workflows/rust-cubesql.yml b/.github/workflows/rust-cubesql.yml index 345c51deae9b2..afb7e97f46e0f 100644 --- a/.github/workflows/rust-cubesql.yml +++ b/.github/workflows/rust-cubesql.yml @@ -1,11 +1,17 @@ name: Build native on: - pull_request: + push: paths: - '.github/workflows/rust-cubesql.yml' - 'packages/cubejs-backend-native/**' - 'rust/cubesql/**' + branches: + - 'master' + pull_request: + paths: + - '.github/workflows/rust-cubesql.yml' + - 'packages/cubejs-backend-native/**' - 'rust/cubesql/**' jobs: @@ -16,19 +22,19 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt, clippy - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: - working-directory: ./rust/cubesql + workspaces: ./rust/cubesql -> target # default key - key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 - sharedKey: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 + key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu + shared-key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu - name: Lint CubeSQL run: cd rust/cubesql/cubesql && cargo fmt --all -- --check - name: Lint Native @@ -41,125 +47,98 @@ jobs: unit: runs-on: ubuntu-20.04 - timeout-minutes: 40 + timeout-minutes: 60 name: Unit (Rewrite Engine) steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: # pulls all commits (needed for codecov) fetch-depth: 2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2022-03-08 - override: true - components: rustfmt - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: - working-directory: ./rust/cubesql + workspaces: ./rust/cubesql -> target # default key - key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 - sharedKey: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 - - name: Install tarpaulin@0.20.1 - uses: baptiste0928/cargo-install@v1 + key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu + shared-key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu + - name: Install tarpaulin@0.28.0 + uses: baptiste0928/cargo-install@v3 with: crate: cargo-tarpaulin - version: "0.20.1" + version: "0.28.0" - name: Unit tests (Rewrite Engine) env: CUBESQL_TESTING_CUBE_TOKEN: ${{ secrets.CUBESQL_TESTING_CUBE_TOKEN }} CUBESQL_TESTING_CUBE_URL: ${{ secrets.CUBESQL_TESTING_CUBE_URL }} - CUBESQL_REWRITE_ENGINE: true + CUBESQL_SQL_PUSH_DOWN: true + CUBESQL_REWRITE_CACHE: true + CUBESQL_REWRITE_TIMEOUT: 60 run: cd rust/cubesql && cargo tarpaulin --workspace --no-fail-fast --avoid-cfg-tarpaulin --out Xml - - name: Upload code coverage - uses: codecov/codecov-action@v2 - with: - files: ./rust/cubesql/cobertura.xml - verbose: true - flags: cubesql - fail_ci_if_error: true - - unit_legacy: - runs-on: ubuntu-20.04 - timeout-minutes: 40 - name: Unit (Legacy) - - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - # pulls all commits (needed for codecov) - fetch-depth: 2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2022-03-08 - override: true - components: rustfmt - - uses: Swatinem/rust-cache@v1 - with: - working-directory: ./rust/cubesql - # default key - key: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 - sharedKey: cubesql-${{ runner.OS }}-x86_64-unknown-linux-gnu-16 - - name: Unit tests (Legacy Engine) - env: - CUBESQL_TESTING_CUBE_TOKEN: ${{ secrets.CUBESQL_TESTING_CUBE_TOKEN }} - CUBESQL_TESTING_CUBE_URL: ${{ secrets.CUBESQL_TESTING_CUBE_URL }} - run: cd rust/cubesql && cargo test +# - name: Upload code coverage +# uses: codecov/codecov-action@v3 +# with: +# files: ./rust/cubesql/cobertura.xml +# verbose: true +# flags: cubesql +# fail_ci_if_error: false native_linux: - needs: [lint,unit,unit_legacy] + needs: [lint] runs-on: ubuntu-20.04 timeout-minutes: 60 - name: Build Linux GNU ${{ matrix.node-version }}.x ${{ matrix.target }} + name: Build Linux GNU ${{ matrix.node-version }}.x ${{ matrix.target }} with Python ${{ matrix.python-version }} strategy: matrix: - node-version: [12, 14, 16, 17] + # Current used version + 1 LTS + node-version: [18, 20] + python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"] target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"] + # minimize number of jobs + exclude: + - node-version: 18 + target: "aarch64-unknown-linux-gnu" + - python-version: 3.10 + target: "aarch64-unknown-linux-gnu" + - python-version: 3.11 + target: "aarch64-unknown-linux-gnu" fail-fast: false container: - image: cubejs/rust-cross:${{ matrix.target }}-10052021 + image: cubejs/rust-cross:${{ matrix.target }}-02042024 steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt target: ${{ matrix.target }} - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: - working-directory: ./rust/cubesql + workspaces: ./rust/cubesql -> target key: cubesql-${{ runner.OS }}-${{ matrix.target }}-${{ matrix.node-version }} - sharedKey: cubesql-${{ runner.OS }}-${{ matrix.target }}-${{ matrix.node-version }} + shared-key: cubesql-${{ runner.OS }}-${{ matrix.target }}-${{ matrix.node-version }} - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install Yarn run: npm install -g yarn - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna - uses: actions/cache@v2 + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + - name: Restore yarn cache + uses: actions/cache@v3 with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubesql/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Yarn install uses: nick-invision/retry@v2 env: @@ -170,77 +149,180 @@ jobs: retry_wait_seconds: 15 timeout_minutes: 20 command: yarn install --frozen-lockfile - - name: Build native + - name: Lerna tsc + run: yarn tsc + - name: Build native (fallback) + if: (matrix.python-version == 'fallback') env: CARGO_BUILD_TARGET: ${{ matrix.target }} - run: cd packages/cubejs-backend-native && yarn run native:build + working-directory: ./packages/cubejs-backend-native + run: yarn run native:build-debug + - name: Setup cross compilation + if: (matrix.target == 'aarch64-unknown-linux-gnu') + uses: allenevans/set-env@v3.0.0 + with: + PYO3_CROSS_PYTHON_VERSION: ${{ matrix.python-version }} + - name: Build native (with Python) + if: (matrix.python-version != 'fallback') + env: + PYO3_PYTHON: python${{ matrix.python-version }} + CARGO_BUILD_TARGET: ${{ matrix.target }} + working-directory: ./packages/cubejs-backend-native + run: yarn run native:build-debug-python - name: Test native (GNU only) if: (matrix.target == 'x86_64-unknown-linux-gnu') env: + CUBESQL_STREAM_MODE: true CUBEJS_NATIVE_INTERNAL_DEBUG: true - run: cd packages/cubejs-backend-native && yarn run test:unit + working-directory: ./packages/cubejs-backend-native + run: yarn run test:unit - name: Run E2E Smoke testing over whole Cube (GNU only) if: (matrix.target == 'x86_64-unknown-linux-gnu') env: CUBEJS_NATIVE_INTERNAL_DEBUG: true - run: yarn tsc && cd packages/cubejs-testing && yarn smoke:cubesql + working-directory: ./packages/cubejs-testing + run: yarn smoke:cubesql - native: - needs: [lint,unit,unit_legacy] + native_macos: + needs: [lint] runs-on: ${{ matrix.os-version }} timeout-minutes: 60 - name: Build ${{ matrix.os-version }} ${{ matrix.node-version }} + name: Build ${{ matrix.os-version }} ${{ matrix.target }} ${{ matrix.node-version }} with Python ${{ matrix.python-version }} strategy: matrix: - node-version: [12.x, 14.x, 16.x, 17.x] - os-version: [windows-2019, macos-11] + # We do not need to test under all versions, we do it under linux + node-version: [18.x] + os-version: ["macos-11"] + target: ["x86_64-apple-darwin", "aarch64-apple-darwin"] + include: + - target: x86_64-apple-darwin + python-version: "3.9" + - target: x86_64-apple-darwin + python-version: "3.10" + - target: x86_64-apple-darwin + python-version: "3.11" + - target: x86_64-apple-darwin + python-version: "3.12" + - target: x86_64-apple-darwin + python-version: "fallback" + - target: aarch64-apple-darwin + python-version: "fallback" fail-fast: false steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-08 + toolchain: nightly-2023-12-13 override: true components: rustfmt + target: ${{ matrix.target }} + - name: Install Python + uses: actions/setup-python@v4 + if: (matrix.python-version != 'fallback') + with: + python-version: ${{ matrix.python-version }} - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - name: Install Yarn - run: npm install -g yarn - name: Set Yarn version - run: yarn policies set-version v1.22.5 + run: yarn policies set-version v1.22.19 - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Restore lerna (excluding Windows) - uses: actions/cache@v2 - if: ${{ !startsWith(matrix.os-version, 'windows') }} + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - node_modules - rust/cubesql/node_modules - packages/*/node_modules - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- - # Windows doesn't support links + cache action doesn't support exclude - # cache will include rust cache for native, which causes 3GB archive - # Right now, GH provides 10 gb for each repository with automatic retention. - - name: Restore lerna (Windows only) - uses: actions/cache@v2 - if: ${{ startsWith(matrix.os-version, 'windows') }} + ${{ runner.os }}-yarn- + - name: Yarn install + uses: nick-invision/retry@v2 + env: + CUBESTORE_SKIP_POST_INSTALL: true with: - path: | - ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-workspace-main-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + max_attempts: 3 + retry_on: error + retry_wait_seconds: 15 + timeout_minutes: 20 + command: yarn install --frozen-lockfile + - name: Lerna tsc + run: yarn tsc + - name: Build native (fallback) + if: (matrix.python-version == 'fallback') + env: + CUBESQL_STREAM_MODE: true + CUBEJS_NATIVE_INTERNAL_DEBUG: true + CARGO_BUILD_TARGET: ${{ matrix.target }} + run: cd packages/cubejs-backend-native && yarn run native:build + - name: Build native (with Python) + if: (matrix.python-version != 'fallback') + env: + PYO3_PYTHON: python${{ matrix.python-version }} + CARGO_BUILD_TARGET: ${{ matrix.target }} + run: cd packages/cubejs-backend-native && yarn run native:build-debug-python + - name: Tests + # We cannot test arm64 on x64 + if: (matrix.target == 'x86_64-apple-darwin') + env: + CUBESQL_STREAM_MODE: true + CUBEJS_NATIVE_INTERNAL_DEBUG: true + run: cd packages/cubejs-backend-native && yarn run test:unit + + native_windows: + needs: [lint] + runs-on: ${{ matrix.os-version }} + timeout-minutes: 60 + name: Build ${{ matrix.os-version }} ${{ matrix.node-version }} with Python ${{ matrix.python-version }} + + strategy: + matrix: + # We do not need to test under all versions, we do it under linux + node-version: [18.x] + os-version: [windows-2019] + python-version: ["fallback"] + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Disable rustup update (issue workaround for Windows) + run: rustup set auto-self-update disable + shell: bash + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2023-12-13 + override: true + components: rustfmt + - name: Install Python + uses: actions/setup-python@v4 + if: (matrix.python-version != 'fallback') + with: + python-version: ${{ matrix.python-version }} + - name: Install Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: Set Yarn version + run: yarn policies set-version v1.22.19 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - name: Restore yarn cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-workspace-main-${{ matrix.node-version }}- + ${{ runner.os }}-yarn- - name: Yarn install uses: nick-invision/retry@v2 env: @@ -251,7 +333,21 @@ jobs: retry_wait_seconds: 15 timeout_minutes: 20 command: yarn install --frozen-lockfile - - name: Build native + - name: Lerna tsc + run: yarn tsc + - name: Build native (fallback) + if: (matrix.python-version == 'fallback') env: + CUBESQL_STREAM_MODE: true CUBEJS_NATIVE_INTERNAL_DEBUG: true - run: cd packages/cubejs-backend-native && yarn run native:build && yarn run test:unit + run: cd packages/cubejs-backend-native && yarn run native:build + - name: Build native (with Python) + if: (matrix.python-version != 'fallback') + env: + PYO3_PYTHON: python${{ matrix.python-version }} + run: cd packages/cubejs-backend-native && yarn run native:build-debug-python + - name: Tests + env: + CUBESQL_STREAM_MODE: true + CUBEJS_NATIVE_INTERNAL_DEBUG: true + run: cd packages/cubejs-backend-native && yarn run test:unit diff --git a/.github/workflows/rust-cubestore.yml b/.github/workflows/rust-cubestore.yml index 22a888aef074a..65379a919b397 100644 --- a/.github/workflows/rust-cubestore.yml +++ b/.github/workflows/rust-cubestore.yml @@ -9,27 +9,46 @@ on: jobs: debian: name: Debian Rust ${{ matrix.rust }} - runs-on: ubuntu-20.04 - timeout-minutes: 60 + # 22.04 has gcc 11, new binutils (ld) + runs-on: ubuntu-22.04 + timeout-minutes: 90 strategy: fail-fast: false matrix: - rust: [nightly-2022-06-22] + rust: [nightly-2024-01-29] env: RUST: ${{ matrix.rust }} steps: + - name: Maximize build space (disk space limitations) + run: | + echo "Before" + df -h + sudo apt-get remove -y 'php.*' + sudo apt-get remove -y '^mongodb-.*' + sudo apt-get remove -y '^mysql-.*' + sudo apt-get autoremove -y + sudo apt-get clean + + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/lib/android + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + echo "After" + df -h - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true components: rustfmt - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@v2 with: - working-directory: ./rust/cubestore - key: ubuntu-20.04 + workspaces: ./rust/cubestore -> target + # We should use a separate key for testing to pass disk space limitations + shared-key: cubestore-testing + key: ubuntu-22.04 - name: Run cargo fmt cubestore uses: actions-rs/cargo@v1 with: @@ -70,20 +89,20 @@ jobs: if: github.ref != 'refs/heads/master' steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 with: - version: v0.6.3 + version: v0.9.1 - name: Cache Docker layers - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-${{ matrix.target }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ matrix.target }}-buildx- - name: Build only - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: ./rust/cubestore/ file: ./rust/cubestore/Dockerfile @@ -93,7 +112,7 @@ jobs: cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache - cross: + cubestore: runs-on: ${{ matrix.os }} timeout-minutes: 90 env: @@ -102,72 +121,46 @@ jobs: strategy: matrix: target: - - x86_64-unknown-linux-gnu - - x86_64-unknown-linux-musl - x86_64-pc-windows-msvc - x86_64-apple-darwin - - aarch64-unknown-linux-gnu include: - - os: ubuntu-20.04 - target: x86_64-unknown-linux-gnu - executable_name: cubestored - cross: true - strip: true - compress: true - - os: ubuntu-20.04 - target: x86_64-unknown-linux-musl - executable_name: cubestored - cross: true - strip: true - # cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890 - compress: false - os: windows-2019 target: x86_64-pc-windows-msvc executable_name: cubestored.exe - cross: false strip: true # cubestored.exe: CantPackException: superfluous data between sections compress: false - - os: macos-latest + # Please use minimal possible version of macOS, because it produces constraint on libstdc++ + - os: macos-11 target: x86_64-apple-darwin executable_name: cubestored - cross: false strip: true compress: true - - os: ubuntu-20.04 - target: aarch64-unknown-linux-gnu - executable_name: cubestored - cross: true - # Unable to recognise the format of the input file `rust/cubestore/target/aarch64-unknown-linux-gnu/release/cubestored' - strip: false - # UPX is broken, issue https://github.com/cube-js/cube.js/issues/4474 - compress: false fail-fast: false steps: - - uses: actions/checkout@v2 - - name: Setup Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2022-06-22 - target: ${{ matrix.target }} - override: true - components: rustfmt - - uses: Swatinem/rust-cache@v1 + - uses: actions/checkout@v4 + - name: Disable rustup update (issue workaround for Windows) + run: rustup set auto-self-update disable + if: contains(runner.os, 'windows') + shell: bash + - uses: Swatinem/rust-cache@v2 with: - working-directory: rust/cubestore - key: cross-${{ runner.OS }}-${{ matrix.target }} - sharedKey: cross-${{ runner.OS }}-${{ matrix.target }} + workspaces: ./rust/cubestore -> target + prefix-key: v0-rust-cubestore-cross + key: target-${{ matrix.target }} - run: source .github/actions/${{ matrix.before_script }}.sh if: ${{ matrix.before_script }} shell: bash + - uses: ilammy/msvc-dev-cmd@v1 + if: ${{ startsWith(matrix.os, 'windows') }} - name: Install OpenSSL for Windows if: ${{ startsWith(matrix.os, 'windows') }} 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 9.0.1 + run: choco install -y --force llvm --version 18.1.2 - name: Set Env Variables for Windows - uses: allenevans/set-env@v2.0.0 + uses: allenevans/set-env@v3.0.0 if: ${{ startsWith(matrix.os, 'windows') }} with: OPENSSL_DIR: 'C:/vcpkg/packages/openssl_x64-windows' @@ -175,22 +168,9 @@ jobs: OPENSSL_LIB_DIR: 'C:/vcpkg/packages/openssl_x64-windows/lib' OPENSSL_INCLUDE_DIR: 'C:/vcpkg/packages/openssl_x64-windows/include' LIBCLANG_PATH: 'C:\Program Files\LLVM\bin' - - name: Build with Cross - if: ${{ matrix.cross }} - run: | - wget -c https://github.com/rust-embedded/cross/releases/download/v0.2.1/cross-v0.2.1-x86_64-unknown-linux-gnu.tar.gz -O - | tar -xz - chmod +x cross && sudo mv cross /usr/local/bin/cross - cd rust/cubestore - cross build --release --target=${{ matrix.target }} - name: Build with Cargo - if: ${{ !matrix.cross }} run: | cd rust/cubestore && cargo build --release --target=${{ matrix.target }} - - name: Brew update & install upx (workaround to use upx from github, instead of bintray) - if: ${{ matrix.os == 'macos-latest' }} - run: | - brew update - brew install upx - name: Compress binaries uses: svenstaro/upx-action@v2 if: ${{ matrix.compress }} @@ -215,3 +195,75 @@ jobs: path: cubestore-archive/cubestored-${{ matrix.target }}.tar.gz name: cubestored-${{ matrix.target }}.tar.gz retention-days: 1 + + cubestore_linux: + runs-on: ${{ matrix.os }} + timeout-minutes: 90 + env: + OPENSSL_STATIC: 1 + strategy: + matrix: + target: + - x86_64-unknown-linux-gnu + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + include: + - os: ubuntu-20.04 + target: x86_64-unknown-linux-gnu + executable_name: cubestored + strip: true + compress: false + - os: ubuntu-20.04 + target: x86_64-unknown-linux-musl + executable_name: cubestored + strip: true + # cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890 + compress: false + - os: ubuntu-20.04 + target: aarch64-unknown-linux-gnu + executable_name: cubestored + # Unable to recognise the format of the input file `rust/cubestore/target/aarch64-unknown-linux-gnu/release/cubestored' + strip: false + # UPX is broken, issue https://github.com/cube-js/cube/issues/4474 + compress: false + fail-fast: false + container: + image: cubejs/rust-cross:${{ matrix.target }}-02042024 + steps: + - uses: actions/checkout@v4 + - name: Setup Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2024-01-29 + target: ${{ matrix.target }} + override: true + components: rustfmt + - uses: Swatinem/rust-cache@v2 + with: + workspaces: ./rust/cubestore -> target + prefix-key: v0-rust-cubestore-cross + key: target-${{ matrix.target }} + - name: Build with Cargo + run: | + cd rust/cubestore && cargo build --release --target=${{ matrix.target }} + - name: Compress binaries + uses: svenstaro/upx-action@v2 + if: ${{ matrix.compress }} + with: + file: rust/cubestore/target/${{ matrix.target }}/release/${{ matrix.executable_name }} + args: --lzma + strip: ${{ matrix.strip }} + - name: Create folder for archive + run: | + mkdir cubestore-archive + mkdir cubestore-archive/bin + - name: Create archive for release + run: | + mv rust/cubestore/target/${{ matrix.target }}/release/${{ matrix.executable_name }} cubestore-archive/bin/${{ matrix.executable_name }} + cd cubestore-archive + tar -cvzf cubestored-${{ matrix.target }}.tar.gz * + - uses: actions/upload-artifact@v2 + with: + path: cubestore-archive/cubestored-${{ matrix.target }}.tar.gz + name: cubestored-${{ matrix.target }}.tar.gz + retention-days: 1 diff --git a/.gitignore b/.gitignore index a651cf0c84e2b..1c67497f47694 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ newrelic_agent.log /.DS_Store .DS_Store package-lock.json +pnpm-lock.yaml examples/examples-gallery/build yarn-error.log .gh-token @@ -18,3 +19,7 @@ yarn-error.log lerna-debug.log tsconfig.tsbuildinfo .tool-versions +testings/ +rust/cubesql/profile.json +.cubestore + diff --git a/.nvmrc b/.nvmrc index d8ff873d1ac50..99c98cdd6a88f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -12.22.7 +18.20.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 592d41eec3af6..de75f5651b7d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,4279 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.35.47](https://github.com/cube-js/cube/compare/v0.35.46...v0.35.47) (2024-06-07) + + +### Bug Fixes + +* **cubesql:** Rollup doesn't work over aliased columns ([#8334](https://github.com/cube-js/cube/issues/8334)) ([98e7529](https://github.com/cube-js/cube/commit/98e7529975703f2d4b72cc8f21ce4f8c6fc4c8de)) + + + + + +## [0.35.46](https://github.com/cube-js/cube/compare/v0.35.45...v0.35.46) (2024-06-06) + + +### Bug Fixes + +* **cubestore:** Channel closed in query queue cache ([#8327](https://github.com/cube-js/cube/issues/8327)) ([8898fb1](https://github.com/cube-js/cube/commit/8898fb19bb39dd4778fee695df1ef8497ee28eb2)) + + + + + +## [0.35.45](https://github.com/cube-js/cube/compare/v0.35.44...v0.35.45) (2024-06-05) + + +### Bug Fixes + +* **cubesql:** Don't duplicate time dimensions ([577220d](https://github.com/cube-js/cube/commit/577220ddb88c098dd3142e518fcdb73eb7513b74)) +* **cubesql:** Support `DATE_TRUNC` equals literal string ([69ba0ee](https://github.com/cube-js/cube/commit/69ba0eeb9724ee4105ad0d0ff39eedf92dbc715f)) + + +### Performance Improvements + +* **cubesql:** Improve rewrite engine performance ([4f78b8a](https://github.com/cube-js/cube/commit/4f78b8a9b75672227e7114be6a524a1b1ced8ff6)) + + + + + +## [0.35.44](https://github.com/cube-js/cube/compare/v0.35.43...v0.35.44) (2024-06-04) + + +### Bug Fixes + +* **databricks-jdbc-driver:** Rolling window & count_distinct_approx (HLL) ([#8323](https://github.com/cube-js/cube/issues/8323)) ([5969f0d](https://github.com/cube-js/cube/commit/5969f0d788fffc1fe3492783eec4270325520d38)) +* **query-orchestrator:** Range intersection for 6 digits timestamp, fix [#8320](https://github.com/cube-js/cube/issues/8320) ([#8322](https://github.com/cube-js/cube/issues/8322)) ([667e95b](https://github.com/cube-js/cube/commit/667e95bd9933d67f84409c09f61d47b28156f0c2)) + + + + + +## [0.35.43](https://github.com/cube-js/cube/compare/v0.35.42...v0.35.43) (2024-05-31) + + +### Bug Fixes + +* **native:** CLR - handle 1 level circular references for objects & arrays ([#8314](https://github.com/cube-js/cube/issues/8314)) ([7e8e1ff](https://github.com/cube-js/cube/commit/7e8e1ffdaba612e10f30a2a8eb59eeea47c55dcd)) +* **native:** Python - don't crash on extend_context ([#8315](https://github.com/cube-js/cube/issues/8315)) ([e7e7067](https://github.com/cube-js/cube/commit/e7e70673dce7fa923c41d5ae50eb973462a92188)) + + +### Features + +* **bigquery-driver:** Use 6 digits precision for timestamps ([#8308](https://github.com/cube-js/cube/issues/8308)) ([568bfe3](https://github.com/cube-js/cube/commit/568bfe34bc6aca136b580acb8873d208b522a2f3)) +* sql api over http ([#8254](https://github.com/cube-js/cube/issues/8254)) ([4c18954](https://github.com/cube-js/cube/commit/4c18954452bf14268a2f368960a72fec45f274dc)) + + + + + +## [0.35.42](https://github.com/cube-js/cube/compare/v0.35.41...v0.35.42) (2024-05-30) + + +### Features + +* **cubesql:** Group By Rollup support ([#8281](https://github.com/cube-js/cube/issues/8281)) ([e563798](https://github.com/cube-js/cube/commit/e5637980489608e374f3b89cc219207973a08bbb)) + + + + + +## [0.35.41](https://github.com/cube-js/cube/compare/v0.35.40...v0.35.41) (2024-05-27) + + +### Features + +* **databricks-driver:** Support HLL feature with export bucket ([#8301](https://github.com/cube-js/cube/issues/8301)) ([7f97af4](https://github.com/cube-js/cube/commit/7f97af42d6a6c0645bd778e94f75d62280ffeba6)) + + + + + +## [0.35.40](https://github.com/cube-js/cube/compare/v0.35.39...v0.35.40) (2024-05-24) + + +### Bug Fixes + +* **cubesql:** Match `inDateRange` as time dimension date range in `AND` ([64f176a](https://github.com/cube-js/cube/commit/64f176ab5afc4b0771e45206bff5d6649ca8d672)) +* **cubesql:** Propagate error from api-gateway to SQL API ([#8297](https://github.com/cube-js/cube/issues/8297)) ([1a93d3d](https://github.com/cube-js/cube/commit/1a93d3d85de5099a0325750e4d3e203693b50109)) + + +### Features + +* **cubesql:** Support `DATE_TRUNC` InList filter ([48e7ad4](https://github.com/cube-js/cube/commit/48e7ad4826f6d279570badae13c93b80c28c8094)) + + + + + +## [0.35.39](https://github.com/cube-js/cube/compare/v0.35.38...v0.35.39) (2024-05-24) + + +### Bug Fixes + +* **cubesql:** Fix time dimension range filter chaining with `OR` operator ([757c4c5](https://github.com/cube-js/cube/commit/757c4c51f608c34b8a857ef7a98229bb3f7b04bb)) + + +### Features + +* **cubesql:** Flatten list expression rewrites to improve performance ([96c1549](https://github.com/cube-js/cube/commit/96c1549e1dc2d51f94aacd8fd1b95baef31cc0b1)) +* **schema-compiler:** Support multi time dimensions for rollup pre-aggregations ([#8291](https://github.com/cube-js/cube/issues/8291)) ([8b0a056](https://github.com/cube-js/cube/commit/8b0a05657c7bc7f42e0d45ecc7ce03d37e5b1e57)) + + + + + +## [0.35.38](https://github.com/cube-js/cube/compare/v0.35.37...v0.35.38) (2024-05-22) + + +### Bug Fixes + +* **bigquery-driver:** Transform numeric value (big.js) to string ([#8290](https://github.com/cube-js/cube/issues/8290)) ([65c3f55](https://github.com/cube-js/cube/commit/65c3f5541fa4f1ced5813ae642d53c4d9bb80af5)) + + +### Features + +* **bigquery-driver:** Upgrade [@google-cloud](https://github.com/google-cloud) SDK to 7 ([#8289](https://github.com/cube-js/cube/issues/8289)) ([57ef124](https://github.com/cube-js/cube/commit/57ef124672f2093054548c8797ca194ee3513923)) +* **clickhouse-driver:** SQL API PUSH down - support datetrunc, timestamp_literal ([45bc230](https://github.com/cube-js/cube/commit/45bc2306eb01e2b2cc5c204b64bfa0411ae0144b)) +* **clickhouse-driver:** Support countDistinctApprox ([4d36279](https://github.com/cube-js/cube/commit/4d3627996e8cdaa9d77711f9ea21edabc5d3b8d0)) +* **duckdb-driver:** Upgrade DuckDB to 0.10.2 ([#8284](https://github.com/cube-js/cube/issues/8284)) ([b057bca](https://github.com/cube-js/cube/commit/b057bca8c77eebc7dcb358efe27ad08703afd966)) + + + + + +## [0.35.37](https://github.com/cube-js/cube/compare/v0.35.36...v0.35.37) (2024-05-20) + + +### Bug Fixes + +* **cubesql:** Make param render respect dialect's reuse params flag ([9c91af2](https://github.com/cube-js/cube/commit/9c91af2e03c84d903ac153337cda9f53682aacf1)) + + + + + +## [0.35.36](https://github.com/cube-js/cube/compare/v0.35.35...v0.35.36) (2024-05-17) + + +### Bug Fixes + +* **cubesql:** Do not generate large graphs for large `IN` filters ([f29c9e4](https://github.com/cube-js/cube/commit/f29c9e481ffa65361a804f6ff1e5bf685cb8d0d5)) + + + + + +## [0.35.35](https://github.com/cube-js/cube/compare/v0.35.34...v0.35.35) (2024-05-17) + + +### Bug Fixes + +* **cubesql:** Remove incorrect LOWER match rules and fallback to SQL pushdown ([#8246](https://github.com/cube-js/cube/issues/8246)) ([6c39f37](https://github.com/cube-js/cube/commit/6c39f376a649eeb7d9c171f1805033b020ef58a7)) +* **cubesql:** Remove prefix underscore from aliases ([#8266](https://github.com/cube-js/cube/issues/8266)) ([24e8977](https://github.com/cube-js/cube/commit/24e89779fc4833a8c6b14dc1496d95271c18ebdc)) +* **schema-compiler:** Fix failing of `WHERE FALSE` queries ([#8265](https://github.com/cube-js/cube/issues/8265)) ([e63b4ab](https://github.com/cube-js/cube/commit/e63b4ab701cf44162d5e51d65b8d38e812f9085e)) + + +### Features + +* **cubesql:** Send expressions as objects ([#8216](https://github.com/cube-js/cube/issues/8216)) ([4deee84](https://github.com/cube-js/cube/commit/4deee845a51e3999f3a75b121e14b570a124ad3a)) + + + + + +## [0.35.34](https://github.com/cube-js/cube/compare/v0.35.33...v0.35.34) (2024-05-15) + + +### Bug Fixes + +* **cubestore:** S3 - STS credentials (align aws-creds to 0.36 in fork) ([#8264](https://github.com/cube-js/cube/issues/8264)) ([1a5b27d](https://github.com/cube-js/cube/commit/1a5b27d1775691456a90d34130841ee03b5edef6)) + + + + + +## [0.35.33](https://github.com/cube-js/cube/compare/v0.35.32...v0.35.33) (2024-05-15) + + +### Bug Fixes + +* **cubesql:** Fix Databricks identifier quotes ([a20f4b2](https://github.com/cube-js/cube/commit/a20f4b2d55c8d0235d327fc0d0cc0c2f587bcd02)) +* Mismatched input '10000'. Expecting: '?', 'ALL', for post-aggregate members in Athena ([#8262](https://github.com/cube-js/cube/issues/8262)) ([59834e7](https://github.com/cube-js/cube/commit/59834e7157bf060804470104e0a713194b811f39)) + + +### Features + +* **cubesql:** Rewrites for pushdown of subqueries with empty source ([#8188](https://github.com/cube-js/cube/issues/8188)) ([86a58a5](https://github.com/cube-js/cube/commit/86a58a5f3368a509debfb3f2ba4c83001377127c)) +* **firebolt:** Switch to the new auth method ([#8182](https://github.com/cube-js/cube/issues/8182)) ([e559114](https://github.com/cube-js/cube/commit/e55911478d0b3ba916d44f1fa4c04697d7ca7dfb)) + + + + + +## [0.35.32](https://github.com/cube-js/cube/compare/v0.35.31...v0.35.32) (2024-05-14) + + +### Features + +* **cubesql:** Flatten IN lists expressions to improve performance ([#8235](https://github.com/cube-js/cube/issues/8235)) ([66aa01d](https://github.com/cube-js/cube/commit/66aa01d4f8f888993e68a0967e664b9dcfcc51e7)) +* **databricks-jdbc-driver:** Support HLL ([#8257](https://github.com/cube-js/cube/issues/8257)) ([da231ed](https://github.com/cube-js/cube/commit/da231ed48ae8386f1726710e80c3a943204f6895)) + + + + + +## [0.35.31](https://github.com/cube-js/cube/compare/v0.35.30...v0.35.31) (2024-05-13) + + +### Features + +* **cubestore:** Support HLL from Apache DataSketches (for DataBricks) ([#8241](https://github.com/cube-js/cube/issues/8241)) ([baf2667](https://github.com/cube-js/cube/commit/baf26677a0ceb50102516d3a7cce7543be4a57a2)) +* Support probing `LIMIT 0` queries ([117f332](https://github.com/cube-js/cube/commit/117f3324a4db75c596d6e4b0a1cafffc76aab068)) + + + + + +## [0.35.30](https://github.com/cube-js/cube/compare/v0.35.29...v0.35.30) (2024-05-10) + + +### Bug Fixes + +* **cubesql:** Add alias to rebased window expressions ([990a767](https://github.com/cube-js/cube/commit/990a767e3b2f32c0846907b1dfcff232227b4cbc)) +* **cubesql:** Reuse query params in push down ([b849f34](https://github.com/cube-js/cube/commit/b849f34c001b9a94ac5aed1edacce906fd02f33c)) +* **schema-compiler:** Convert timezone for time dimensions in measures ([0bea221](https://github.com/cube-js/cube/commit/0bea221e5fafdf8c7ca3c8cb3cfa6a233e5fc8a0)) +* **schema-compiler:** respect view prefix and member alias in hierarc… ([#8231](https://github.com/cube-js/cube/issues/8231)) ([59fddea](https://github.com/cube-js/cube/commit/59fddea82e29d5651a5bade751b76afbca9d52da)) +* Unexpected keyword WITH for rolling window measures in BigQuery ([9468f90](https://github.com/cube-js/cube/commit/9468f90fefdc08280e7b81b0f8e289fa041cd37d)), closes [#8193](https://github.com/cube-js/cube/issues/8193) +* Unrecognized name when regular measures are selected with multiplied ones ([617fd11](https://github.com/cube-js/cube/commit/617fd11a527a0be619450698f868858306e1daf8)), closes [#8206](https://github.com/cube-js/cube/issues/8206) + + +### Features + +* **cubesql:** Support window frame SQL push down ([5469dbc](https://github.com/cube-js/cube/commit/5469dbc14c4ae15d9e1047fca90ab5cc4268f047)) + + + + + +## [0.35.29](https://github.com/cube-js/cube/compare/v0.35.28...v0.35.29) (2024-05-03) + + +### Bug Fixes + +* Apply time shift after timezone conversions to avoid double casts ([#8229](https://github.com/cube-js/cube/issues/8229)) ([651b9e0](https://github.com/cube-js/cube/commit/651b9e029d8b0a685883d5151a0538f2f6429da2)) +* **schema-compiler:** support string measures in views ([#8194](https://github.com/cube-js/cube/issues/8194)) ([fadfd1f](https://github.com/cube-js/cube/commit/fadfd1f557a16bc7f4e6c8c0daeca7c6ac1bf237)) + + + + + +## [0.35.28](https://github.com/cube-js/cube/compare/v0.35.27...v0.35.28) (2024-05-02) + + +### Bug Fixes + +* **schema-compiler:** views sorting ([#8228](https://github.com/cube-js/cube/issues/8228)) ([50b459a](https://github.com/cube-js/cube/commit/50b459a6135cb27bb7e52f04639c3a0ad6c89b97)) + + + + + +## [0.35.27](https://github.com/cube-js/cube/compare/v0.35.26...v0.35.27) (2024-05-02) + + +### Bug Fixes + +* **cubestore:** Queue - remove queue item payload on ack (reduce compaction) ([#8225](https://github.com/cube-js/cube/issues/8225)) ([ac58583](https://github.com/cube-js/cube/commit/ac5858384e26b9b9077e9ffeb42d64da874d1f62)) +* **cubestore:** Queue - truncate unused queue rows via TTL ([#8227](https://github.com/cube-js/cube/issues/8227)) ([70ecbef](https://github.com/cube-js/cube/commit/70ecbefadc00eb857362ae647f136873a708bb80)) + + +### Features + +* **cubestore:** Allow to truncate queue item payloads via system command ([#8226](https://github.com/cube-js/cube/issues/8226)) ([75d4eac](https://github.com/cube-js/cube/commit/75d4eac3b48acfc02c8affacdf28f1f0897087b0)) + + + + + +## [0.35.26](https://github.com/cube-js/cube/compare/v0.35.25...v0.35.26) (2024-05-02) + + +### Bug Fixes + +* **gateway:** Don't process meta with `onlyCompilerId` flag set ([76ae23e](https://github.com/cube-js/cube/commit/76ae23edbe0adc101c788f671b2f9760dd7c032d)) +* **gateway:** missed v1 graphql-to-json endpoint ([a24d69b](https://github.com/cube-js/cube/commit/a24d69bd1db5da3b2773ad2f1a512cd72192c031)) +* **gateway:** Optimize `filterVisibleItemsInMeta` performance ([b0fdbd3](https://github.com/cube-js/cube/commit/b0fdbd30d327c0a681a594fbf4ef063ef7a91f58)) +* **schema-compiler:** foreign keys assignment ([#8208](https://github.com/cube-js/cube/issues/8208)) ([74affc4](https://github.com/cube-js/cube/commit/74affc40a70a4b6bb19f9ee438d6f4d0e4bd27fa)) + + +### Features + +* **schema-compiler:** hierarchies ([#8102](https://github.com/cube-js/cube/issues/8102)) ([c98683f](https://github.com/cube-js/cube/commit/c98683f07a286c6f4cf71c656e3e336295a0cc78)) +* **schema-compiler:** Upgrade cron-parser to 4.9, fix [#8203](https://github.com/cube-js/cube/issues/8203) ([#8214](https://github.com/cube-js/cube/issues/8214)) ([f643c4b](https://github.com/cube-js/cube/commit/f643c4ba55e5f69c161dd687c79d7ce359fcf8e5)) +* Support post-aggregate time shifts for prior period lookup support ([#8215](https://github.com/cube-js/cube/issues/8215)) ([a9f55d8](https://github.com/cube-js/cube/commit/a9f55d80ee36be6a197cdfed6e1d202a52c1a39d)) + + + + + +## [0.35.25](https://github.com/cube-js/cube/compare/v0.35.24...v0.35.25) (2024-04-29) + + +### Bug Fixes + +* **cubesql:** Disallow ematching cycles ([4902c6d](https://github.com/cube-js/cube/commit/4902c6d3f882a0ee27f62d63d8b0fcda3669a0b1)) +* **cubestore:** Error in optimization for nested boolean expressions ([#7891](https://github.com/cube-js/cube/issues/7891)) ([e5d20d2](https://github.com/cube-js/cube/commit/e5d20d228ac07849dbcd4df2f713ea01fc74f0fe)) + + +### Features + +* Rolling YTD, QTD and MTD measure support ([#8196](https://github.com/cube-js/cube/issues/8196)) ([bfc0708](https://github.com/cube-js/cube/commit/bfc0708502f78902e481608b4f83c2eee6182636)) + + + + + +## [0.35.24](https://github.com/cube-js/cube/compare/v0.35.23...v0.35.24) (2024-04-26) + + +### Bug Fixes + +* **cubesql:** Fix `date_trunc` over column offset in filters ([1a602be](https://github.com/cube-js/cube/commit/1a602bea8fc17cc258c6d125ea8e7904b33454ff)) +* **cubestore:** S3 - STS credentials (backport fix for 0.32.3) ([#8195](https://github.com/cube-js/cube/issues/8195)) ([9d9cb4a](https://github.com/cube-js/cube/commit/9d9cb4a025931da24d560220878b7450f81de22c)) + + + + + +## [0.35.23](https://github.com/cube-js/cube/compare/v0.35.22...v0.35.23) (2024-04-25) + + +### Bug Fixes + +* **client-core:** castNumerics option for CubeApi ([#8186](https://github.com/cube-js/cube/issues/8186)) ([6ff2208](https://github.com/cube-js/cube/commit/6ff22088ede88521c6c5a5e8cb1a77c819301ad4)) + + +### Features + +* **api-gateway:** graphql json query conversion ([#8189](https://github.com/cube-js/cube/issues/8189)) ([55ea7c8](https://github.com/cube-js/cube/commit/55ea7c86f49163b6c65fb277966a0e8b572a5fd5)) +* **cubesql:** In subquery rewrite ([#8162](https://github.com/cube-js/cube/issues/8162)) ([d17c2a7](https://github.com/cube-js/cube/commit/d17c2a7d58beada203009c5d624974d3a68c6af8)) +* primary and foreign keys driver queries ([#8115](https://github.com/cube-js/cube/issues/8115)) ([35bb1d4](https://github.com/cube-js/cube/commit/35bb1d435a75f53f704e9c5e33382093cbc4e115)) + + + + + +## [0.35.22](https://github.com/cube-js/cube/compare/v0.35.21...v0.35.22) (2024-04-22) + + +### Bug Fixes + +* **cubestore:** S3 - wrong credentials ([1313cdd](https://github.com/cube-js/cube/commit/1313cdd6d3882a7c4644e9d397df7745116246bb)) + + + + + +## [0.35.21](https://github.com/cube-js/cube/compare/v0.35.20...v0.35.21) (2024-04-19) + + +### Bug Fixes + +* **cubestore:** MINIORemoteFs - use only simple auth from S3 client ([#8170](https://github.com/cube-js/cube/issues/8170)) ([66403ad](https://github.com/cube-js/cube/commit/66403ad1be6ec34d8b68444553c40dbc1543f3e5)) +* Logical boolean measure filter for post aggregate measures support ([92cee95](https://github.com/cube-js/cube/commit/92cee954b1252b0234e3008fb74d88d7b1c3c47f)) +* **native:** Better error message on unexpected values while streaming ([#8172](https://github.com/cube-js/cube/issues/8172)) ([bcf3438](https://github.com/cube-js/cube/commit/bcf3438682951d7b917866870fc029af3efe2362)) + + + + + +## [0.35.20](https://github.com/cube-js/cube/compare/v0.35.19...v0.35.20) (2024-04-18) + + +### Features + +* Allow all calculated measure types in post aggregate measures ([66f3acc](https://github.com/cube-js/cube/commit/66f3accd2f4b84ccdc41ece68da5c0c73998df29)) +* Post aggregate raw dimension with date range support ([23411cf](https://github.com/cube-js/cube/commit/23411cfe8152687b6a8ed02c073b151217c60e6a)) + + + + + +## [0.35.19](https://github.com/cube-js/cube/compare/v0.35.18...v0.35.19) (2024-04-18) + + +### Features + +* **cubesql:** Update egg and remove some clones ([#8164](https://github.com/cube-js/cube/issues/8164)) ([fe20d35](https://github.com/cube-js/cube/commit/fe20d3575abc7105f827b979266e147299553aee)) +* Post aggregate measure filter support ([120f22b](https://github.com/cube-js/cube/commit/120f22b4a52e5328ebfeea60e90b2b1aa1839feb)) + + + + + +## [0.35.18](https://github.com/cube-js/cube/compare/v0.35.17...v0.35.18) (2024-04-17) + + +### Features + +* Post aggregate no granularity time dimension support ([f7a99f6](https://github.com/cube-js/cube/commit/f7a99f6e3f61b766e1581f2af574dc5d81f58101)) +* Post aggregate view support ([#8161](https://github.com/cube-js/cube/issues/8161)) ([acb507d](https://github.com/cube-js/cube/commit/acb507d21d29b25592050bcf49c09fb9d88a7d93)) + + + + + +## [0.35.17](https://github.com/cube-js/cube/compare/v0.35.16...v0.35.17) (2024-04-16) + + +### Bug Fixes + +* **cubestore:** Fix wrong optimization in total count queries ([#7964](https://github.com/cube-js/cube/issues/7964)) ([7a8ddf0](https://github.com/cube-js/cube/commit/7a8ddf056a075c9224657d1497e2679502acc515)) +* ungrouped not getting applied for MSSQL ([#7997](https://github.com/cube-js/cube/issues/7997)) Thanks @UsmanYasin ! ([3fac97c](https://github.com/cube-js/cube/commit/3fac97cc4c72dc78b8016014cfa536f54c1be9d8)) + + +### Features + +* **cubestore:** Upgrade rust-s3 0.26.3 -> 0.32.3 ([#6019](https://github.com/cube-js/cube/issues/6019)) ([4b8d4d3](https://github.com/cube-js/cube/commit/4b8d4d3c3445dcd817945e3a71a70d0084644d4c)) +* **cubestore:** Use S3 client in async way ([#8158](https://github.com/cube-js/cube/issues/8158)) ([7f286fe](https://github.com/cube-js/cube/commit/7f286fee90897048f8a2735a2a9e171d40e47da4)) + + + + + +## [0.35.16](https://github.com/cube-js/cube/compare/v0.35.15...v0.35.16) (2024-04-16) + + +### Features + +* Post aggregate time dimensions support ([4071e8a](https://github.com/cube-js/cube/commit/4071e8a112823150e98703a2face4ccb98fd9e86)) + + + + + +## [0.35.15](https://github.com/cube-js/cube/compare/v0.35.14...v0.35.15) (2024-04-15) + + +### Features + +* Post aggregate filter support ([49131ea](https://github.com/cube-js/cube/commit/49131ea8adb025b974ce6a4a596d6637df47bdea)) + + + + + +## [0.35.14](https://github.com/cube-js/cube/compare/v0.35.13...v0.35.14) (2024-04-15) + + +### Bug Fixes + +* **server-core:** Handle schemaPath default value correctly everywhere (refix) ([#8152](https://github.com/cube-js/cube/issues/8152)) ([678f17f](https://github.com/cube-js/cube/commit/678f17f2ef5a2cf38b28e3c095a721f1cd38fb56)) + + + + + +## [0.35.13](https://github.com/cube-js/cube/compare/v0.35.12...v0.35.13) (2024-04-15) + + +### Features + +* Post aggregate measure support ([#8145](https://github.com/cube-js/cube/issues/8145)) ([2648a26](https://github.com/cube-js/cube/commit/2648a26a6149c31615d5df105575e5c30117be6f)) + + + + + +## [0.35.12](https://github.com/cube-js/cube/compare/v0.35.11...v0.35.12) (2024-04-12) + + +### Bug Fixes + +* **snowflake-driver:** Unable to detect a Project Id in the current environment for GCS export bucket ([03ca8fa](https://github.com/cube-js/cube/commit/03ca8fa9b7222ddaf0d52c1ead221ac26827c054)) + + +### Reverts + +* Revert "fix(server-core): Handle schemaPath default value correctly everywhere (#8131)" ([22a6f8b](https://github.com/cube-js/cube/commit/22a6f8b5e959db02f8eab89e2a9e873ef0a8ce87)), closes [#8131](https://github.com/cube-js/cube/issues/8131) + + + + + +## [0.35.11](https://github.com/cube-js/cube/compare/v0.35.10...v0.35.11) (2024-04-11) + + +### Bug Fixes + +* **cubesql:** Support latest Metabase, fix [#8105](https://github.com/cube-js/cube/issues/8105) ([#8130](https://github.com/cube-js/cube/issues/8130)) ([c82bb10](https://github.com/cube-js/cube/commit/c82bb10ed383f9c0cec04def8ac7dc53283f7254)) +* **server-core:** Handle schemaPath default value correctly everywhere ([#8131](https://github.com/cube-js/cube/issues/8131)) ([23bd621](https://github.com/cube-js/cube/commit/23bd621541c1646ff6430deef9e0d7fc5f149f2f)) + + +### Features + +* **cubestore:** Enable jemalloc allocator for RocksDB on linux GNU ([#8104](https://github.com/cube-js/cube/issues/8104)) ([ee7bcee](https://github.com/cube-js/cube/commit/ee7bceeee43c45e0a183272b16b3932288146370)) + + + + + +## [0.35.10](https://github.com/cube-js/cube/compare/v0.35.9...v0.35.10) (2024-04-09) + + +### Bug Fixes + +* **cubesql:** has_schema_privilege - compatiblity with PostgreSQL ([#8098](https://github.com/cube-js/cube/issues/8098)) ([42586cf](https://github.com/cube-js/cube/commit/42586cfae7f55c998f0034cd3c816f59ba4116df)) + + + + + +## [0.35.9](https://github.com/cube-js/cube/compare/v0.35.8...v0.35.9) (2024-04-08) + + +### Features + +* **cubestore:** Upgrade rust to 1.77.0-nightly (635124704 2024-01-27) ([#7640](https://github.com/cube-js/cube/issues/7640)) ([5aa5abb](https://github.com/cube-js/cube/commit/5aa5abb6bba28b7d981c569982e80641673fd5b7)) +* **docker:** Security upgrade Node.js from 18.19.1 to 18.20.1 ([#8094](https://github.com/cube-js/cube/issues/8094)) ([51921cc](https://github.com/cube-js/cube/commit/51921ccfd60ff739a638b32205e2f4eb48110789)) + + + + + +## [0.35.8](https://github.com/cube-js/cube/compare/v0.35.7...v0.35.8) (2024-04-05) + + +### Bug Fixes + +* **schema-compiler:** quote case sensitive idents ([#8063](https://github.com/cube-js/cube/issues/8063)) ([6273532](https://github.com/cube-js/cube/commit/6273532611385d794257e7123d747f01b1c1c436)) + + +### Features + +* **cubestore:** Queue - optimize list/pending operations ([#7998](https://github.com/cube-js/cube/issues/7998)) ([815be2f](https://github.com/cube-js/cube/commit/815be2fb90bf84d095f2ab6b208167b8cc8433e7)) + + + + + +## [0.35.7](https://github.com/cube-js/cube/compare/v0.35.6...v0.35.7) (2024-04-03) + + +### Features + +* **cross:** Upgrade LLVM from 14 to 18 (02042024) ([#8064](https://github.com/cube-js/cube/issues/8064)) ([9b30eac](https://github.com/cube-js/cube/commit/9b30eac57442af586d146bbb947b9dcba634cd60)) +* **cubestore:** Upgrade LLVM from 14 to 18 ([#8068](https://github.com/cube-js/cube/issues/8068)) ([d1f0cbc](https://github.com/cube-js/cube/commit/d1f0cbc3c76ee5025aa26919a2563f85964a20a8)) + + + + + +## [0.35.6](https://github.com/cube-js/cube/compare/v0.35.5...v0.35.6) (2024-04-02) + + +### Bug Fixes + +* **cubesql:** Remove binary expression associative rewrites ([19f6245](https://github.com/cube-js/cube/commit/19f62450f9fcf23b5484620783275564f2eedca4)) +* **cubestore:** RocksStore - migrate table by truncate (unknown tables) ([#8053](https://github.com/cube-js/cube/issues/8053)) ([509d895](https://github.com/cube-js/cube/commit/509d89561eb23283fb0bda14ec03ca4d4a0a7aab)) + + +### Features + +* **cubestore:** CacheStore - allow to disable logs ([#8027](https://github.com/cube-js/cube/issues/8027)) ([ce6303c](https://github.com/cube-js/cube/commit/ce6303c5944f7ab0ac6c8411af26d396b0d3d7a8)) +* Ungrouped query pre-aggregation support ([#8058](https://github.com/cube-js/cube/issues/8058)) ([2ca99de](https://github.com/cube-js/cube/commit/2ca99de3e7ea813bdb7ea684bed4af886bde237b)) + + + + + +## [0.35.5](https://github.com/cube-js/cube/compare/v0.35.4...v0.35.5) (2024-03-28) + + +### Bug Fixes + +* **cubesql:** SQL push down of ORDER BY causes Invalid query format: "order[0][0]" with value fails to match the required pattern: /^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/ ([#8032](https://github.com/cube-js/cube/issues/8032)) ([0681725](https://github.com/cube-js/cube/commit/0681725c921ea62f7ef813562be0202e93928889)) +* **cubestore:** RocksStore - improve panic safety on migration ([#8031](https://github.com/cube-js/cube/issues/8031)) ([f81e2cb](https://github.com/cube-js/cube/commit/f81e2cb1bbcb5f37d01b85bfbeef4b4634fe8332)) +* Multiplied count measure can be used as additive measure in pre-… ([#8033](https://github.com/cube-js/cube/issues/8033)) ([f36959c](https://github.com/cube-js/cube/commit/f36959c297bd637c5332ba171a9049c3448b3522)) +* **schema-compiler:** Upgrade babel/traverse to 7.24 (GHSA-67hx-6x53-jw92) ([#8002](https://github.com/cube-js/cube/issues/8002)) ([9848e51](https://github.com/cube-js/cube/commit/9848e51a2a5420bc7649775951ea122c03aa52e9)) + + + + + +## [0.35.4](https://github.com/cube-js/cube/compare/v0.35.3...v0.35.4) (2024-03-27) + + +### Bug Fixes + +* **cubesql:** Flatten aliasing breaks wrapped select `ORDER BY` expressions ([#8004](https://github.com/cube-js/cube/issues/8004)) ([eea88ec](https://github.com/cube-js/cube/commit/eea88ecaf3267091d1fbdd761db0451775b9fbe9)) +* **query-orchestrator:** Missing dataSource in pre-aggregation preview query ([#7989](https://github.com/cube-js/cube/issues/7989)) ([d3012c8](https://github.com/cube-js/cube/commit/d3012c8075382a4bf66156cb56765f0483d111dc)) + + +### Features + +* **cubesql:** Support `DISTINCT` push down ([fc79188](https://github.com/cube-js/cube/commit/fc79188b5a205d29d9acd3669677cc829b0a9013)) + + + + + +## [0.35.3](https://github.com/cube-js/cube/compare/v0.35.2...v0.35.3) (2024-03-22) + + +### Bug Fixes + +* Render all distinct counts as `1` for ungrouped queries to not fail ratio measures ([#7987](https://github.com/cube-js/cube/issues/7987)) ([f756e4b](https://github.com/cube-js/cube/commit/f756e4bd7d48a0e60d505ac0de50ae1469637011)) + + + + + +## [0.35.2](https://github.com/cube-js/cube/compare/v0.35.1...v0.35.2) (2024-03-22) + + +### Bug Fixes + +* **cubesql:** Fix timestamp parsing format string ([938b13c](https://github.com/cube-js/cube/commit/938b13c16706243efdb38f67e687c9778b8ca5f9)) +* **mssql-driver:** Unsupported option opt.evictionRunIntervalMillis, refs [#7951](https://github.com/cube-js/cube/issues/7951) ([#7977](https://github.com/cube-js/cube/issues/7977)) ([53f013a](https://github.com/cube-js/cube/commit/53f013ab3ca1f3d7906e182b04cccd3aaabf4506)) + + +### Features + +* **cubesql:** Flatten rules to allow multiple level transformation queries be executed by split and SQL push down ([#7979](https://github.com/cube-js/cube/issues/7979)) ([f078adc](https://github.com/cube-js/cube/commit/f078adc38ce3eab39763253d137f291ee7625bf1)) +* **cubesql:** Parse timestamp strings as `Date32` ([4ba5a80](https://github.com/cube-js/cube/commit/4ba5a80c6736bcd7e19afc88692c7b6713286850)) +* **cubesql:** Support `a ^ b` exponentiation ([914b058](https://github.com/cube-js/cube/commit/914b05893a66269ef41fae3d5b81f903ad1a75e7)) +* **cubestore:** Queue - reduce memory usage ([#7975](https://github.com/cube-js/cube/issues/7975)) ([e9848e8](https://github.com/cube-js/cube/commit/e9848e8d6140333dd029be4270b9450e1ca10450)) +* **cubestore:** Reduce memory usage while writting WALs ([#7967](https://github.com/cube-js/cube/issues/7967)) ([ee9fa71](https://github.com/cube-js/cube/commit/ee9fa7162be6aa53593c316046a9f60d41ecbd28)) +* **query-orchestrator:** Queue - improve performance ([#7983](https://github.com/cube-js/cube/issues/7983)) ([56d48fb](https://github.com/cube-js/cube/commit/56d48fb2bad6210f38cfcc6189b683dd2ead62c2)) + + +### Reverts + +* Revert "feat(schema-compiler): composite key generation (#7929)" ([61e4c45](https://github.com/cube-js/cube/commit/61e4c45024bdce7799a2161608b1fdc97e9bd9e8)), closes [#7929](https://github.com/cube-js/cube/issues/7929) + + + + + +## [0.35.1](https://github.com/cube-js/cube/compare/v0.35.0...v0.35.1) (2024-03-18) + + +### Bug Fixes + +* **cubestore:** Wrong calculation of default compaction trigger size (too often compaction) ([#7960](https://github.com/cube-js/cube/issues/7960)) ([2f4b75b](https://github.com/cube-js/cube/commit/2f4b75b3440f307e33699d4d26e90da9a880bf0a)) + + +### Features + +* **docker:** Security upgrade node from 18.19.0 to 18.19.1 ([#7924](https://github.com/cube-js/cube/issues/7924)) ([f33d03e](https://github.com/cube-js/cube/commit/f33d03ed293d489d109b3da774c22d8543c8a081)) +* **duckdb-driver:** Upgrade DuckDB to v0.10 ([#7920](https://github.com/cube-js/cube/issues/7920)) ([0e9103a](https://github.com/cube-js/cube/commit/0e9103a78712e80118244306cfcbd670aac2c311)) +* **mssql-driver:** Upgrade mssql to 10.0.2 (Node.js 17+ compatiblity), fix [#7951](https://github.com/cube-js/cube/issues/7951) ([7adaea6](https://github.com/cube-js/cube/commit/7adaea6522e47035e67596b4dc0ab15e87312706)) +* **schema-compiler:** composite key generation ([#7929](https://github.com/cube-js/cube/issues/7929)) ([5a27200](https://github.com/cube-js/cube/commit/5a27200252cf837fc34ef38b320216d2e37ffa22)) + + + + + +# [0.35.0](https://github.com/cube-js/cube/compare/v0.34.62...v0.35.0) (2024-03-14) + + +### Bug Fixes + +* **cubesql:** Don't ignore second filter over same time dimension ([03e7f3a](https://github.com/cube-js/cube/commit/03e7f3a6e68d911368fdba2a79387cbea995cae5)) +* **cubestore-driver:** Compatibility with Node.js 18 (localhost resolved to ipv6) ([f7a4fab](https://github.com/cube-js/cube/commit/f7a4fabc28a81f238446c823794ae2938ecd7290)) + + +### Features + +* **docker:** Upgrade Node.js to 18.x ([8b5b923](https://github.com/cube-js/cube/commit/8b5b9237a6822498829ec7e9fba39a1e02b4b7bd)) + + + + + +## [0.34.62](https://github.com/cube-js/cube/compare/v0.34.61...v0.34.62) (2024-03-13) + + +### Bug Fixes + +* **cubesql:** Fix push down column remapping ([8221a53](https://github.com/cube-js/cube/commit/8221a53a6f679ea9dcfce83df948173ccc89c5f0)) +* Job API - correct handling on missed pre_aggregation ([#7907](https://github.com/cube-js/cube/issues/7907)) ([6fcaff4](https://github.com/cube-js/cube/commit/6fcaff4a9626f917c5efb2f837178c4244d75ff8)) +* Job API - correct handling when job is not_found ([#7894](https://github.com/cube-js/cube/issues/7894)) ([cae1866](https://github.com/cube-js/cube/commit/cae1866dabd1bd13829221f6576a649117bcd142)) +* **query-orchestrator:** Job API - builds are not triggered, fix [#7726](https://github.com/cube-js/cube/issues/7726) ([#7909](https://github.com/cube-js/cube/issues/7909)) ([738dbde](https://github.com/cube-js/cube/commit/738dbde3ab3767d935f733ab8770aaa8cba9c631)) + + + + + +## [0.34.61](https://github.com/cube-js/cube/compare/v0.34.60...v0.34.61) (2024-03-11) + + +### Bug Fixes + +* **cubesql:** Error out when temporary table already exists ([1a0a324](https://github.com/cube-js/cube/commit/1a0a324274071b9dd9a667505c86698870e236b0)) +* **cubesql:** Fix push down `CASE` with expr ([f1d1242](https://github.com/cube-js/cube/commit/f1d12428870cd6e1a159bd559a3402bb6be778aa)) +* **cubesql:** Fix push down column remapping ([c7736cc](https://github.com/cube-js/cube/commit/c7736ccb2c3e1fd809d98adf58bad012fc38c8b7)) +* **cubesql:** Partition pruning doesn't work when view uses proxy member ([#7866](https://github.com/cube-js/cube/issues/7866)) ([c02a07f](https://github.com/cube-js/cube/commit/c02a07f99141bcd549ffbbcaa37e95d138ff72a2)), closes [#6623](https://github.com/cube-js/cube/issues/6623) +* **cubesql:** Trim ".0" postfix when converting `Float to `Utf8` ([3131f94](https://github.com/cube-js/cube/commit/3131f94def0a73b29fd1638a40672377339dd7d3)) +* Wrong sql generation when multiple primary keys used ([#6689](https://github.com/cube-js/cube/issues/6689)) Thanks [@alexanderlz](https://github.com/alexanderlz) ! ([2540a22](https://github.com/cube-js/cube/commit/2540a224f406b8fd3c09183b826fb899dad7a915)) + + +### Features + +* **clickhouse-driver:** Support export bucket for S3 (write only) ([#7849](https://github.com/cube-js/cube/issues/7849)) ([db7e2c1](https://github.com/cube-js/cube/commit/db7e2c10c97dc4b81d136bb1205931ea5eab2918)) +* **clickhouse-driver:** Support S3 export for readOnly mode ([7889aad](https://github.com/cube-js/cube/commit/7889aadaefc2142f2a470839065860efb4858b63)) +* **cubesql:** Support `FETCH ... n ROWS ONLY` ([53b0c14](https://github.com/cube-js/cube/commit/53b0c149c7e348cfb4b36890d72c5090762e717b)) +* **query-orchestrator:** Support unload (export bucket) for readOnly drivers ([76ce7ed](https://github.com/cube-js/cube/commit/76ce7ed176e0c8097bc8024a7e5e82bbb48d5d1c)) + + +### Reverts + +* Revert "fix(cubesql): Fix push down column remapping" (#7895) ([dec8901](https://github.com/cube-js/cube/commit/dec8901493814f3028e38e0ed17f5868e6ecd7a5)), closes [#7895](https://github.com/cube-js/cube/issues/7895) + + + + + +## [0.34.60](https://github.com/cube-js/cube/compare/v0.34.59...v0.34.60) (2024-03-02) + + +### Bug Fixes + +* Bump max connect retries for Cube Store ([00a6ec0](https://github.com/cube-js/cube/commit/00a6ec034c2d5dff8c66647b7ec6cae39c0237ba)) +* **client-core:** incorrect index in movePivotItem ([#6684](https://github.com/cube-js/cube/issues/6684)) Thanks to [@telunc](https://github.com/telunc)! ([82217b2](https://github.com/cube-js/cube/commit/82217b28a012158cd8a978fd2e1ad15746ddeae0)) +* **cubesql:** Allow different `Timestamp` types in `DATEDIFF` ([de9ef08](https://github.com/cube-js/cube/commit/de9ef081cae21f551a38219bb64749e08e7ca6fc)) +* **cubesql:** Incorrect CASE WHEN generated during ungrouped filtered count ([#7859](https://github.com/cube-js/cube/issues/7859)) ([f970937](https://github.com/cube-js/cube/commit/f9709376e5dadfbcbffe9a65dfa9f0ea16df7bab)), closes [#7858](https://github.com/cube-js/cube/issues/7858) +* **cubesql:** Prioritize ungrouped aggregate scans over ungrouped projection scans so most of the members can be pushed down without wrapping ([#7865](https://github.com/cube-js/cube/issues/7865)) ([addde0d](https://github.com/cube-js/cube/commit/addde0d373f01e69485b8a0333850917ffad9a2d)) +* **cubesql:** Remove excessive limit on inner wrapped queries ([#7864](https://github.com/cube-js/cube/issues/7864)) ([b97268f](https://github.com/cube-js/cube/commit/b97268fe5caf55c5b7806c597b9f7b75410f6ba4)) + + +### Features + +* **cubesql:** In subquery support ([#7851](https://github.com/cube-js/cube/issues/7851)) ([8e2a3ec](https://github.com/cube-js/cube/commit/8e2a3ecc348c4ab9e6a5ab038c46fcf7f4c3dfcc)) +* **cubesql:** Support split and SUM(1) ([16e2ee0](https://github.com/cube-js/cube/commit/16e2ee0d290c502f796891e137556aad2275e52d)) + + + + + +## [0.34.59](https://github.com/cube-js/cube/compare/v0.34.58...v0.34.59) (2024-02-28) + + +### Bug Fixes + +* **cubesql:** Replace only simple ungrouped measures in projections to avoid aggregate over aggregate statements ([#7852](https://github.com/cube-js/cube/issues/7852)) ([fa2a89b](https://github.com/cube-js/cube/commit/fa2a89b89f91c8eba175130fca33975200690288)) +* Ungrouped filtered count should contain `CASE WHEN` statement bu… ([#7853](https://github.com/cube-js/cube/issues/7853)) ([8c37a40](https://github.com/cube-js/cube/commit/8c37a407b9d8c8f97dab51c9e0e97067c91ff90e)) + + + + + +## [0.34.58](https://github.com/cube-js/cube/compare/v0.34.57...v0.34.58) (2024-02-27) + + +### Bug Fixes + +* **clickhouse-driver:** Correct support for Enum8/16 ([#7814](https://github.com/cube-js/cube/issues/7814)) ([db37fc3](https://github.com/cube-js/cube/commit/db37fc3b0f24511bd9ae3a319b5755c102bb3358)) +* **cubesql:** Ambiguous reference in case of same two 16 char prefixes are in query ([5051f66](https://github.com/cube-js/cube/commit/5051f663b4142735ee1cc455936300f765de62a7)) +* **cubesql:** Continue wait error is being thrown to users ([cb2376c](https://github.com/cube-js/cube/commit/cb2376c1d2cc0a86aa329072fb2ec02ddadfeaf8)) + + +### Features + +* **materialize-driver:** Add cluster option to Materialize driver ([#7773](https://github.com/cube-js/cube/issues/7773)) Thanks [@bobbyiliev](https://github.com/bobbyiliev)! ([917004e](https://github.com/cube-js/cube/commit/917004ebccfeb6509a08e5b9b51e1ae8542cf0af)) + + + + + +## [0.34.57](https://github.com/cube-js/cube/compare/v0.34.56...v0.34.57) (2024-02-26) + + +### Bug Fixes + +* **cubesql:** `ungrouped` query can be routed to Cube Store ([#7810](https://github.com/cube-js/cube/issues/7810)) ([b122837](https://github.com/cube-js/cube/commit/b122837de9cd4fcaca4ddc0e7f85ff695de09483)) +* **cubesql:** Can't find rewrite due to AST node limit reached for remaining non-equivalent date and timestamp constant folding rules ([b79f697](https://github.com/cube-js/cube/commit/b79f69739e2b8cb74cfc86db72fa7157dd723960)) +* **cubesql:** More readable error message during SQL generation ([d9a7194](https://github.com/cube-js/cube/commit/d9a719479d6ca00ef5b2b511677cd777ceb131e7)) +* **cubesql:** Support `Z` postfix in `Timestamp` response transformation ([c013c91](https://github.com/cube-js/cube/commit/c013c913bbeb8dabacc508240ab94956f1172a8b)) +* **cubesql:** Timestamp equals filter support ([754a0df](https://github.com/cube-js/cube/commit/754a0df3a20cae5269e961649a01fb5047906645)) +* **cubesql:** writerOrChannel.resolve is not a function ([abc95e2](https://github.com/cube-js/cube/commit/abc95e259c82894aea63371e468c98d640b4d42e)) + + +### Features + +* **cubesql:** `WHERE` SQL push down ([#7808](https://github.com/cube-js/cube/issues/7808)) ([98b5709](https://github.com/cube-js/cube/commit/98b570946905586f16a502f83b0a1cf8e4aa92a6)) +* **cubesql:** Allow replacement of aggregation functions in SQL push down ([#7811](https://github.com/cube-js/cube/issues/7811)) ([97fa757](https://github.com/cube-js/cube/commit/97fa757a0d22e6d7d9432d686005765b28271f7c)) +* **cubesql:** Support placeholders in `OFFSET`, `FETCH ...` ([60aad90](https://github.com/cube-js/cube/commit/60aad90a237800f4471bb4efa10ec590b50e19fe)) +* **cubesql:** Support temporary tables ([7022611](https://github.com/cube-js/cube/commit/702261156fc3748fc7d3103f28bd4f4648fd4e0b)) +* **duckdb-driver:** Add support for local fs duckdb database path ([#7799](https://github.com/cube-js/cube/issues/7799)) ([77cc883](https://github.com/cube-js/cube/commit/77cc883a3d73d37730a82ecf9128b8929abb2ca3)) + + + + + +## [0.34.56](https://github.com/cube-js/cube/compare/v0.34.55...v0.34.56) (2024-02-20) + + +### Bug Fixes + +* **cubesql:** Allow `NULL` values in `CASE` ([a97acdc](https://github.com/cube-js/cube/commit/a97acdc996dd68a0e2c00c155dfe30a863440ecc)) +* **cubesql:** Streaming still applies default limit ([a96831d](https://github.com/cube-js/cube/commit/a96831dc7157cf48ae4dc0cd3a81d9f44557e47e)) +* Gracefully handle logical expressions in FILTER_PARAMS and introduce FILTER_GROUP to allow use FILTER_PARAMS for logical expressions ([#7766](https://github.com/cube-js/cube/issues/7766)) ([736070d](https://github.com/cube-js/cube/commit/736070d5a33c25d212420a61da6c98a4b4d31188)) + + + + + +## [0.34.55](https://github.com/cube-js/cube/compare/v0.34.54...v0.34.55) (2024-02-15) + + +### Bug Fixes + +* Cannot read properties of null (reading 'includes') ([9b50382](https://github.com/cube-js/cube/commit/9b503827a8f4cf18b926dfec4e65a0dce0de0b70)) +* **cubesql:** Quote `FROM` alias for SQL push down to avoid name clas… ([#7755](https://github.com/cube-js/cube/issues/7755)) ([4e2732a](https://github.com/cube-js/cube/commit/4e2732ae9997762a95fc946a5392b50e4dbf8622)) + + +### Features + +* **cubesql:** Strings with Unicode Escapes ([#7756](https://github.com/cube-js/cube/issues/7756)) ([49acad5](https://github.com/cube-js/cube/commit/49acad51e6a2b7ffa9ec0b584aaaa6e54f4f1434)) + + + + + +## [0.34.54](https://github.com/cube-js/cube/compare/v0.34.53...v0.34.54) (2024-02-13) + + +### Bug Fixes + +* **cubesql:** Cannot read properties of undefined (reading 'preAggregation') with enabled SQL push down ([ac2cc17](https://github.com/cube-js/cube/commit/ac2cc177fc5d53a213603efd849acb2b4abf7a48)) + + + + + +## [0.34.53](https://github.com/cube-js/cube/compare/v0.34.52...v0.34.53) (2024-02-13) + + +### Bug Fixes + +* **cubesql:** SQL push down can be incorrectly routed to Cube Store pre-aggregations ([#7752](https://github.com/cube-js/cube/issues/7752)) ([1a6451c](https://github.com/cube-js/cube/commit/1a6451c2c0bef6f5efbba2870ec0a11238b1addb)) + + + + + +## [0.34.52](https://github.com/cube-js/cube/compare/v0.34.51...v0.34.52) (2024-02-13) + + +### Bug Fixes + +* **cubesql:** Support new Metabase meta queries ([0bc09fd](https://github.com/cube-js/cube/commit/0bc09fdbefaf8b4e184f4c0803919103789acb0a)) +* **cubestore:** Error in queries with GROUP BY DIMENSION ([#7743](https://github.com/cube-js/cube/issues/7743)) ([b9fcc60](https://github.com/cube-js/cube/commit/b9fcc6007864303cbc662a76e7bed1f119b9fc7d)) +* **cubestore:** Use file_name instead of id for in memory chunks ([#7704](https://github.com/cube-js/cube/issues/7704)) ([9e2e925](https://github.com/cube-js/cube/commit/9e2e9258fb1d4824e71a423d6a10cfc9df053ca1)) + + +### Features + +* **cubesql:** Always Prefer SQL push down over aggregation in Datafusion ([#7751](https://github.com/cube-js/cube/issues/7751)) ([b4b0f05](https://github.com/cube-js/cube/commit/b4b0f05d16eb08f2be3831a5d48468be8d8b9d76)) +* **cubesql:** EXTRACT(EPOCH, ...) support ([#7734](https://github.com/cube-js/cube/issues/7734)) ([b4deacd](https://github.com/cube-js/cube/commit/b4deacddf0a2e06b0b1f4216ca735a41e52724e2)) +* **cubesql:** Support `TimestampNanosecond` in `CASE` ([69aed08](https://github.com/cube-js/cube/commit/69aed0875afb3b2d56176f4bdfdee7b1acd17ce9)) +* **cubesql:** Support Athena OFFSET and LIMIT push down ([00c2a6b](https://github.com/cube-js/cube/commit/00c2a6b3cc88fde5d65d02549d3458818e4a8e42)) +* **duckdb-driver:** pass Cube user agent ([6b7aff6](https://github.com/cube-js/cube/commit/6b7aff6afb07ffffdb036f6cd1fbc24bd6ae7cb9)) + + + + + +## [0.34.51](https://github.com/cube-js/cube/compare/v0.34.50...v0.34.51) (2024-02-11) + + +### Bug Fixes + +* **cubesql:** Enable constant folding for unary minus exprs ([704d05a](https://github.com/cube-js/cube/commit/704d05aecafada282a6bcbd57bd0519bb5a12aa5)) +* **cubesql:** Fix `CASE` type with `NULL` values ([2b7cc30](https://github.com/cube-js/cube/commit/2b7cc304b101330ca072fa0c4a3a6e9ae9efa2a5)) +* **cubesql:** Stabilize split operations for SQL push down ([#7725](https://github.com/cube-js/cube/issues/7725)) ([6241e5e](https://github.com/cube-js/cube/commit/6241e5e9335148947a687f7e3d6b56929ba46c36)) +* **native:** Don't crash after query cancellation ([40726ba](https://github.com/cube-js/cube/commit/40726ba3ae27a53a4e6531886513b545a27b1858)) +* **native:** Handle JsAsyncChannel error (without panic) ([#7729](https://github.com/cube-js/cube/issues/7729)) ([5480978](https://github.com/cube-js/cube/commit/5480978295232d5cd7b3baf2fe4c48b005338f06)) +* **playground:** replace antd daterange picker ([#7735](https://github.com/cube-js/cube/issues/7735)) ([484f1ca](https://github.com/cube-js/cube/commit/484f1ca0d0fa67a148f2db01041837a95d35c1c5)) + + +### Features + +* Add `ungrouped` flag to GraphQL API ([#7746](https://github.com/cube-js/cube/issues/7746)) ([6111fbb](https://github.com/cube-js/cube/commit/6111fbbffb8486a1a19ef0846967abe3fa285ad3)) +* **cubesql:** Extend `DATEDIFF` push down support ([ecaaf1c](https://github.com/cube-js/cube/commit/ecaaf1ca5566ff7cc27289468440e6a902a09609)) +* **cubestore:** CREATE TABLE IF NOT EXISTS support ([#7451](https://github.com/cube-js/cube/issues/7451)) ([79c5e92](https://github.com/cube-js/cube/commit/79c5e92e6aed04b59e88ed61bd4a6dcdbcfb0b92)) + + + + + +## [0.34.50](https://github.com/cube-js/cube/compare/v0.34.49...v0.34.50) (2024-01-31) + + +### Bug Fixes + +* **cubestore:** Single job process don't stop after job done ([#7706](https://github.com/cube-js/cube/issues/7706)) ([b84a345](https://github.com/cube-js/cube/commit/b84a34592648f37bbdf77b9d8691e44a6e3d8f27)) +* Merge streaming methods to one interface to allow SQL API use batching and Databricks batching implementation ([#7695](https://github.com/cube-js/cube/issues/7695)) ([73ad72d](https://github.com/cube-js/cube/commit/73ad72dd8a104651cf5ef23a60e8b4c116c97eed)) +* **playground:** replace antd popover for settings ([#7699](https://github.com/cube-js/cube/issues/7699)) ([56b44ee](https://github.com/cube-js/cube/commit/56b44eefe02fa21fe0ae89d2bc45ee83f20a5210)) + + + + + +## [0.34.49](https://github.com/cube-js/cube/compare/v0.34.48...v0.34.49) (2024-01-26) + + +### Bug Fixes + +* Revert drillMembers include in views as it's a breaking change. Need to re-introduce it through evaluation on cube level and validating drillMembers are included in view ([#7692](https://github.com/cube-js/cube/issues/7692)) ([6cbbaa0](https://github.com/cube-js/cube/commit/6cbbaa009c87eef4250cebca79de3c9cbb2ace11)) + + + + + +## [0.34.48](https://github.com/cube-js/cube/compare/v0.34.47...v0.34.48) (2024-01-25) + + +### Bug Fixes + +* **cubesql:** Fix unary minus operator precedence ([d5a935a](https://github.com/cube-js/cube/commit/d5a935ac3bb16c1dda6c30982cdc9ef787a24967)) +* **cubesql:** Segment mixed with a filter and a date range filter may affect push down of `inDateRange` filter to time dimension ([#7684](https://github.com/cube-js/cube/issues/7684)) ([f29a7be](https://github.com/cube-js/cube/commit/f29a7be8379097b8de657ebc2e46f40bae3ccce9)) +* **cubesql:** Support Sigma Sunday week granularity ([3d492eb](https://github.com/cube-js/cube/commit/3d492eb5feb84503a1bffda7481ed8b562939e44)) +* Join order is incorrect for snowflake schema views with defined join paths ([#7689](https://github.com/cube-js/cube/issues/7689)) ([454d456](https://github.com/cube-js/cube/commit/454d4563120f591445c219c42dd5bd2fd937f7a6)), closes [#7663](https://github.com/cube-js/cube/issues/7663) + + +### Features + +* **cubesql:** Support KPI chart in Thoughtspot ([dbab39e](https://github.com/cube-js/cube/commit/dbab39e63a1c752a56a2cb06169a479a3e9cb11e)) +* **cubesql:** Support unwrapping BINARY expr from SUM() ([#7683](https://github.com/cube-js/cube/issues/7683)) ([ce93cc7](https://github.com/cube-js/cube/commit/ce93cc7a0f667409d725b34913405f18d18f629b)) +* View members inherit title, format and drillMembers attribute ([#7617](https://github.com/cube-js/cube/issues/7617)) Thanks @CallumWalterWhite ! ([302a756](https://github.com/cube-js/cube/commit/302a7560fd65e1437249701e1fc42b32da5df8fa)) + + + + + +## [0.34.47](https://github.com/cube-js/cube/compare/v0.34.46...v0.34.47) (2024-01-23) + + +### Features + +* **cubesql:** TO_CHAR - support more formats, correct NULL handling ([#7671](https://github.com/cube-js/cube/issues/7671)) ([2d1e2d2](https://github.com/cube-js/cube/commit/2d1e2d216c99af68a2d5cf1b2acd2f5e2a623323)) +* **duckdb-driver:** Support advanced configuration for S3 via env variables ([#7544](https://github.com/cube-js/cube/issues/7544)) ([4862195](https://github.com/cube-js/cube/commit/4862195d57a8796c3bbd74696eb41df4505e545c)) + + + + + +## [0.34.46](https://github.com/cube-js/cube/compare/v0.34.45...v0.34.46) (2024-01-18) + + +### Bug Fixes + +* **cubejs-client/react:** types for useCubeQuery ([#7668](https://github.com/cube-js/cube/issues/7668)) Thanks [@tchell](https://github.com/tchell) ! ([2f95f76](https://github.com/cube-js/cube/commit/2f95f76031e4419998bd2001c10d78ec4b75ef2e)) + + +### Features + +* **cubesql:** Cache plan rewrites with and without replaced parameters ([#7670](https://github.com/cube-js/cube/issues/7670)) ([c360d3c](https://github.com/cube-js/cube/commit/c360d3c9da61b45f8215cc17db098cfa0a74c899)) + + + + + +## [0.34.45](https://github.com/cube-js/cube/compare/v0.34.44...v0.34.45) (2024-01-16) + + +### Features + +* **cubesql:** Query rewrite cache ([#7647](https://github.com/cube-js/cube/issues/7647)) ([79888af](https://github.com/cube-js/cube/commit/79888afc3823a3ef29ba76c440828c8c5d719ae4)) + + + + + +## [0.34.44](https://github.com/cube-js/cube/compare/v0.34.43...v0.34.44) (2024-01-15) + + +### Bug Fixes + +* **query-orchestrator:** QueryQueue - reduce trafic (unexpected call for query stage) ([#7646](https://github.com/cube-js/cube/issues/7646)) ([ecf3826](https://github.com/cube-js/cube/commit/ecf3826df0e8f7ff5855b725ded4ac7d4f566582)) + + +### Features + +* **query-orchestrator:** Queue - reduce traffic for processing (Cube Store only) ([#7644](https://github.com/cube-js/cube/issues/7644)) ([7db90fb](https://github.com/cube-js/cube/commit/7db90fb7532d53d7ce46ba342e89250110f32c6b)) + + + + + +## [0.34.43](https://github.com/cube-js/cube/compare/v0.34.42...v0.34.43) (2024-01-11) + + +### Bug Fixes + +* **playground:** replace antd overlay ([#7645](https://github.com/cube-js/cube/issues/7645)) ([bb6a7d3](https://github.com/cube-js/cube/commit/bb6a7d3ff4b6d6b7972c196877749d3dbc2aecf6)) + + + + + +## [0.34.42](https://github.com/cube-js/cube/compare/v0.34.41...v0.34.42) (2024-01-07) + + +### Features + +* **cubesql:** Compiler cache for rewrite rules ([#7604](https://github.com/cube-js/cube/issues/7604)) ([995889f](https://github.com/cube-js/cube/commit/995889fb7722cda3bf839095949d6d71693dd329)) + + + + + +## [0.34.41](https://github.com/cube-js/cube/compare/v0.34.40...v0.34.41) (2024-01-02) + + +### Bug Fixes + +* **@cubejs-client/ngx:** set module to fesm2015 ([#7571](https://github.com/cube-js/cube/issues/7571)) Thanks [@loremaps](https://github.com/loremaps)! ([aaa8bfd](https://github.com/cube-js/cube/commit/aaa8bfd23e91ff033b4c048c4e6ee4e419c45d98)), closes [#7570](https://github.com/cube-js/cube/issues/7570) +* **cubesql:** Enable `Visitor` on `GROUP BY` expressions ([#7575](https://github.com/cube-js/cube/issues/7575)) ([bcc1a89](https://github.com/cube-js/cube/commit/bcc1a8911fe99f33b0a82e865597dec38101ecad)) +* **cubestore:** Panic in hash join ([#7573](https://github.com/cube-js/cube/issues/7573)) ([aa6c08b](https://github.com/cube-js/cube/commit/aa6c08b65dbb16c1008a46fbeca7590715bca46b)) +* **databricks-jdbc-driver:** Time series queries with rolling window & time dimension ([#7564](https://github.com/cube-js/cube/issues/7564)) ([79d033e](https://github.com/cube-js/cube/commit/79d033eecc54c4ae5a4e04ed7713fb34957af091)) +* Do not fail extractDate on missing result set ([c8567ef](https://github.com/cube-js/cube/commit/c8567eff0a8ccafe04be2948331c11f80bfeab09)) + + +### Features + +* **cubesql:** Support Domo data queries ([#7509](https://github.com/cube-js/cube/issues/7509)) ([6d644dc](https://github.com/cube-js/cube/commit/6d644dc5265245b8581eb2c2e3b75f5d6d9f929c)) + + + + + +## [0.34.40](https://github.com/cube-js/cube/compare/v0.34.39...v0.34.40) (2023-12-21) + + +### Features + +* **cubesql:** Do not run split re-aggregate for trivial push down to improve wide table queries ([#7567](https://github.com/cube-js/cube/issues/7567)) ([8dbf879](https://github.com/cube-js/cube/commit/8dbf87986cd58f4860d647d5a0bb33e64a229db1)) + + + + + +## [0.34.39](https://github.com/cube-js/cube/compare/v0.34.38...v0.34.39) (2023-12-21) + + +### Bug Fixes + +* **base-driver:** Support parsing intervals with month|quarter|year granularity ([#7561](https://github.com/cube-js/cube/issues/7561)) ([24c850c](https://github.com/cube-js/cube/commit/24c850ccb74b08f74b5314ed97f872b95cb46b43)) +* **clickhouse-driver:** Correct parsing for DateTime('timezone') ([#7565](https://github.com/cube-js/cube/issues/7565)) ([d39e4a2](https://github.com/cube-js/cube/commit/d39e4a25f2982cd2f66434f8095905883b9815ff)) + + +### Features + +* **jdbc-driver:** Upgrade java to ^0.14 (to support new JDK & Node.js) ([#7566](https://github.com/cube-js/cube/issues/7566)) ([fe10c9b](https://github.com/cube-js/cube/commit/fe10c9b07ef88162044d86f0552f30b61cc618ed)) + + + + + +## [0.34.38](https://github.com/cube-js/cube/compare/v0.34.37...v0.34.38) (2023-12-19) + + +### Bug Fixes + +* **dremio-driver:** Fix generation of time series SQL ([#7503](https://github.com/cube-js/cube/issues/7503)) ([7e84d4c](https://github.com/cube-js/cube/commit/7e84d4c0eb3639893faf11a10a11316b9870a0d5)) + + +### Features + +* **native:** NodeObjSerializer - support serializing sequences ([#7560](https://github.com/cube-js/cube/issues/7560)) ([c19679d](https://github.com/cube-js/cube/commit/c19679d740684fd616ff4d2ce35fe6d95b65160e)) + + + + + +## [0.34.37](https://github.com/cube-js/cube/compare/v0.34.36...v0.34.37) (2023-12-19) + + +### Bug Fixes + +* **clickhouse-driver:** Initial support for DateTime64, fix [#7537](https://github.com/cube-js/cube/issues/7537) ([#7538](https://github.com/cube-js/cube/issues/7538)) ([401e9e1](https://github.com/cube-js/cube/commit/401e9e1b9c07e115804a1f84fade2bb82b55ca29)) +* Internal: Error during planning: No field named for pre-aggregat… ([#7554](https://github.com/cube-js/cube/issues/7554)) ([412213c](https://github.com/cube-js/cube/commit/412213cbec40748d0de6f54731686c3d0b263e5c)) + + +### Features + +* **client-core:** Add meta field for Cube type definition ([#7527](https://github.com/cube-js/cube/issues/7527)) ([75e201d](https://github.com/cube-js/cube/commit/75e201df5b64538da24103ccf82411b6f46006da)) +* **cubesql:** Avoid pushing split down for trivial selects to optimi… ([#7556](https://github.com/cube-js/cube/issues/7556)) ([2bf86e5](https://github.com/cube-js/cube/commit/2bf86e5a70810f5f081a527d6e7b70c8020673aa)) +* **native:** Support Python 3.12 ([#7550](https://github.com/cube-js/cube/issues/7550)) ([618a81e](https://github.com/cube-js/cube/commit/618a81ea3075473f05dba8a2114358b9b9af4d82)) + + + + + +## [0.34.36](https://github.com/cube-js/cube/compare/v0.34.35...v0.34.36) (2023-12-16) + + +### Bug Fixes + +* **cubesql:** Improve performance for wide table querying ([#7534](https://github.com/cube-js/cube/issues/7534)) ([0f877d4](https://github.com/cube-js/cube/commit/0f877d41f08aeb1ebc9b22e9b38da931152435d2)) + + + + + +## [0.34.35](https://github.com/cube-js/cube/compare/v0.34.34...v0.34.35) (2023-12-13) + + +### Bug Fixes + +* **cubesql:** Support Sigma Computing table schema sync ([d87bd19](https://github.com/cube-js/cube/commit/d87bd19384e25a161fb2424b3b6c01da675de04e)) + + +### Features + +* Add meta property for cube definition ([#7327](https://github.com/cube-js/cube/issues/7327)) Thanks [@mharrisb1](https://github.com/mharrisb1) ! ([0ea12c4](https://github.com/cube-js/cube/commit/0ea12c440b3b3fb8280063a1da7d7f9e6b9b6754)) +* **cubesql:** Additional trace event logging for SQL API ([#7524](https://github.com/cube-js/cube/issues/7524)) ([6b700cd](https://github.com/cube-js/cube/commit/6b700cd493b16d4450ce1efaa449207836a47592)) + + + + + +## [0.34.34](https://github.com/cube-js/cube/compare/v0.34.33...v0.34.34) (2023-12-12) + + +### Bug Fixes + +* **api-gateway:** Catch error from contextToApiScopes ([#7521](https://github.com/cube-js/cube/issues/7521)) ([0214472](https://github.com/cube-js/cube/commit/0214472dabf39b8429e11f4830350b2a6bd305a0)) +* **api-gateway:** Fallback to global error middelware for async handlers ([#7520](https://github.com/cube-js/cube/issues/7520)) ([74b0862](https://github.com/cube-js/cube/commit/74b0862800ada31681e702992ff1f7da89924b9f)) +* **api-gateway:** Removed hasOwnProperty check for request object ([#7517](https://github.com/cube-js/cube/issues/7517)) ([2129a1b](https://github.com/cube-js/cube/commit/2129a1b5bac1e2863e8136adb061708d8660354e)) +* **deps:** Upgrade qs (CVE-2022-24999) ([#7518](https://github.com/cube-js/cube/issues/7518)) ([55422a1](https://github.com/cube-js/cube/commit/55422a1b340c8ca067e783952aaed041ab6aed40)) + + + + + +## [0.34.33](https://github.com/cube-js/cube/compare/v0.34.32...v0.34.33) (2023-12-11) + + +### Features + +* **duckdb-driver:** Declare user agent information ([#7490](https://github.com/cube-js/cube/issues/7490)) ([59557e8](https://github.com/cube-js/cube/commit/59557e8492e4338c457b129c6c59bde542410577)) +* **query-orchestrator:** Reduce number of touches for pre-aggregations ([#7515](https://github.com/cube-js/cube/issues/7515)) ([c22eb91](https://github.com/cube-js/cube/commit/c22eb9183c6c7c02e137662ee935f418ef45f02a)) + + + + + +## [0.34.32](https://github.com/cube-js/cube/compare/v0.34.31...v0.34.32) (2023-12-07) + + +### Bug Fixes + +* **query-orchestrator:** Queue - clear timer on streaming ([#7501](https://github.com/cube-js/cube/issues/7501)) ([ac2357d](https://github.com/cube-js/cube/commit/ac2357dd52f3316dc33158795388067097c32ece)) + + +### Features + +* **cubesql:** Add CURRENT_DATE function definitions for Postgres and Snowflake so those can be pushed down ([ac1ca88](https://github.com/cube-js/cube/commit/ac1ca889add970dd05820b8f077edb968c985994)) + + + + + +## [0.34.31](https://github.com/cube-js/cube/compare/v0.34.30...v0.34.31) (2023-12-07) + + +### Bug Fixes + +* **cubesql:** Avoid constant folding for current_date() function duri… ([#7498](https://github.com/cube-js/cube/issues/7498)) ([e86f4be](https://github.com/cube-js/cube/commit/e86f4be42a6e48a115c2765e0cda84fbf1cc56e7)) + + +### Features + +* **cubesql:** Support `Utf8 * Interval` expression ([ea1fa9c](https://github.com/cube-js/cube/commit/ea1fa9ca6e04cf12b4c334b5702d7a5a33f0c364)) + + + + + +## [0.34.30](https://github.com/cube-js/cube/compare/v0.34.29...v0.34.30) (2023-12-04) + + +### Bug Fixes + +* **cubestore:** InplaceAggregate for boolean columns ([#7432](https://github.com/cube-js/cube/issues/7432)) ([a6d3579](https://github.com/cube-js/cube/commit/a6d3579c6930763edc0f72eabdb7892b8675a5c5)) +* View tries to join cube twice in case there's join ambiguity ([#7487](https://github.com/cube-js/cube/issues/7487)) ([66f7c17](https://github.com/cube-js/cube/commit/66f7c17a19fb594a8c71ff6d449f25a5a9e727aa)) + + + + + +## [0.34.29](https://github.com/cube-js/cube/compare/v0.34.28...v0.34.29) (2023-12-01) + + +### Bug Fixes + +* **schema-compiler:** td.isDateOperator is not a function ([#7483](https://github.com/cube-js/cube/issues/7483)) ([31c272a](https://github.com/cube-js/cube/commit/31c272ae929bc8e7f7972e46666f84bf8509cc3f)) + + + + + +## [0.34.28](https://github.com/cube-js/cube/compare/v0.34.27...v0.34.28) (2023-11-30) + + +### Features + +* **server-core:** Relative imports resolution for custom drivers ([#7480](https://github.com/cube-js/cube/issues/7480)) ([8f180b3](https://github.com/cube-js/cube/commit/8f180b38e42bed61ebf2dc510631e5390258e8ff)) + + + + + +## [0.34.27](https://github.com/cube-js/cube/compare/v0.34.26...v0.34.27) (2023-11-30) + + +### Features + +* **client-ngx:** enable ivy ([#7479](https://github.com/cube-js/cube/issues/7479)) ([a3c2bbb](https://github.com/cube-js/cube/commit/a3c2bbb760a166d796f4080913bdfc1d352af8bd)) +* **cubesql:** Provide password supplied by Postgres connection as a 3rd argument of `check_sql_auth()` ([#7471](https://github.com/cube-js/cube/issues/7471)) ([ee3c19f](https://github.com/cube-js/cube/commit/ee3c19f8d467056c90ee407b3ac386dc1892b678)), closes [#5430](https://github.com/cube-js/cube/issues/5430) + + + + + +## [0.34.26](https://github.com/cube-js/cube/compare/v0.34.25...v0.34.26) (2023-11-28) + + +### Bug Fixes + +* **cubesql:** Missing template backslash escaping ([#7465](https://github.com/cube-js/cube/issues/7465)) ([4a08de5](https://github.com/cube-js/cube/commit/4a08de5791f7353b925c60ee84d2654e95e7967a)) +* **query-orchestartor:** Queue - fix possible memory leak with timer ([#7466](https://github.com/cube-js/cube/issues/7466)) ([535a676](https://github.com/cube-js/cube/commit/535a6765346e08c5848d293c481d9abfa417ca78)) +* **schema-compiler:** Incorrect excludes resolution, fix [#7100](https://github.com/cube-js/cube/issues/7100) ([#7468](https://github.com/cube-js/cube/issues/7468)) ([f89ef8d](https://github.com/cube-js/cube/commit/f89ef8d638fafa760ea6415bc670c0c3939ea06b)) +* **schema-compiler:** Missing pre-aggregation filter for partitioned pre-aggregation via view, fix [#6623](https://github.com/cube-js/cube/issues/6623) ([#7454](https://github.com/cube-js/cube/issues/7454)) ([567b92f](https://github.com/cube-js/cube/commit/567b92fe716bcc11b19d42815699b476339ef201)) + + +### Features + +* **cubesql:** Support SQL push down for several functions ([79e5ac8](https://github.com/cube-js/cube/commit/79e5ac8e998005ebf8b5f72ccf1d63f425f6003c)) +* **cubestore-driver:** Queue - protect possible race condition with hearbeat/cancellation on error ([#7467](https://github.com/cube-js/cube/issues/7467)) ([9c0ad07](https://github.com/cube-js/cube/commit/9c0ad0746d54543e264789dd36fa0ce2b91b7626)) + + + + + +## [0.34.25](https://github.com/cube-js/cube/compare/v0.34.24...v0.34.25) (2023-11-24) + + +### Bug Fixes + +* **api-gateway:** Handle invalid query (invalid JSON) as 400 Bad Request ([#7455](https://github.com/cube-js/cube/issues/7455)) ([c632727](https://github.com/cube-js/cube/commit/c6327275f01cd7c2b43750f88b3d6b13809edba4)) +* **mongobi-driver:** Correct time zone conversion for minutes, fix [#7152](https://github.com/cube-js/cube/issues/7152) ([#7456](https://github.com/cube-js/cube/issues/7456)) ([5ae2009](https://github.com/cube-js/cube/commit/5ae2009a8231432020e09fb6dfeaa8f40ef152fa)) +* Validation problem with ECDSA SSL keys ([#7453](https://github.com/cube-js/cube/issues/7453)) ([567d2ca](https://github.com/cube-js/cube/commit/567d2cad9a81e82dacd27e99fce9f28db42e9d75)) + + + + + +## [0.34.24](https://github.com/cube-js/cube/compare/v0.34.23...v0.34.24) (2023-11-23) + + +### Bug Fixes + +* **athena-driver:** Allow to pass custom credentials, fix [#7407](https://github.com/cube-js/cube/issues/7407) ([#7429](https://github.com/cube-js/cube/issues/7429)) ([f005c5b](https://github.com/cube-js/cube/commit/f005c5b88418c1c9e34f476c25e523f64434c9ca)) +* **cubestore:** Natural order for Int96 and Decimal96 ([#7419](https://github.com/cube-js/cube/issues/7419)) ([5671a5c](https://github.com/cube-js/cube/commit/5671a5cb28db517676f451acc928c4d4b36d9bae)) + + +### Features + +* **cubestore:** Metrics - track command for data/cache/queue ([#7430](https://github.com/cube-js/cube/issues/7430)) ([91db103](https://github.com/cube-js/cube/commit/91db103b541da77c6f46f692bbf9c5d138cb6156)) +* **schema-compiler:** add dimension primaryKey property to transform result ([#7443](https://github.com/cube-js/cube/issues/7443)) ([baabd41](https://github.com/cube-js/cube/commit/baabd41fed8bd1476d0489dc97c3f78c9106a63b)) + + + + + +## [0.34.23](https://github.com/cube-js/cube/compare/v0.34.22...v0.34.23) (2023-11-19) + + +### Bug Fixes + +* **duckdb-driver:** Crash with high concurrency (unsuccessful or closed pending query result) ([#7424](https://github.com/cube-js/cube/issues/7424)) ([a2e42ac](https://github.com/cube-js/cube/commit/a2e42ac930ea1cabb1d13c8c8dbde7c808139d55)) +* Match additive pre-aggregations with missing members for views and proxy members ([#7433](https://github.com/cube-js/cube/issues/7433)) ([e236079](https://github.com/cube-js/cube/commit/e236079ad0ecef2b43f285f4a5154bcd8cb8a9e2)) + + +### Features + +* **cubesql:** Support `-` (unary minus) SQL push down ([a0a2e12](https://github.com/cube-js/cube/commit/a0a2e129e4cf3264df75bbdf53a962a892e4e9c2)) +* **cubesql:** Support `NOT` SQL push down ([#7422](https://github.com/cube-js/cube/issues/7422)) ([7b1ff0d](https://github.com/cube-js/cube/commit/7b1ff0d897ec9a5cfffba1e09444ff7baa8bea5b)) +* **cubestore-driver:** Queue - protect possible race condition on removing orphaned queries ([#7426](https://github.com/cube-js/cube/issues/7426)) ([7142e9c](https://github.com/cube-js/cube/commit/7142e9cf146379182cc57e68d4456bd0f00137a5)) +* **duckdb-driver:** Upgrade to 0.9.2 ([#7425](https://github.com/cube-js/cube/issues/7425)) ([d630243](https://github.com/cube-js/cube/commit/d630243dfe045acc46426a4d58acfdeeed7ca1da)) +* **native:** Jinja - print tracebacks for Python errors ([#7435](https://github.com/cube-js/cube/issues/7435)) ([734094c](https://github.com/cube-js/cube/commit/734094c6c9a9f89de3504d980daa5fa0e0198ae5)) + + + + + +## [0.34.22](https://github.com/cube-js/cube/compare/v0.34.21...v0.34.22) (2023-11-16) + + +### Bug Fixes + +* **cubesql:** Window PARTITION BY, ORDER BY queries fail for SQL push down ([62b359f](https://github.com/cube-js/cube/commit/62b359f2d33d0c8fd59aa570e7e3a83718a3f7e8)) + + +### Features + +* **cubesql:** Ambiguous column references for SQL push down ([c5f1648](https://github.com/cube-js/cube/commit/c5f16485f2b7324f5e8c5ce3642ec9e9d29de534)) + + + + + +## [0.34.21](https://github.com/cube-js/cube/compare/v0.34.20...v0.34.21) (2023-11-15) + + +### Features + +* **cubesql:** SQL push down support for synthetic fields ([#7418](https://github.com/cube-js/cube/issues/7418)) ([d2bdc1b](https://github.com/cube-js/cube/commit/d2bdc1bedbb89ffee14d3bda1c8045b833076e35)) +* **cubesql:** Support SQL push down for more functions ([#7406](https://github.com/cube-js/cube/issues/7406)) ([b1606da](https://github.com/cube-js/cube/commit/b1606daba70ab92952b1cbbacd94dd7294b17ad5)) + + + + + +## [0.34.20](https://github.com/cube-js/cube/compare/v0.34.19...v0.34.20) (2023-11-14) + + +### Bug Fixes + +* Expose `isVisible` and `public` properties in meta consistently ([35ca1d0](https://github.com/cube-js/cube/commit/35ca1d0c104ea6111d4db3b8649cd52a5fabcf79)) + + +### Features + +* **cubesql:** Support `[NOT] IN` SQL push down ([c64994a](https://github.com/cube-js/cube/commit/c64994ac26e1174ce121c79af46fa6a62747b7e9)) +* **druid-driver:** Retrieve types for columns with new Druid versions ([#7414](https://github.com/cube-js/cube/issues/7414)) ([b25c199](https://github.com/cube-js/cube/commit/b25c1998441226132f072211523ad4503f96d929)) + + + + + +## [0.34.19](https://github.com/cube-js/cube/compare/v0.34.18...v0.34.19) (2023-11-11) + + +### Bug Fixes + +* support for format in typings for measures ([#7401](https://github.com/cube-js/cube/issues/7401)) ([1f7e1b3](https://github.com/cube-js/cube/commit/1f7e1b300f06a1b53adfa2850314bd9f145f6651)) + + +### Features + +* **@cubejs-client/core:** expose total rows ([#7140](https://github.com/cube-js/cube/issues/7140)) ([#7372](https://github.com/cube-js/cube/issues/7372)) Thanks [@hannosgit](https://github.com/hannosgit)! ([a4d08c9](https://github.com/cube-js/cube/commit/a4d08c961c3dad880c9a00df630e6f27917f1898)) +* **cubesql:** SQL push down support for window functions ([#7403](https://github.com/cube-js/cube/issues/7403)) ([b1da6c0](https://github.com/cube-js/cube/commit/b1da6c0e38e3b586c3d4b1ddf9c00be57065d960)) + + + + + +## [0.34.18](https://github.com/cube-js/cube/compare/v0.34.17...v0.34.18) (2023-11-10) + + +### Bug Fixes + +* Non-additive pre-aggregations based on proxy dimension doesn't match anymore ([#7396](https://github.com/cube-js/cube/issues/7396)) ([910a49d](https://github.com/cube-js/cube/commit/910a49d87ebfade22ab5ac2463eca9b43f2d5742)) + + + + + +## [0.34.17](https://github.com/cube-js/cube/compare/v0.34.16...v0.34.17) (2023-11-09) + + +### Bug Fixes + +* **cubestore-driver:** Check introspection results on import ([#7382](https://github.com/cube-js/cube/issues/7382)) ([a8b8ad0](https://github.com/cube-js/cube/commit/a8b8ad07fd64b1ff7aea9ba0610e7ab01c174e77)) +* **duckdb-driver:** Compatibility issue with Cube Store for DATE type ([#7394](https://github.com/cube-js/cube/issues/7394)) ([3e1389b](https://github.com/cube-js/cube/commit/3e1389b3a94db85d6b4d343e876a349b843cbf27)) + + + + + +## [0.34.16](https://github.com/cube-js/cube/compare/v0.34.15...v0.34.16) (2023-11-06) + + +### Features + +* **cubesql:** Enable `COVAR` aggr functions push down ([89d841a](https://github.com/cube-js/cube/commit/89d841a049c0064b902bf3cdc631cb056984ddd4)) +* **native:** Jinja - async render ([#7309](https://github.com/cube-js/cube/issues/7309)) ([cd1019c](https://github.com/cube-js/cube/commit/cd1019c9fa904ba76b334e941726ff871d2e3a44)) +* **server:** Mark cube.py as stable ([#7381](https://github.com/cube-js/cube/issues/7381)) ([e0517bb](https://github.com/cube-js/cube/commit/e0517bb4d77ce635b0495ab0b95606c139d40628)) + + + + + +## [0.34.15](https://github.com/cube-js/cube/compare/v0.34.14...v0.34.15) (2023-11-06) + + +### Bug Fixes + +* **cubestore:** Fix broadcasting for worker services ([#7375](https://github.com/cube-js/cube/issues/7375)) ([1726632](https://github.com/cube-js/cube/commit/1726632e9ffa223f8dba9a9c0914d13cb2ad283b)) +* Single value non-additive pre-aggregation match in views ([9666f24](https://github.com/cube-js/cube/commit/9666f24650e93ad6fd6990f6b82fb957e26c2885)) + + + + + +## [0.34.14](https://github.com/cube-js/cube/compare/v0.34.13...v0.34.14) (2023-11-05) + + +### Bug Fixes + +* Views with proxy dimensions and non-additive measures don't not match pre-aggregations ([#7374](https://github.com/cube-js/cube/issues/7374)) ([7189720](https://github.com/cube-js/cube/commit/718972090612f31326bad84fcf792d674ea622a9)), closes [#7099](https://github.com/cube-js/cube/issues/7099) + + +### Features + +* **cubesql:** SQL push down for several ANSI SQL functions ([ac2bf15](https://github.com/cube-js/cube/commit/ac2bf15954e6b143b9014ff4b8f72c6098253c82)) +* **cubesql:** SQL push down support for `IS NULL` and `IS NOT NULL` expressions ([9b3c27d](https://github.com/cube-js/cube/commit/9b3c27d502adbcda8a98a4de486a9d0baf4307aa)) + + + + + +## [0.34.13](https://github.com/cube-js/cube/compare/v0.34.12...v0.34.13) (2023-10-31) + + +### Bug Fixes + +* **cubesql:** SQL push down for limit and offset for ungrouped queries ([67da8c3](https://github.com/cube-js/cube/commit/67da8c31463d81e0f84ed1430a1c2d848f910f66)) +* **cubestore:** Error with pre-aggregation and filters containing comma. ([#7364](https://github.com/cube-js/cube/issues/7364)) ([ac4037e](https://github.com/cube-js/cube/commit/ac4037e7bc4d76fcfee113f3e55174b8335f5e73)) + + +### Features + +* **cubestore:** Introduce limit for cache_max_entry_size ([#7363](https://github.com/cube-js/cube/issues/7363)) ([2295fe0](https://github.com/cube-js/cube/commit/2295fe037600137dc52452d2f9a4c806aa784419)) + + + + + +## [0.34.12](https://github.com/cube-js/cube/compare/v0.34.11...v0.34.12) (2023-10-30) + + +### Bug Fixes + +* **duckdb-driver:** Specify schema for information_schema queries ([#7355](https://github.com/cube-js/cube/issues/7355)) ([60f2078](https://github.com/cube-js/cube/commit/60f20783fb295ad4bcdd8a9d6622a04c565a674a)) + + +### Features + +* **cubestore-driver:** Queue - protect possible race condition on cancellation ([#7356](https://github.com/cube-js/cube/issues/7356)) ([a788954](https://github.com/cube-js/cube/commit/a7889543f4fc786ab05a6141227d5f31fc6ffff8)) + + + + + +## [0.34.11](https://github.com/cube-js/cube/compare/v0.34.10...v0.34.11) (2023-10-29) + + +### Features + +* **cubesql:** Allow changing current user through `SET user = ?` ([#7350](https://github.com/cube-js/cube/issues/7350)) ([2c9c8d6](https://github.com/cube-js/cube/commit/2c9c8d68d1bd76b005ebf863b6899ea463d59aae)) +* **cubestore:** Queue - expose queueId for LIST/ACTIVE/PENDING/TO_CANCEL ([#7351](https://github.com/cube-js/cube/issues/7351)) ([7b1a0c0](https://github.com/cube-js/cube/commit/7b1a0c05347d0a0f874978b4462f580ddc814b93)) +* **query-orchestrator:** Pass queueId for orphaned query cancellation ([#7353](https://github.com/cube-js/cube/issues/7353)) ([08ce078](https://github.com/cube-js/cube/commit/08ce078e4f094c18da9fdd265629e4bb01a8a2c9)) +* **query-orchestrator:** Use real queueId in processQuery for events ([#7352](https://github.com/cube-js/cube/issues/7352)) ([bf83762](https://github.com/cube-js/cube/commit/bf83762adfb75585ae233b2c671971761f133048)) + + + + + +## [0.34.10](https://github.com/cube-js/cube/compare/v0.34.9...v0.34.10) (2023-10-27) + + +### Features + +* **cubesql:** Introduce `CUBESQL_DISABLE_STRICT_AGG_TYPE_MATCH` to avoid aggregation type checking during querying ([#7316](https://github.com/cube-js/cube/issues/7316)) ([61089f0](https://github.com/cube-js/cube/commit/61089f056af44f69f79420ce9767e4bb68030f26)) + + + + + +## [0.34.9](https://github.com/cube-js/cube/compare/v0.34.8...v0.34.9) (2023-10-26) + + +### Bug Fixes + +* Correct GraphQL endpoint displayed on front-end ([#7226](https://github.com/cube-js/cube/issues/7226)) Thanks [@peterklingelhofer](https://github.com/peterklingelhofer) ! ([4ae0f18](https://github.com/cube-js/cube/commit/4ae0f18b05184c9d3bf1df6bca6d18bbb29f63b1)) +* **databricks-jdbc-driver:** Failed to read package.json issue ([#7311](https://github.com/cube-js/cube/issues/7311)) ([abb3506](https://github.com/cube-js/cube/commit/abb35067daa016eec07592db0e41fa0750a112aa)) +* **server-core:** Specify maximum for continueWaitTimeout (90 seconds) ([#7301](https://github.com/cube-js/cube/issues/7301)) ([148fb96](https://github.com/cube-js/cube/commit/148fb966d25d2f15d413300304a664ee275a1686)) + + +### Features + +* **native:** Jinja - support fields reflection for PyObject ([#7312](https://github.com/cube-js/cube/issues/7312)) ([e2569a9](https://github.com/cube-js/cube/commit/e2569a9407f86380831d410be8df0e9ef27d5b40)) +* **native:** Jinja - upgrade engine (fixes macros memory leak & stack overflow) ([#7313](https://github.com/cube-js/cube/issues/7313)) ([792e265](https://github.com/cube-js/cube/commit/792e265507d12e4d55d4777fa83b5c2148acbc9e)) +* **oracle-driver:** Update package.json ([#7273](https://github.com/cube-js/cube/issues/7273)) Thanks [@rongfengliang](https://github.com/rongfengliang) ! ([9983661](https://github.com/cube-js/cube/commit/998366131cf825fbf3dd48c6aa48ace2a80776c5)) +* Split view support ([#7308](https://github.com/cube-js/cube/issues/7308)) ([1e722dd](https://github.com/cube-js/cube/commit/1e722dd0cc1a29b6e6554b855b7899abe5746a07)) + + + + + +## [0.34.8](https://github.com/cube-js/cube/compare/v0.34.7...v0.34.8) (2023-10-25) + + +### Bug Fixes + +* **cubesql:** column does not exist in case of ORDER BY is called on CASE column ([8ec80e8](https://github.com/cube-js/cube/commit/8ec80e80ed1501bf369e29c68c1e3fc8f894693f)) + + +### Features + +* **cubesql:** Aggregation over dimensions support ([#7290](https://github.com/cube-js/cube/issues/7290)) ([745ae38](https://github.com/cube-js/cube/commit/745ae38554571b6890be7db5b1e1b5dc4c51324b)) + + + + + +## [0.34.7](https://github.com/cube-js/cube/compare/v0.34.6...v0.34.7) (2023-10-23) + + +### Features + +* **native:** Jinja - passing filters via TemplateContext from Python ([#7284](https://github.com/cube-js/cube/issues/7284)) ([1e92352](https://github.com/cube-js/cube/commit/1e9235293f3843caacc1d20fc458e0184e933c40)) + + + + + +## [0.34.6](https://github.com/cube-js/cube/compare/v0.34.5...v0.34.6) (2023-10-20) + + +### Bug Fixes + +* **cubestore:** Window function don't work with only one Following bound ([#7216](https://github.com/cube-js/cube/issues/7216)) ([a0d23cb](https://github.com/cube-js/cube/commit/a0d23cbcecdac9d73bc1d2291e11a3e4d08acde1)) +* **docs:** update marketing-ui version ([#7249](https://github.com/cube-js/cube/issues/7249)) ([0b6755c](https://github.com/cube-js/cube/commit/0b6755c0f4c7d49cb9ac22ec58165649479aa26d)) +* **native:** Init logger earlier without javascript side (silient errors) ([#7228](https://github.com/cube-js/cube/issues/7228)) ([1f6d49d](https://github.com/cube-js/cube/commit/1f6d49dbd0aa2e792db8c3bcefd54a8a434b4000)) +* **native:** Jinja - enable autoescape for .jinja (old naming) files ([#7243](https://github.com/cube-js/cube/issues/7243)) ([abf5a0c](https://github.com/cube-js/cube/commit/abf5a0cc05d378691e736c859fdbd9209ad1a336)) + + +### Features + +* **native:** Jinja - passing variables via TemplateContext from Python ([#7280](https://github.com/cube-js/cube/issues/7280)) ([e3dec88](https://github.com/cube-js/cube/commit/e3dec888870f6c37da2957ff49988e5769e37f3d)) + + + + + +## [0.34.5](https://github.com/cube-js/cube/compare/v0.34.4...v0.34.5) (2023-10-16) + + +### Features + +* **duckdb-driver:** upgrade duckdb driver to 0.9.1 ([#7174](https://github.com/cube-js/cube/issues/7174)) ([f9889d4](https://github.com/cube-js/cube/commit/f9889d41d5f74e254e17d1bcf35dab6d46da4df4)) +* **native:** Support SafeString for Python & Jinja ([#7242](https://github.com/cube-js/cube/issues/7242)) ([c6069cd](https://github.com/cube-js/cube/commit/c6069cd343d75dbc24a59ae4b941460231409350)) + + + + + +## [0.34.4](https://github.com/cube-js/cube/compare/v0.34.3...v0.34.4) (2023-10-14) + + +### Bug Fixes + +* **cross:** Enable shared python for aarch64-unknown-linux-gnu ([#7225](https://github.com/cube-js/cube/issues/7225)) ([2c4f48a](https://github.com/cube-js/cube/commit/2c4f48a615616bb99bc95ad34e9fc1a420c685c0)) + + + + + +## [0.34.3](https://github.com/cube-js/cube/compare/v0.34.2...v0.34.3) (2023-10-12) + + +### Bug Fixes + +* **native:** Improve error on scheduling Python task ([#7222](https://github.com/cube-js/cube/issues/7222)) ([c14c025](https://github.com/cube-js/cube/commit/c14c0251935d04cc2fa887b44f560024c6ce967d)) + + +### Features + +* **native:** Enable Python support for Linux/ARM64 ([#7220](https://github.com/cube-js/cube/issues/7220)) ([5486e26](https://github.com/cube-js/cube/commit/5486e2623057c189b6e15ef2e0dcbfa6e5e6dad0)) + + + + + +## [0.34.2](https://github.com/cube-js/cube/compare/v0.34.1...v0.34.2) (2023-10-12) + + +### Bug Fixes + +* **native:** Correct compilation for Linux ARM64 ([#7215](https://github.com/cube-js/cube/issues/7215)) ([669c86c](https://github.com/cube-js/cube/commit/669c86cc8ed785ddfc604861fe7e8556ddd00f88)) +* **playground:** rollup designer view members ([#7214](https://github.com/cube-js/cube/issues/7214)) ([b08e27b](https://github.com/cube-js/cube/commit/b08e27b7dc48427a745adccfd03d92088b78dc72)) + + +### Features + +* **native:** Support jinja inside yml in fallback build (without python) ([#7203](https://github.com/cube-js/cube/issues/7203)) ([e3e7e0e](https://github.com/cube-js/cube/commit/e3e7e0e987d1f0b433873779063fa709c0b43eeb)) + + + + + +## [0.34.1](https://github.com/cube-js/cube/compare/v0.34.0...v0.34.1) (2023-10-09) + + +### Bug Fixes + +* **@cubejs-client/vue:** Do not add time dimension as order member if granularity is set to `none` ([#7165](https://github.com/cube-js/cube/issues/7165)) ([1557be6](https://github.com/cube-js/cube/commit/1557be6aa5a6a081578c54c48446815d9be37db6)) +* **cubesql:** Support unaliased columns for SQL push down ([#7199](https://github.com/cube-js/cube/issues/7199)) ([e92e15c](https://github.com/cube-js/cube/commit/e92e15c81205f9a05f3df88513d4b934fa039886)) +* **duckdb-driver:** allow setting default schema ([#7181](https://github.com/cube-js/cube/issues/7181)) ([a52c4d6](https://github.com/cube-js/cube/commit/a52c4d603a00813380075f0c1b20ad44cb026502)) +* More descriptive error message for incorrect `incremental: true` non-partitioned setting ([7e12e4e](https://github.com/cube-js/cube/commit/7e12e4e812b9aee3dab69ba8b86709f889f1a5a0)) + + +### Features + +* **cubesql:** Support `SET ROLE name` ([d02077e](https://github.com/cube-js/cube/commit/d02077ed44f8641850bf74f200c91cb6864fddbe)) +* **cubestore:** Size limit for RocksStore logs file ([#7201](https://github.com/cube-js/cube/issues/7201)) ([43bb693](https://github.com/cube-js/cube/commit/43bb6936905f73221e59db1a38b0f994c3f13160)) + + + + + +# [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 + + + + + +## [0.33.65](https://github.com/cube-js/cube/compare/v0.33.64...v0.33.65) (2023-10-02) + + +### Bug Fixes + +* **@cubejs-client/vue:** Pivot config can use null from heuristics ([#7167](https://github.com/cube-js/cube/issues/7167)) ([e7043bb](https://github.com/cube-js/cube/commit/e7043bb41099d2c4477430b96a20c562e1908266)) + + +### Features + +* **python:** Evaluate Jinja templates inside `.yml` and `.yaml` ([#7182](https://github.com/cube-js/cube/issues/7182)) ([69e9437](https://github.com/cube-js/cube/commit/69e9437deccc2f16442a39ceb95d1583bcea195f)) +* **python:** Support `[@template](https://github.com/template).function("name")` definitions ([#7183](https://github.com/cube-js/cube/issues/7183)) ([33823e8](https://github.com/cube-js/cube/commit/33823e8529529e388535a405a9316ad0d86496c9)) + + + + + +## [0.33.64](https://github.com/cube-js/cube/compare/v0.33.63...v0.33.64) (2023-09-30) + + +### Bug Fixes + +* **cubestore:** Escape regex symbols in all versions of like operator ([#7176](https://github.com/cube-js/cube/issues/7176)) ([e58af39](https://github.com/cube-js/cube/commit/e58af39ee779f1a9372ba24b67ebf56ab532f548)) +* **cubestore:** Escape regex symbols in like operator ([#7175](https://github.com/cube-js/cube/issues/7175)) ([b88c3f3](https://github.com/cube-js/cube/commit/b88c3f343d78c13ef170136d257cf591de8d3f4b)) +* **cubestore:** Wrong pre-aggregations count distinct approx count when using PostgreSQL database ([#7170](https://github.com/cube-js/cube/issues/7170)) ([1d1d4f0](https://github.com/cube-js/cube/commit/1d1d4f055aa96e8b61e59c173aec25635fc4730b)) +* **databricks-jdbc-driver:** ensure default UID property is set ([#7168](https://github.com/cube-js/cube/issues/7168)) ([0f357f8](https://github.com/cube-js/cube/commit/0f357f841b908d71f7b13fc5df889ebb6945901f)) +* SQL push down expressions incorrectly cache used cube names ([c5f0b03](https://github.com/cube-js/cube/commit/c5f0b03e2582be6969ae2de8d1e7dfc6190141c4)) + + +### Features + +* **native:** More concise module structure ([#7180](https://github.com/cube-js/cube/issues/7180)) ([e2a80bf](https://github.com/cube-js/cube/commit/e2a80bfa0515696391f5aa69c299038f6e52c405)) +* **native:** Support explicit [@config](https://github.com/config)("") annotations ([d345d74](https://github.com/cube-js/cube/commit/d345d748e947c8479145886f6d4ac9e9fbeeccd6)) + + + + + +## [0.33.63](https://github.com/cube-js/cube/compare/v0.33.62...v0.33.63) (2023-09-26) + + +### Features + +* **cubesql:** Tableau Standard Gregorian missing date groupings support through SQL push down and some other functions([#7172](https://github.com/cube-js/cube/issues/7172)) ([1339f57](https://github.com/cube-js/cube/commit/1339f577badf94aab02483e3431f614b1fe61302)) +* **snowflake-driver:** Upgrade snowflake driver to 1.8.0 ([#7171](https://github.com/cube-js/cube/issues/7171)) ([06a66c6](https://github.com/cube-js/cube/commit/06a66c662e93354e2d1a22e1bf406ea9d1c2825b)) + + + + + +## [0.33.62](https://github.com/cube-js/cube/compare/v0.33.61...v0.33.62) (2023-09-25) + + +### Features + +* **native:** Jinja - support dynamic Python objects (methods, __call__, fields) ([#7162](https://github.com/cube-js/cube/issues/7162)) ([6a5f70c](https://github.com/cube-js/cube/commit/6a5f70c3d7b910590f5c8ed411363dc6d694e720)) + + + + + +## [0.33.61](https://github.com/cube-js/cube/compare/v0.33.60...v0.33.61) (2023-09-22) + + +### Features + +* **native:** Python - new Jinja API ([#7160](https://github.com/cube-js/cube/issues/7160)) ([ea250ae](https://github.com/cube-js/cube/commit/ea250ae3a9c2c86b375f1ebeebb8304496a1dfc2)) + + + + + +## [0.33.60](https://github.com/cube-js/cube/compare/v0.33.59...v0.33.60) (2023-09-22) + + +### Bug Fixes + +* **cubesql:** `dataRange` filter isn't being push down to time dimension in case of other filters are used ([a4edfae](https://github.com/cube-js/cube/commit/a4edfae654f99b0d5a1227dfc569e8f2231e9697)), closes [#6312](https://github.com/cube-js/cube/issues/6312) + + +### Features + +* **docker:** Python - disable buffering for STDOUT (PYTHONUNBUFFERED) ([#7153](https://github.com/cube-js/cube/issues/7153)) ([5cd0a17](https://github.com/cube-js/cube/commit/5cd0a175bf903d7118735f3526813aa9dd6f9953)) + + + + + +## [0.33.59](https://github.com/cube-js/cube/compare/v0.33.58...v0.33.59) (2023-09-20) + + +### Features + +* **cubesql:** `EXTRACT` SQL push down ([#7151](https://github.com/cube-js/cube/issues/7151)) ([e30c4da](https://github.com/cube-js/cube/commit/e30c4da555adfc1515fcc9e0253bc89ca8adc58b)) +* **cubesql:** Add ability to filter dates inclusive of date being passed in when using `<=` or `>=` ([#7041](https://github.com/cube-js/cube/issues/7041)) Thanks [@darapuk](https://github.com/darapuk) ! ([6b9ae70](https://github.com/cube-js/cube/commit/6b9ae703b113a01fa4e6de54b5597475aed0b85d)) +* **native:** Cube.py - support all options ([#7145](https://github.com/cube-js/cube/issues/7145)) ([5e5fb18](https://github.com/cube-js/cube/commit/5e5fb1800d2e97b870281b335bfca28ab00a9c10)) + + + + + +## [0.33.58](https://github.com/cube-js/cube/compare/v0.33.57...v0.33.58) (2023-09-18) + + +### Bug Fixes + +* **cubejs-client/core:** drillDown - check dateRange before destructuring ([#7138](https://github.com/cube-js/cube/issues/7138)) ([21a7cc2](https://github.com/cube-js/cube/commit/21a7cc2e852366ca224bf84e968c90c30e5e2332)) +* **docs:** layout styles ([f5e5372](https://github.com/cube-js/cube/commit/f5e537290b0367a3cd8acd0f4570766193592e93)) +* **schema-compiler:** YAML - crash on empty string/null, fix [#7126](https://github.com/cube-js/cube/issues/7126) ([#7141](https://github.com/cube-js/cube/issues/7141)) ([73f5ca7](https://github.com/cube-js/cube/commit/73f5ca74a6b6d7ae66b5576c6c4446fda6b1a5de)) +* **schema-compiler:** YAML - crash on unammed measure/dimension/join, refs [#7033](https://github.com/cube-js/cube/issues/7033) ([#7142](https://github.com/cube-js/cube/issues/7142)) ([5c6a065](https://github.com/cube-js/cube/commit/5c6a065b5755d9a991bc89beeb15243b119511cb)) +* **server-core:** Validation - cors.optionsSuccessStatus should be a number ([#7144](https://github.com/cube-js/cube/issues/7144)) ([1d58d4f](https://github.com/cube-js/cube/commit/1d58d4fe995299dfb2139a821538446ecb63eb2b)) + + +### Features + +* new methods for step-by-step db schema fetching ([#7058](https://github.com/cube-js/cube/issues/7058)) ([a362c20](https://github.com/cube-js/cube/commit/a362c2042d4158ae735e9afe0cfeae15c331dc9d)) + + + + + +## [0.33.57](https://github.com/cube-js/cube/compare/v0.33.56...v0.33.57) (2023-09-15) + + +### Bug Fixes + +* **cubesql:** ORDER BY references outer alias instead of inner expression for SQL push down ([778e16c](https://github.com/cube-js/cube/commit/778e16c52319e5ba6d8a786de1e5ff95036b4461)) +* **cubestore:** Eviction - schedule compaction as blocking task ([#7133](https://github.com/cube-js/cube/issues/7133)) ([009b1d6](https://github.com/cube-js/cube/commit/009b1d665e2e90c01a60e2a4192ee108b1838a1c)) +* **docs:** change header layout ([#7136](https://github.com/cube-js/cube/issues/7136)) ([581faad](https://github.com/cube-js/cube/commit/581faad70b360b3bab79c52ce735a3650ba17ba4)) +* **redshift-driver:** resolves issue where redshift column order can come back in a different order, causing pre-aggregations across partitions to encounter a union all error ([#6965](https://github.com/cube-js/cube/issues/6965)) Thanks [@jskarda829](https://github.com/jskarda829) [@magno32](https://github.com/magno32) ! ([30356d9](https://github.com/cube-js/cube/commit/30356d9a43485ae22a7c97378c9c303679480f05)) + + +### Features + +* Config - improve validation (use strict mode) ([#6892](https://github.com/cube-js/cube/issues/6892)) ([5e39b9b](https://github.com/cube-js/cube/commit/5e39b9b35d3a3ca04170b3f9c201d790c437c291)) +* **cubesql:** `CONCAT` function support for SQL push down ([da24afe](https://github.com/cube-js/cube/commit/da24afebc844f6f983d6f4df76f2367168667036)) +* **cubesql:** DATE_TRUNC support for SQL push down ([#7132](https://github.com/cube-js/cube/issues/7132)) ([ae80eb1](https://github.com/cube-js/cube/commit/ae80eb1e45857cde14ec0ff9c15547f917d6fdd2)) +* **cubestore:** Int96 and Decimal96 support ([#6952](https://github.com/cube-js/cube/issues/6952)) ([0262d67](https://github.com/cube-js/cube/commit/0262d67b7c3720224f61385356c6accc1e10cd4b)) +* **native:** Cube.py - support orchestratorOptions/http/jwt ([#7135](https://github.com/cube-js/cube/issues/7135)) ([7ab977f](https://github.com/cube-js/cube/commit/7ab977ff4ba011f10dcf0c853fdd8822cfa9bf1e)) + + + + + +## [0.33.56](https://github.com/cube-js/cube/compare/v0.33.55...v0.33.56) (2023-09-13) + + +### Features + +* **native:** Cube.py - introduce config decorator ([#7131](https://github.com/cube-js/cube/issues/7131)) ([84fad15](https://github.com/cube-js/cube/commit/84fad151b061d2ae73237b8704a3dbefe95e66ce)) +* **native:** Cube.py - support pre_aggregations_schema ([#7130](https://github.com/cube-js/cube/issues/7130)) ([5fc3b8d](https://github.com/cube-js/cube/commit/5fc3b8d8f9e8fbea6ffdcd3e80232c6d142544d7)) +* **native:** Initial support for Python 3.12 ([#7129](https://github.com/cube-js/cube/issues/7129)) ([cc81cd2](https://github.com/cube-js/cube/commit/cc81cd211aba32ecd4e62c3f22a4e1cb9705ba44)) +* **native:** Python - support tuple type ([#7128](https://github.com/cube-js/cube/issues/7128)) ([2518e16](https://github.com/cube-js/cube/commit/2518e16531b92358cf8fe3fc21f1022687b3f86a)) + + + + + +## [0.33.55](https://github.com/cube-js/cube/compare/v0.33.54...v0.33.55) (2023-09-12) + + +### Features + +* **client-core:** castNumerics option ([#7123](https://github.com/cube-js/cube/issues/7123)) ([9aed9ac](https://github.com/cube-js/cube/commit/9aed9ac2c271d064888db6f3fe726dac350b52ea)) +* **cubestore:** Cache - auto trigger for full compaction ([#7120](https://github.com/cube-js/cube/issues/7120)) ([675a0a0](https://github.com/cube-js/cube/commit/675a0a085f7049b23c2b212fc7ecdfd064006986)) +* **native:** Cube.py - support semanticLayerSync/schemaVersion ([#7124](https://github.com/cube-js/cube/issues/7124)) ([1df04da](https://github.com/cube-js/cube/commit/1df04da3bbbe205c72a4a645d6ddbf72b0eaf8f7)) +* **native:** Jinja - support passing Map/Seq to Python ([#7125](https://github.com/cube-js/cube/issues/7125)) ([b7762a1](https://github.com/cube-js/cube/commit/b7762a1700f35ac2b89eed061900a7fa01fd5866)) + + + + + +## [0.33.54](https://github.com/cube-js/cube/compare/v0.33.53...v0.33.54) (2023-09-12) + + +### Bug Fixes + +* **cubestore:** COUNT(*) don't work on subquery with aggregation ([#7117](https://github.com/cube-js/cube/issues/7117)) ([fa48e92](https://github.com/cube-js/cube/commit/fa48e92128ce3695963371977d5475cfbe9b3eeb)) +* **cubestore:** Fix error in projection pushdown ([#7119](https://github.com/cube-js/cube/issues/7119)) ([88ef3d6](https://github.com/cube-js/cube/commit/88ef3d6d1bae235e47a9948aa0940a06bf2c2687)) + + +### Features + +* **cubesql:** `ORDER BY` SQL push down support ([#7115](https://github.com/cube-js/cube/issues/7115)) ([49ea3cf](https://github.com/cube-js/cube/commit/49ea3cf0721f30da142fb021f860cc56b0a85ab6)) +* **cubestore:** Increase parallelism for Cache Store ([#7114](https://github.com/cube-js/cube/issues/7114)) ([ad1b146](https://github.com/cube-js/cube/commit/ad1b146fcd63ff8eccfb719f79c82922a7b08b7e)) + + + + + +## [0.33.53](https://github.com/cube-js/cube/compare/v0.33.52...v0.33.53) (2023-09-08) + + +### Features + +* **cubesql:** Ungrouped SQL push down ([#7102](https://github.com/cube-js/cube/issues/7102)) ([4c7fde5](https://github.com/cube-js/cube/commit/4c7fde5a96a5db0978b72d0887e533450123e9f7)) + + + + + +## [0.33.52](https://github.com/cube-js/cube/compare/v0.33.51...v0.33.52) (2023-09-07) + + +### Features + +* **docker:** Upgrade Node.js to 16.20.2 ([#7111](https://github.com/cube-js/cube/issues/7111)) ([c376e23](https://github.com/cube-js/cube/commit/c376e23d22e9dbc3f3429e1bd9cae793df5f3e28)) + + + + + +## [0.33.51](https://github.com/cube-js/cube/compare/v0.33.50...v0.33.51) (2023-09-06) + + +### Features + +* **cubesql:** Support `inet_server_addr` stub ([9ecb180](https://github.com/cube-js/cube/commit/9ecb180add83a06f5689f530df561f79d441311f)) +* **native:** Cube.py - support contextToAppId/contextToOrchestratorId ([#6725](https://github.com/cube-js/cube/issues/6725)) ([77e8432](https://github.com/cube-js/cube/commit/77e8432ec133fae605c4ff43f097cf1a3aaeb529)) +* **native:** cube.py - support file_repository ([#7107](https://github.com/cube-js/cube/issues/7107)) ([806db35](https://github.com/cube-js/cube/commit/806db353e746f331b897aec8f61e8205ed299089)) + + + + + +## [0.33.50](https://github.com/cube-js/cube/compare/v0.33.49...v0.33.50) (2023-09-04) + + +### Bug Fixes + +* **cubestore:** Eviction - correct size counting for old keys ([#7097](https://github.com/cube-js/cube/issues/7097)) ([8ded651](https://github.com/cube-js/cube/commit/8ded651cfdd0e1595cbbbaf6a2a5b6b212dae631)) + + +### Features + +* **cubesql:** Support `Date32` to `Timestamp` coercion ([54bdfee](https://github.com/cube-js/cube/commit/54bdfeec01ce9bbdd78b022fcf02687a9dcf0793)) +* **cubestore:** Eviction - truncate expired keys ([#7081](https://github.com/cube-js/cube/issues/7081)) ([327f2dc](https://github.com/cube-js/cube/commit/327f2dc206a5a9b101e4edbc2099d58cb943b44a)) + + + + + +## [0.33.49](https://github.com/cube-js/cube/compare/v0.33.48...v0.33.49) (2023-08-31) + + +### Bug Fixes + +* **databricks-driver:** Uppercase filter values doesn't match in contains filter ([#7067](https://github.com/cube-js/cube/issues/7067)) ([1e29bb3](https://github.com/cube-js/cube/commit/1e29bb396434730fb705c5406c7a7f3df91b7edf)) +* **mongobi-driver:** Invalid configuration for mysql2 connection ([#6352](https://github.com/cube-js/cube/issues/6352)) Thanks [@loremaps](https://github.com/loremaps)! ([edaf326](https://github.com/cube-js/cube/commit/edaf32689a4252dfcafd70a10bc9292e17b2f2d7)), closes [#5527](https://github.com/cube-js/cube/issues/5527) + + +### Features + +* **cubesql:** Support multiple values in `SET` ([41af344](https://github.com/cube-js/cube/commit/41af3441bbb1502950a3e34905070f055c783f29)) +* **cubestore:** Support eviction for cache ([#7034](https://github.com/cube-js/cube/issues/7034)) ([2f16cdf](https://github.com/cube-js/cube/commit/2f16cdf7fed06b815e3f4b10c75e2635661aed07)) + + + + + +## [0.33.48](https://github.com/cube-js/cube/compare/v0.33.47...v0.33.48) (2023-08-23) + + +### Features + +* **cubesql:** Ungrouped queries support ([#7056](https://github.com/cube-js/cube/issues/7056)) ([1b5c161](https://github.com/cube-js/cube/commit/1b5c161655de0b055bf55dcd399cd6cde199ef46)) +* **cubestore:** Optimize CACHE SET on update (uneeded clone) ([#7035](https://github.com/cube-js/cube/issues/7035)) ([8aea083](https://github.com/cube-js/cube/commit/8aea0839156d4b0f0f3c69e867088ab4da593bf5)) +* **cubestore:** Optimize QUEUE ACK/CANCEL, CACHE DELETE ([#7054](https://github.com/cube-js/cube/issues/7054)) ([ac7d1a8](https://github.com/cube-js/cube/commit/ac7d1a8ca14a2fefeea40c29eb64745b9127fd21)) + + + + + +## [0.33.47](https://github.com/cube-js/cube/compare/v0.33.46...v0.33.47) (2023-08-15) + + +### Bug Fixes + +* **cubestore:** Reduce memory usage while truncating ([#7031](https://github.com/cube-js/cube/issues/7031)) ([29080d7](https://github.com/cube-js/cube/commit/29080d72661bb23529d35343a7b1f4f20cda9ec6)) + + +### Features + +* **cubesql:** Support LIMIT for SQL push down ([1b5c19f](https://github.com/cube-js/cube/commit/1b5c19f03331ca4174b37614b8b41cdafc211ad7)) + + + + + +## [0.33.46](https://github.com/cube-js/cube/compare/v0.33.45...v0.33.46) (2023-08-14) + + +### Bug Fixes + +* **cubestore:** Missing filter in the middle of an index prunes unnecessary partitions ([5690d8d](https://github.com/cube-js/cube/commit/5690d8da87e1d3959620ba43cd0b0648d3285d68)) + + +### Features + +* **cubesql:** Initial SQL push down support for BigQuery, Clickhouse and MySQL ([38467ab](https://github.com/cube-js/cube/commit/38467ab7de64803cd51acf4d5fc696938e52f778)) + + + + + +## [0.33.45](https://github.com/cube-js/cube/compare/v0.33.44...v0.33.45) (2023-08-13) + + +### Features + +* **cubesql:** CASE WHEN SQL push down ([#7029](https://github.com/cube-js/cube/issues/7029)) ([80e4a60](https://github.com/cube-js/cube/commit/80e4a609cdb983db0a600d0fff0fd5bfe31652ed)) +* **cubesql:** Whole SQL query push down to data sources ([#6629](https://github.com/cube-js/cube/issues/6629)) ([0e8a76a](https://github.com/cube-js/cube/commit/0e8a76a20cb37e675997f384785dd06e09175113)) + + + + + +## [0.33.44](https://github.com/cube-js/cube/compare/v0.33.43...v0.33.44) (2023-08-11) + + +### Bug Fixes + +* **cubejs-schema-compiler:** cube level public should take precedence over dimension level public ([#7005](https://github.com/cube-js/cube/issues/7005)) ([2161227](https://github.com/cube-js/cube/commit/216122708a2fa2732b3b4755e81f3eccde21f070)) +* **cubestore:** Store value_version for secondary index as u32 ([#7019](https://github.com/cube-js/cube/issues/7019)) ([c8cfd62](https://github.com/cube-js/cube/commit/c8cfd6248a81edb4950404fa40fa89405f84b387)) + + +### Features + +* **client-core:** Add Meta to export ([#6988](https://github.com/cube-js/cube/issues/6988)) Thanks [@philipprus](https://github.com/philipprus)! ([1f2443c](https://github.com/cube-js/cube/commit/1f2443c073b383ed5993afdc348b1ba599443619)) +* **schema-compiler:** Support .yaml.jinja extension, fix [#7018](https://github.com/cube-js/cube/issues/7018) ([#7023](https://github.com/cube-js/cube/issues/7023)) ([3f910fb](https://github.com/cube-js/cube/commit/3f910fb90d8b280e71867ff451f4433dec9a4efa)) + + + + + +## [0.33.43](https://github.com/cube-js/cube/compare/v0.33.42...v0.33.43) (2023-08-04) + + +### Bug Fixes + +* **cubestore:** Mark nullable fields for system.cache/queue/queue_results ([#6984](https://github.com/cube-js/cube/issues/6984)) ([9e64e71](https://github.com/cube-js/cube/commit/9e64e71902f99d6ce50d4599116f92fce06ecfa5)) +* **duckdb-driver:** Throw error on broken connection ([#6981](https://github.com/cube-js/cube/issues/6981)) ([e64116d](https://github.com/cube-js/cube/commit/e64116d4b597d253c04d66befa4e6b48e7ad05d5)) +* **duckdb:** reuse connection ([#6983](https://github.com/cube-js/cube/issues/6983)) ([dc6c154](https://github.com/cube-js/cube/commit/dc6c1540323fe087ac8e4821b09ed46e5c215506)) + + +### Features + +* **cubestore:** Limit push down for system tables (cache, queue, queue_results) ([#6977](https://github.com/cube-js/cube/issues/6977)) ([ace2054](https://github.com/cube-js/cube/commit/ace20547de5fce8a28cb3542ea482daa6eebc2b8)) +* **duckdb-driver:** Allow to specify memory_limit as env variable ([#6982](https://github.com/cube-js/cube/issues/6982)) ([84211b2](https://github.com/cube-js/cube/commit/84211b2d0c282636f72f42644ce8af5a8d2f302e)) + + + + + +## [0.33.42](https://github.com/cube-js/cube/compare/v0.33.41...v0.33.42) (2023-08-03) + + +### Bug Fixes + +* **duckdb:** load httpfs ([#6976](https://github.com/cube-js/cube/issues/6976)) ([423e824](https://github.com/cube-js/cube/commit/423e824d2ffe9f920d9775ffb851c05ab66c8d5d)) +* **mssql-driver:** Fix group by clause for queries with dimensions and cumulative measures in MS SQL ([#6526](https://github.com/cube-js/cube/issues/6526)) Thanks [@mfclarke-cnx](https://github.com/mfclarke-cnx)! ([e0ed3a2](https://github.com/cube-js/cube/commit/e0ed3a27c9decf00c00568ebb01b6689f410a44d)) + + +### Features + +* **schema-compiler:** allow passing a catalog ([#6964](https://github.com/cube-js/cube/issues/6964)) ([680f545](https://github.com/cube-js/cube/commit/680f54561a53d4c8b2108204f191ae9a3c22156e)) + + + + + +## [0.33.41](https://github.com/cube-js/cube/compare/v0.33.40...v0.33.41) (2023-07-28) + + +### Bug Fixes + +* **duckdb:** release connection ([fd9f408](https://github.com/cube-js/cube/commit/fd9f408c45a0595be99a6cc039a91c41975f1642)) +* **graphql:** snake case query fields ([#6956](https://github.com/cube-js/cube/issues/6956)) ([eeda56a](https://github.com/cube-js/cube/commit/eeda56aae8ea2c4e3a62a27633834da8e1668279)) + + +### Features + +* **duckdb:** s3 config support ([#6961](https://github.com/cube-js/cube/issues/6961)) ([7c10f49](https://github.com/cube-js/cube/commit/7c10f49420828eed773789c7db75cf97966a7727)) + + + + + +## [0.33.40](https://github.com/cube-js/cube/compare/v0.33.39...v0.33.40) (2023-07-27) + + +### Features + +* **cubestore:** Tracking data amount using in processing ([#6887](https://github.com/cube-js/cube/issues/6887)) ([92cae7a](https://github.com/cube-js/cube/commit/92cae7a6feffb8f65b8c165e4c958e17c93c47eb)) +* **duckdb-driver:** bump duckdb version ([9678ebb](https://github.com/cube-js/cube/commit/9678ebb749e08736d44804f526a8141bdbf91e91)) + + + + + +## [0.33.39](https://github.com/cube-js/cube/compare/v0.33.38...v0.33.39) (2023-07-25) + + +### Features + +* support motherduck token ([#6948](https://github.com/cube-js/cube/issues/6948)) ([f056088](https://github.com/cube-js/cube/commit/f056088e4e9aed4866629fcd6adfe263367b2661)) + + + + + +## [0.33.38](https://github.com/cube-js/cube/compare/v0.33.37...v0.33.38) (2023-07-21) + +**Note:** Version bump only for package cubejs + + + + + +## [0.33.37](https://github.com/cube-js/cube/compare/v0.33.36...v0.33.37) (2023-07-20) + + +### Bug Fixes + +* **schema:** Jinja - show source line in error message ([#6885](https://github.com/cube-js/cube/issues/6885)) ([ec3ce22](https://github.com/cube-js/cube/commit/ec3ce22a54439ca003c725d7ae2fd2c005618dbc)) + + + + + +## [0.33.36](https://github.com/cube-js/cube/compare/v0.33.35...v0.33.36) (2023-07-13) + + +### Features + +* **schema:** Support passing arguments for [@context](https://github.com/context)_func in jinja templates ([#6882](https://github.com/cube-js/cube/issues/6882)) ([25f149a](https://github.com/cube-js/cube/commit/25f149aaa1d028c671e37612c819aa211117b026)) + + + + + +## [0.33.35](https://github.com/cube-js/cube/compare/v0.33.34...v0.33.35) (2023-07-12) + +**Note:** Version bump only for package cubejs + + + + + +## [0.33.34](https://github.com/cube-js/cube/compare/v0.33.33...v0.33.34) (2023-07-12) + + +### Features + +* **schema:** Support python [@context](https://github.com/context)_func for jinja templates ([#6729](https://github.com/cube-js/cube/issues/6729)) ([2f2be58](https://github.com/cube-js/cube/commit/2f2be58d49e4baf2b389a94ba2c782f8579022ab)) + + + + + +## [0.33.33](https://github.com/cube-js/cube/compare/v0.33.32...v0.33.33) (2023-07-08) + + +### Features + +* **schema:** Support multitenancy for jinja templates ([#6793](https://github.com/cube-js/cube/issues/6793)) ([fb59e59](https://github.com/cube-js/cube/commit/fb59e590b09e13bfaecb794a9db7d0b861f38d3f)) + + + + + +## [0.33.32](https://github.com/cube-js/cube/compare/v0.33.31...v0.33.32) (2023-07-07) + + +### Bug Fixes + +* **databricks-jdbc-driver:** Return NULL as NULL instead of false for boolean ([#6791](https://github.com/cube-js/cube/issues/6791)) ([7eb02f5](https://github.com/cube-js/cube/commit/7eb02f569464d801ec71215503bc9b3679b5e856)) + + +### Features + +* **docker:** Upgrade Node.js to 16.20.1 ([#6789](https://github.com/cube-js/cube/issues/6789)) ([5da7562](https://github.com/cube-js/cube/commit/5da7562013b6696d3c5da96112990fc8d48290ce)) + + + + + +## [0.33.31](https://github.com/cube-js/cube/compare/v0.33.30...v0.33.31) (2023-07-01) + + +### Bug Fixes + +* **cubestore:** FreeInMemoryChunks fires if there is no inmemory chunks ([#6771](https://github.com/cube-js/cube/issues/6771)) ([f9cfd77](https://github.com/cube-js/cube/commit/f9cfd770a646f45c44e554d5b16ba2cddd8b1c48)) +* **databricks-jdbc-driver:** Return NULL decimal as NULL instead of 0 ([#6768](https://github.com/cube-js/cube/issues/6768)) ([c2ab19d](https://github.com/cube-js/cube/commit/c2ab19d86d6144e4f91f9e8fb681e17e87bfcef3)) + + + + + +## [0.33.30](https://github.com/cube-js/cube/compare/v0.33.29...v0.33.30) (2023-06-23) + + +### Features + +* **firebolt-driver:** Timezones support ([#6458](https://github.com/cube-js/cube/issues/6458)) ([6cae9b5](https://github.com/cube-js/cube/commit/6cae9b5c034026247f5d86c821f90090e76cad72)) + + + + + +## [0.33.29](https://github.com/cube-js/cube/compare/v0.33.28...v0.33.29) (2023-06-20) + + +### Features + +* **native:** Support darwin-aaarch64 ([#6745](https://github.com/cube-js/cube/issues/6745)) ([ea53e8d](https://github.com/cube-js/cube/commit/ea53e8d83c7d516e541e78175eac5534c7ea7531)) + + + + + +## [0.33.28](https://github.com/cube-js/cube/compare/v0.33.27...v0.33.28) (2023-06-19) + + +### Bug Fixes + +* **native:** Correct support detection (disable on darwin-aaarch64) ([#6737](https://github.com/cube-js/cube/issues/6737)) ([53c6ee9](https://github.com/cube-js/cube/commit/53c6ee9bddfb679dad28d88352e11b2f8a39e6ca)) +* **schema:** Load jinja engine only when jinja templates exist ([#6741](https://github.com/cube-js/cube/issues/6741)) ([75469a6](https://github.com/cube-js/cube/commit/75469a67b58d0a730b29b57d4f05a4049462bf10)) + + + + + +## [0.33.27](https://github.com/cube-js/cube/compare/v0.33.26...v0.33.27) (2023-06-17) + + +### Bug Fixes + +* Support unescaped `\\N` as NULL value for Snowflake driver ([#6735](https://github.com/cube-js/cube/issues/6735)) ([1f92ba6](https://github.com/cube-js/cube/commit/1f92ba6f5407f82703c8920b27a3a3e5a16fea41)), closes [#6693](https://github.com/cube-js/cube/issues/6693) + + + + + +## [0.33.26](https://github.com/cube-js/cube/compare/v0.33.25...v0.33.26) (2023-06-14) + + +### Bug Fixes + +* Correct duration for refresh sheduler interval warning ([#6724](https://github.com/cube-js/cube/issues/6724)) ([3482d29](https://github.com/cube-js/cube/commit/3482d293463c861848b18b773e43ba732ec56a4f)) +* **cubestore:** Out of memory on partition compaction ([#6705](https://github.com/cube-js/cube/issues/6705)) ([980b898](https://github.com/cube-js/cube/commit/980b8985e25928cc62446b76bb8d1182b10353ec)) + + +### Features + +* **native:** Python - support int64 ([#6709](https://github.com/cube-js/cube/issues/6709)) ([34497ab](https://github.com/cube-js/cube/commit/34497ab2bc0807159a21ba9a4a76b4702038a8e6)) +* **presto-driver:** Set query timeout as query_max_run_time to avoid orphaned queries after query timeout ([d6332cf](https://github.com/cube-js/cube/commit/d6332cf824cb0e282b67188fd5618808a7a158bd)) +* **schema:** Initial support for jinja templates ([#6704](https://github.com/cube-js/cube/issues/6704)) ([338d1b7](https://github.com/cube-js/cube/commit/338d1b7ed03fc074c06fb028f731c9817ba8d419)) + + + + + +## [0.33.25](https://github.com/cube-js/cube/compare/v0.33.24...v0.33.25) (2023-06-07) + + +### Bug Fixes + +* schema generation joins and quotes ([#6695](https://github.com/cube-js/cube/issues/6695)) ([85dd2b5](https://github.com/cube-js/cube/commit/85dd2b55daba9a0fed3c13131d9c8acae600e136)) +* Support indexes in pre-aggs in yaml ([#6587](https://github.com/cube-js/cube/issues/6587)) ([eaec97d](https://github.com/cube-js/cube/commit/eaec97d99a386e39be937ae8770d422512b482ff)) + + + + + +## [0.33.24](https://github.com/cube-js/cube/compare/v0.33.23...v0.33.24) (2023-06-05) + + +### Bug Fixes + +* **ksql-driver:** Reduce default concurrency to 1 as ksql doesn't support multiple queries at the same time right now ([4435661](https://github.com/cube-js/cube/commit/44356618a7aa77311336061b62fb1d6c2861bf3e)) +* Multi data source CUBEJS_CONCURRENCY env ([#6683](https://github.com/cube-js/cube/issues/6683)) ([6beb0fb](https://github.com/cube-js/cube/commit/6beb0fb2f9d5b009f22e67ca72f78b3419c40861)) +* **native:** Allow to load Python extensions (export public symbols) ([d95cddc](https://github.com/cube-js/cube/commit/d95cddcb477667fa1c6a1f01a3b6571230af8efb)) + + +### Features + +* **cubesql:** Support `CURRENT_DATE` scalar function ([ec928a6](https://github.com/cube-js/cube/commit/ec928a67f05ed91517b556b701581d8d04370cc7)) +* **cubestore:** Priorities for job types ([#6502](https://github.com/cube-js/cube/issues/6502)) ([a457c5d](https://github.com/cube-js/cube/commit/a457c5da23b95be55e09e68c759e23f1299d17bf)) +* **native:** Publish python builds for darwin platform ([#6664](https://github.com/cube-js/cube/issues/6664)) ([edcf8f2](https://github.com/cube-js/cube/commit/edcf8f2c875d3bc821ad56ef4a06841953a1cabb)) +* **native:** Python - support async functions ([9232af5](https://github.com/cube-js/cube/commit/9232af5b0b833dcfde10ae7b637bdadc1c4ac972)) +* **native:** Python - support more functions in cube.py ([#6687](https://github.com/cube-js/cube/issues/6687)) ([1d10c5b](https://github.com/cube-js/cube/commit/1d10c5b29815672e9e739e3b3a89537a8d0e9404)) + + + + + +## [0.33.23](https://github.com/cube-js/cube/compare/v0.33.22...v0.33.23) (2023-06-01) + + +### Bug Fixes + +* **ci:** Publish - cubestore use gtar on windows ([9feaf49](https://github.com/cube-js/cube/commit/9feaf4944843dde200229dbe56ef3b5ba9069236)) +* **docker:** Install libpython3-dev on building step ([11245d2](https://github.com/cube-js/cube/commit/11245d201666c56b07c277b57f23ec99a812516a)) + + + + + +## [0.33.22](https://github.com/cube-js/cube/compare/v0.33.21...v0.33.22) (2023-05-31) + + +### Features + +* **docker:** Enable python builds for x64 ([#6671](https://github.com/cube-js/cube/issues/6671)) ([bc78f2d](https://github.com/cube-js/cube/commit/bc78f2d70b15c05b54e0d169620d7c2c40847fc9)) + + + + + +## [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 + + + + + +## [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 + + + + + +## [0.33.19](https://github.com/cube-js/cube/compare/v0.33.18...v0.33.19) (2023-05-30) + + +### Bug Fixes + +* **mssql-driver:** Handle BigInt and other mismatched types ([9cebfef](https://github.com/cube-js/cube/commit/9cebfefbe44d2606195f2f2add0579687c2f4461)), closes [#6658](https://github.com/cube-js/cube/issues/6658) + + +### Features + +* **native:** Publish builds with Python 3.9, 3.10 for Linux ([#6666](https://github.com/cube-js/cube/issues/6666)) ([0b1c7b8](https://github.com/cube-js/cube/commit/0b1c7b8bd13947a7c43d4f91d425a9124a4dde77)) + + + + + +## [0.33.18](https://github.com/cube-js/cube/compare/v0.33.17...v0.33.18) (2023-05-29) + + +### Features + +* **native:** Initial support for cube.py (Python configuration) ([#6465](https://github.com/cube-js/cube/issues/6465)) ([9086be4](https://github.com/cube-js/cube/commit/9086be4bc8e727733f11c08240b463f8f64c879d)) + + + + + +## [0.33.17](https://github.com/cube-js/cube/compare/v0.33.16...v0.33.17) (2023-05-29) + + +### Bug Fixes + +* **mssql-driver:** Server crashes on streaming errors ([2e81345](https://github.com/cube-js/cube/commit/2e81345059c14c0880e8b7d1bde7c9d04e497bfa)) + + + + + +## [0.33.16](https://github.com/cube-js/cube/compare/v0.33.15...v0.33.16) (2023-05-28) + + +### Bug Fixes + +* **mssql-driver:** Pre-aggregations builds hang up if over 10K of rows ([#6661](https://github.com/cube-js/cube/issues/6661)) ([9b20ff4](https://github.com/cube-js/cube/commit/9b20ff4ef78acbb65ebea80adceb227bf96b1727)) + + + + + +## [0.33.15](https://github.com/cube-js/cube/compare/v0.33.14...v0.33.15) (2023-05-26) + + +### Bug Fixes + +* **athena-driver:** Internal: Error during planning: Coercion from [Utf8, Utf8] to the signature Exact([Utf8, Timestamp(Nanosecond, None)]) failed for athena pre-aggregations ([#6655](https://github.com/cube-js/cube/issues/6655)) ([46f7dbd](https://github.com/cube-js/cube/commit/46f7dbdeb0a9f55640d0f7afd7edb67ec101a43a)) +* Put temp table strategy drop under lock to avoid missing table r… ([#6642](https://github.com/cube-js/cube/issues/6642)) ([05fcdca](https://github.com/cube-js/cube/commit/05fcdca9795bb7f049d57eb3cdaa38d098554bb8)) + + + + + +## [0.33.14](https://github.com/cube-js/cube/compare/v0.33.13...v0.33.14) (2023-05-25) + + +### Reverts + +* Revert "feat(native): Initial support for cube.py (Python configuration) (#6465)" ([95e9581](https://github.com/cube-js/cube/commit/95e95818e0be316b9d4df83a00e5107efde7081f)), closes [#6465](https://github.com/cube-js/cube/issues/6465) + + + + + +## [0.33.13](https://github.com/cube-js/cube/compare/v0.33.12...v0.33.13) (2023-05-25) + + +### Features + +* **native:** Initial support for cube.py (Python configuration) ([#6465](https://github.com/cube-js/cube/issues/6465)) ([c41af63](https://github.com/cube-js/cube/commit/c41af63c9ba9778364ebb89ad7b087156b48cfec)) + + + + + +## [0.33.12](https://github.com/cube-js/cube/compare/v0.33.11...v0.33.12) (2023-05-22) + + +### Bug Fixes + +* **client-core:** drill down check the parent date range bounds ([#6639](https://github.com/cube-js/cube/issues/6639)) ([5da5e61](https://github.com/cube-js/cube/commit/5da5e613c4551f09f72ba89e4432534ab1524eaa)) +* Invalid query format: \"filters[0]\" does not match any of the allowed types for `or` query ([a3b4cd6](https://github.com/cube-js/cube/commit/a3b4cd67455f9839024495f332f8f4e2963d64ce)) + + + + + +## [0.33.11](https://github.com/cube-js/cube/compare/v0.33.10...v0.33.11) (2023-05-22) + + +### Bug Fixes + +* **docker:** Don't load native on alpine (not supported), fix [#6510](https://github.com/cube-js/cube/issues/6510) ([#6636](https://github.com/cube-js/cube/issues/6636)) ([a01d2f9](https://github.com/cube-js/cube/commit/a01d2f953973eee79b6135f7883ecff56bb71486)) + + +### Features + +* **cubestore:** Optimization of inmemory chunk operations for streaming ([#6354](https://github.com/cube-js/cube/issues/6354)) ([146798a](https://github.com/cube-js/cube/commit/146798affff184cab489628a1a40611b7fb5879a)) +* **docker:** Install DuckDB as built-in driver ([b1e77bd](https://github.com/cube-js/cube/commit/b1e77bdee1d9b35a46c51387d8d16565d332754b)) +* **duckdb-driver:** Upgrade DuckDB to 0.8 ([7d91f9f](https://github.com/cube-js/cube/commit/7d91f9f2ec187f8032a768cb35e46bbd557e8125)) +* Improve LangChain support ([15e51bc](https://github.com/cube-js/cube/commit/15e51bcb19ce22c38b71f4685484295fc637e44c)) + + + + + +## [0.33.10](https://github.com/cube-js/cube/compare/v0.33.9...v0.33.10) (2023-05-19) + + +### Bug Fixes + +* remove noisy Warning: Attribute `filter.dimension` is deprecated. Please use 'member' instead of 'dimension' ([546227a](https://github.com/cube-js/cube/commit/546227a96c5c41078c82a75d7e4697dfd505e181)) + + + + + +## [0.33.9](https://github.com/cube-js/cube/compare/v0.33.8...v0.33.9) (2023-05-18) + + +### Bug Fixes + +* **databricks-jdbc-driver:** Error: [Databricks][JDBC](11220) Parameters cannot be used with normal Statement objects, use PreparedStatements instead. ([328bb79](https://github.com/cube-js/cube/commit/328bb79853833420a287fc9e31dda72a9886999d)), closes [#6627](https://github.com/cube-js/cube/issues/6627) +* Invalid query format: \"filters[0]\" does not match any of the allowed types if queryRewrite is using non string values ([ac57b4c](https://github.com/cube-js/cube/commit/ac57b4c15cb39392faa75a01c042fdd5ecb19af9)) + + + + + +## [0.33.8](https://github.com/cube-js/cube/compare/v0.33.7...v0.33.8) (2023-05-17) + + +### Bug Fixes + +* **athena-driver:** Fix partitioned pre-aggregations and column values with `,` through export bucket ([#6596](https://github.com/cube-js/cube/issues/6596)) ([1214cab](https://github.com/cube-js/cube/commit/1214cabf69f9e6216c516d05acadfe7e6178cccf)) +* **graphql:** exclude empty cubes, revert equals/notEquals type ([#6619](https://github.com/cube-js/cube/issues/6619)) ([fab1b6a](https://github.com/cube-js/cube/commit/fab1b6abe198b1d83b4484bae66108782e62887c)) + + +### Features + +* **bigquery-driver:** Specify timeout for job on testConnection ([#6588](https://github.com/cube-js/cube/issues/6588)) ([d724f09](https://github.com/cube-js/cube/commit/d724f09113e4b4cb8c703fc02e9d9e13c3e05fb7)) +* **cubestore-driver:** Queue - protect possible race condition (query def) [#6616](https://github.com/cube-js/cube/issues/6616)) ([60294de](https://github.com/cube-js/cube/commit/60294defff88ee96d95d1d34b1fe17fccdb17b71)) + + + + + +## [0.33.7](https://github.com/cube-js/cube/compare/v0.33.6...v0.33.7) (2023-05-16) + + +### Bug Fixes + +* Limit override isn't respected in queryRewrite ([#6605](https://github.com/cube-js/cube/issues/6605)) ([172c39b](https://github.com/cube-js/cube/commit/172c39b6fb2609f003a364efb63d8091e39607a0)) + + +### Features + +* **cubestore-driver:** Queue - protect race conditions ([#6598](https://github.com/cube-js/cube/issues/6598)) ([d503598](https://github.com/cube-js/cube/commit/d50359845d388ccadc8d5a7233ed7317849558f4)) +* **cubestore:** Queue - allow to GET by processingId ([#6608](https://github.com/cube-js/cube/issues/6608)) ([f0c1156](https://github.com/cube-js/cube/commit/f0c11565426b5604bae665fc52d5b416f4f055d2)) +* **cubestore:** Queue - delete results via scheduler ([#6515](https://github.com/cube-js/cube/issues/6515)) ([8e1ab20](https://github.com/cube-js/cube/commit/8e1ab2044a92f9e71918085a31716a784cd5bb9f)) + + + + + +## [0.33.6](https://github.com/cube-js/cube/compare/v0.33.5...v0.33.6) (2023-05-13) + + +### Bug Fixes + +* **cubesql:** Improve NULL comparison with int/bool ([de1be39](https://github.com/cube-js/cube/commit/de1be39d07ceec5d87d6c7aef8adb65fbe246ee3)) +* **cubestore:** Optimize unique constraint check on insert ([c227ae9](https://github.com/cube-js/cube/commit/c227ae9f72cfd66fd47e60fc567c2fde88ebc932)) +* **cubestore:** Schedule compaction without blocking rw loop ([f9bbbac](https://github.com/cube-js/cube/commit/f9bbbac278898d02d50e6ff5911658d5e8caf7e3)) +* LIMIT is not enforced ([#6586](https://github.com/cube-js/cube/issues/6586)) ([8ca5234](https://github.com/cube-js/cube/commit/8ca52342944b9767f2c34591a9241bf31cf78c71)) +* **snowflake-driver:** Bind variable ? not set for partitioned pre-aggregations ([#6594](https://github.com/cube-js/cube/issues/6594)) ([0819075](https://github.com/cube-js/cube/commit/081907568d97fa79f56edf1898b2845affb925cf)) + + +### Features + +* **cubestore:** Queue - support cancel, ack, result_blocking by processingId ([#6551](https://github.com/cube-js/cube/issues/6551)) ([2e82839](https://github.com/cube-js/cube/commit/2e82839586f18d8b9ba385ab6f8e5641113ccf0c)) +* **cubestore:** Support custom CSV delimiters ([#6597](https://github.com/cube-js/cube/issues/6597)) ([f8c2c88](https://github.com/cube-js/cube/commit/f8c2c888150e9436c90de9ecd45f540bb0314855)) + + + + + +## [0.33.5](https://github.com/cube-js/cube/compare/v0.33.4...v0.33.5) (2023-05-11) + + +### Bug Fixes + +* **cubejs-playground:** sticky bar styles ([#6558](https://github.com/cube-js/cube/issues/6558)) ([c4864c5](https://github.com/cube-js/cube/commit/c4864c508ffd42bebbc8e1fb8d98523fa1d252b7)) +* fix includes all for views ([#6559](https://github.com/cube-js/cube/issues/6559)) ([f62044a](https://github.com/cube-js/cube/commit/f62044aa7b60f6a2eeafc60e5649629aadc287a2)) +* typo in docs ([8c36022](https://github.com/cube-js/cube/commit/8c3602297299af44bca1427646c95e50ddf4b991)) +* yml formatter escapse double quotes ([341e115](https://github.com/cube-js/cube/commit/341e115ef7fd6475f3d947fb0aa878addee86eb9)) + + +### Features + +* **cubestore:** Support converting Int16/32, UInt16/32 for DataFrame ([#6569](https://github.com/cube-js/cube/issues/6569)) ([5e0fd4f](https://github.com/cube-js/cube/commit/5e0fd4fd73717d50c1a0684e840d987fb95df495)) + + + + + +## [0.33.4](https://github.com/cube-js/cube/compare/v0.33.3...v0.33.4) (2023-05-07) + + +### Bug Fixes + +* **docs:** fix views example in style guide ([1296ddb](https://github.com/cube-js/cube/commit/1296ddb06d5e0ae151c8dc7ec7f0ad77e429333f)) +* join_path for JS schemas and * includes with prefix ([#6555](https://github.com/cube-js/cube/issues/6555)) ([c76bbef](https://github.com/cube-js/cube/commit/c76bbef36e5b6594bcb79174ceb672d8e2b870ff)) + + +### Features + +* **cubestore:** Projection in kafka streaming queries ([#6479](https://github.com/cube-js/cube/issues/6479)) ([e0495a9](https://github.com/cube-js/cube/commit/e0495a9f46dd8a78fce069b31382fdeec37da8d0)) + + + + + +## [0.33.3](https://github.com/cube-js/cube/compare/v0.33.2...v0.33.3) (2023-05-05) + + +### Bug Fixes + +* **databricks-driver:** Increase default JDBC acquire timeout to 2 minutes as it can take more time to reconnect ([dde9bc4](https://github.com/cube-js/cube/commit/dde9bc401d3629e5284e3d160ba41023316b7e8c)) +* **databricks-driver:** Remove package.json dependency from DatabricksDriver to avoid package.json not found issues ([#6521](https://github.com/cube-js/cube/issues/6521)) Thanks [@carlagouveia](https://github.com/carlagouveia) ! ([b3ac7a1](https://github.com/cube-js/cube/commit/b3ac7a10b74988af42bd6f289a271a71a92dee5e)) +* **graphql:** Pre-aggregations aren't used for GraphQL queries with date range ([#6549](https://github.com/cube-js/cube/issues/6549)) ([a343f4d](https://github.com/cube-js/cube/commit/a343f4d2f0bdf62120e99fb3252f6460f4a85e8e)) +* **snowflake-driver:** Float exported as decimal for pre-aggregations ([#6544](https://github.com/cube-js/cube/issues/6544)) ([7c8b8de](https://github.com/cube-js/cube/commit/7c8b8ded5f7bb16248989bd56b0913180321314d)) + + +### Features + +* **docker:** Security upgrade node from 16.19.1 to 16.20 ([#6547](https://github.com/cube-js/cube/issues/6547)) ([5523935](https://github.com/cube-js/cube/commit/55239350d8b629d55ec8ee61fd2c4a6f00057f88)) + + + + + +## [0.33.2](https://github.com/cube-js/cube/compare/v0.33.1...v0.33.2) (2023-05-04) + + +### Bug Fixes + +* **cubejs-playground:** remove less file import ([#6537](https://github.com/cube-js/cube/issues/6537)) ([2a4de4b](https://github.com/cube-js/cube/commit/2a4de4b85746ed8c74c57b2cd18c6f69f2e65bd4)) +* **cubestore:** Queue - protect possible race condition on GET_RESULT_BLOCKING ([#6535](https://github.com/cube-js/cube/issues/6535)) ([d962c05](https://github.com/cube-js/cube/commit/d962c058f703a5f5156c36ceb8cae074b8d15d02)) + + +### Features + +* **cubestore-driver:** Queue - track orphaned set result ([f97fbdc](https://github.com/cube-js/cube/commit/f97fbdcbe1e8c98d568f0614be8074e32d22343f)) +* **cubestore:** Queue - allow to do merge_extra, heartbeat by processingId ([#6534](https://github.com/cube-js/cube/issues/6534)) ([bf8df29](https://github.com/cube-js/cube/commit/bf8df29c261625f588faf65984047026d760020a)) +* **cubestore:** Queue - expose processingId in queue_add ([#6540](https://github.com/cube-js/cube/issues/6540)) ([24b4798](https://github.com/cube-js/cube/commit/24b4798fb5e26b2be0f04f3e1af76c1b8516a9b8)) +* **cubestore:** Queue - expose processingId in queue_retrieve ([#6530](https://github.com/cube-js/cube/issues/6530)) ([43913ce](https://github.com/cube-js/cube/commit/43913ce459e1b60dd04f3a23aed1c617de0e0422)) +* **cubestore:** Queue - return success marker on ack (set result) ([e8814bf](https://github.com/cube-js/cube/commit/e8814bf5ebd18431f0d4a61db7fee2a519a5bdd8)) + + + + + +## [0.33.1](https://github.com/cube-js/cube/compare/v0.33.0...v0.33.1) (2023-05-03) + + +### Bug Fixes + +* **firebolt-driver:** Automatically cast boolean parameters ([#6531](https://github.com/cube-js/cube/issues/6531)) ([90136dc](https://github.com/cube-js/cube/commit/90136dc565653a65a6682591206f4cea98b6bd97)) +* **snowflake-driver:** Revert read-only mode until useOriginalSqlPreAggregations flow is fixed for read only ([#6532](https://github.com/cube-js/cube/issues/6532)) ([20651a9](https://github.com/cube-js/cube/commit/20651a94f2b4e9919e2b5e7761bb725ca07efc54)) + + + + + +# [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 + + + + + +## [0.32.31](https://github.com/cube-js/cube/compare/v0.32.30...v0.32.31) (2023-05-02) + + +### Bug Fixes + +* **bigquery-driver:** Revert read-only implementation as `LIMIT 1` queries generate too much usage ([#6523](https://github.com/cube-js/cube/issues/6523)) ([f023484](https://github.com/cube-js/cube/commit/f02348408103f7eeb9d6cd8bea959549a78fe943)) +* **cubesql:** Streaming error logging ([e27a525](https://github.com/cube-js/cube/commit/e27a5252380a55682f450bf057767074394179a2)) + + +### Features + +* **cubesql:** psqlodbc driver support ([fcfc7ea](https://github.com/cube-js/cube/commit/fcfc7ea9f8bfd027aa549d139b9ed12b773594ec)) +* Support snake case security_context in COMPILE_CONTEXT ([#6519](https://github.com/cube-js/cube/issues/6519)) ([feb3fe3](https://github.com/cube-js/cube/commit/feb3fe389462fc4cf3947f8ecf2146c3fe102b9e)) + + + + + +## [0.32.30](https://github.com/cube-js/cube/compare/v0.32.29...v0.32.30) (2023-04-28) + + +### Bug Fixes + +* Always log authentication errors for debugging purpose ([2c309b7](https://github.com/cube-js/cube/commit/2c309b7d8122c19397a649e51d4b2a032361f8ee)) +* **cubejs-playground:** SL-58 CC-1686 text and icon fixes ([#6490](https://github.com/cube-js/cube/issues/6490)) ([1fa96f0](https://github.com/cube-js/cube/commit/1fa96f04b7068887c0541f2fcfba51400b8ddc3c)) +* **cubesql:** Resolve Grafana introspection issues ([db32377](https://github.com/cube-js/cube/commit/db32377f6e6d45c8c16b12ee7e51fdf1e9687fc9)) +* **cubestore:** Error in Sparse HLL entry parsing ([#6498](https://github.com/cube-js/cube/issues/6498)) ([9719cdc](https://github.com/cube-js/cube/commit/9719cdcc39461948e85ea7f2c4bdae377a8dba83)) +* model style guide, views folder ([#6493](https://github.com/cube-js/cube/issues/6493)) ([1fa7f99](https://github.com/cube-js/cube/commit/1fa7f994551e05fd2ef417bd2ee7f472881bc2bc)) +* **snowflake-driver:** Int is exported to pre-aggregations as decimal… ([#6513](https://github.com/cube-js/cube/issues/6513)) ([3710b11](https://github.com/cube-js/cube/commit/3710b113160d4b0f53b40d6b31ae9c901aa51571)) + + +### Features + +* **bigquery-driver:** CI, read-only, streaming and unloading ([#6495](https://github.com/cube-js/cube/issues/6495)) ([4c07431](https://github.com/cube-js/cube/commit/4c07431033df7554ffb6f9d5f64eca156267b3e3)) +* **gateway:** GraphQL snake case support ([#6480](https://github.com/cube-js/cube/issues/6480)) ([45a46d0](https://github.com/cube-js/cube/commit/45a46d0556c07842830bf55447f4f575fc158ef6)) +* **playground:** cube type tag, public cubes ([#6482](https://github.com/cube-js/cube/issues/6482)) ([cede7a7](https://github.com/cube-js/cube/commit/cede7a71f7d2e8d9dc221669b6b1714ee146d8ea)) + + + + + +## [0.32.29](https://github.com/cube-js/cube/compare/v0.32.28...v0.32.29) (2023-04-25) + + +### Bug Fixes + +* **api-gateway:** passing defaultApiScope env to the contextToApiScopesFn ([#6485](https://github.com/cube-js/cube/issues/6485)) ([b2da950](https://github.com/cube-js/cube/commit/b2da950509e48bdfcd5d6f282f81a00b3794d559)) +* **schema-compiler:** yml backtick escaping ([#6478](https://github.com/cube-js/cube/issues/6478)) ([39a9ac0](https://github.com/cube-js/cube/commit/39a9ac0e9a641efeeca0e99d286962aa007551cd)) +* **server-core:** Display refresh scheduler interval error as warning ([#6473](https://github.com/cube-js/cube/issues/6473)) ([771f661](https://github.com/cube-js/cube/commit/771f661cadfe9c19bcaad9fe232f7f4901f0778b)) + + +### Features + +* **athena-driver:** read-only unload ([#6469](https://github.com/cube-js/cube/issues/6469)) ([d3fee7c](https://github.com/cube-js/cube/commit/d3fee7cbefe5c415573c4d2507b7e61a48f0c91a)) +* **cubestore:** Split partitions by filesize ([#6435](https://github.com/cube-js/cube/issues/6435)) ([5854add](https://github.com/cube-js/cube/commit/5854add7a65c39e05ba71c2a558032671797ec26)) +* **cubestore:** Traffic tracing for streaming ([#6379](https://github.com/cube-js/cube/issues/6379)) ([37a33e6](https://github.com/cube-js/cube/commit/37a33e65234740a8028c340334510facbea896d7)) +* Make configurable cubestore metrics address ([#6437](https://github.com/cube-js/cube/issues/6437)) Thanks [@fbalicchia](https://github.com/fbalicchia) ! ([16d0bcb](https://github.com/cube-js/cube/commit/16d0bcb1489c512f91c21970e21769c9882bfedc)) +* **schema-compiler:** Support public/shown for segments ([#6491](https://github.com/cube-js/cube/issues/6491)) ([df6160c](https://github.com/cube-js/cube/commit/df6160cc62f8ab2fccbfb85f2916040aec218fc3)) +* semanticLayerSync configs option ([#6483](https://github.com/cube-js/cube/issues/6483)) ([d3b8ed7](https://github.com/cube-js/cube/commit/d3b8ed7401f98429eca42227ef4cfe1f29f90d8e)) +* **snowflake-driver:** streaming export, read-only unload ([#6452](https://github.com/cube-js/cube/issues/6452)) ([67565b9](https://github.com/cube-js/cube/commit/67565b975c16f93070de0346056c6a3865bc9fd8)) + + + + + +## [0.32.28](https://github.com/cube-js/cube/compare/v0.32.27...v0.32.28) (2023-04-19) + + +### Bug Fixes + +* **mssql-driver:** release stream connection ([#6453](https://github.com/cube-js/cube/issues/6453)) ([7113fa1](https://github.com/cube-js/cube/commit/7113fa1247f3761c9fde5f8d1af8de6036350e72)) +* **schema-compiler:** Incorrect camelize for meta ([#6444](https://github.com/cube-js/cube/issues/6444)) ([c82844e](https://github.com/cube-js/cube/commit/c82844e130b31722fa338022b740ac7285c01190)) +* segment not found for path if rollup with segment is used within `rollupJoin` ([6a3ca80](https://github.com/cube-js/cube/commit/6a3ca8032151d530a30bab88c024c451d4141c01)) + + +### Features + +* **cubesql:** Support new Thoughtspot introspection ([a04c83a](https://github.com/cube-js/cube/commit/a04c83a070ddbd2924528ce5e7ecf10c7b4f235c)) +* **cubesql:** Support psql's `\list` command ([0b30def](https://github.com/cube-js/cube/commit/0b30def71aa5bb53dbc59ddb6a4b63bd59eda95a)) +* **playground:** use snake case for data models ([398993a](https://github.com/cube-js/cube/commit/398993ad9772a52ad377542937614148c597ca72)) +* using snake case for model files, model templates updates ([#6447](https://github.com/cube-js/cube/issues/6447)) ([37e3180](https://github.com/cube-js/cube/commit/37e3180d4218b342ee0c2fe0ef90464aa6633b54)) + + + + + +## [0.32.27](https://github.com/cube-js/cube/compare/v0.32.26...v0.32.27) (2023-04-14) + + +### Bug Fixes + +* Do not use in memory cache for more than 5 minutes to avoid any long term discrepancies with upstream cache ([aea2daf](https://github.com/cube-js/cube/commit/aea2daf38ddde61fd3f00a886b7679bef060948f)) +* **ksql-driver:** Drop table with the topic to avoid orphaned topics ([b113841](https://github.com/cube-js/cube/commit/b113841ad52a52b4ea65192277819fce50725f02)) +* Limit pre-aggregations API memory usage by introducing partition loading concurrency ([f565371](https://github.com/cube-js/cube/commit/f565371fe9d05267bbacd37369dbc25780e4da19)) + + + + + +## [0.32.26](https://github.com/cube-js/cube/compare/v0.32.25...v0.32.26) (2023-04-13) + + +### Bug Fixes + +* **cli:** Validate command - allow node require ([#6416](https://github.com/cube-js/cube/issues/6416)) ([ead63d8](https://github.com/cube-js/cube/commit/ead63d823253e8cd42e9353a09d4481e5e889d0b)) +* Ensure expired in memory cache value can't be used even in case renewalThreshold hasn't been met ([64f5878](https://github.com/cube-js/cube/commit/64f58789b6eab44d25f8d4305b3e8b299f4735bb)) +* re-export FileRepository ([#6425](https://github.com/cube-js/cube/issues/6425)) ([52c9252](https://github.com/cube-js/cube/commit/52c92529c5c13994b81b7af616fdf329cb50a0f6)) + + +### Features + +* **schema-compiler:** JS - support snake_case for any properties ([#6396](https://github.com/cube-js/cube/issues/6396)) ([f1b4c0b](https://github.com/cube-js/cube/commit/f1b4c0bfb2e8b8ad20853af6232388c6d764a780)) + + + + + +## [0.32.25](https://github.com/cube-js/cube/compare/v0.32.24...v0.32.25) (2023-04-12) + + +### Bug Fixes + +* **schema-compiler:** Yaml - crash on fully commented file ([#6413](https://github.com/cube-js/cube/issues/6413)) ([29d2eae](https://github.com/cube-js/cube/commit/29d2eaed8c2d8fe7575be732bc21acbf8dadafbb)) +* **server-core:** turn off the jobs API renewQuery flag ([#6414](https://github.com/cube-js/cube/issues/6414)) ([81dddb1](https://github.com/cube-js/cube/commit/81dddb1ecb6d5e5d97c6fe3dd277ff3b5f651b51)) + + +### Features + +* **api-gateway, server-core:** Orchestration API telemetry ([#6419](https://github.com/cube-js/cube/issues/6419)) ([af0854d](https://github.com/cube-js/cube/commit/af0854d0d8cdc05eab2df090a2d0314a3d27fc23)) +* **api-gateway, server-core:** Renamed Permissions to ApiScopes ([#6397](https://github.com/cube-js/cube/issues/6397)) ([800a96b](https://github.com/cube-js/cube/commit/800a96b68e5aa9bbeb2c52edaab0698832a18619)) +* **duckdb-driver:** Support countDistinctApprox ([#6409](https://github.com/cube-js/cube/issues/6409)) ([6b1fadb](https://github.com/cube-js/cube/commit/6b1fadb0954ce349a55b88a158d236c2ca31ecfc)) + + + + + +## [0.32.24](https://github.com/cube-js/cube/compare/v0.32.23...v0.32.24) (2023-04-10) + + +### Reverts + +* Revert "feat(docker): Install DuckDB as built-in driver" ([99ea6c1](https://github.com/cube-js/cube/commit/99ea6c15333b3d0c19011cb58ed8a8d10e6b0d3c)) + + + + + +## [0.32.23](https://github.com/cube-js/cube/compare/v0.32.22...v0.32.23) (2023-04-10) + + +### Bug Fixes + +* Fix typo in driver name, DuckDB ([c53a31c](https://github.com/cube-js/cube/commit/c53a31c37b6b70fa3c5e2fc0da97eb958e9fec5d)) + + +### Features + +* **docker:** Install DuckDB as built-in driver ([41a0ca1](https://github.com/cube-js/cube/commit/41a0ca11047ed907db354c3f6e49c3e097a584b9)) + + + + + +## [0.32.22](https://github.com/cube-js/cube/compare/v0.32.21...v0.32.22) (2023-04-10) + + +### Bug Fixes + +* Correct the syntax error in the ClickHouse cast method ([#6154](https://github.com/cube-js/cube/issues/6154)) Thanks [@fxx-real](https://github.com/fxx-real)! ([b5ccf18](https://github.com/cube-js/cube/commit/b5ccf18cd56ee9cc9d8c1c9bb5ffd519c00d0f3c)) + + +### Features + +* **ducksdb-driver:** Initial support ([#6403](https://github.com/cube-js/cube/issues/6403)) ([00e41bf](https://github.com/cube-js/cube/commit/00e41bfe8084e9dc7831ff14e2302199af2a8fe3)) +* **prestodb-driver:** Add schema filter to informationSchemaQuery ([#6382](https://github.com/cube-js/cube/issues/6382)) Thanks [@maatumo](https://github.com/maatumo) ! ([cbf4620](https://github.com/cube-js/cube/commit/cbf4620bd8b0f5bfa0f02006dee007102258744a)) +* **schema-compiler:** Yaml - report error on misconfiguration (object instead of array) ([#6407](https://github.com/cube-js/cube/issues/6407)) ([29e3778](https://github.com/cube-js/cube/commit/29e37780c9c4f320c868880266dc73f55840987f)) + + + + + +## [0.32.21](https://github.com/cube-js/cube/compare/v0.32.20...v0.32.21) (2023-04-06) + + +### Bug Fixes + +* **cubestore:** Query Cache - correct size calculation (complex TableValue) ([#6400](https://github.com/cube-js/cube/issues/6400)) ([b0e3c88](https://github.com/cube-js/cube/commit/b0e3c88e33fdcbb9555faf791b01df4eed884686)) +* **databricks-jdbc:** startsWith, endsWith, contains filters ([#6401](https://github.com/cube-js/cube/issues/6401)) ([7eeea60](https://github.com/cube-js/cube/commit/7eeea60353f332bd83ae91c10efa47e2371beea3)) + + +### Features + +* **cubestore:** Introduce system.query_cache table ([#6399](https://github.com/cube-js/cube/issues/6399)) ([a5e4bd3](https://github.com/cube-js/cube/commit/a5e4bd393c05518e041ca52d386b1bace672be22)) + + + + + +## [0.32.20](https://github.com/cube-js/cube/compare/v0.32.19...v0.32.20) (2023-04-05) + + +### Features + +* **cubestore:** Query cache - limits by time_to_idle and max_capacity ([#6132](https://github.com/cube-js/cube/issues/6132)) ([edd220f](https://github.com/cube-js/cube/commit/edd220f0e76d43b05d482ff457c710d9ab4c2393)) +* **cubestore:** Separate configuration for count of metastore and cachestore snapshots ([#6388](https://github.com/cube-js/cube/issues/6388)) ([df73851](https://github.com/cube-js/cube/commit/df738513e06a3c4199255ae58ab9f52db1a4f2ef)) +* **questdb-driver:** Add SSL support ([#6395](https://github.com/cube-js/cube/issues/6395)) ([e9a4458](https://github.com/cube-js/cube/commit/e9a445807638f01c3762430339a84f5fe8518a50)) + + + + + +## [0.32.19](https://github.com/cube-js/cube/compare/v0.32.18...v0.32.19) (2023-04-03) + + +### Features + +* **cubesql:** Support `date_trunc = literal date` filter ([#6376](https://github.com/cube-js/cube/issues/6376)) ([0ef53cb](https://github.com/cube-js/cube/commit/0ef53cb978e8995185a731985944b08f1f24949e)) +* **cubestore:** Increase default TRANSPORT_MAX_FRAME_SIZE to 32Mb ([#6381](https://github.com/cube-js/cube/issues/6381)) ([73f7ea9](https://github.com/cube-js/cube/commit/73f7ea9a79882cdcdeff9a7bc916077f86489852)) +* **schema-compiler:** Support new aliases for join.relationship ([#6367](https://github.com/cube-js/cube/issues/6367)) ([34a18d8](https://github.com/cube-js/cube/commit/34a18d8936d6e3e27d0dcba2456dbac3f03b0d76)) +* Support quarter(s) in dateRange for timeDimensions ([#6385](https://github.com/cube-js/cube/issues/6385)) ([5a08721](https://github.com/cube-js/cube/commit/5a087216dfd95be29d414ec83f4494de8e3a1fb2)) + + + + + +## [0.32.18](https://github.com/cube-js/cube/compare/v0.32.17...v0.32.18) (2023-04-02) + + +### Bug Fixes + +* **athena-driver:** Correct handling for NULL values ([#6171](https://github.com/cube-js/cube/issues/6171)) ([a1f4cd4](https://github.com/cube-js/cube/commit/a1f4cd498e84dde91d736cc87825ae3a8095f9bf)) +* **playground:** SQL API default port 15432 ([416a9de](https://github.com/cube-js/cube/commit/416a9de677cb9a1a48f426a74e755b78c18e0952)) + + +### Features + +* Cube based includes and meta exposure ([#6380](https://github.com/cube-js/cube/issues/6380)) ([ead4ac0](https://github.com/cube-js/cube/commit/ead4ac0b3b78c074f29fcdec3f86282bce42c45a)) +* **cubestore:** Allow to configure max message_size/frame_size for transport ([#6369](https://github.com/cube-js/cube/issues/6369)) ([be7d40b](https://github.com/cube-js/cube/commit/be7d40bcf3be29b2fc0edfe2983162c4b0cafbce)) +* **schema-compiler:** Introduce public field (alias for shown) ([#6361](https://github.com/cube-js/cube/issues/6361)) ([6d0c66a](https://github.com/cube-js/cube/commit/6d0c66aad43d51dd23cc3b0cbd6ba3454581afd6)) + + + + + +## [0.32.17](https://github.com/cube-js/cube/compare/v0.32.16...v0.32.17) (2023-03-29) + + +### Bug Fixes + +* **deps:** Upgrade minimist, @xmldom/xmldom, refs [#6340](https://github.com/cube-js/cube/issues/6340) ([#6364](https://github.com/cube-js/cube/issues/6364)) ([04a1c9a](https://github.com/cube-js/cube/commit/04a1c9a04ca2eaae841024eb797e7ee549e98445)) +* **deps:** Upgrade moment, moment-timezone, refs [#6340](https://github.com/cube-js/cube/issues/6340) ([#6365](https://github.com/cube-js/cube/issues/6365)) ([d967cf3](https://github.com/cube-js/cube/commit/d967cf3fcf5d3f92ee32e47925fd1090f381a9c5)) + + +### Features + +* **schema-compiler:** Introduce support for sqlTable (syntactic sugar) ([#6360](https://github.com/cube-js/cube/issues/6360)) ([c73b368](https://github.com/cube-js/cube/commit/c73b368ca20735c63d01d2364b1c2f26d3b24cc5)) +* **sqlite-driver:** Upgrade sqlite3 from 5.0.11 to 5.1.6, refs [#6340](https://github.com/cube-js/cube/issues/6340) ([#6287](https://github.com/cube-js/cube/issues/6287)) ([4ec1da3](https://github.com/cube-js/cube/commit/4ec1da361afa9146b4ac955addd89120cfe23e2d)) + + +### Reverts + +* Revert "docs(schema): replace camel-case properties with snake-case" ([4731f4a](https://github.com/cube-js/cube/commit/4731f4ae16c1568f6a0956bc89f79f9a81f53e06)) +* Revert "docs: use snake-case property names" ([eb97883](https://github.com/cube-js/cube/commit/eb97883d75985bea7abce5bf3cc434473297cc96)) + + + + + +## [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 + + + + + +## [0.32.15](https://github.com/cube-js/cube/compare/v0.32.14...v0.32.15) (2023-03-24) + + +### Bug Fixes + +* **cubesql:** Allow any aggregation for number measure as it can be a wildcard ([48f8828](https://github.com/cube-js/cube/commit/48f882867b020ca4a0d058ff147e61ef9bea9555)) +* **cubestore-driver:** Fix informationSchemaQuery ([#6338](https://github.com/cube-js/cube/issues/6338)) ([387020d](https://github.com/cube-js/cube/commit/387020d13ae3e82bac7b55699880e16f79940016)) +* **cubestore:** RocksStore - specify TTL for WAL to protect logs uploading ([#6345](https://github.com/cube-js/cube/issues/6345)) ([3a9cba4](https://github.com/cube-js/cube/commit/3a9cba478387dd4712b9ea3c566db159a32302d5)) + + +### Features + +* **cubestore:** Use XXH3 checksum alg for RocksDB ([#6339](https://github.com/cube-js/cube/issues/6339)) ([866f965](https://github.com/cube-js/cube/commit/866f965044536dac72c74160f9da6abc923e3dfb)) +* **playground:** BI connection guides, frontend integration snippets ([#6341](https://github.com/cube-js/cube/issues/6341)) ([8fdeb1b](https://github.com/cube-js/cube/commit/8fdeb1b882d959f9e8aec0ae963e5a0b1995e517)) + + + + + +## [0.32.14](https://github.com/cube-js/cube/compare/v0.32.13...v0.32.14) (2023-03-23) + + +### Bug Fixes + +* **cubestore:** Create table failed: Internal: Directory not empty (os error 39) for local dir storage ([103cabe](https://github.com/cube-js/cube/commit/103cabec6e4d6c59ad1890a3dbe42f7d092eeb6e)) +* Use last rollup table types to avoid type guessing for unionWithSourceData lambda queries ([#6337](https://github.com/cube-js/cube/issues/6337)) ([15badfe](https://github.com/cube-js/cube/commit/15badfeb2e1829e81dd914db3bbfd33f105e36ea)) + + + + + +## [0.32.13](https://github.com/cube-js/cube/compare/v0.32.12...v0.32.13) (2023-03-22) + + +### Bug Fixes + +* **cubestore-driver:** Queue - correct APM events ([#6251](https://github.com/cube-js/cube/issues/6251)) ([f4fdfc0](https://github.com/cube-js/cube/commit/f4fdfc03278e64c709e91e7df6cf1a9c936a041c)) +* **cubestore:** A single-character boolean value in csv is parsed incorrectly ([#6325](https://github.com/cube-js/cube/issues/6325)) ([ce8f3e2](https://github.com/cube-js/cube/commit/ce8f3e21ec675181ec47174428f14c8ddb7f3bf1)) + + + + + +## [0.32.12](https://github.com/cube-js/cube/compare/v0.32.11...v0.32.12) (2023-03-22) + + +### Bug Fixes + +* **cubesql:** Support quicksight AVG Rebase window exprs: Physical plan does not support logical expression SUM(x) PARTITION BY ([#6328](https://github.com/cube-js/cube/issues/6328)) ([5a5d7e4](https://github.com/cube-js/cube/commit/5a5d7e497f05c69541e04df0a464c85eb9a5f506)) +* **cubestore:** If job has been scheduled to non-existent node it'd hang around forever ([#6242](https://github.com/cube-js/cube/issues/6242)) ([69ef0b6](https://github.com/cube-js/cube/commit/69ef0b697bbe87a00687137bff318bb0cfc88015)) +* **cubestore:** Retying download from external locations ([#6321](https://github.com/cube-js/cube/issues/6321)) ([50841d9](https://github.com/cube-js/cube/commit/50841d92b7e84d3feec7372119eb540327a4d233)) + + +### Features + +* **cubestore-driver:** Support timestamp(3) as a column type ([#6324](https://github.com/cube-js/cube/issues/6324)) ([71dbca4](https://github.com/cube-js/cube/commit/71dbca4ed1fb706d36af322d2659435465804825)) +* **server-core, query-orchestrator:** sql-runner - supp… ([#6142](https://github.com/cube-js/cube/issues/6142)) ([32c603d](https://github.com/cube-js/cube/commit/32c603d50f462bf3cf9ce852dc9dcf23fc271cf3)) + + + + + +## [0.32.11](https://github.com/cube-js/cube.js/compare/v0.32.10...v0.32.11) (2023-03-21) + + +### Bug Fixes + +* **cubesql:** Ignore timestamps which can't be represented as nanoseconds instead of failing ([e393b06](https://github.com/cube-js/cube.js/commit/e393b0601fb663b03158ea03143a30eb0086ebbf)) +* **cubesql:** Quicksight AVG measures support ([#6323](https://github.com/cube-js/cube.js/issues/6323)) ([ada0afd](https://github.com/cube-js/cube.js/commit/ada0afd17b42a54fbecac69b849abf40158991c1)) + + + + + +## [0.32.10](https://github.com/cube-js/cube.js/compare/v0.32.9...v0.32.10) (2023-03-20) + + +### Bug Fixes + +* Refresh Scheduler - empty securityContext in driverFactory ([#6316](https://github.com/cube-js/cube.js/issues/6316)) ([dd4c9d5](https://github.com/cube-js/cube.js/commit/dd4c9d5a508de03b076850daed78afa18e99eb4f)) + + + + + +## [0.32.9](https://github.com/cube-js/cube.js/compare/v0.32.8...v0.32.9) (2023-03-18) + + +### Bug Fixes + +* **cubesql:** Unexpected response from Cube, Field "count" doesn't exist in row ([6bdc91d](https://github.com/cube-js/cube.js/commit/6bdc91d3eaf51dcb25e7321d03b485147511f049)) + + + + + +## [0.32.8](https://github.com/cube-js/cube.js/compare/v0.32.7...v0.32.8) (2023-03-17) + + +### Bug Fixes + +* **cubesql:** Catch error on TcpStream.peer_addr() ([#6300](https://github.com/cube-js/cube.js/issues/6300)) ([d74a1f0](https://github.com/cube-js/cube.js/commit/d74a1f059ce7f1baa9dad5f216e013a3f0f1bc45)) +* **cubesql:** Use writable streams with plain objects instead of JSON.stringify pipe for streaming capability ([#6306](https://github.com/cube-js/cube.js/issues/6306)) ([a9b19fa](https://github.com/cube-js/cube.js/commit/a9b19fa1a1a9c2f0710c8058ed797a4b7a48ed7e)) +* **cubestore:** Panic: index out of bounds: the len is 0 but the index is 0 ([#6311](https://github.com/cube-js/cube.js/issues/6311)) ([41dbbc0](https://github.com/cube-js/cube.js/commit/41dbbc03365f6067e85a09e8d5cafbfc6fe39990)) +* **query-orchestrator:** queues reconciliation logic ([#6286](https://github.com/cube-js/cube.js/issues/6286)) ([b45def4](https://github.com/cube-js/cube.js/commit/b45def46d99710e4fcf43cbc84b1b38341b859f6)) + + +### Features + +* **cubestore:** RocksStore - panic protection for broken rw loop ([#6293](https://github.com/cube-js/cube.js/issues/6293)) ([1f2db32](https://github.com/cube-js/cube.js/commit/1f2db32c289c119468f4cbe522fa40bab1a00068)) + + + + + +## [0.32.7](https://github.com/cube-js/cube.js/compare/v0.32.6...v0.32.7) (2023-03-14) + + +### Bug Fixes + +* Cross data source `rollupLambda` uses incorrect refreshKey ([#6288](https://github.com/cube-js/cube.js/issues/6288)) ([f87be98](https://github.com/cube-js/cube.js/commit/f87be98c68bcdcb65bd317b845571ad186586bd1)) + + + + + +## [0.32.6](https://github.com/cube-js/cube.js/compare/v0.32.5...v0.32.6) (2023-03-14) + + +### Bug Fixes + +* **firebolt-driver:** numeric null value ([#6284](https://github.com/cube-js/cube.js/issues/6284)) ([b5cc5b5](https://github.com/cube-js/cube.js/commit/b5cc5b56a16defe3b6412bad384ae5e07eeaeace)) + + +### Features + +* **schema-compiler:** quarter granularity ([#6285](https://github.com/cube-js/cube.js/issues/6285)) ([22f6102](https://github.com/cube-js/cube.js/commit/22f6102e137940b6882d55f560d826feceaf470d)) + + + + + +## [0.32.5](https://github.com/cube-js/cube.js/compare/v0.32.4...v0.32.5) (2023-03-13) + + +### Bug Fixes + +* Allow to specify cubestore as cacheAndQueueDriver from config, fix [#6279](https://github.com/cube-js/cube.js/issues/6279) ([#6280](https://github.com/cube-js/cube.js/issues/6280)) ([6b48c65](https://github.com/cube-js/cube.js/commit/6b48c65bf5dfe042b507171afb726328fa16e75c)) +* **api-gateway:** permissions cache removed ([#6276](https://github.com/cube-js/cube.js/issues/6276)) ([03be6d2](https://github.com/cube-js/cube.js/commit/03be6d29afbf13a053d5c2036ee4eae53a500892)) +* **cubestore:** Setup format_version = 5 (previusly used with RocksDB 6.20.3) ([#6283](https://github.com/cube-js/cube.js/issues/6283)) ([5126d00](https://github.com/cube-js/cube.js/commit/5126d00c64331c99d6aadc3ab7ccbd1c49dc1732)) +* **hive-driver:** Follow DriverInterface for query method, fix [#6281](https://github.com/cube-js/cube.js/issues/6281) ([#6282](https://github.com/cube-js/cube.js/issues/6282)) ([e81aba9](https://github.com/cube-js/cube.js/commit/e81aba9fd3dcf8b08092b9c7302067b230d1bbdc)) + + + + + +## [0.32.4](https://github.com/cube-js/cube.js/compare/v0.32.3...v0.32.4) (2023-03-10) + + +### Bug Fixes + +* **api-gateway:** contextToPermissions default permissions parameter ([#6268](https://github.com/cube-js/cube.js/issues/6268)) ([b234afc](https://github.com/cube-js/cube.js/commit/b234afc9877e4d80aa05528b32d9234b2730f0c5)) +* **api-gateway:** permissions cache removed ([#6271](https://github.com/cube-js/cube.js/issues/6271)) ([cd32266](https://github.com/cube-js/cube.js/commit/cd322665e5973dd8551bb039b3d0ad66a3a16d7f)) +* **api-gateway:** permissions error message ([#6269](https://github.com/cube-js/cube.js/issues/6269)) ([53d71a2](https://github.com/cube-js/cube.js/commit/53d71a2167a9d262520f4be3fbc1a458e8cc704c)) +* **api-gateway:** permissions unit test fix ([#6270](https://github.com/cube-js/cube.js/issues/6270)) ([15df7c1](https://github.com/cube-js/cube.js/commit/15df7c101dc664084f475764743694993a5cacdb)) +* Catch exception from extendContext (unhandledRejection) ([#6256](https://github.com/cube-js/cube.js/issues/6256)) ([9fa0bd9](https://github.com/cube-js/cube.js/commit/9fa0bd95c49bf4885224b43c42cad0d2327d026d)) +* **cubesql:** Failed printing to stdout: Resource temporarily unavailable ([#6272](https://github.com/cube-js/cube.js/issues/6272)) ([d8dd8a6](https://github.com/cube-js/cube.js/commit/d8dd8a60dba1eb3092dd252ccf98fa6e1de43dd4)) + + +### Features + +* **cubestore/docker:** Upgrade CLang to 15 ([979246b](https://github.com/cube-js/cube.js/commit/979246bdc8498d874aee755a4858c3008761ed54)) +* **cubestore/docker:** Upgrade OS to bullseye ([c512586](https://github.com/cube-js/cube.js/commit/c51258643bb24279ebe71e1279d0078efe32fce9)) +* **cubestore:** Support quarter intervals ([#6266](https://github.com/cube-js/cube.js/issues/6266)) ([35cc5c8](https://github.com/cube-js/cube.js/commit/35cc5c83e270e507e36e0602e707c8ed3f64872f)) +* **cubestore:** Upgrade RocksDB to 7.9.2 (0.20) ([#6221](https://github.com/cube-js/cube.js/issues/6221)) ([92bbef3](https://github.com/cube-js/cube.js/commit/92bbef34bd8fe34d9c8126bcf93c0535adcb289d)) + + + + + +## [0.32.3](https://github.com/cube-js/cube.js/compare/v0.32.2...v0.32.3) (2023-03-07) + + +### Features + +* **cubestore:** Streaming optimizations ([#6228](https://github.com/cube-js/cube.js/issues/6228)) ([114a847](https://github.com/cube-js/cube.js/commit/114a84778a84ff050f4d08eafdafa21efbf46646)) +* **server-core, api-gateway:** Permissions API ([#6240](https://github.com/cube-js/cube.js/issues/6240)) ([aad6aa3](https://github.com/cube-js/cube.js/commit/aad6aa3e327503487d8c9b4b85ec047d3fc0843e)) + + + + + +## [0.32.2](https://github.com/cube-js/cube.js/compare/v0.32.1...v0.32.2) (2023-03-07) + + +### Bug Fixes + +* **cubestore-driver:** Correct pending count and active keys in queue logs ([#6250](https://github.com/cube-js/cube.js/issues/6250)) ([3607c67](https://github.com/cube-js/cube.js/commit/3607c67ea0fa137c5f97e9d3b6fc67805ce85f68)) +* **redshift-driver:** fixes column order ([#6068](https://github.com/cube-js/cube.js/issues/6068)) Thanks [@rdwoodring](https://github.com/rdwoodring)! ([3bba803](https://github.com/cube-js/cube.js/commit/3bba803289c15be8cc6c9fe8476dc4ea8f46f40b)) +* Replace deprecated `@hapi/joi` with `joi` ([#6223](https://github.com/cube-js/cube.js/issues/6223)) Thanks [@hehex9](https://github.com/hehex9) ! ([ccbcc50](https://github.com/cube-js/cube.js/commit/ccbcc501dc91ef68ca49ddced79316425ae8f215)) + + +### 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)) +* **cubestore:** QUEUE - support extended flag for retrieve ([#6248](https://github.com/cube-js/cube.js/issues/6248)) ([9f23924](https://github.com/cube-js/cube.js/commit/9f23924a306c8141aa0cc8d990aeffdd5f3b4135)) +* Enable drop pre-aggregations without touch by default. **NOTE:** This change may adversely affect deployments which has incorrectly configured Refresh Worker instance. ([291977b](https://github.com/cube-js/cube.js/commit/291977b58ffb09e5886b6b1dbd46f9acd16a32ec)) +* Support rollupLambda across different cubes and data sources ([#6245](https://github.com/cube-js/cube.js/issues/6245)) ([fa284a4](https://github.com/cube-js/cube.js/commit/fa284a4e04ac0f80e9e06fb1dc48b5c07204c5a4)) + + + + + +## [0.32.1](https://github.com/cube-js/cube.js/compare/v0.32.0...v0.32.1) (2023-03-03) + + +### Bug Fixes + +* **cubesql:** Replace stream buffering with async implementation ([#6127](https://github.com/cube-js/cube.js/issues/6127)) ([5186d30](https://github.com/cube-js/cube.js/commit/5186d308cedf103b08c8a8140de84984839c710a)) + + + + + +# [0.32.0](https://github.com/cube-js/cube.js/compare/v0.31.69...v0.32.0) (2023-03-02) + + +### Features + +* **docker:** Remove gcc/g++/cmake/python from final images ([bb0a0e7](https://github.com/cube-js/cube.js/commit/bb0a0e7eac6044141e446f802d858529b4ff9782)) +* **docker:** Upgrade Node.js to 16.x ([8fe0e04](https://github.com/cube-js/cube.js/commit/8fe0e048e8d485b8775105be29d96f27cb4adf40)) + +### Breaking changes + +* Use cubestore driver for queue & cache ([a54aef](https://github.com/cube-js/cube.js/commit/5d88fed03a3e6599f9b77610f8657161f9a54aef)) +* Remove absolute import for @cubejs-backend/server-core ([361848](https://github.com/cube-js/cube.js/commit/6ee42184da3b36c793ec43284964cd885c361848)) +* Remove absolute import for @cubejs-backend/schema-compiler ([f3669](https://github.com/cube-js/cube.js/commit/d028937a92e6bf5d718ffd89b1676f90976f3669)) +* Remove absolute import for @cubejs-backend/query-orchestrator ([578c9](https://github.com/cube-js/cube.js/commit/45bd678a547ac71fc7d69471c4c72e49238578c9)) +* Remove support for Node.js 12, 15 ([78d76f1](https://github.com/cube-js/cube.js/commit/6568057fa6e6cc7e2fa02a7826d07fe3778d76f1)) + +## [0.31.69](https://github.com/cube-js/cube.js/compare/v0.31.68...v0.31.69) (2023-03-01) + + +### Bug Fixes + +* **cubestore:** Wrong triggering of table deactivation in some cases ([#6119](https://github.com/cube-js/cube.js/issues/6119)) ([523c0c2](https://github.com/cube-js/cube.js/commit/523c0c2cbcd981a114ab348f83e719526a6a3a0a)) +* Throw error message on misconfiguration with Cube Store as queue/cache driver. ([#6199](https://github.com/cube-js/cube.js/issues/6199)) ([ae06ef7](https://github.com/cube-js/cube.js/commit/ae06ef74c15fed996cc2d745d6ecdd5e03bb86f3)) + + + + + +## [0.31.68](https://github.com/cube-js/cube.js/compare/v0.31.67...v0.31.68) (2023-02-28) + + +### Bug Fixes + +* **cubestore:** Metastore logs are uploaded without the corresponding snapshot ([#6222](https://github.com/cube-js/cube.js/issues/6222)) ([cfa4b47](https://github.com/cube-js/cube.js/commit/cfa4b4780f0b1549544bf26e2fb843d69ccdc981)) +* **jdbc-driver, databricks-jdbc-driver:** clearTimeout on validate catch, temp table name ([#6220](https://github.com/cube-js/cube.js/issues/6220)) ([c2c7118](https://github.com/cube-js/cube.js/commit/c2c711815a32fa597fa70937a27a14cdc86cad1f)) + + + + + +## [0.31.67](https://github.com/cube-js/cube.js/compare/v0.31.66...v0.31.67) (2023-02-27) + + +### Bug Fixes + +* Reconcile streaming queries in case of cluster execution ([#6204](https://github.com/cube-js/cube.js/issues/6204)) ([dcf7866](https://github.com/cube-js/cube.js/commit/dcf78660bb07bb033665ac698e8b45af3565845b)) +* **schema-compiler:** skip empty YAML files ([b068f7f](https://github.com/cube-js/cube.js/commit/b068f7f4f44c8bede3d45aac8df4bc8b4f38912e)) + + +### Features + +* **cube-cli:** Schema validation command ([#6208](https://github.com/cube-js/cube.js/issues/6208)) ([1fc6490](https://github.com/cube-js/cube.js/commit/1fc64906e5e628437fb58d35feea8ab3aa5bfe06)) + + + + + +## [0.31.66](https://github.com/cube-js/cube.js/compare/v0.31.65...v0.31.66) (2023-02-27) + + +### Bug Fixes + +* databricks pre-aggregation errors ([#6207](https://github.com/cube-js/cube.js/issues/6207)) ([e7297f7](https://github.com/cube-js/cube.js/commit/e7297f735b64d3ce80ff4715c7b40ccee73cdb40)) + + +### Features + +* **cubestore:** Streaming ingestion optimizations ([#6198](https://github.com/cube-js/cube.js/issues/6198)) ([fb896ba](https://github.com/cube-js/cube.js/commit/fb896ba10bb2cbeacd14c7192a4a9b2d1e40abef)) +* **docker:** Use Debian (bullseye) for dev images ([#6202](https://github.com/cube-js/cube.js/issues/6202)) ([b4c922a](https://github.com/cube-js/cube.js/commit/b4c922a898e81df0bf3b4116c8ac51072ecc2382)) + + + + + +## [0.31.65](https://github.com/cube-js/cube.js/compare/v0.31.64...v0.31.65) (2023-02-23) + + +### Bug Fixes + +* **oracle-driver:** Release connection after query execution ([#5469](https://github.com/cube-js/cube.js/issues/5469)) ([ff1af78](https://github.com/cube-js/cube.js/commit/ff1af789c6326e25b3a341c4bae1829da95c36c1)) + + + + + +## [0.31.64](https://github.com/cube-js/cube.js/compare/v0.31.63...v0.31.64) (2023-02-21) + + +### Bug Fixes + +* **cubejs-playground:** error overflow ([#6170](https://github.com/cube-js/cube.js/issues/6170)) ([b5f68bb](https://github.com/cube-js/cube.js/commit/b5f68bbc8c0091089bb2c43bcbcf44a9da8a7182)) +* **jdbc-driver:** ResourceRequest timeout ([#6186](https://github.com/cube-js/cube.js/issues/6186)) ([b58c44e](https://github.com/cube-js/cube.js/commit/b58c44e116930f6dfaa4107e9c8ca14b472bfd77)) + + +### Features + +* **cubesql:** Remove unexpected clone (reduce memory consumption) ([#6185](https://github.com/cube-js/cube.js/issues/6185)) ([904556b](https://github.com/cube-js/cube.js/commit/904556b83e724e6b55e65afd9dbd077bb6c9ea99)) +* **cubestore:** Allow tinyint type (map as Int) ([#6174](https://github.com/cube-js/cube.js/issues/6174)) ([47571e5](https://github.com/cube-js/cube.js/commit/47571e566b7991f3bac902fcecce9c3ac3328a10)) + + + + + +## [0.31.63](https://github.com/cube-js/cube.js/compare/v0.31.62...v0.31.63) (2023-02-20) + + +### Bug Fixes + +* **cubesql:** `CAST(column AS DATE)` to DateTrunc day ([8f6fbe2](https://github.com/cube-js/cube.js/commit/8f6fbe274fa659870f9a736f4ac0c8e8406c64d0)) +* **cubestore:** Support realiasing for information schema tables ([#6155](https://github.com/cube-js/cube.js/issues/6155)) ([423a3ec](https://github.com/cube-js/cube.js/commit/423a3ec33953e816ca94fb33ed9f4ec2084e640c)) +* **databricks-jdbc-driver:** export table drops twice in Databricks ([#6177](https://github.com/cube-js/cube.js/issues/6177)) ([a62d9f0](https://github.com/cube-js/cube.js/commit/a62d9f0c23943224170fddb19f3a7c784920aa48)) +* **playground:** closing the last query tab ([aaa75f4](https://github.com/cube-js/cube.js/commit/aaa75f4d0d2cda73ca9070495ef788ef704e7e17)) + + +### Features + +* **cubestore:** Use separate scheduler for Cache Store ([#6160](https://github.com/cube-js/cube.js/issues/6160)) ([a17f59b](https://github.com/cube-js/cube.js/commit/a17f59b673f6a6336d52c4eafffbc237c1ca39e7)) +* graphql api variables ([#6153](https://github.com/cube-js/cube.js/issues/6153)) ([5f0f705](https://github.com/cube-js/cube.js/commit/5f0f7053022f437e61d23739b9acfb364fb06a16)) + + + + + +## [0.31.62](https://github.com/cube-js/cube.js/compare/v0.31.61...v0.31.62) (2023-02-13) + + +### Bug Fixes + +* streaming ([#6156](https://github.com/cube-js/cube.js/issues/6156)) ([abcbc1e](https://github.com/cube-js/cube.js/commit/abcbc1ed8f496ffa322053cc2dac9a7cc5b38dcd)) + + +### Features + +* **cubestore:** Introduce information_schema.columns ([#6152](https://github.com/cube-js/cube.js/issues/6152)) ([c70b155](https://github.com/cube-js/cube.js/commit/c70b155780f3eba491f093cfbb56bd1c297eae34)) + + + + + +## [0.31.61](https://github.com/cube-js/cube.js/compare/v0.31.60...v0.31.61) (2023-02-10) + +**Note:** Version bump only for package cubejs + + + + + +## [0.31.60](https://github.com/cube-js/cube.js/compare/v0.31.59...v0.31.60) (2023-02-10) + + +### Bug Fixes + +* GraphQL API date range filter ([#6138](https://github.com/cube-js/cube.js/issues/6138)) ([dc2ea8c](https://github.com/cube-js/cube.js/commit/dc2ea8cb430a6e013cfa32f42294ee6a7c4206b6)) +* **shared:** getProxySettings - use global configuration ([#6137](https://github.com/cube-js/cube.js/issues/6137)) ([e2ba5c1](https://github.com/cube-js/cube.js/commit/e2ba5c1962f2c57e79ce405c22209ab6890f400d)) + + +### Features + +* **cubesql:** Redesign member pushdown to support more advanced join… ([#6122](https://github.com/cube-js/cube.js/issues/6122)) ([3bb85e4](https://github.com/cube-js/cube.js/commit/3bb85e492056d73c28b3d006a95e0f9765e6e026)) +* **cubestore:** Disable MetastoreEvents for queue & cache ([#6126](https://github.com/cube-js/cube.js/issues/6126)) ([0fd20cb](https://github.com/cube-js/cube.js/commit/0fd20cb409703945fecc3620833b8d5cc683ca0e)) +* **cubestore:** Limit pushdown ([#5604](https://github.com/cube-js/cube.js/issues/5604)) ([f593ffe](https://github.com/cube-js/cube.js/commit/f593ffe686b9dfd40af9719226b583fc43f43648)) +* **cubestore:** Support SYS DROP QUERY CACHE + metrics ([#6131](https://github.com/cube-js/cube.js/issues/6131)) ([e8d2670](https://github.com/cube-js/cube.js/commit/e8d2670848656fa130bd76f2f98bca6b282143d3)) + + + + + +## [0.31.59](https://github.com/cube-js/cube.js/compare/v0.31.58...v0.31.59) (2023-02-06) + + +### Bug Fixes + +* **server-core:** config validation if custom ContextAcceptor is ([#6120](https://github.com/cube-js/cube.js/issues/6120)) ([6524a84](https://github.com/cube-js/cube.js/commit/6524a848e3459cf7de59fecd2d38f7f88a5fdc6f)) + + +### Features + +* **api-gateway, server-core:** added endpoint to fetch db schema ([#5852](https://github.com/cube-js/cube.js/issues/5852)) ([8ffcfd2](https://github.com/cube-js/cube.js/commit/8ffcfd22f75b745c90023c54bad19f6c5c9e87e5)) + + + + + +## [0.31.58](https://github.com/cube-js/cube.js/compare/v0.31.57...v0.31.58) (2023-02-02) + + +### Bug Fixes + +* **jdbc-driver:** streamQuery connection release ([#6108](https://github.com/cube-js/cube.js/issues/6108)) ([3426e6e](https://github.com/cube-js/cube.js/commit/3426e6e46a12aba2e85671cf22dcf4dd005d785c)) + + +### Features + +* **cubesql:** Improve catching of panic's reason ([#6107](https://github.com/cube-js/cube.js/issues/6107)) ([c8cf300](https://github.com/cube-js/cube.js/commit/c8cf3007b5bcb4f0362e5e3721eccadf69bcea62)) +* **cubestore:** Queue - support custom orphaned timeout ([#6090](https://github.com/cube-js/cube.js/issues/6090)) ([d6702ab](https://github.com/cube-js/cube.js/commit/d6702ab1d7c38111799edf9227e3aa53c51cc237)) +* **native:** Correct error handling for neon::channel.send ([#6106](https://github.com/cube-js/cube.js/issues/6106)) ([f71255a](https://github.com/cube-js/cube.js/commit/f71255abdae1d933101e0bc4002fd83373278067)) +* **snowflake-sdk:** Security upgrade snowflake-sdk from 1.6.14 to 1.6.18 ([#6097](https://github.com/cube-js/cube.js/issues/6097)) ([1f10c8a](https://github.com/cube-js/cube.js/commit/1f10c8a7cf088328e4e9a30d74e34338709af9b1)) + + + + + +## [0.31.57](https://github.com/cube-js/cube.js/compare/v0.31.56...v0.31.57) (2023-02-02) + + +### Features + +* **cubejs-api-gateway:** Add scope check to sql runner ([#6053](https://github.com/cube-js/cube.js/issues/6053)) ([d79d3aa](https://github.com/cube-js/cube.js/commit/d79d3aae32ce185614a65912f1c8229128792c48)) +* **cubejs-server-core:** add dbType to dataSources ([#6089](https://github.com/cube-js/cube.js/issues/6089)) ([5c84467](https://github.com/cube-js/cube.js/commit/5c844677d841a65cb7eb3eadd36e69ed59881fd6)) +* **cubestore:** Cache/Queue - implement migrations (truncating) ([#6083](https://github.com/cube-js/cube.js/issues/6083)) ([e8daf5e](https://github.com/cube-js/cube.js/commit/e8daf5e70e947c04675e2acc6654deb9484e2497)) +* **cubestore:** Queue - correct sort over priority (+created) ([#6094](https://github.com/cube-js/cube.js/issues/6094)) ([bd489cd](https://github.com/cube-js/cube.js/commit/bd489cd7981dd94766f28ae4621fe993252d63c1)) + + + + + +## [0.31.56](https://github.com/cube-js/cube.js/compare/v0.31.55...v0.31.56) (2023-01-31) + + +### Bug Fixes + +* (dimensions.type.ownedByCube = true) is not allowed if dynamic schemas outside of schema folder are used ([88b09bd](https://github.com/cube-js/cube.js/commit/88b09bd14e13a05599c9f433063832a17664ed92)) +* **cubesql:** Allow Thoughtspot `EXTRACT YEAR AS date` ([22d0ad9](https://github.com/cube-js/cube.js/commit/22d0ad967380b4ece695b567e77a216a16b3bf17)) +* **cubestore-driver:** Correct cancellation handling ([#6087](https://github.com/cube-js/cube.js/issues/6087)) ([03089ce](https://github.com/cube-js/cube.js/commit/03089cebb5a932eb69abb637ef8b7998beac115c)) +* **playground:** filter nullish refs ([9732af6](https://github.com/cube-js/cube.js/commit/9732af6bfe2b3dad78c0b9e669ba1c6b8b4815dd)) + + +### Features + +* **cubestore:** Max disk space limit ([#6084](https://github.com/cube-js/cube.js/issues/6084)) ([cc6003b](https://github.com/cube-js/cube.js/commit/cc6003b6a6df9744a6cf4aab833230fdca0a4d11)) +* **cubestore:** Max disk space limit per worker ([#6085](https://github.com/cube-js/cube.js/issues/6085)) ([ed2ca79](https://github.com/cube-js/cube.js/commit/ed2ca798b38d5496d4a92a4fe0227e6a25361037)) + + + + + +## [0.31.55](https://github.com/cube-js/cube.js/compare/v0.31.54...v0.31.55) (2023-01-26) + + +### Bug Fixes + +* **cubesql:** Correct Thoughtspot day in quarter offset ([d62079e](https://github.com/cube-js/cube.js/commit/d62079eaadaaa81d9b1e45580b27d7597192263e)) + + +### Features + +* **cubestore-driver:** Queue - support persistent flag/stream handling ([#6046](https://github.com/cube-js/cube.js/issues/6046)) ([5b12ec8](https://github.com/cube-js/cube.js/commit/5b12ec874f33d30a02df55f792f1fc1ce0a30bf4)) +* new logo with background ([#6062](https://github.com/cube-js/cube.js/issues/6062)) ([7c3601b](https://github.com/cube-js/cube.js/commit/7c3601b259a05fe3c8318e2aa62f3553f45de5a3)) + + + + + +## [0.31.54](https://github.com/cube-js/cube.js/compare/v0.31.53...v0.31.54) (2023-01-25) + + +### Bug Fixes + +* **cubestore:** Support macOS 11 for standalone binary ([#6060](https://github.com/cube-js/cube.js/issues/6060)) ([6d2dff7](https://github.com/cube-js/cube.js/commit/6d2dff76021b2ee86ab6856f1f5c7864a9da658f)) + + +### Features + +* **cubestore:** Filter for data from kafka streams ([#6054](https://github.com/cube-js/cube.js/issues/6054)) ([3b1b1ab](https://github.com/cube-js/cube.js/commit/3b1b1ab052c96d1de635da0eb10fdea5701c0442)) +* **cubestore:** Queue - improve orphaned detection + optimizations ([#6051](https://github.com/cube-js/cube.js/issues/6051)) ([70e68ae](https://github.com/cube-js/cube.js/commit/70e68ae35ed7bc66b8306512ae68c7919e45e2cc)) + + + + + +## [0.31.53](https://github.com/cube-js/cube.js/compare/v0.31.52...v0.31.53) (2023-01-24) + + +### Bug Fixes + +* Last lambda partition is incorrectly filtered in case of middle partition is filtered out ([656edcf](https://github.com/cube-js/cube.js/commit/656edcf24f8a784cf3b5425e7d501260d48a9dc1)) + + +### Features + +* **cubestore:** Correct metrics for queue/cache (ignore long commands) ([#6047](https://github.com/cube-js/cube.js/issues/6047)) ([1d5a1f6](https://github.com/cube-js/cube.js/commit/1d5a1f679b3b1ed8a2b132acb63640405443dc43)) + + + + + +## [0.31.52](https://github.com/cube-js/cube.js/compare/v0.31.51...v0.31.52) (2023-01-23) + + +### Bug Fixes + +* **query-orchestrator:** streams cluster ([#6048](https://github.com/cube-js/cube.js/issues/6048)) ([c5b6702](https://github.com/cube-js/cube.js/commit/c5b6702f69788cbcbf959608e5e86abfa4bd5385)) + + +### Features + +* **api-gateway, server-core:** Added dataSources method ([#5789](https://github.com/cube-js/cube.js/issues/5789)) ([128d017](https://github.com/cube-js/cube.js/commit/128d017e2c8eb75d9439a3d09c6739bc0c552938)) +* **cubestore:** Support multiple parallel QUEUE RESULT_BLOCKING ([#6038](https://github.com/cube-js/cube.js/issues/6038)) ([d8be78a](https://github.com/cube-js/cube.js/commit/d8be78a95f8fae466615063433a5ae53ab1c1bd6)) +* **cubestore:** Upgrade warp to 0.3.3 (use crates.io instead of git) ([#6043](https://github.com/cube-js/cube.js/issues/6043)) ([d2307a8](https://github.com/cube-js/cube.js/commit/d2307a8ce3449d8085810463e97d33de4b340db4)) +* new dark scheme at README ([#6044](https://github.com/cube-js/cube.js/issues/6044)) ([a44ebbb](https://github.com/cube-js/cube.js/commit/a44ebbbe8c0cbd2b94db6dfd5f7b9f30fa18bd34)) + + + + + +## [0.31.51](https://github.com/cube-js/cube.js/compare/v0.31.50...v0.31.51) (2023-01-21) + + +### Bug Fixes + +* Incorrect partition filter for real time partitions ([6520279](https://github.com/cube-js/cube.js/commit/6520279096048f3cd19b38e5c431dd5a5c29323a)) + + + + + +## [0.31.50](https://github.com/cube-js/cube.js/compare/v0.31.49...v0.31.50) (2023-01-21) + + +### Bug Fixes + +* Lambda pre-aggregations aren't served by external refresh instance ([bd45720](https://github.com/cube-js/cube.js/commit/bd4572083a9560cddb7ef23e2eccc9c9c806378a)) +* Real time partitions seal just after created ([882a7df](https://github.com/cube-js/cube.js/commit/882a7df2d1184e754c41d7f5daea9f43f3ac53f8)) + + + + + +## [0.31.49](https://github.com/cube-js/cube.js/compare/v0.31.48...v0.31.49) (2023-01-20) + + +### Bug Fixes + +* Content version gets updated on build range change ([0adc634](https://github.com/cube-js/cube.js/commit/0adc63493d51c74a68004c09fb239f1234dffe4a)) +* **cubestore-driver:** Unexpected token u in JSON at position 0 ([#6037](https://github.com/cube-js/cube.js/issues/6037)) ([1d00521](https://github.com/cube-js/cube.js/commit/1d005214c2b18f092ede5c9187798af151793cf8)) + + + + + +## [0.31.48](https://github.com/cube-js/cube.js/compare/v0.31.47...v0.31.48) (2023-01-20) + + +### Features + +* **cubesql:** Postgres protocol - stream support ([#6025](https://github.com/cube-js/cube.js/issues/6025)) ([d5786df](https://github.com/cube-js/cube.js/commit/d5786df63a1f48dec2697a8bb5e8c017c1b13ae4)) +* **cubesql:** Streams - cancel query and drop conection handling ([8c585f2](https://github.com/cube-js/cube.js/commit/8c585f24003c768300a31e0ed6774a3a724e54fa)) +* **cubestore:** Collect metrics for queue/cache commands ([#6032](https://github.com/cube-js/cube.js/issues/6032)) ([9ac7d0c](https://github.com/cube-js/cube.js/commit/9ac7d0ce67571c6945b7afe4095c995a1190da19)) +* **cubestore:** Support negative priority for queue ([#6031](https://github.com/cube-js/cube.js/issues/6031)) ([9924a1a](https://github.com/cube-js/cube.js/commit/9924a1a900f83fe246ede0b3a19e0c6ea7d5efc4)) +* streaming desync ([#6034](https://github.com/cube-js/cube.js/issues/6034)) ([a4c8b09](https://github.com/cube-js/cube.js/commit/a4c8b09a680d2857d28a42817d29fa567dcf63b2)) + + + + + +## [0.31.47](https://github.com/cube-js/cube.js/compare/v0.31.46...v0.31.47) (2023-01-18) + + +### Bug Fixes + +* Re-use external connection for CubeStore in queue ([#6028](https://github.com/cube-js/cube.js/issues/6028)) ([ff724f7](https://github.com/cube-js/cube.js/commit/ff724f734039d059b762c9200688c7b1afcb0f76)) + + +### Features + +* **cubestore:** Correct queue add handling ([#6022](https://github.com/cube-js/cube.js/issues/6022)) ([0f4a431](https://github.com/cube-js/cube.js/commit/0f4a431bc6c2b1324bbfd53dd1204874120a5082)) + + + + + +## [0.31.46](https://github.com/cube-js/cube.js/compare/v0.31.45...v0.31.46) (2023-01-18) + + +### Bug Fixes + +* **athena-driver:** Help user to understand CUBEJS_AWS_S3_OUTPUT_LOCATION parameter is missing ([#5991](https://github.com/cube-js/cube.js/issues/5991)) Thanks [@fbalicchia](https://github.com/fbalicchia) ! ([eedd12a](https://github.com/cube-js/cube.js/commit/eedd12a18645d2d6faa68a43963a6cb98560b5a6)) +* Do not fail if partitions are not ready for specified date range interval but there's at least one ready for pre-aggregation ([#6026](https://github.com/cube-js/cube.js/issues/6026)) ([2d39fe4](https://github.com/cube-js/cube.js/commit/2d39fe48b31b544f4aefa00c87e084102d134b2e)) + + +### Features + +* **query-orchestrator:** Introduce CubeStoreQueueDriver ([#6014](https://github.com/cube-js/cube.js/issues/6014)) ([f4744bf](https://github.com/cube-js/cube.js/commit/f4744bfb218a8a8cb28effe28237867157d01074)) + + + + + +## [0.31.45](https://github.com/cube-js/cube.js/compare/v0.31.44...v0.31.45) (2023-01-16) + + +### Bug Fixes + +* **cubestore:** Panic on combination of `Union All` and single select in root `Union All` ([#6012](https://github.com/cube-js/cube.js/issues/6012)) ([0d1a3d8](https://github.com/cube-js/cube.js/commit/0d1a3d8e2732d47f193aa5cf018e8ca5c6d7cf31)) +* Do not update structure version on build range end update ([#6015](https://github.com/cube-js/cube.js/issues/6015)) ([7891b6c](https://github.com/cube-js/cube.js/commit/7891b6c7d3033cfdf4705402ce54a156f24f29e3)) + + +### Features + +* **cubestore:** Initial queue support ([#5541](https://github.com/cube-js/cube.js/issues/5541)) ([7109039](https://github.com/cube-js/cube.js/commit/7109039beaf5819fa1179751e98a3431a04b3cac)) + + + + + +## [0.31.44](https://github.com/cube-js/cube.js/compare/v0.31.43...v0.31.44) (2023-01-16) + + +### Bug Fixes + +* Rollups are sorted by name in `rollups` params of pre-aggregations ([#6011](https://github.com/cube-js/cube.js/issues/6011)) ([235ec70](https://github.com/cube-js/cube.js/commit/235ec70c296846f02e337acc4be90b4863556d15)) + + + + + +## [0.31.43](https://github.com/cube-js/cube.js/compare/v0.31.42...v0.31.43) (2023-01-16) + + +### Bug Fixes + +* **cubestore:** Panic when nested Union All ([#6010](https://github.com/cube-js/cube.js/issues/6010)) ([331242e](https://github.com/cube-js/cube.js/commit/331242e263435513544ece0ee7b174d14562f05b)) +* fix a mistake in the websocket context acceptance mechanism ([#6006](https://github.com/cube-js/cube.js/issues/6006)) ([1d8a9bd](https://github.com/cube-js/cube.js/commit/1d8a9bd06804681ef74f6e4e70357cefb05f9c29)) + + +### Features + +* Pre-aggregations API for `rollupLambda` support ([#6009](https://github.com/cube-js/cube.js/issues/6009)) ([b90b3f2](https://github.com/cube-js/cube.js/commit/b90b3f2b5c991a0046220d7821ce74fc11ddbb85)) + + + + + +## [0.31.42](https://github.com/cube-js/cube.js/compare/v0.31.41...v0.31.42) (2023-01-15) + + +### Bug Fixes + +* **cubestore:** Large memory consumption while waiting for the queue cache ([#6004](https://github.com/cube-js/cube.js/issues/6004)) ([8c029bb](https://github.com/cube-js/cube.js/commit/8c029bb96cf4c451f061cef2d83b5d5dc3a8637c)) +* **cubestore:** Large memory consumption while waiting for the queue cache: drop context ([#6005](https://github.com/cube-js/cube.js/issues/6005)) ([b39920f](https://github.com/cube-js/cube.js/commit/b39920f6f5f2b10b2ea598712bd5f5d1b02a3308)) + + +### Features + +* **api-gateway:** added result filter for sql-runner ([#5985](https://github.com/cube-js/cube.js/issues/5985)) ([89f1b92](https://github.com/cube-js/cube.js/commit/89f1b922e1e3d8a02fbdaf2bda2c2cb77c0bdc78)) +* Multiple rollups in `rollupLambda` support ([#6008](https://github.com/cube-js/cube.js/issues/6008)) ([84fff0d](https://github.com/cube-js/cube.js/commit/84fff0d7745ccf657bb8eca0c5cc426c82ffd516)) +* **native:** Channel.resolve/reject without lock ([#6001](https://github.com/cube-js/cube.js/issues/6001)) ([9133a3b](https://github.com/cube-js/cube.js/commit/9133a3bf885ca17f14ac18041a1692201d4c1cfb)) + + + + + +## [0.31.41](https://github.com/cube-js/cube.js/compare/v0.31.40...v0.31.41) (2023-01-13) + + +### Bug Fixes + +* **cubestore:** Metastore get_tables_with_path cache is not work correctly ([#6000](https://github.com/cube-js/cube.js/issues/6000)) ([75699c8](https://github.com/cube-js/cube.js/commit/75699c85f3b428d3e1967642b2c440be77e7b095)) + + +### Features + +* streaming capabilities ([#5995](https://github.com/cube-js/cube.js/issues/5995)) ([d336c4e](https://github.com/cube-js/cube.js/commit/d336c4eaa3547422484bb003df19dfd4c7be5f96)) + + + + + +## [0.31.40](https://github.com/cube-js/cube.js/compare/v0.31.39...v0.31.40) (2023-01-12) + + +### Features + +* **cubesql:** Support `date_trunc` over column filter ([c9e71e6](https://github.com/cube-js/cube.js/commit/c9e71e6a13f41e2af388b7f91043e4118ba91f40)) +* **docker:** Alpine - migrate to 3.15 (3.14 was removed) ([#5997](https://github.com/cube-js/cube.js/issues/5997)) ([cf9078a](https://github.com/cube-js/cube.js/commit/cf9078a2c29d31d78b8c1e100ce254495128e1a0)) +* Hooks for the context rejection mechanism ([#5901](https://github.com/cube-js/cube.js/issues/5901)) ([b6f0506](https://github.com/cube-js/cube.js/commit/b6f0506e1b5821a16857d6695a40c6b957887941)) + + + + + +## [0.31.39](https://github.com/cube-js/cube.js/compare/v0.31.38...v0.31.39) (2023-01-12) + + +### Bug Fixes + +* **cubesql:** Query cancellation for simple query protocol ([#5987](https://github.com/cube-js/cube.js/issues/5987)) ([aae758f](https://github.com/cube-js/cube.js/commit/aae758f83d45a2572caddfc5f85663e059406c78)) + + +### Features + +* Re-use connection to Cube Store from externalDriver ([#5993](https://github.com/cube-js/cube.js/issues/5993)) ([69a35ed](https://github.com/cube-js/cube.js/commit/69a35edb74e9b5e09f74b13a91afe7076fa344cb)) + + + + + +## [0.31.38](https://github.com/cube-js/cube.js/compare/v0.31.37...v0.31.38) (2023-01-11) + + +### Bug Fixes + +* **athena-driver:** Add catalog config ([#5835](https://github.com/cube-js/cube.js/issues/5835)) Thanks [@tkislan](https://github.com/tkislan) ! ([c33a5c5](https://github.com/cube-js/cube.js/commit/c33a5c596622c5a2b67987da6cfd3f8bef6acebe)) +* **athena-driver:** TypeError: table.join is not a function ([#5988](https://github.com/cube-js/cube.js/issues/5988)) ([4e56a04](https://github.com/cube-js/cube.js/commit/4e56a0402dbb13d757e073fb38a547522c0936d1)), closes [#5143](https://github.com/cube-js/cube.js/issues/5143) +* Delete `CUBEJS_DROP_PRE_AGG_WITHOUT_TOUCH` pre-aggregations only after refresh end to avoid cold start removals ([#5982](https://github.com/cube-js/cube.js/issues/5982)) ([58ad02f](https://github.com/cube-js/cube.js/commit/58ad02f24c5cc5940d6c668a0586fd66ff843795)) + + +### Features + +* **cubesql:** Improve memory usage in writting for pg-wire ([#4870](https://github.com/cube-js/cube.js/issues/4870)) ([401fbcf](https://github.com/cube-js/cube.js/commit/401fbcfa1e11a36d65555f7848280f5e60801808)) +* **docker:** Upgrade Node.js to 14.21.1 ([#5970](https://github.com/cube-js/cube.js/issues/5970)) ([0394ed2](https://github.com/cube-js/cube.js/commit/0394ed2b38827e345a4a43ab35b129dfd845057b)) + + + + + +## [0.31.37](https://github.com/cube-js/cube.js/compare/v0.31.36...v0.31.37) (2023-01-09) + + +### Bug Fixes + +* Remove missed `cacheFn` console.log ([ec9e56b](https://github.com/cube-js/cube.js/commit/ec9e56b79e5acf0399c634e3e50b3457175404b6)) + + +### Features + +* **cubejs-api-gateway:** added endpoint to run sql query directly ([#5786](https://github.com/cube-js/cube.js/issues/5786)) ([61d5798](https://github.com/cube-js/cube.js/commit/61d579834800c839defd3c2991aae65a42318027)) +* **cubestore:** Support lazy initialization for CacheStore ([#5933](https://github.com/cube-js/cube.js/issues/5933)) ([37b4a95](https://github.com/cube-js/cube.js/commit/37b4a953e6c3bc535520203b23fef1632bf04aee)) + + + + + +## [0.31.36](https://github.com/cube-js/cube.js/compare/v0.31.35...v0.31.36) (2023-01-08) + + +### Bug Fixes + +* graphql non capital cube name issue ([#5680](https://github.com/cube-js/cube.js/issues/5680)) Thanks @MattFanto! ([47956ea](https://github.com/cube-js/cube.js/commit/47956ea695443547a13c4f05eed382a750324f11)), closes [#5643](https://github.com/cube-js/cube.js/issues/5643) +* Potential OOM due to recursion while recovering Cube Store websocket ([8a0fd1f](https://github.com/cube-js/cube.js/commit/8a0fd1fe1901b80b369bd9fe5feff0da4f054ed5)) + + +### Features + +* **cubestore:** Set metastore current snapshot system command ([#5940](https://github.com/cube-js/cube.js/issues/5940)) ([f590a20](https://github.com/cube-js/cube.js/commit/f590a20a5ff3d81e500f54f03eeb31698fbf8a42)) + + + + + +## [0.31.35](https://github.com/cube-js/cube.js/compare/v0.31.34...v0.31.35) (2023-01-07) + + +### Bug Fixes + +* **client-core:** Added type CubesMap for cubeMap in Meta ([#5897](https://github.com/cube-js/cube.js/issues/5897)) ([92d1ccb](https://github.com/cube-js/cube.js/commit/92d1ccb9166e3a608424a1e11457f1746119e5f2)) +* **cubestore:** Get query execution results even after web socket disconnect ([#5931](https://github.com/cube-js/cube.js/issues/5931)) ([c6ccc1a](https://github.com/cube-js/cube.js/commit/c6ccc1a1c37d3f0c2fb5b4cdeacafdcad39321b3)) +* **cubestore:** Maintain minimum count of metastore snapshots ([#5925](https://github.com/cube-js/cube.js/issues/5925)) ([b303aa6](https://github.com/cube-js/cube.js/commit/b303aa68b7040d22334673c436808564a505e097)) +* Reduce memory footprint for pre-aggregations with many partitions by caching partition SQL ([5f72d8f](https://github.com/cube-js/cube.js/commit/5f72d8f99b588e579527ed3c8f550bf7949fab4e)) + + +### Features + +* **cubejs-cli:** add type-checking for `cube.js` files to newly-generated projects ([ba31d4f](https://github.com/cube-js/cube.js/commit/ba31d4fac969faa2a0bd35c15863595c66f36ea0)) +* **cubesql:** Support `NULLIF` in projection ([129fc58](https://github.com/cube-js/cube.js/commit/129fc580579062be73d362cfa829e3af82f37ad0)) +* **cubesql:** Support Thoughtspot starts/ends LIKE exprs ([e6798cc](https://github.com/cube-js/cube.js/commit/e6798cca8f9de33badf34b9cd64c41a2a7e6ce88)) + + + + + +## [0.31.34](https://github.com/cube-js/cube.js/compare/v0.31.33...v0.31.34) (2023-01-05) + + +### Bug Fixes + +* **client-core:** move @babel/runtime to dependencies ([#5917](https://github.com/cube-js/cube.js/issues/5917)) ([67221af](https://github.com/cube-js/cube.js/commit/67221afa040bb71381369306b3cc9b5067094589)) +* Reuse queries cache in refresh worker pre-aggregation iterator to reduce memory usage in high concurrency environment ([4ae21fa](https://github.com/cube-js/cube.js/commit/4ae21fa54d08b25420694caec5ffd6658c8e96f6)) + + + + + +## [0.31.33](https://github.com/cube-js/cube.js/compare/v0.31.32...v0.31.33) (2023-01-03) + + +### Bug Fixes + +* **@cubejs-client/core:** add missing Series.shortTitle typing ([#5860](https://github.com/cube-js/cube.js/issues/5860)) ([5dd78b9](https://github.com/cube-js/cube.js/commit/5dd78b9544965304757c72d8f305741f78bfc935)) + + +### Features + +* **cubesql:** Support Node.js 18 ([#5900](https://github.com/cube-js/cube.js/issues/5900)) ([839fa75](https://github.com/cube-js/cube.js/commit/839fa752229d23c25f97df66b845fe6d8ebfd341)) +* Introduce CubeStoreCacheDriver ([#5511](https://github.com/cube-js/cube.js/issues/5511)) ([fb39776](https://github.com/cube-js/cube.js/commit/fb3977631adb126183d5d2775c70821c6c099897)) + + + + + +## [0.31.32](https://github.com/cube-js/cube.js/compare/v0.31.31...v0.31.32) (2022-12-28) + + +### Features + +* **cubesql:** Allow postprocessing with JOIN below Cube query limit ([56f5399](https://github.com/cube-js/cube.js/commit/56f5399fb37dbb7b388951b1db0be21dda2a94d4)) +* **cubesql:** Support `LEFT`, `RIGHT` in projection ([282ad3a](https://github.com/cube-js/cube.js/commit/282ad3ab3106d81a1361f94a499cfc7dc716f3e6)) +* **cubestore:** Direct kafka download support for ksql streams and t… ([#5880](https://github.com/cube-js/cube.js/issues/5880)) ([fcb5c5e](https://github.com/cube-js/cube.js/commit/fcb5c5e7825df32249a8021580b582821761c7b1)) +* **cubestore:** Installer - download binary without GH API ([#5885](https://github.com/cube-js/cube.js/issues/5885)) ([51a0f39](https://github.com/cube-js/cube.js/commit/51a0f3951caf62fdf8e88d80faf16d11a2b9158b)) + + + + + +## [0.31.31](https://github.com/cube-js/cube.js/compare/v0.31.30...v0.31.31) (2022-12-23) + + +### Bug Fixes + +* **cubesql:** Improve Thoughtspot `WHERE IN` support ([6212efe](https://github.com/cube-js/cube.js/commit/6212efe428e504cd8c06797dfaa2b81783b80777)) +* **cubesql:** Support Thoughtspot DATEADD queries ([58b5669](https://github.com/cube-js/cube.js/commit/58b566903685ac3d14e78d61dc38c38c43aa5c3c)) + + +### Features + +* **cubestore-driver:** Introduce `CUBEJS_CUBESTORE_NO_HEART_BEAT_TIMEOUT` env ([e67e800](https://github.com/cube-js/cube.js/commit/e67e800119e4efe0456eef347a573fa9feaf10e7)) +* **cubestore:** Initial support for KV cache ([#5861](https://github.com/cube-js/cube.js/issues/5861)) ([498d4b5](https://github.com/cube-js/cube.js/commit/498d4b5c5dae2ddf1ff1336566580cff1a656a92)) +* **playground:** allow for query renaming ([#5862](https://github.com/cube-js/cube.js/issues/5862)) ([681a2d8](https://github.com/cube-js/cube.js/commit/681a2d804880b17254e37a132008086c7c3fe81f)) + + + + + +## [0.31.30](https://github.com/cube-js/cube.js/compare/v0.31.29...v0.31.30) (2022-12-22) + + +### Bug Fixes + +* **cubesql:** Improve Thoughtspot compatibility ([4d6511a](https://github.com/cube-js/cube.js/commit/4d6511a3d18ea877f06775c1aae154b5665feda0)) +* **cubestore-driver:** Increase retry timeout to avoid endless loop connection retries ([8bd19fa](https://github.com/cube-js/cube.js/commit/8bd19fafb36da6d97000da20417e98f23d92a424)) +* Pre-aggregation table is not found after it was successfully created for `CUBEJS_DROP_PRE_AGG_WITHOUT_TOUCH` strategy ([#5858](https://github.com/cube-js/cube.js/issues/5858)) ([f602fee](https://github.com/cube-js/cube.js/commit/f602feea9c2a25a0de8604e1297484f71ac8437a)) + + +### Features + +* **@cubejs-client/core:** expose shortTitle in seriesNames ([#5836](https://github.com/cube-js/cube.js/issues/5836)) Thanks [@euljr](https://github.com/euljr) ! ([1058d5a](https://github.com/cube-js/cube.js/commit/1058d5afd2784302b23215d73c679d35ceb785a8)) + + + + + +## [0.31.29](https://github.com/cube-js/cube.js/compare/v0.31.28...v0.31.29) (2022-12-18) + + +### Bug Fixes + +* Error: WebSocket is not open: readyState 2 (CLOSING) ([#5846](https://github.com/cube-js/cube.js/issues/5846)) ([a5be099](https://github.com/cube-js/cube.js/commit/a5be099f1d339ceb17c89439d6195c5718c726bb)) + + + + + +## [0.31.28](https://github.com/cube-js/cube.js/compare/v0.31.27...v0.31.28) (2022-12-16) + + +### Features + +* Support `string`, `time` and `boolean` measures ([#5842](https://github.com/cube-js/cube.js/issues/5842)) ([4543ede](https://github.com/cube-js/cube.js/commit/4543edefe5b2432c90bb8530bc6a3c24c5548de3)) + + + + + +## [0.31.27](https://github.com/cube-js/cube.js/compare/v0.31.26...v0.31.27) (2022-12-16) + + +### Bug Fixes + +* **api-gateway:** pre-aggregations/jobs auth middleware ([#5840](https://github.com/cube-js/cube.js/issues/5840)) ([b527cd9](https://github.com/cube-js/cube.js/commit/b527cd9fab348b404b6ed83fbbdb963c23928b07)) + + + + + +## [0.31.26](https://github.com/cube-js/cube.js/compare/v0.31.25...v0.31.26) (2022-12-13) + + +### Bug Fixes + +* **cubestore:** Temporary disable compression to check if it fixes running on Mac OS X Ventura ([8e89427](https://github.com/cube-js/cube.js/commit/8e8942776f28a4a35a5dc3ad22360691da43682f)), closes [#5712](https://github.com/cube-js/cube.js/issues/5712) +* **trino-driver:** Timezone issue fix ([#5731](https://github.com/cube-js/cube.js/issues/5731)) Thanks [@yuraborue](https://github.com/yuraborue) ! ([70df903](https://github.com/cube-js/cube.js/commit/70df9034f4246be06956cbf1dc69de709d4d3df8)) + + +### Features + +* **cubestore:** Introduce pre-aggregation table touch and allow to drop tables without touch using `CUBEJS_DROP_PRE_AGG_WITHOUT_TOUCH` env ([#5794](https://github.com/cube-js/cube.js/issues/5794)) ([ad6c1e8](https://github.com/cube-js/cube.js/commit/ad6c1e8d09c228c28bb957755339a1146f54d6c9)) +* persistent queue ([#5793](https://github.com/cube-js/cube.js/issues/5793)) ([02a8e02](https://github.com/cube-js/cube.js/commit/02a8e027c1f414c50cb49f257ce68c01425400ec)) + + + + + +## [0.31.25](https://github.com/cube-js/cube.js/compare/v0.31.24...v0.31.25) (2022-12-10) + + +### Bug Fixes + +* **cubesql:** normalize column names in filter node ([#5788](https://github.com/cube-js/cube.js/issues/5788)) ([28aa008](https://github.com/cube-js/cube.js/commit/28aa008d8060173b2af2052577afdc26cc32c36d)) + + + + + +## [0.31.24](https://github.com/cube-js/cube.js/compare/v0.31.23...v0.31.24) (2022-12-09) + + +### Bug Fixes + +* **cubesql:** Support `CAST` in `HAVING` clause ([17ba3e2](https://github.com/cube-js/cube.js/commit/17ba3e212fb801fbffec99ef043b443f6f2a698f)) + + +### Features + +* **api-gateway, server-core:** Added dataSources list to extended meta ([#5743](https://github.com/cube-js/cube.js/issues/5743)) ([2c5db32](https://github.com/cube-js/cube.js/commit/2c5db32f2ded074ebe5e83668eee8c024101240b)) + + +### Reverts + +* Revert "feat(api-gateway, server-core): Added dataSources list to extended meta (#5743)" (#5785) ([3c61467](https://github.com/cube-js/cube.js/commit/3c614674fed6ca17df08bbba8c835ef110167570)), closes [#5743](https://github.com/cube-js/cube.js/issues/5743) [#5785](https://github.com/cube-js/cube.js/issues/5785) +* Revert "chore(cubejs-api-gateway): added endpoint to run sql query directly (#5723)" (#5784) ([f1140de](https://github.com/cube-js/cube.js/commit/f1140de508e359970ac82b50bae1c4bf152f6041)), closes [#5723](https://github.com/cube-js/cube.js/issues/5723) [#5784](https://github.com/cube-js/cube.js/issues/5784) + + + + + +## [0.31.23](https://github.com/cube-js/cube.js/compare/v0.31.22...v0.31.23) (2022-12-09) + + +### Bug Fixes + +* **jdbc-driver:** set default encoding ([#5773](https://github.com/cube-js/cube.js/issues/5773)) ([734167a](https://github.com/cube-js/cube.js/commit/734167a4fd555d15f722945fe5d2957663a144df)) + + +### Features + +* query limits ([#5763](https://github.com/cube-js/cube.js/issues/5763)) ([4ec172b](https://github.com/cube-js/cube.js/commit/4ec172b3dd27193d145afcdb8d9bf7ef1bd7505d)) +* **cubesql:** Support `CASE` statements in cube projection ([e7ae68c](https://github.com/cube-js/cube.js/commit/e7ae68c1afcb1152c0248f61ee355f0b30cc9b73)) +* introducing query persistent flag ([#5744](https://github.com/cube-js/cube.js/issues/5744)) ([699e772](https://github.com/cube-js/cube.js/commit/699e772be0e2e1b6eef4e59ff8e3857d1166bcef)) + + + + + +## [0.31.22](https://github.com/cube-js/cube.js/compare/v0.31.21...v0.31.22) (2022-12-07) + + +### Bug Fixes + +* **cubesql:** Metabase - auto-generated charts for cubes containing string dimensions ([#5728](https://github.com/cube-js/cube.js/issues/5728)) ([72be686](https://github.com/cube-js/cube.js/commit/72be68671faaa4c938374f95cb8cb81578ef4fdb)) +* **cubestore:** Added long running job fetches burst network ([385c4a6](https://github.com/cube-js/cube.js/commit/385c4a6f92e2da209804276d85f1dec1d404ed8e)) +* **cubestore:** Increase default stale stream timeout to allow replays to catch up with large kafka streams ([43cf0b1](https://github.com/cube-js/cube.js/commit/43cf0b1c700c5fc15ed907c694916569e5647bf3)) +* **cubestore:** Row with id 1 is not found for SchemaRocksTable -- fix log replay order during metastore loading from dump ([b74c072](https://github.com/cube-js/cube.js/commit/b74c0721fb8d62d9e52570a3d5b883604b00648c)) +* **playground:** reload the page in case chunks got stale ([#5646](https://github.com/cube-js/cube.js/issues/5646)) ([2215595](https://github.com/cube-js/cube.js/commit/2215595369ac0ceab89c95760ecea6e9fd9cc1af)) +* return failed query request ids ([#5729](https://github.com/cube-js/cube.js/issues/5729)) ([22cd580](https://github.com/cube-js/cube.js/commit/22cd580c412a64ce92dd1410f13af19709c27b9d)) + + +### Features + +* **playground:** yaml rollup support ([#5727](https://github.com/cube-js/cube.js/issues/5727)) ([7a267f9](https://github.com/cube-js/cube.js/commit/7a267f99def74fe56f1505c7d56d42ea0c24f842)) + + + + + +## [0.31.21](https://github.com/cube-js/cube.js/compare/v0.31.20...v0.31.21) (2022-12-06) + + +### Bug Fixes + +* **cubestore:** `Error in processing loop: Row with id is not found for JobRocksTable` for streaming jobs ([f2de503](https://github.com/cube-js/cube.js/commit/f2de503365c4dece0b01a2f8817b231ab0fced4e)) +* **cubestore:** Avoid streaming jobs waiting for regular jobs to complete ([#5725](https://github.com/cube-js/cube.js/issues/5725)) ([89d5bf4](https://github.com/cube-js/cube.js/commit/89d5bf4eda6d2b8ba41febe121322aba5605d107)) +* **cubestore:** Chunk all streaming input into bigger chunks based on time spent in write chunk operations and remove sequence gap checks as those fail for tables ([1f2d9bf](https://github.com/cube-js/cube.js/commit/1f2d9bf6f1df8e8d961300d4c632240bc5290eb3)) +* **cubestore:** Replay streams with `earliest` offset even for `latest` setting after failure ([7ca71f5](https://github.com/cube-js/cube.js/commit/7ca71f5969f9550151afcd646864a4d5eaeca3ab)) +* **cubestore:** ReplayHandle reconcile fails due to merge ReplayHandles with Chunks ([#5713](https://github.com/cube-js/cube.js/issues/5713)) ([ac213a7](https://github.com/cube-js/cube.js/commit/ac213a7bb648fbe4a6f645227640d7085a0b578e)) +* **cubestore:** Streaming jobs stuck as stale ([1cf3432](https://github.com/cube-js/cube.js/commit/1cf3432c23a20ec682a40fd0f86192b98b0a6fc0)) +* **databricks-jdbc:** Databricks pre-aggregations schema with UC ([#5726](https://github.com/cube-js/cube.js/issues/5726)) ([6281471](https://github.com/cube-js/cube.js/commit/6281471ad981372a938449114cd51e5cf1326884)) +* **playground:** clear search value ([#5720](https://github.com/cube-js/cube.js/issues/5720)) ([5b177f2](https://github.com/cube-js/cube.js/commit/5b177f2531789928a75f1e0c47c8f25bdd7c0251)) +* More explanatory `No pre-aggregation partitions were built yet` message ([#5702](https://github.com/cube-js/cube.js/issues/5702)) ([ec39baa](https://github.com/cube-js/cube.js/commit/ec39baa80b9980e4b72be31c53f6704884b8ac5c)) + + + + + +## [0.31.20](https://github.com/cube-js/cube.js/compare/v0.31.19...v0.31.20) (2022-12-02) + + +### Bug Fixes + +* **clickhouse-driver:** Make ClickHouse driver `readOnly` by default ([e6a85d1](https://github.com/cube-js/cube.js/commit/e6a85d1856ee0a7d6b2b4f3e59f6e8edaed609a2)), closes [#5479](https://github.com/cube-js/cube.js/issues/5479) +* **clickhouse-driver:** ParserError("Expected ',' or ')' after column definition, found: (") when Nullable(Float64) is present ([81b2247](https://github.com/cube-js/cube.js/commit/81b224747f1423f263f384546f182b3d47f22a3d)) +* **cubesql:** Fix escape symbols in `LIKE` expressions ([5f3cd50](https://github.com/cube-js/cube.js/commit/5f3cd50ea311900adc27ba2b30c72a05a3453a1d)) +* **cubestore:** Orphaned replay handles after table drop ([0e4b876](https://github.com/cube-js/cube.js/commit/0e4b876556d8d88e6fb3e4270d6a7852acb0fd00)) +* **cubestore:** Sort by seq column to reduce Unexpected sequence increase gap ([b5f06d0](https://github.com/cube-js/cube.js/commit/b5f06d0c10217f6e193e6729adba30e2d9af2b92)) +* **oracle-driver:** Make oracle driver `readOnly` by default so pre-aggregations can be used ([5efccba](https://github.com/cube-js/cube.js/commit/5efccbaa8e15d4c85f59f0465bca62a919ace78b)) + + +### Features + +* **cubesql:** Support Thoughtspot include filter search ([745fe5d](https://github.com/cube-js/cube.js/commit/745fe5d2806b4c6c9e76d6061aa038892ec7438f)) +* **cubesql:** Support ThoughtSpot search filters ([ee0fde4](https://github.com/cube-js/cube.js/commit/ee0fde4798894c619f63cfd87cfc118c7ff1fc78)) + + + + + +## [0.31.19](https://github.com/cube-js/cube.js/compare/v0.31.18...v0.31.19) (2022-11-29) + + +### Bug Fixes + +* Incorrect filter pushdown when filtering two left-joined tables ([#5685](https://github.com/cube-js/cube.js/issues/5685)) ([c775869](https://github.com/cube-js/cube.js/commit/c77586961078ec67395af39e3f233025833d4f6e)), closes [#3777](https://github.com/cube-js/cube.js/issues/3777) +* packages/cubejs-client-core/package.json to reduce vulnerabilities ([#5352](https://github.com/cube-js/cube.js/issues/5352)) ([76e8e43](https://github.com/cube-js/cube.js/commit/76e8e43c05d857ce4338d0d184a987e4edae735c)) +* packages/cubejs-client-vue/package.json to reduce vulnerabilities ([#5361](https://github.com/cube-js/cube.js/issues/5361)) ([effc694](https://github.com/cube-js/cube.js/commit/effc694b29da181899ff74f7f0107eeaa9aaec76)) +* packages/cubejs-query-orchestrator/package.json to reduce vulnerabilities ([#5347](https://github.com/cube-js/cube.js/issues/5347)) ([3442ddf](https://github.com/cube-js/cube.js/commit/3442ddf319caeae8c5506f4cec0fde1ebcf9d147)) +* packages/cubejs-schema-compiler/package.json to reduce vulnerabilities ([#5359](https://github.com/cube-js/cube.js/issues/5359)) ([cd81554](https://github.com/cube-js/cube.js/commit/cd81554079533eae2c35ce142b26ad862b6e250d)) +* packages/cubejs-schema-compiler/package.json to reduce vulnerabilities ([#5408](https://github.com/cube-js/cube.js/issues/5408)) ([6b7a95f](https://github.com/cube-js/cube.js/commit/6b7a95f96dacb42a0a50fe77afcc11216f10c29a)) +* packages/cubejs-templates/package.json to reduce vulnerabilities ([#5342](https://github.com/cube-js/cube.js/issues/5342)) ([825605a](https://github.com/cube-js/cube.js/commit/825605aa8d85dca29b6d3d7a230e361c1374746b)) + + +### Features + +* catalog support for the Databricks driver ([#5666](https://github.com/cube-js/cube.js/issues/5666)) ([de5ba9a](https://github.com/cube-js/cube.js/commit/de5ba9a247543b432ea82b4371ddb052f1c91227)) + + + + + +## [0.31.18](https://github.com/cube-js/cube.js/compare/v0.31.17...v0.31.18) (2022-11-28) + + +### Bug Fixes + +* **cubesql:** Prevent infinite limit push down ([f26d40a](https://github.com/cube-js/cube.js/commit/f26d40a3b91a2651811cfa622424c6ed2e44dfef)) +* **cubesql:** Push down projection to CubeScan with literals ([207616d](https://github.com/cube-js/cube.js/commit/207616d8e51649a78b854b02fc83611472aea715)) + + +### Features + +* **cubesql:** Sigma Computing date filters ([404e3f4](https://github.com/cube-js/cube.js/commit/404e3f42ac02be8c0c9eaacb6cf81bb516616001)) +* yaml schema generation ([#5676](https://github.com/cube-js/cube.js/issues/5676)) ([fc0b810](https://github.com/cube-js/cube.js/commit/fc0b81016e5c66156d06f6834187d3323e9e8ca8)) + + + + + +## [0.31.17](https://github.com/cube-js/cube.js/compare/v0.31.16...v0.31.17) (2022-11-23) + + +### Features + +* **cubestore:** Introduce CacheStore ([#5607](https://github.com/cube-js/cube.js/issues/5607)) ([36dee61](https://github.com/cube-js/cube.js/commit/36dee61de05b544edb2b413afa4b9582f81a5eec)) + + + + + +## [0.31.16](https://github.com/cube-js/cube.js/compare/v0.31.15...v0.31.16) (2022-11-23) + + +### Features + +* **ksql-driver:** Support offset earliest, replays and per partition streaming ([#5663](https://github.com/cube-js/cube.js/issues/5663)) ([3a79d02](https://github.com/cube-js/cube.js/commit/3a79d02c9794b5e437a52f9f0be72eb82a92805a)) + + + + + +## [0.31.15](https://github.com/cube-js/cube.js/compare/v0.31.14...v0.31.15) (2022-11-17) + + +### Bug Fixes + +* **@cubejs-backend/snowflake-driver:** Make `CUBEJS_DB_SNOWFLAKE_CLIENT_SESSION_KEEP_ALIVE=true` by default ([be12c40](https://github.com/cube-js/cube.js/commit/be12c40ca7acda11409774f5aa407741fdfde871)) +* `extends` YAML support ([982885e](https://github.com/cube-js/cube.js/commit/982885e8e41b351e27919551688f50f7e5af3a5a)) +* **client-react:** check meta changes ([4c44551](https://github.com/cube-js/cube.js/commit/4c44551b880bd4ff34d443241c1c0c28cae0d5f8)) +* **druid-driver:** Respect day light saving ([#5613](https://github.com/cube-js/cube.js/issues/5613)) ([388c992](https://github.com/cube-js/cube.js/commit/388c992ca7a2d3730249fafb2a53b3accff21451)) +* packages/cubejs-client-core/package.json to reduce vulnerabilities ([#5415](https://github.com/cube-js/cube.js/issues/5415)) ([fb2de68](https://github.com/cube-js/cube.js/commit/fb2de682670bd28b2879d0460fac990d9b653dce)) +* packages/cubejs-client-react/package.json to reduce vulnerabilities ([#5390](https://github.com/cube-js/cube.js/issues/5390)) ([0ab9c30](https://github.com/cube-js/cube.js/commit/0ab9c30692c70d3776a8429197915090fef61d4f)) +* packages/cubejs-databricks-jdbc-driver/package.json to reduce vulnerabilities ([#5413](https://github.com/cube-js/cube.js/issues/5413)) ([6a891f0](https://github.com/cube-js/cube.js/commit/6a891f0bc34dcaa8c955cd0ac20121d4d074e228)) +* packages/cubejs-databricks-jdbc-driver/package.json to reduce vulnerabilities ([#5429](https://github.com/cube-js/cube.js/issues/5429)) ([a45c9a8](https://github.com/cube-js/cube.js/commit/a45c9a828b38d13da9a4194fdfc23e11674aa7cd)) +* packages/cubejs-query-orchestrator/package.json to reduce vulnerabilities ([#5409](https://github.com/cube-js/cube.js/issues/5409)) ([5e9fe68](https://github.com/cube-js/cube.js/commit/5e9fe68b40164ca12e9cecb0aefda31c06b57f28)) +* packages/cubejs-templates/package.json to reduce vulnerabilities ([#5403](https://github.com/cube-js/cube.js/issues/5403)) ([c9706cb](https://github.com/cube-js/cube.js/commit/c9706cbfcd6480dbd58ca18ab064ded185f710d3)) +* **server-core:** Force flush events if their count is greater than the agent frame size ([#5602](https://github.com/cube-js/cube.js/issues/5602)) ([17d1d98](https://github.com/cube-js/cube.js/commit/17d1d989bd03459adae1e6c6714843fc82d99163)) + + +### Features + +* **databricks-jdbc:** jdbc (jar) driver update ([#5610](https://github.com/cube-js/cube.js/issues/5610)) ([aacd8cd](https://github.com/cube-js/cube.js/commit/aacd8cd356429e4da21749b92eb457c03a1a3f76)) +* **databricks-jdbc:** jdbc (jar) driver update ([#5612](https://github.com/cube-js/cube.js/issues/5612)) ([372ed71](https://github.com/cube-js/cube.js/commit/372ed71c6edd61d862d62cb0522fbc47c0f997b2)) +* **docs:** add new component to display code snippets side-by-side ([146328c](https://github.com/cube-js/cube.js/commit/146328c7e7eab41c7cfe4e67d26af58eeca9c09c)) +* Replace YAML parser to provide more meaningful parse errors ([9984066](https://github.com/cube-js/cube.js/commit/99840665ee31aa8f14cf9c83b19d4a4cbc3a978a)) +* Support snake case in YAML relationship field ([f20fe6b](https://github.com/cube-js/cube.js/commit/f20fe6baa43142589a5a85be5af1daefb56acd8b)) + + +### Reverts + +* Revert "feat(databricks-jdbc): jdbc (jar) driver update (#5610)" (#5611) ([23ed416](https://github.com/cube-js/cube.js/commit/23ed416d9540afc4fe027f7e3c6917af387f06f7)), closes [#5610](https://github.com/cube-js/cube.js/issues/5610) [#5611](https://github.com/cube-js/cube.js/issues/5611) + + + + + +## [0.31.14](https://github.com/cube-js/cube.js/compare/v0.31.13...v0.31.14) (2022-11-14) + + +### Bug Fixes + +* **cubesql:** Allow referencing CTEs in UNION ([7f5bc83](https://github.com/cube-js/cube.js/commit/7f5bc8316d6119ffe1703bc1bb41e54586f9d19b)) +* **cubesql:** Keep CubeScan literal values relation ([6d3856a](https://github.com/cube-js/cube.js/commit/6d3856acdfeea8d93866a1f36513016a5a04b2e8)) +* **playground:** schemaVersion updates ([5c4880f](https://github.com/cube-js/cube.js/commit/5c4880f1fa30189798c0b0ea42df67c7fd0aea75)) + + +### Features + +* **@cubejs-backend/mssql-driver:** Make MSSQL `readOnly` by default ([#5584](https://github.com/cube-js/cube.js/issues/5584)) ([ddf0369](https://github.com/cube-js/cube.js/commit/ddf036992aebc61fdd99d2a67753c63528bba9db)) +* **cubesql:** Join Cubes ([#5585](https://github.com/cube-js/cube.js/issues/5585)) ([c687e42](https://github.com/cube-js/cube.js/commit/c687e42f9280f611152f7c154fdf136e6d9ce402)) +* **playground:** ability to rerun queries ([#5597](https://github.com/cube-js/cube.js/issues/5597)) ([6ef8ce9](https://github.com/cube-js/cube.js/commit/6ef8ce91740086dc0b10ea11d7133f8be1e2ef0a)) + + + + + +## [0.31.13](https://github.com/cube-js/cube.js/compare/v0.31.12...v0.31.13) (2022-11-08) + + +### Bug Fixes + +* Make Trino driver CommonJS compatible ([#5581](https://github.com/cube-js/cube.js/issues/5581)) ([ca8fd4e](https://github.com/cube-js/cube.js/commit/ca8fd4e42f4d8f87667507920f02cbb1a7072763)) +* **cubestore:** Merge for streaming union ([#5554](https://github.com/cube-js/cube.js/issues/5554)) ([310649a](https://github.com/cube-js/cube.js/commit/310649af9a280484481dc09063178c07f3f36131)) + + +### Features + +* export bucket CVS files escape symbol support ([#5570](https://github.com/cube-js/cube.js/issues/5570)) ([09ceffb](https://github.com/cube-js/cube.js/commit/09ceffbefc75417555f8ff90f6277bd9c419d751)) +* notStartsWith/notEndsWith filters support ([#5579](https://github.com/cube-js/cube.js/issues/5579)) ([8765833](https://github.com/cube-js/cube.js/commit/87658333df0194db07c3ce0ae6f94a292f8bd592)) +* YAML snake case and `.yaml` extension support ([#5578](https://github.com/cube-js/cube.js/issues/5578)) ([c8af286](https://github.com/cube-js/cube.js/commit/c8af2864af2dcc532abdc3629cf58893d874c190)) + + + + + +## [0.31.12](https://github.com/cube-js/cube.js/compare/v0.31.11...v0.31.12) (2022-11-05) + + +### Bug Fixes + +* Cannot read property 'apply' of undefined on missed dimension sql ([#5559](https://github.com/cube-js/cube.js/issues/5559)) ([6f85096](https://github.com/cube-js/cube.js/commit/6f850967ba834bbdd87284fa957859d66d19344a)) +* YAML filter support ([fb6fade](https://github.com/cube-js/cube.js/commit/fb6fade4bfa5b0fb2e3b6895e378aef97ea26f95)) +* **cubestore:** Fix partition pruning ([#5548](https://github.com/cube-js/cube.js/issues/5548)) ([8bc4aee](https://github.com/cube-js/cube.js/commit/8bc4aeeff5502d2e17763bf503ebe396227b48ae)) +* No column found in case non equals filter query incorrectly matched against rollup with no dimensions ([#5552](https://github.com/cube-js/cube.js/issues/5552)) ([73b3203](https://github.com/cube-js/cube.js/commit/73b3203925bf9d8221001f730bb23272dd4e47e6)) +* TypeError: Cannot read property 'dimension' of undefined for rolling window rollup without time dimension ([#5553](https://github.com/cube-js/cube.js/issues/5553)) ([03c3b6f](https://github.com/cube-js/cube.js/commit/03c3b6f4197ff8e6a77fc6bb7c08e4730cbfde66)) + + +### Features + +* Trino driver ([e58c392](https://github.com/cube-js/cube.js/commit/e58c3924781b65f5631ee241b39a0bee1366273d)) +* **cubesql:** Support Skyvia date granularities ([df69d93](https://github.com/cube-js/cube.js/commit/df69d93e3f0c016d4767e0509ca523b60bc74099)) + + + + + +## [0.31.11](https://github.com/cube-js/cube.js/compare/v0.31.10...v0.31.11) (2022-11-02) + + +### Bug Fixes + +* **@cubejs-backend/prestodb-driver:** Replace double escaping in contain filter ([#5529](https://github.com/cube-js/cube.js/issues/5529)) ([7870705](https://github.com/cube-js/cube.js/commit/7870705b04697faf8cb994c0794bc86437a9e3cf)), closes [#5528](https://github.com/cube-js/cube.js/issues/5528) +* **cubestore:** Fix streaming index ([#5550](https://github.com/cube-js/cube.js/issues/5550)) ([061305e](https://github.com/cube-js/cube.js/commit/061305e7a7549ae2d79e5391afd79f3d2af7d628)) + + +### Features + +* **cubestore:** Sealing partition ([#5523](https://github.com/cube-js/cube.js/issues/5523)) ([70ee72c](https://github.com/cube-js/cube.js/commit/70ee72cca5b9a77bf14994f05b0e77148089362c)) + + + + + +## [0.31.10](https://github.com/cube-js/cube.js/compare/v0.31.9...v0.31.10) (2022-11-01) + + +### Bug Fixes + +* Revert back strict shown checks behavior for consistency reasons ([#5551](https://github.com/cube-js/cube.js/issues/5551)) ([c3ee4e6](https://github.com/cube-js/cube.js/commit/c3ee4e6911d07f7d5cb8977f563555157f7b5f2b)), closes [#5542](https://github.com/cube-js/cube.js/issues/5542) + + + + + +## [0.31.9](https://github.com/cube-js/cube.js/compare/v0.31.8...v0.31.9) (2022-11-01) + + +### Bug Fixes + +* **@cubejs-client/core:** `startsWith` and `endsWith` to filterOperatorsForMember ([#5544](https://github.com/cube-js/cube.js/issues/5544)) ([583de4a](https://github.com/cube-js/cube.js/commit/583de4a58c841542f3138c5ce836dbfedd19d4de)) +* You requested hidden member in case of rolling window measure is being used in a view ([#5546](https://github.com/cube-js/cube.js/issues/5546)) ([c00ea43](https://github.com/cube-js/cube.js/commit/c00ea432021a02638361b278f8eb24801a7a867b)) + + + + + +## [0.31.8](https://github.com/cube-js/cube.js/compare/v0.31.7...v0.31.8) (2022-10-30) + + +### Bug Fixes + +* **cubesql:** Count measure type changed from u64 to i64 ([#5535](https://github.com/cube-js/cube.js/issues/5535)) ([f568851](https://github.com/cube-js/cube.js/commit/f568851948cff16ddc53a974d46a77a8698dbdf1)) + + +### Features + +* YAML support ([#5539](https://github.com/cube-js/cube.js/issues/5539)) ([29c19db](https://github.com/cube-js/cube.js/commit/29c19db9315ef7ad40350150f74f9519d6ff4a98)) +* **cubesql:** Support `BOOL_AND`, `BOOL_OR` aggregate functions ([#5533](https://github.com/cube-js/cube.js/issues/5533)) ([a2e6e38](https://github.com/cube-js/cube.js/commit/a2e6e386557bfbf43b2a4907c1fa3aef07ea90f2)) +* **cubesql:** Support Sigma Computing number filters ([f2f2abd](https://github.com/cube-js/cube.js/commit/f2f2abdbdafdd4669e1bd223b5b2f50a24c42b86)) +* **cubesql:** Thoughspot - count distinct with year and month ([#5450](https://github.com/cube-js/cube.js/issues/5450)) ([d44baad](https://github.com/cube-js/cube.js/commit/d44baad34dab8dbf70aa7c9b011dfe17f93b1375)) + + + + + +## [0.31.7](https://github.com/cube-js/cube.js/compare/v0.31.6...v0.31.7) (2022-10-27) + + +### Bug Fixes + +* Remove empty hidden cubes from meta ([#5531](https://github.com/cube-js/cube.js/issues/5531)) ([f93e851](https://github.com/cube-js/cube.js/commit/f93e8515598fd90708606220dd5d96b4e2396fd6)) + + +### Features + +* **cubesql:** Support `is null`, `is not null` in SELECT ([d499c47](https://github.com/cube-js/cube.js/commit/d499c47c6cec4ac7b72d26418598bfbe515c6c62)) +* **cubesql:** Support Sigma Computing string filters ([d18b971](https://github.com/cube-js/cube.js/commit/d18b9712c4eae1ced2b8f94681e1676d854e99a5)) + + + + + +## [0.31.6](https://github.com/cube-js/cube.js/compare/v0.31.5...v0.31.6) (2022-10-20) + + +### Bug Fixes + +* **docker:** Correct lock for deps with yarn.lock ([#5509](https://github.com/cube-js/cube.js/issues/5509)) ([97ca524](https://github.com/cube-js/cube.js/commit/97ca524556178a1210c796ee5bac42d476c7c3df)) + + +### Features + +* **snowflake-driver:** Upgrade snowflake-sdk ([#5508](https://github.com/cube-js/cube.js/issues/5508)) ([2863a93](https://github.com/cube-js/cube.js/commit/2863a93508c8ddf7a4a78a45386b79c2ae5f5ed6)) + + + + + +## [0.31.5](https://github.com/cube-js/cube.js/compare/v0.31.4...v0.31.5) (2022-10-20) + + +### Bug Fixes + +* **cubesql:** Use real database name in Postgres meta layer ([031a90f](https://github.com/cube-js/cube.js/commit/031a90fac068ce35f18823a034f65b486153c726)) + + +### Features + +* **cubesql:** Allow `EXTRACT` field to be parsed as a string ([cad1e0b](https://github.com/cube-js/cube.js/commit/cad1e0b4452233866f87d3856823ef81ca117444)) +* **cubestore:** CC-1133 - add headers to telemetry request ([#5473](https://github.com/cube-js/cube.js/issues/5473)) ([26fa817](https://github.com/cube-js/cube.js/commit/26fa8173961adfc756cee0a9bb626219f33c35b2)) +* pre-aggregations build jobs API endpoint ([#5251](https://github.com/cube-js/cube.js/issues/5251)) ([4aee3ef](https://github.com/cube-js/cube.js/commit/4aee3efba9c14b4698c81707d92af11c98978c81)) + + + + + +## [0.31.4](https://github.com/cube-js/cube.js/compare/v0.31.3...v0.31.4) (2022-10-13) + + +### Bug Fixes + +* **cubestore:** Extension planner for LogicalAlias error ([#5459](https://github.com/cube-js/cube.js/issues/5459)) ([8153459](https://github.com/cube-js/cube.js/commit/8153459c70ddf9acef7e886a6e44971c1aa82660)) +* **druid-driver:** query timezone fix ([#5372](https://github.com/cube-js/cube.js/issues/5372)) ([ccad5fc](https://github.com/cube-js/cube.js/commit/ccad5fc58e23c55283c8e3014908cb51fa5b5fbc)) + + +### Features + +* `shown` flag for cubes and views ([#5455](https://github.com/cube-js/cube.js/issues/5455)) ([e7ef446](https://github.com/cube-js/cube.js/commit/e7ef4467adfc581e07c14b315a43c0eb4d1e8c11)) + + + + + +## [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) + + +### Bug Fixes + +* Added connection test completed successfully log ([#5444](https://github.com/cube-js/cube.js/issues/5444)) ([a8e1180](https://github.com/cube-js/cube.js/commit/a8e1180d4c05e8de94b116f46f40db531d91e0eb)) +* Temp tables dropped for ksql after successfully created ([#5445](https://github.com/cube-js/cube.js/issues/5445)) ([7726c82](https://github.com/cube-js/cube.js/commit/7726c82fc833a6b14eeeb498a31df62ba9818336)) +* **cubesql:** Handle Panic on simple query executiony ([#5394](https://github.com/cube-js/cube.js/issues/5394)) ([84dc442](https://github.com/cube-js/cube.js/commit/84dc442eb1c42bc3c7b7b03fe365c7c0a948e328)) + + +### Features + +* **mssql-driver:** add column type mapping for a bit type ([#5442](https://github.com/cube-js/cube.js/issues/5442)) ([0ed7ba4](https://github.com/cube-js/cube.js/commit/0ed7ba4b483fff8653602f89f43bd1b03b458859)) +* Includes and Excludes directives for Cube Views ([#5437](https://github.com/cube-js/cube.js/issues/5437)) ([7c35604](https://github.com/cube-js/cube.js/commit/7c356049b56a0ea58a4ad8f2628ffaff2ac307d4)) +* **cubesql:** Support boolean decoding in pg-wire ([#5436](https://github.com/cube-js/cube.js/issues/5436)) ([4fd2ee6](https://github.com/cube-js/cube.js/commit/4fd2ee6cd238161f889896739a00f09e6dc11651)) + + + + + +## [0.31.1](https://github.com/cube-js/cube.js/compare/v0.31.0...v0.31.1) (2022-10-04) + + +### Bug Fixes + +* Cube not found for path due to FILTER_PARAMS are used in members ([#5417](https://github.com/cube-js/cube.js/issues/5417)) ([bfe76bf](https://github.com/cube-js/cube.js/commit/bfe76bfbf3bd5f51a408088f8f5fefb35e17e22f)) +* **extensions:** fix SELECT handling in the Funnels extensions ([#5397](https://github.com/cube-js/cube.js/issues/5397)) ([041f591](https://github.com/cube-js/cube.js/commit/041f591482cc75d840310a9b7592158c1b33fa37)) +* **playground:** bar chart pivot config ([36b9ec2](https://github.com/cube-js/cube.js/commit/36b9ec2f3de5ba3b6b047f3669f8e162321d854e)) + + +### Features + +* **console-ui:** show error stack trace ([7ab15c6](https://github.com/cube-js/cube.js/commit/7ab15c6fbd46696d36c95f197711284d316c9f70)) + + + + + +# [0.31.0](https://github.com/cube-js/cube.js/compare/v0.30.75...v0.31.0) (2022-10-03) + + +* feat!: Cube Views implementation (#5278) ([9937356](https://github.com/cube-js/cube.js/commit/99373563b610d1f15dfc44fafac0c329c1dc9a0d)), closes [#5278](https://github.com/cube-js/cube.js/issues/5278) + + +### Bug Fixes + +* **cubesql:** Allow derived tables to have a dot in column name ([#5391](https://github.com/cube-js/cube.js/issues/5391)) ([f83009c](https://github.com/cube-js/cube.js/commit/f83009cf193a6313296dddffa45bffa08ec01725)) +* **cubesql:** cast strings to timestamp ([#5331](https://github.com/cube-js/cube.js/issues/5331)) ([a706258](https://github.com/cube-js/cube.js/commit/a706258f85faa3f99150127a2c78f885e99e3aaf)) +* **cubesql:** Metabase - substring __user ([#5328](https://github.com/cube-js/cube.js/issues/5328)) ([a25c8bf](https://github.com/cube-js/cube.js/commit/a25c8bf3ddad9c589918b91f05df440eb31a2ad4)) +* **cubesql:** udf format_type prepared statement fix ([#5260](https://github.com/cube-js/cube.js/issues/5260)) ([307ed1b](https://github.com/cube-js/cube.js/commit/307ed1b6cc9b242e76d48241cb871b36f571f91e)) +* **cubesql:** WHERE Lower / Upper in list with multiply items ([#5376](https://github.com/cube-js/cube.js/issues/5376)) ([2269b2b](https://github.com/cube-js/cube.js/commit/2269b2bb41293107f8e8fca118218c56bf3eca53)) +* **cubestore:** Aggregate function MERGE not allowed for column type bytes ([#5166](https://github.com/cube-js/cube.js/issues/5166)) ([7626ed5](https://github.com/cube-js/cube.js/commit/7626ed5fa308854ba625f0956c29b21c84484b67)) +* **cubestore:** Fix error: Internal: channel closed on the next request after cubestore cloud process got OOM ([#5238](https://github.com/cube-js/cube.js/issues/5238)) ([cb81fdb](https://github.com/cube-js/cube.js/commit/cb81fdb79c5b768892831437659e1591773d8e15)) +* **postgres-driver:** release method should not throw ([#5395](https://github.com/cube-js/cube.js/issues/5395)) ([9423f46](https://github.com/cube-js/cube.js/commit/9423f46141eb73eaac24d9b16c449ff2dbc2918a)) +* **query-orchestrator:** pre-aggs build range queries cache key alignment ([#5377](https://github.com/cube-js/cube.js/issues/5377)) ([5896c4a](https://github.com/cube-js/cube.js/commit/5896c4aa4d5a469a892ca9f0e758dc5c6ef6c350)) +* **schema-compiler:** throw an error for the empty pre-aggs ([#5392](https://github.com/cube-js/cube.js/issues/5392)) ([4afd604](https://github.com/cube-js/cube.js/commit/4afd6041dae8175fb8d292e9ee0db15969239c81)) + + +### Features + +* **cubesql:** Holistics - in dates list filter ([#5333](https://github.com/cube-js/cube.js/issues/5333)) ([94b6509](https://github.com/cube-js/cube.js/commit/94b650928a81be9ea203e50612ea194d9558b298)) +* **cubesql:** Support joins with distinct ([#5340](https://github.com/cube-js/cube.js/issues/5340)) ([da4304f](https://github.com/cube-js/cube.js/commit/da4304fef51e33d9c29627d9da92925569943083)) +* multiple data source ([#5326](https://github.com/cube-js/cube.js/issues/5326)) ([334af8c](https://github.com/cube-js/cube.js/commit/334af8c56cd02ae551844e9d1e9ab5e107fb1555)) +* **cubesql:** Add `float8`, `bool` casts ([b345ade](https://github.com/cube-js/cube.js/commit/b345ade898d6a0ec14e320d66129e985244cddb4)) +* **cubesql:** Allow `char_length` function to be used with cubes ([e99344f](https://github.com/cube-js/cube.js/commit/e99344f4e056ef6698f5d92c9e8b79801871a199)) +* **cubesql:** Allow filter by exact year (Tableau) ([#5367](https://github.com/cube-js/cube.js/issues/5367)) ([c31e59d](https://github.com/cube-js/cube.js/commit/c31e59d4763e0dd45e96b8e39eb9bcf914370eae)) +* **cubesql:** Holistics - support range of charts ([#5325](https://github.com/cube-js/cube.js/issues/5325)) ([d16b4c2](https://github.com/cube-js/cube.js/commit/d16b4c2dc0a582d8e28e48a1e5fae3ff2fe7b0de)) +* **cubesql:** Support `date_trunc` over column filter with `<=` ([b30d239](https://github.com/cube-js/cube.js/commit/b30d239ae4e00d8d547f0aa65b324f1f0d3af3f1)) +* **query-orchestrator:** introduce unload without temp table ([#5324](https://github.com/cube-js/cube.js/issues/5324)) ([3dcbd2e](https://github.com/cube-js/cube.js/commit/3dcbd2ed1d214d56bfde2183538fce3ec7d65595)) +* **testing:** databricks test suite ([#5311](https://github.com/cube-js/cube.js/issues/5311)) ([b77f33b](https://github.com/cube-js/cube.js/commit/b77f33ba9d804d8ca8746fe99d6050ebe26b4528)) + + +### BREAKING CHANGES + +* The logic of how cubes are included in joins has been changed. There are multiple member reference constructs that are now forbidden and should be rewritten. You can't reference foreign cubes anymore to define members inside other cubes: `${ForeignCube}.foo`. `foo` member should be defined in `ForeignCube` and referenced as `${ForeignCube.foo}`. You also can't mix references and members without `CUBE` self-reference. For example `${ForeignCube.foo} + bar` is invalid and `${ForeignCube.foo} + ${CUBE}.bar` should be used instead. If not fixed, it'll lead to missing tables in the `FROM` clause. + + + + + ## [0.30.75](https://github.com/cube-js/cube.js/compare/v0.30.74...v0.30.75) (2022-09-22) diff --git a/CODEOWNERS b/CODEOWNERS index 8e80c6cd84d37..d4b73a3fe7aa6 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -24,8 +24,8 @@ /packages/cubejs-schema-compiler/ @cube-js/schema-compiler /packages/*-schema-extension/ @cube-js/schema-compiler +# Doc reviewers +/docs/ @cube-js/doc-reviewers + # Developer Relations and Community -*.md @cube-js/developer-relations-and-community -/docs/ @cube-js/developer-relations-and-community /examples/ @cube-js/developer-relations-and-community -/guides/ @cube-js/developer-relations-and-community diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 36411b53c335c..e9961d1f69305 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,10 +1,10 @@ -# Contributing to Cube.js +# Contributing to Cube -Thanks for taking the time for contribution to Cube.js! +Thanks for taking the time for contribution to Cube! We're very welcoming community and while it's very much appreciated if you follow these guidelines it's not a requirement. ## Code of Conduct -This project and everyone participating in it is governed by the [Cube.js Code of Conduct](./CODE_OF_CONDUCT.md). +This project and everyone participating in it is governed by the [Cube Code of Conduct](./CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to conduct@cube.dev. ## Contributing Code Changes @@ -13,36 +13,32 @@ Please review the following sections before proposing code changes. ### License -- Cube.js Client is [MIT licensed](./packages/cubejs-client-core/LICENSE). -- Cube.js Backend is [Apache 2.0 licensed](./packages/cubejs-server/LICENSE). +- Cube Client is [MIT licensed](./packages/cubejs-client-core/LICENSE). +- Cube Backend is [Apache 2.0 licensed](./packages/cubejs-server/LICENSE). ### Developer Certificate of Origin (DCO) -By contributing to Cube Dev, Inc., You accept and agree to the terms and conditions in the [Developer Certificate of Origin](https://github.com/cube-js/cube.js/blob/master/DCO.md) for Your present and future Contributions submitted to Cube Dev, Inc. Your contribution includes any submissions to the [Cube.js repository](https://github.com/cube-js) when you click on such buttons as `Propose changes` or `Create pull request`. Except for the licenses granted herein, You reserve all right, title, and interest in and to Your Contributions. - -### Our quarterly roadmap - -We publish our open source roadmap every quarter and discuss them during our [monthly community calls](https://cube.dev/community-call/). You can find our roadmap under [projects in our Cube.js repository](https://github.com/cube-js/cube.js/projects?query=is%3Aopen+sort%3Aupdated-desc). +By contributing to Cube Dev, Inc., You accept and agree to the terms and conditions in the [Developer Certificate of Origin](https://github.com/cube-js/cube/blob/master/DCO.md) for Your present and future Contributions submitted to Cube Dev, Inc. Your contribution includes any submissions to the [Cube repository](https://github.com/cube-js) when you click on such buttons as `Propose changes` or `Create pull request`. Except for the licenses granted herein, You reserve all right, title, and interest in and to Your Contributions. ## Step-by-step guide to contributing -1. Find [issues](https://github.com/cube-js/cube.js/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) where we need help. Search for issues with either [`good first issue`](https://github.com/cube-js/cube.js/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22+) and/or [`help wanted`](https://github.com/cube-js/cube.js/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22help+wanted%22) labels. -2. Follow the directions in the [Getting Started guide](https://cube.dev/docs/getting-started) to get Cube.js up and running (incl. the [Developer Playground](https://cube.dev/docs/dev-tools/dev-playground)). -3. Clone the [Cube.js repo](https://github.com/cube-js/cube.js). +1. Find [issues](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) where we need help. Search for issues with either [`good first issue`](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22+) and/or [`help wanted`](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22help+wanted%22) labels. +2. Follow the directions in the [Getting Started guide](https://cube.dev/docs/getting-started) to get Cube up and running (incl. the [Developer Playground](https://cube.dev/docs/dev-tools/dev-playground)). +3. Clone the [Cube repo](https://github.com/cube-js/cube). 4. Submit your Pull Request. -5. Testing: Please include test(s) for your code contribution. See some of the test examples for [drivers](https://github.com/cube-js/cube.js/pull/1333/commits/56dadccd62ac4eaceafe650d2853406f5d3d9d43) and [backend](https://github.com/cube-js/cube.js/tree/master/packages/cubejs-backend-shared/test). -6. Documentation: When new features are added or there are changes to existing features that require updates to documentation, we encourage you to add/update any missing documentation in the [`/docs` folder](https://github.com/cube-js/cube.js/tree/master/docs). To update an existing documentation page, you can simply click on the `Edit this page` button on the top right corner of the documentation page. +5. Testing: Please include test(s) for your code contribution. Depending on a change it can be tested by unit, integration or E2E test. See some of the test examples for [drivers](https://github.com/cube-js/cube/pull/1333/commits/56dadccd62ac4eaceafe650d2853406f5d3d9d43) and [backend](https://github.com/cube-js/cube/tree/master/packages/cubejs-backend-shared/test). There're separate packages for [E2E testing](https://github.com/cube-js/cube/tree/master/packages/cubejs-testing/) and [E2E driver testing](https://github.com/cube-js/cube/tree/master/packages/cubejs-testing-drivers/). **Tests are required for most of the contributions.** +6. Documentation: When new features are added or there are changes to existing features that require updates to documentation, we encourage you to add/update any missing documentation in the [`/docs` folder](https://github.com/cube-js/cube/tree/master/docs). To update an existing documentation page, you can simply click on the `Edit this page` button on the top right corner of the documentation page. 7. Relevant team(s) will be pinged automatically for a review based on information in the `CODEOWNERS` file. ## Development Workflow ### Prerequisites -Cube.js works with Node.js 10+ and uses Yarn as a package manager. +Cube works with Node.js 10+ and uses Yarn as a package manager. -### Cube.js Docker +### Cube Docker -Cube.js offers two different types of Docker image: +Cube offers two different types of Docker image: - Stable (building from published release on npm) - Dev (building from source files, needed to test unpublished changes) @@ -51,17 +47,17 @@ For more information, take a look at [Docker Development Guide](./packages/cubej #### Stable Docker Release -1. After cloning Cube.js repository run `yarn install` in `packages/cubejs-docker` to install dependencies. +1. After cloning Cube repository run `yarn install` in `packages/cubejs-docker` to install dependencies. 2. Copy `yarn.lock` file from the project root to the `packages/cubejs-docker` folder and use `docker build -t cubejs/cube:latest -f latest.Dockerfile` in `packages/cubejs-docker` to build stable docker image manually. #### Development -1. After cloning Cube.js repository run `yarn install` to install dependencies. -2. Use `docker build -t cubejs/cube:dev -f dev.Dockerfile ../../` to build stable development image. +1. After cloning Cube repository run `yarn install` to install dependencies. +2. Use `docker build -t cubejs/cube:dev -f dev.Dockerfile ../../` in `packages/cubejs-docker` to build stable development image. -### Cube.js Client +### Cube Client -1. After cloning Cube.js repository run `yarn install` in root directory. +1. After cloning Cube repository run `yarn install` in root directory. 2. Use `yarn link` to add these packages to link registry. 3. Perform required code changes. 4. Use `yarn build` in the repository root to build CommonJS and UMD modules. @@ -69,29 +65,29 @@ For more information, take a look at [Docker Development Guide](./packages/cubej 6. Use `yarn test` where available to test your changes. 7. Ensure that any CommonJS and UMD modules are included as part of your commit. -To get set up quickly, you can perform 1) and 2) with one line from the `cube.js` clone root folder: +To get set up quickly, you can perform 1) and 2) with one line from the `cube` clone root folder: ``` $ cd packages/cubejs-client-core && yarn && yarn link && cd ../.. && cd packages/cubejs-client-react && yarn && yarn link && cd ../.. ``` -### Cube.js Server +### Cube Server #### Prerequisites If you are going to develop a JDBC driver, you need to [install Java with JDK][link-java-guide]. [link-java-guide]: -https://github.com/cube-js/cube.js/blob/master/packages/cubejs-jdbc-driver/README.md#java-installation +https://github.com/cube-js/cube/blob/master/packages/cubejs-jdbc-driver/README.md#java-installation #### Development -Cube.js is written in a mixture of plain JavaScript and TypeScript. TypeScript is preferred for new code. +Cube.is written in a mixture of JavaScript, TypeScript, and Rust. TypeScript and Rust are preferred for new code. -> Attention: Cube.js uses TypeScript configured in incremental mode, which uses cache to speed up compilation, +> Attention: Cube uses TypeScript configured in incremental mode, which uses cache to speed up compilation, > but in some cases, you can run into a problem with a not recompiled file. To fix it, we recommend running `$ yarn clean` and `$ yarn tsc`. -1. Clone the Cube.js repository, `git clone https://github.com/cube-js/cube.js`. +1. Clone the Cube repository, `git clone https://github.com/cube-js/cube`. 2. Run `yarn install` in the root directory. 3. Run `yarn build` in the root directory to build the frontend dependent packages. 4. Run `yarn build` in `packages/cubejs-playground` to build the frontend. @@ -100,16 +96,37 @@ Cube.js is written in a mixture of plain JavaScript and TypeScript. TypeScript i 7. Run `yarn install` in `packages/cubejs-` to install dependencies for drivers and dependent packages. 8. Run `yarn link @cubejs-backend/` in `packages/cubejs-server-core` to link drivers and dependent packages. 9. Run `yarn link` in `packages/cubejs-server-core`. -10. Create or choose an existing project for testing. +10. Create or choose an existing project for testing. You can generate a new one with + [cubejs-cli](https://cube.dev/docs/reference/cli) tool. 11. Run `yarn link @cubejs-backend/server-core` in your project directory. 12. Run `yarn dev` to start your testing project and verify changes. +Instead of running all of the above commands manually you can use the `dev_env_setup.sh` script: + +1. Clone the Cube repository, `git clone https://github.com/cube-js/cube`. +2. Navigate to your working projects directory and run `/path/to/cube/repo/dev_env_setup.sh`. The script will + ask you some questions and run all the required commands. In case you decide to create a new testing project, + it will be created in the current directory (that is why you probably don't want to run this script within + cube repo directory). + ### Debugging with WebStorm 1. Follow all the steps from the previous section. Make sure that the `yarn tsc:watch` daemon is running in the background. -2. Open the cube.js project in WebStorm. +2. Open the Cube project in WebStorm. 3. Create a new configuration, using `./node_modules/.bin/cubejs-server` for Node Parameters and the directory of your test project for Working directory. -4. Run/Debug dev cube.js servers using the new configuration. +4. Run/Debug dev Cube servers using the new configuration. + +## Contributing Database Drivers + +To enhance the adoption of community-contributed drivers, we decided to split the database driver contribution process into multiple stages. + +1. Each driver which is planned to be contributed to the main Cube repository should be published first as an npm package. Please see [Publishing Driver npm package](#publishing-driver-npm-package) on how to do that. +2. This NPM package should be contributed to the list of [Third-party community drivers](https://cube.dev/docs/config/databases#third-party-community-drivers). +3. Please make sure each npm package has a README with instructions on how to install it to the official docker image and how to connect it to the database. +4. Posting a backlink to an open-source repository would be a good idea here so people can provide feedback on it by posting issues. +5. Before creating PR for the main repository, please make sure it's tested with the standard Cube E2E testing suite. An example of an E2E testing suite can be found here: https://github.com/cube-js/cube/blob/master/packages/cubejs-testing/test/driver-postgres.test.ts +6. If you're creating PR for the main repo, please be prepared to become a maintainer for this driver and dedicate some time to it. There're no specific time requirements. As a rule of thumb, you should expect to spend time on a weekly basis. +7. Due to limited resources Core team will review and merge driver PRs based on popularity and development activity. ### Implementing a Driver @@ -124,12 +141,12 @@ The rest will be done by `BaseDriver` class. 6. If db requires connection pooling prefer use `generic-pool` implementation with settings similar to other db packages. 7. Make sure your driver has `release()` method in case DB expects graceful shutdowns for connections. 8. Please use yarn to add any dependencies and run `$ yarn` within the package before committing to ensure right `yarn.lock` is in place. -9. Add this driver dependency to [cubejs-server-core/core/DriverDependencies.js](https://github.com/cube-js/cube.js/blob/master/packages/cubejs-server-core/core/DriverDependencies.js#L1). +9. Add this driver dependency to [cubejs-server-core/core/DriverDependencies.js](https://github.com/cube-js/cube/blob/master/packages/cubejs-server-core/core/DriverDependencies.js#L1). ### Implementing a JDBC Driver If there's existing JDBC Driver in place for Database of interest you can just create `DbTypes` configuration inside -[cubejs-jdbc-driver/driver/JDBCDriver.js](https://github.com/statsbotco/cube.js/blob/master/packages/cubejs-jdbc-driver/driver/JDBCDriver.js#L31). +[cubejs-jdbc-driver/driver/JDBCDriver.ts](https://github.com/cube-js/cube/blob/master/packages/cubejs-jdbc-driver/src/JDBCDriver.ts). Most of the time no additional adjustments required for base `JDBCDriver` implementation as JDBC is pretty standard. In case you need to tweak it a little please follow [Implementing Driver](#implementing-driver) steps but use `JDBCDriver` as your base driver class. @@ -153,9 +170,11 @@ If driver class contains `static dialectClass()` method it'll be used to lookup ### Publishing Driver npm Package -Cube.js looks up `cubejs-{dbType}-driver` package among installed modules to fullfil driver dependency if there's no corresponding default driver for the specified database type. +Cube looks up `cubejs-{dbType}-driver` package among installed modules to fullfil driver dependency if there's no corresponding default driver for the specified database type. For example one can publish `cubejs-foo-driver` npm package to fullfil driver dependency for the `foo` database type. +## Other Packages + ### Testing Schema Compiler In order to run tests in `cubejs-schema-compiler` package you need to have running [Docker](https://docs.docker.com/install/) on your machine. diff --git a/DCO.md b/DCO.md index 03c381fcaf5ed..0572a3fde2cd6 100644 --- a/DCO.md +++ b/DCO.md @@ -10,7 +10,7 @@ contribute and that they understand that the contribution is under the terms of the [Cube.js project licenses][link-licenses]. [link-licenses]: - https://github.com/cube-js/cube.js/blob/master/README.md#license + https://github.com/cube-js/cube/blob/master/README.md#license # Developer's Certificate of Origin @@ -23,7 +23,7 @@ the licenses granted herein, You reserve all right, title, and interest in and to Your Contributions. [link-dco]: https://developercertificate.org/ -[link-cubejs-repo]: https://github.com/cube-js/cube.js +[link-cubejs-repo]: https://github.com/cube-js/cube ``` Developer Certificate of Origin diff --git a/DEPRECATION.md b/DEPRECATION.md index 23cde834b21b7..67d61b8d3f890 100644 --- a/DEPRECATION.md +++ b/DEPRECATION.md @@ -33,26 +33,33 @@ features: migrate to alternatives. In such cases, a warning may be printed, and users should not rely on this feature. -| Status | Feature | Deprecated | Remove | -| ---------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------- | --------- | -| Removed | [Node.js 8](#nodejs-8) | v0.22.4 | v0.26.0 | -| Deprecated | [`hearBeatInterval`](#hearbeatinterval) | v0.23.8 | June 2021 | -| Removed | [`CUBEJS_ENABLE_TLS`](#cubejs_enable_tls) | v0.23.11 | v0.26.0 | -| Deprecated | [Embedding Cube.js within Express](#embedding-cubejs-within-express) | v0.24.0 | June 2021 | -| Deprecated | [Absolute import for `@cubejs-backend/query-orchestrator`](#absolute-import-for-@cubejs-backendquery-orchestrator) | v0.24.2 | v0.28.0 | -| Removed | [`contextToDataSourceId`](#contexttodatasourceid) | v0.25.0 | v0.25.0 | -| Deprecated | [Absolute import for `@cubejs-backend/server-core`](#absolute-import-for-@cubejs-backendserver-core) | v0.25.4 | v0.30.0 | -| Deprecated | [Absolute import for `@cubejs-backend/schema-compiler`](#absolute-import-for-@cubejs-backendschema-compiler) | v0.25.21 | v0.32.0 | -| Deprecated | [`checkAuthMiddleware`](#checkauthmiddleware) | v0.26.0 | | -| Removed | [Node.js 10](#nodejs-10) | v0.26.0 | v0.29.0 | -| Removed | [Node.js 15](#nodejs-15) | v0.26.0 | v0.29.0 | -| Deprecated | [`USER_CONTEXT`](#user_context) | v0.26.0 | | -| Deprecated | [`authInfo`](#authinfo) | v0.26.0 | | -| Deprecated | [Prefix Redis environment variables with `CUBEJS_`](#prefix-redis-environment-variables-with-cubejs_) | v0.27.0 | | -| Deprecated | [Node.js 12](#nodejs-12) | v0.29.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 | | +| Status | Feature | Deprecated | Remove | +|------------|-----------------------------------------------------------------------------------------------------------------------------------------|------------|-----------| +| Removed | [Node.js 8](#nodejs-8) | v0.22.4 | v0.26.0 | +| Deprecated | [`hearBeatInterval`](#hearbeatinterval) | v0.23.8 | June 2021 | +| Removed | [`CUBEJS_ENABLE_TLS`](#cubejs_enable_tls) | v0.23.11 | v0.26.0 | +| Deprecated | [Embedding Cube.js within Express](#embedding-cubejs-within-express) | v0.24.0 | June 2021 | +| Removed | [Absolute import for `@cubejs-backend/query-orchestrator`](#absolute-import-for-@cubejs-backendquery-orchestrator) | v0.24.2 | v0.32.0 | +| Removed | [`contextToDataSourceId`](#contexttodatasourceid) | v0.25.0 | v0.25.0 | +| Removed | [Absolute import for `@cubejs-backend/server-core`](#absolute-import-for-@cubejs-backendserver-core) | v0.25.4 | v0.32.0 | +| Removed | [Absolute import for `@cubejs-backend/schema-compiler`](#absolute-import-for-@cubejs-backendschema-compiler) | v0.25.21 | v0.32.0 | +| Deprecated | [`checkAuthMiddleware`](#checkauthmiddleware) | v0.26.0 | | +| Removed | [Node.js 10](#nodejs-10) | v0.26.0 | v0.29.0 | +| Removed | [Node.js 15](#nodejs-15) | v0.26.0 | v0.32.0 | +| Deprecated | [`USER_CONTEXT`](#user_context) | v0.26.0 | | +| Deprecated | [`authInfo`](#authinfo) | v0.26.0 | | +| Deprecated | [Prefix Redis environment variables with `CUBEJS_`](#prefix-redis-environment-variables-with-cubejs_) | v0.27.0 | | +| 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 | [Serverless Deployments](#serverless-deployments) | v0.31.64 | v0.35.0 | +| Removed | [Node.js 14](#nodejs-14) | v0.32.0 | v0.35.0 | +| Deprecated | [Using Redis for in-memory cache and queue](#using-redis-for-in-memory-cache-and-queue) | v0.32.0 | | +| Deprecated | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | | +| Deprecated | [Node.js 16](#nodejs-16) | v0.35.0 | | +| Removed | [MySQL-based SQL API](#mysql-based-sql-api) | v0.35.0 | v0.35.0 | +| Removed | [`initApp` hook](#initapp-hook) | v0.35.0 | v0.35.0 | ### Node.js 8 @@ -100,7 +107,7 @@ microservices, if necessary). ### Absolute import for `@cubejs-backend/query-orchestrator` -**Deprecated in Release: v0.24.2** +**Removed in Release: v0.32.0** Absolute imports are highly dependent on a path, and all API becomes public. We now provide a public API from the package directly. @@ -108,13 +115,13 @@ now provide a public API from the package directly. Deprecated: ```javascript -const BaseDriver = require('@cubejs-backend/query-orchestrator/driver/BaseDriver'); +const BaseDriver = require("@cubejs-backend/query-orchestrator/driver/BaseDriver"); ``` You should use: ```javascript -const { BaseDriver } = require('@cubejs-backend/query-orchestrator'); +const { BaseDriver } = require("@cubejs-backend/query-orchestrator"); ``` ### `contextToDataSourceId` @@ -133,7 +140,7 @@ removing the `contextToDataSourceId` property completely. ### Absolute import for `@cubejs-backend/server-core` -**Deprecated in Release: v0.25.4** +**Removed in Release: v0.32.0** Absolute imports are highly dependent on a path, and all API becomes public. We now provide a public API from the package directly. @@ -141,18 +148,18 @@ now provide a public API from the package directly. Deprecated: ```javascript -const CubejsServerCore = require('@cubejs-backend/server-core'); +const CubejsServerCore = require("@cubejs-backend/server-core"); ``` You should use: ```javascript -const { CubejsServerCore } = require('@cubejs-backend/server-core'); +const { CubejsServerCore } = require("@cubejs-backend/server-core"); ``` ### Absolute import for `@cubejs-backend/schema-compiler` -**Deprecated in Release: v0.25.21** +**Removed in Release: v0.32.0** Absolute imports are highly dependent on a path, and all API becomes public. We now provide a public API from the package directly. @@ -160,13 +167,13 @@ now provide a public API from the package directly. Deprecated: ```javascript -const BaseQuery = require('@cubejs-backend/schema-compiler/adapter/BaseQuery'); +const BaseQuery = require("@cubejs-backend/schema-compiler/adapter/BaseQuery"); ``` You should use: ```javascript -const { BaseQuery } = require('@cubejs-backend/schema-compiler'); +const { BaseQuery } = require("@cubejs-backend/schema-compiler"); ``` ### `checkAuthMiddleware` @@ -204,7 +211,7 @@ Deprecated: ```js cube(`visitors`, { - sql: `select * from visitors WHERE ${USER_CONTEXT.source.filter('source')}`, + sql: `select * from visitors WHERE ${USER_CONTEXT.source.filter("source")}`, }); ``` @@ -213,7 +220,7 @@ You should use: ```js cube(`visitors`, { sql: `select * from visitors WHERE ${SECURITY_CONTEXT.source.filter( - 'source' + "source" )}`, }); ``` @@ -293,13 +300,11 @@ more updates. Please upgrade to Node.js 14 or higher. ### Node.js 12 -**Deprecated in Release: v0.29.0** +**Removed in Release: v0.32.0** Node.js 12 reached [End of Life on May 19, 2021][link-nodejs-eol]. This means no more updates. Please upgrade to Node.js 14 or higher. -[link-nodejs-eol]: https://github.com/nodejs/Release#end-of-life-releases - ### Using non-Cube Store databases as external database **Deprecated in Release: v0.29.0** @@ -327,10 +332,64 @@ recommend [using Cube Store as a solution][ref-caching-in-prod]. [ref-caching-in-prod]: https://cube.dev/docs/caching/running-in-production -### dbType +### `dbType` **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. + +### Serverless Deployments + +**Removed in Release: v0.35.0** + +Using Serverless deployments with the `@cubejs-backend/serverless` package is +now deprecated; we **strongly** recommend using Docker-based deployments +instead. + +### Node.js 14 + +**Removed in Release: v0.35.0** + +Node.js 14 reached [End of Life on April 30, 2023][link-nodejs-eol]. This means +no more updates. Please upgrade to Node.js 16 or higher. + +### Using Redis for in-memory cache and queue + +**Deprecated in release: v0.32.0** + +Cube Store is now the default cache and queue engine, [replacing +Redis](https://cube.dev/blog/replacing-redis-with-cube-store). Please migrate to +[Cube Store](https://cube.dev/blog/how-you-win-by-using-cube-store-part-1). + +### `running_total` measure type + +**Deprecated in Release: v0.33.39** + +The `running_total` measure type is now deprecated, and we recommend using +[`rolling_window`](https://cube.dev/docs/product/data-modeling/reference/measures#rolling_window) +to calculate running totals instead. + +### Node.js 16 + +**Deprecated in Release: v0.35.0** + +Node.js 16 reached [End of Life on September 11, 2023][link-nodejs-eol]. This means +no more updates. Please upgrade to Node.js 18 or higher. + +[link-nodejs-eol]: https://github.com/nodejs/Release#end-of-life-releases + +### MySQL-based SQL API + +**Removed in release: v0.35.0** + +Early prototype of the MySQL-based SQL API is removed in favor of the Postgres-compatible +[SQL API](https://cube.dev/docs/product/apis-integrations/sql-api), together with the +`CUBEJS_SQL_PORT` environment variable. + +### `initApp` hook + +**Removed in release: v0.35.0** + +The `initApp` hook is removed as it's not relevant anymore for Docker-based architecture. \ No newline at end of file diff --git a/README.md b/README.md index 0ed53f27378a4..6c93d86851d22 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,24 @@ CI part will take place from github actions. and not from codefresh pipeline onc ### CD CD part will take place from codefresh pipeline and will only publish specific packages that were defined in the codefresh.yml -### how to add another new package in case we need +### how to add another new package in case we need(ordered) 1. make change in the package.json of the specific required new package and rename the original name. take a look on how we did it for cubejs-bigquery-driver 2. add another step in the codefresh.yml so that the new package will be pushed to our npm ### What packages are we publishing atm -1. [server-core](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-server-core/package.json), [@codefresh-io/cubejs-backend-server-core](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-server-core) -2. [cbuejs-bigquery-driver](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-bigquery-driver), [@codefresh-io/cubejs-backend-bigquery-driver](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-bigquery-driver) -3. [cubejs-postgres-driver](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-postgres-driver), [@codefresh-io/cubejs-backend-postgres-driver - ](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-postgres-driver) +1. [cubejs-backend-shared](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-backend-shared), [@codefresh-io/cubejs-backend-shared](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-shared) +**files were changed:** + [packages/cubejs-backend-shared/src/env.ts](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-backend-shared/src/env.ts) +2. [cubejs-backend-base-driver](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-base-driver), [@codefresh-io/cubejs-backend-base-driver](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-base-driver) +3. [cbuejs-bigquery-driver](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-bigquery-driver), [@codefresh-io/cubejs-backend-bigquery-driver](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-bigquery-driver) +4. [cubejs-postgres-driver](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-postgres-driver), [@codefresh-io/cubejs-backend-postgres-driver](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-postgres-driver) +**files were changed:** + [packages/cubejs-postgres-driver/src/PostgresDriver.ts](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-postgres-driver/src/PostgresDriver.ts) +5. [cubejs-backend-query-orchestrator](https://github.com/codefresh-io/cube.js/tree/master/packages/cubejs-query-orchestrator), [@codefresh-io/cubejs-backend-query-orchestrator](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-query-orchestrator) +**files were changed:** + [packages/cubejs-query-orchestrator/src/orchestrator/IORedisFactory.ts](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-query-orchestrator/src/orchestrator/IORedisFactory.ts) + [packages/cubejs-query-orchestrator/src/orchestrator/RedisFactory.ts](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-query-orchestrator/src/orchestrator/RedisFactory.ts) +6. [server-core](https://github.com/codefresh-io/cube.js/blob/master/packages/cubejs-server-core/package.json), [@codefresh-io/cubejs-backend-server-core](https://www.npmjs.com/package/@codefresh-io/cubejs-backend-server-core) ### How to use packages 1. We need to keep real names of packages when using the published packages, so since we are publishing with different name, other places in cube js code aren't aware of this name and this causing issues on runtime. @@ -26,31 +35,32 @@ CD part will take place from codefresh pipeline and will only publish specific p `3. this will resolve in platform analytics from our fork but will resolve it correctly in cube-js code. see examples in platform-analytics package.json file +

- Cube — Headless Business Intelligence + Cube — Semantic Layer for Data Applications

-[Website](https://cube.dev?ref=github-readme) • [Getting Started](https://cube.dev/docs/getting-started?ref=github-readme) • [Docs](https://cube.dev/docs?ref=github-readme) • [Examples](https://cube.dev/docs/examples?ref=github-readme) • [Blog](https://cube.dev/blog?ref=github-readme) • [Slack](https://slack.cube.dev?ref=github-readme) • [Discourse](https://forum.cube.dev/) • [Twitter](https://twitter.com/thecubejs) +[Website](https://cube.dev?ref=github-readme) • [Getting Started](https://cube.dev/docs/getting-started?ref=github-readme) • [Docs](https://cube.dev/docs?ref=github-readme) • [Examples](https://cube.dev/docs/examples?ref=github-readme) • [Blog](https://cube.dev/blog?ref=github-readme) • [Slack](https://slack.cube.dev?ref=github-readme) • [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) +[![GitHub Actions](https://github.com/cube-js/cube/workflows/Build/badge.svg)](https://github.com/cube-js/cube/actions?query=workflow%3ABuild+branch%3Amaster) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fcube-js%2Fcube.js.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fcube-js%2Fcube.js?ref=badge_shield) -__Cube is the headless business intelligence platform.__ It helps data engineers and application developers access data from modern data stores, organize it into consistent definitions, and deliver it to every application. +__Cube is the semantic layer for building data applications.__ It helps data engineers and application developers access data from modern data stores, organize it into consistent definitions, and deliver it to every application.

- Learn more about connecting Cube to data sources and analytics & visualization tools. + Learn more about connecting Cube to data sources and analytics & visualization tools.

Cube was designed to work with all SQL-enabled data sources, including cloud data warehouses like Snowflake or Google BigQuery, query engines like Presto or Amazon Athena, and application databases like Postgres. Cube has a built-in relational caching engine to provide sub-second latency and high concurrency for API requests. -For more details, see the [introduction](https://cube.dev/docs/cubejs-introduction?ref=github-readme) page in our documentation. +For more details, see the [introduction](https://cube.dev/docs/cubejs-introduction?ref=github-readme) page in our documentation. ## Why Cube? @@ -72,7 +82,7 @@ Cube has the necessary infrastructure and features to implement efficient data m Get started now -For a step-by-step guide on Cube Cloud, [see the docs](https://cube.dev/docs/cloud/getting-started/create?ref=github-readme). +For a step-by-step guide on Cube Cloud, [see the docs](https://cube.dev/docs/getting-started/cloud/overview?ref=github-readme). ### Docker @@ -82,6 +92,7 @@ Once Docker is installed, in a new folder for your project, run the following co ```bash docker run -p 4000:4000 \ + -p 15432:15432 \ -v ${PWD}:/cube/conf \ -e CUBEJS_DEV_MODE=true \ cubejs/cube @@ -96,34 +107,20 @@ For a step-by-step guide on Docker, [see the docs](https://cube.dev/docs/getting - [Documentation](https://cube.dev/docs?ref=github-readme) - [Getting Started](https://cube.dev/docs/getting-started?ref=github-readme) - [Examples & Tutorials](https://cube.dev/docs/examples?ref=github-readme) -- [Architecture](https://cube.dev/docs/cubejs-introduction?ref=github-readme#architecture) - -## Community - -If you have any questions or need help - [please join our Slack community](https://slack.cube.dev?ref=github-readme) of amazing developers and data engineers. - -You are also welcome to join our **monthly community calls** where we discuss community news, Cube Dev team's plans, backlogs, use cases, etc. If you miss the call, the recordings will also be available after the meeting. -* When: Second Wednesday of each month at [9am Pacific Time](https://www.thetimezoneconverter.com/?t=09:00&tz=PT%20%28Pacific%20Time%29). -* Meeting link: https://us02web.zoom.us/j/86717042169?pwd=VlBEd2VVK01DNDVVbU1EUXd5ajhsdz09 -* [Meeting page](https://cube.dev/community-call/). -* Recordings will be posted on the [Community Call Playlist](https://www.youtube.com/playlist?list=PLtdXl_QTQjpb1dHZCM09qKTsgvgqjSvc9). - -### Our quarterly roadmap - -We publish our open source roadmap every quarter and discuss them during our [monthly community calls](https://cube.dev/community-call/). You can find our roadmap under [projects in our Cube.js repository](https://github.com/cube-js/cube.js/projects?query=is%3Aopen+sort%3Aupdated-desc). +- [Architecture](https://cube.dev/docs/product/introduction#four-layers-of-semantic-layer) -### Contributing +## Contributing There are many ways you can contribute to Cube! Here are a few possibilities: -* Star this repo and follow us on [Twitter](https://twitter.com/thecubejs). +* Star this repo and follow us on [Twitter](https://twitter.com/the_cube_dev). * Add Cube to your stack on [Stackshare](https://stackshare.io/cube-js). * Upvote issues with 👍 reaction so we know what's the demand for particular issue to prioritize it within road map. * Create issues every time you feel something is missing or goes wrong. * Ask questions on [Stack Overflow with cube.js tag](https://stackoverflow.com/questions/tagged/cube.js) if others can have these questions as well. -* Provide pull requests for all open issues and especially for those with [help wanted](https://github.com/cube-js/cube.js/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted") and [good first issue](https://github.com/cube-js/cube.js/issues?q=is%3Aissue+is%3Aopen+label%3A"good+first+issue") labels. +* Provide pull requests for all open issues and especially for those with [help wanted](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted") and [good first issue](https://github.com/cube-js/cube/issues?q=is%3Aissue+is%3Aopen+label%3A"good+first+issue") labels. -All sort of contributions are **welcome and extremely helpful** 🙌 Please refer to [the contribution guide](https://github.com/cube-js/cube.js/blob/master/CONTRIBUTING.md) for more information. +All sort of contributions are **welcome and extremely helpful** 🙌 Please refer to [the contribution guide](https://github.com/cube-js/cube/blob/master/CONTRIBUTING.md) for more information. ## License diff --git a/dev_env_setup.sh b/dev_env_setup.sh new file mode 100755 index 0000000000000..112812c4d9209 --- /dev/null +++ b/dev_env_setup.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +set -e + +CURRENT_DIR=$(pwd) +SCRIPT_DIR=$(dirname "$(realpath "$0")") + +# Change to the cube repo directory +cd "$SCRIPT_DIR" + +# Step 1: Run yarn install in the root directory +echo "Running 'yarn install' in the root directory..." +yarn install + +# Step 2: Run yarn build in the root directory +echo "Running 'yarn build' in the root directory..." +yarn build + +# Step 3: Run yarn build in packages/cubejs-playground +echo "Running 'yarn build' in packages/cubejs-playground..." +cd packages/cubejs-playground +yarn build +cd ../.. + +# Step 4: Run yarn tsc for the first time +echo "Running 'yarn tsc --build'..." +yarn tsc + +# Step 5: List available drivers and ask user to select +echo "Listing available drivers..." +available_drivers=$(ls packages | grep "driver") + +PS3='Please select the drivers you want to use (enter number, then press Enter): ' + +# Display drivers without the prefix "cubejs-" +select selected_driver in $(echo "$available_drivers" | sed 's/cubejs-//') "Finish selection" +do + if [[ "$selected_driver" == "Finish selection" ]]; then + break + fi + selected_drivers+=("$selected_driver") + echo "Selected drivers: ${selected_drivers[*]}" +done + +# Step 6-7: Run yarn link and yarn install in packages/cubejs- +for driver in "${selected_drivers[@]}" +do + echo "Linking and installing dependencies for $driver..." + cd "packages/cubejs-$driver" + yarn link + yarn install + cd ../.. +done + +# Step 8: Run yarn link @cubejs-backend/ in packages/cubejs-server-core +cd packages/cubejs-server-core +for driver in "${selected_drivers[@]}" +do + echo "Linking @cubejs-backend/$driver in packages/cubejs-server-core..." + yarn link @cubejs-backend/"$driver" +done +cd ../.. + +# Step 9: Run yarn link in packages/cubejs-server-core +echo "Running 'yarn link' in packages/cubejs-server-core..." +cd packages/cubejs-server-core +yarn link +cd ../.. + +# Change back to the original directory +cd "$CURRENT_DIR" + +# Step 10: Ask user if they want to create a new test project +read -p "Do you want to create a new test project? (yes/no, default: yes): " CREATE_PROJECT +CREATE_PROJECT=${CREATE_PROJECT:-yes} + +if [[ "$CREATE_PROJECT" == "yes" || "$CREATE_PROJECT" == "y" ]]; then + read -p "Enter the application name: " APP_NAME + + # List of available database types (hardcoded for now as of https://cube.dev/docs/reference/cli) + db_types=("postgres" "mysql" "athena" "mongodb" "bigquery" "redshift" "mssql" "clickhouse" "snowflake" "presto" "druid") + + echo "Listing available database types..." + PS3='Please select the database type: ' + select DB_TYPE in "${db_types[@]}" + do + if [[ -n "$DB_TYPE" ]]; then + break + else + echo "Invalid selection. Please try again." + fi + done + + # Create new project using cubejs-cli + echo "Creating new project with name $APP_NAME and database type $DB_TYPE..." + npx cubejs-cli create "$APP_NAME" -d "$DB_TYPE" + + # Step 11: Run yarn link @cubejs-backend/server-core in your project directory + echo "Linking @cubejs-backend/server-core in the project directory..." + cd "$APP_NAME" + yarn link @cubejs-backend/server-core + cd ../ +else + echo "Ok. No problem!" + echo "You need to run 'yarn link @cubejs-backend/server-core' in your project directory manually" +fi + +# Step 11: Ask user if they plan to make changes to Rust code +read -p "Do you plan to make changes to Rust code? (yes/no, default: no): " RUST_CHANGES +RUST_CHANGES=${RUST_CHANGES:-no} + +if [[ "$RUST_CHANGES" == "yes" || "$RUST_CHANGES" == "y" ]]; then + # Run yarn link:dev in the script directory + cd "$SCRIPT_DIR" + echo "Running 'yarn link:dev' in the root directory..." + yarn link:dev + + if [[ "$CREATE_PROJECT" == "yes" || "$CREATE_PROJECT" == "y" ]]; then + dev_pkgs=("@cubejs-backend/shared" + "@cubejs-backend/cloud" + "@cubejs-backend/native" + "@cubejs-backend/server" + "@cubejs-backend/server-core" + "@cubejs-backend/api-gateway" + "@cubejs-backend/schema-compiler" + "@cubejs-backend/query-orchestrator" + "@cubejs-backend/athena-driver" + "@cubejs-backend/duckdb-driver" + "@cubejs-backend/bigquery-driver" + "@cubejs-backend/postgres-driver" + "@cubejs-backend/databricks-jdbc-driver" + "@cubejs-backend/mssql-driver" + "@cubejs-backend/clickhouse-driver" + "@cubejs-backend/snowflake-driver" + "@cubejs-backend/cubestore-driver" + "@cubejs-backend/templates" + "@cubejs-client/core" + "@cubejs-client/ws-transport" + "@cubejs-client/playground" + ) + + cd "$CURRENT_DIR/$APP_NAME" + echo "Linking dev packages in $APP_NAME project..." + + for pkg in "${dev_pkgs[@]}" + do + echo "Linking $pkg..." + yarn link "$pkg" + done + else + echo "Don't forget to link packages that you plan to modify inside your project!" + fi +fi + +echo "All steps completed successfully!" +echo "Run 'yarn dev' to start your testing project and verify changes." diff --git a/docs-gen/README.md b/docs-gen/README.md deleted file mode 100644 index 84f19261a8a36..0000000000000 --- a/docs-gen/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# typedoc-plugin-markdown - -A plugin for [TypeDoc](https://github.com/TypeStrong/typedoc) that enables TypeScript API documentation to be generated in Markdown. - -[![npm](https://img.shields.io/npm/v/typedoc-plugin-markdown.svg)](https://www.npmjs.com/package/typedoc-plugin-markdown) -[![Build Status](https://travis-ci.org/tgreyuk/typedoc-plugin-markdown.svg?branch=master)](https://travis-ci.org/tgreyuk/typedoc-plugin-markdown) - -## What it does? - -The plugin will replace the default HTML theme with a built-in Markdown theme, and expose some additional arguments. - -By default, the Markdown theme will attempt to render standard CommonMark, suitable for the majority of Markdown engines. -It follows the same structure and file patterns as the default HTML theme. - -## Installation - -```bash -npm install --save-dev typedoc typedoc-plugin-markdown -``` - -## Usage - -```bash -$ npx typedoc --plugin typedoc-plugin-markdown [args] -``` - -### Note: - -- The `--plugin` arg is optional - if omitted all installed plugins will run. -- If using with the default HTML theme or other themes, use `--plugin none` to switch the plugin off. -- The plugin needs to be executed from the same location as `typedoc`. Either run as an npm script or make sure to run `npx typedoc`. - -## Arguments - -The following arguments can be used in addition to the default [TypeDoc arguments](https://github.com/TypeStrong/typedoc#arguments). - -- `--theme `
- Specify the theme that should be used. Defaults to `markdown`. Please read [Markdown Themes](https://github.com/tgreyuk/typedoc-plugin-markdown/blob/master/THEMES.md) for further details. -- `--namedAnchors`
- Use HTML named anchors as fragment identifiers for engines that do not automatically assign header ids. -- `--hideSources`
- Do not print source file link rendering. -- `--hideBreadcrumbs`
- Do not print breadcrumbs. -- `--skipSidebar`
- Do not update the `sidebar.json` file when used with `docusaurus` or `docusaurus2` theme. - -## License - -[MIT](https://github.com/tgreyuk/typedoc-plugin-markdown/blob/master/LICENSE) diff --git a/docs-gen/THEMES.md b/docs-gen/THEMES.md deleted file mode 100644 index 52bf6889d4fa4..0000000000000 --- a/docs-gen/THEMES.md +++ /dev/null @@ -1,151 +0,0 @@ -# Markdown Themes - -By default, the Markdown theme will attempt to render standard CommonMark, suitable for the majority of Markdown engines. -It follows the same structure and file patterns as the default HTML theme (see [typedoc-default-themes](https://github.com/TypeStrong/typedoc-default-themes)). - -The plugin also comes packaged with some additional built-in themes and can also be extended with a custom theme. - -- [Built-in themes](#built-in-themes) -- [Writing a custom Markdown theme](#writing-a-custom-markdown-theme) - -## Writing a custom markdown theme - -The Markdown theme packaged with the plugin can also be extended with a custom Markdown theme using the standard TypeDoc theming pattern as per https://typedoc.org/guides/themes/. - -### Create a theme.js class - -As per the theme docs create a `theme.js` file which TypeDoc will then attempt to load from a given location. - -_mytheme/custom-theme.js_ - -```js -const MarkdownTheme = require('typedoc-plugin-markdown/dist/theme'); - -class CustomMarkdownTheme extends MarkdownTheme.default { - constructor(renderer, basePath) { - super(renderer, basePath); - } -} - -exports.default = CustomMarkdownTheme; -``` - -### Theme resources - -By default the theme will inherit the resources of the Markdown theme (https://github.com/tgreyuk/typedoc-plugin-markdown/tree/master/src/resources). - -These can be replaced and updated as required. - -### Building the theme - -#### CLI - -``` -npx typedoc ./src --plugin typedoc-plugin-markdown --theme ./mytheme/custom-theme --out docs -``` - -#### API - -```js -const { Application } = require('typedoc'); -const path = require('path'); - -const app = new Application(); -app.bootstrap({ - module: 'CommonJS', - target: 'ES5', - readme: 'none', - theme: path.join(__dirname, 'mytheme', 'custom-theme'), - plugin: 'typedoc-plugin-markdown', -}); - -app.generateDocs(app.expandInputFiles(['./src']), 'docs'); -``` - -See https://typedoc.org/guides/installation/#node-module - -## Built-in themes - -### `docusaurus` / `docusaurus2` - -The --out path is assumed be a Docusaurus docs directory. - -- Adds Front Matter to pages to support Docusaurus [Markdown Headers](https://docusaurus.io/docs/en/doc-markdown#markdown-headers). -- Appends releavant JSON to website/sidebars.json|sidebars.js, to support [sidebar navigation](https://docusaurus.io/docs/en/navigation). - -#### Output - -``` -root-directory -├── docs -│ ├── myapi -│ | ├── classes -│ │ ├── enums -│ │ ├── interfaces -│ │ ├── index.md -│ │ -└── website - ├── sidebars.json - -``` - -#### Adding links in siteconfig - -Manually add the index page to headerLinks in the [siteConfig.js](https://docusaurus.io/docs/en/site-config) to access the api from header. - -```js -headerLinks: [ - { doc: "myapi/index", label: "My API" }, -], -``` - -### `vuepress` - -- Adds Front Matter to pages. -- The --out path is assumed be a Vuepress docs directory. -- Will create: - - - `.vuepress/api-sidebar.json` to be used with [sidebar](https://vuepress.vuejs.org/default-theme-config/#sidebar). - - `.vuepress/api-sidebar-relative.json` to be used with [multiple sidebars](https://vuepress.vuejs.org/default-theme-config/#multiple-sidebars). - - `.vuepress/config.json` - -#### Examples - -```js -const apiSideBar = require('./api-sidebar.json'); - -// Without groups -module.exports = { - themeConfig: { - sidebar: ['some-content', ...apiSideBar], - }, -}; - -// With groups -module.exports = { - themeConfig: { - sidebar: ['some-content', { title: 'API', children: apiSideBar }], - }, -}; -``` - -```js -const apiSideBarRelative = require('./api-sidebar-relative.json'); - -// Multiple sidebars -module.exports = { - themeConfig: { - sidebar: { - '/guide/': ['some-content'], - '/api/': apiSideBarRelative, - '/': ['other'], - }, - }, -}; -``` - -### `bitbucket` - -_Note: this theme applicable to Bitbucket Cloud. If using Bitbucket Server please use the `--namedAnchors` argument to fix anchor links._ - -- Parses internal anchor links to support Bitbucket's internal anchor linking. diff --git a/docs-gen/jest.config.js b/docs-gen/jest.config.js deleted file mode 100644 index 80a03151d7198..0000000000000 --- a/docs-gen/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - modulePaths: ['/dist'], - transform: { - '^.+\\.tsx?$': 'ts-jest', - }, - verbose: true, - collectCoverage: true, - coverageReporters: ['text-summary'], - collectCoverageFrom: ['/dist/**/*js'], -}; diff --git a/docs-gen/package.json b/docs-gen/package.json deleted file mode 100644 index c1a7fa366be90..0000000000000 --- a/docs-gen/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "cubejs-typedoc-plugin", - "version": "0.0.1", - "description": "A plugin for TypeDoc that enables TypeScript API documentation to be generated in Markdown.", - "main": "dist/index.js", - "files": [ - "dist/" - ], - "scripts": { - "lint": "tslint --project ./tsconfig.json", - "generate": "yarn build && yarn gen-docs", - "gen-docs": "node tasks/generate.js", - "dev-gen": "copyfiles --up 1 ./src/**/*.hbs ./dist/ && yarn gen-docs", - "build": "rm -rf dist && tsc --sourceMap false --declaration false && copyfiles --up 1 ./src/**/*.hbs ./dist/", - "watch": "tsc-watch", - "prepublishOnly": "yarn test", - "pretest": "yarn lint && yarn build", - "test": "jest", - "compile": "tsc src/index.ts", - "test:updateSnapshot": "jest --updateSnapshot", - "fixtures": "rm -rf ./test/fixtures && node ./tasks/fixtures.js", - "examples": "yarn build && rm -rf out && node ./tasks/link-plugin.js && yarn examples:html && yarn examples:md", - "examples:html": "typedoc --tsconfig ./test/stubs/tsconfig.json --options ./test/options.json --plugin none --out ./out/html", - "examples:md": "typedoc --tsconfig ./test/stubs/tsconfig.json --options ./test/options.json --out ./out/md" - }, - "author": "Cube Dev, Inc.", - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "typedoc": ">=0.17.0" - }, - "devDependencies": { - "@types/fs-extra": "^9.0.1", - "@types/jest": "^25.2.3", - "@types/node": "^14.0.9", - "@types/react": "^16.9.41", - "copyfiles": "^2.3.0", - "jest": "^26.0.1", - "ts-jest": "^26.1.0", - "tsc-watch": "^4.2.9", - "tslint": "^6.1.2", - "typedoc": "0.19.2", - "typescript": "^4" - }, - "dependencies": { - "fs-extra": "^9.0.0", - "inflection": "^1.12.0" - } -} diff --git a/docs-gen/src/__snapshots__/theme.spec.ts.snap b/docs-gen/src/__snapshots__/theme.spec.ts.snap deleted file mode 100644 index 9fcfa7fdc1bf1..0000000000000 --- a/docs-gen/src/__snapshots__/theme.spec.ts.snap +++ /dev/null @@ -1,2585 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`MarkdownTheme getUrls should get navigation 1`] = ` -NavigationItem { - "children": Array [ - NavigationItem { - "children": Array [ - NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - [Circular], - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - [Circular], - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": undefined, - "title": "comments", - "url": "modules/_comments_.md", - }, - NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - NavigationItem { - "parent": [Circular], - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - ], - "parent": undefined, - "title": "destrucuting", - "url": "modules/_destrucuting_.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - [Circular], - NavigationItem { - "parent": [Circular], - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - ], - "parent": undefined, - "title": "destrucuting", - "url": "modules/_destrucuting_.md", - }, - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "moduleFunction", - "url": "modules/_functions_.modulefunction.md", - }, - NavigationItem { - "parent": [Circular], - "title": "moduleFunction", - "url": "modules/_functions_.modulefunction.md", - }, - ], - "parent": undefined, - "title": "functions", - "url": "modules/_functions_.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - [Circular], - NavigationItem { - "parent": [Circular], - "title": "moduleFunction", - "url": "modules/_functions_.modulefunction.md", - }, - ], - "parent": undefined, - "title": "functions", - "url": "modules/_functions_.md", - }, - "title": "moduleFunction", - "url": "modules/_functions_.modulefunction.md", - }, - NavigationItem { - "parent": undefined, - "title": "literals", - "url": "modules/_literals_.md", - }, - NavigationItem { - "parent": undefined, - "title": "variables", - "url": "modules/_variables_.md", - }, - ], - "isLabel": true, - "parent": undefined, - "title": "Modules", - "url": "", - }, - NavigationItem { - "children": Array [ - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - ], - "isLabel": true, - "parent": undefined, - "title": "Classes", - "url": "", - }, - NavigationItem { - "children": Array [ - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - NavigationItem { - "parent": [Circular], - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA1", - "url": "interfaces/_categories_.categoryinterfacea1.md", - }, - NavigationItem { - "parent": [Circular], - "title": "CategoryInterfaceA2", - "url": "interfaces/_categories_.categoryinterfacea2.md", - }, - [Circular], - ], - "parent": undefined, - "title": "categories", - "url": "modules/_categories_.md", - }, - "title": "OtherInterfaceA", - "url": "interfaces/_categories_.otherinterfacea.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - [Circular], - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "BaseClass", - "url": "classes/_classes_.baseclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "GenericClass", - "url": "classes/_classes_.genericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "InternalClass", - "url": "classes/_classes_.internalclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "NonGenericClass", - "url": "classes/_classes_.nongenericclass.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassA", - "url": "classes/_classes_.subclassa.md", - }, - NavigationItem { - "parent": [Circular], - "title": "SubClassB", - "url": "classes/_classes_.subclassb.md", - }, - NavigationItem { - "parent": [Circular], - "title": "INameInterface", - "url": "interfaces/_classes_.inameinterface.md", - }, - NavigationItem { - "parent": [Circular], - "title": "IPrintInterface", - "url": "interfaces/_classes_.iprintinterface.md", - }, - [Circular], - ], - "parent": undefined, - "title": "classes", - "url": "modules/_classes_.md", - }, - "title": "IPrintNameInterface", - "url": "interfaces/_classes_.iprintnameinterface.md", - }, - NavigationItem { - "parent": NavigationItem { - "children": Array [ - NavigationItem { - "parent": [Circular], - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - [Circular], - ], - "parent": undefined, - "title": "destrucuting", - "url": "modules/_destrucuting_.md", - }, - "title": "I", - "url": "interfaces/_destrucuting_.i.md", - }, - ], - "isLabel": true, - "parent": undefined, - "title": "Interfaces", - "url": "", - }, - ], - "parent": undefined, - "title": "typedoc-plugin-markdown", - "url": "README.md", -} -`; - -exports[`MarkdownTheme getUrls should getUrls when readme is defined 1`] = ` -Array [ - "globals.md", - "modules/_categories_.md", - "modules/_classes_.md", - "modules/_comments_.md", - "modules/_destrucuting_.md", - "modules/_functions_.md", - "modules/_literals_.md", - "modules/_variables_.md", - "README.md", - "modules/_categories_.md", - "modules/_classes_.md", - "modules/_comments_.md", - "modules/_destrucuting_.md", - "modules/_functions_.md", - "modules/_literals_.md", - "modules/_variables_.md", - "modules/_categories_.md", - "interfaces/_categories_.categoryinterfacea1.md", - "interfaces/_categories_.categoryinterfacea2.md", - "interfaces/_categories_.otherinterfacea.md", - "modules/_categories_.md#let-categoryvariablea1", - "modules/_categories_.md#let-categoryvariablea2", - "modules/_categories_.md#let-categoryvariableb1", - "modules/_categories_.md#let-othervariablea", - "modules/_categories_.md#let-othervariableb", - "modules/_categories_.md#categoryfunctiona1", - "modules/_categories_.md#categoryfunctiona2", - "modules/_categories_.md#categoryfunctiona3", - "modules/_categories_.md#categoryfunctionb2", - "modules/_categories_.md#otherfunctiona", - "modules/_categories_.md#otherfunctionb", - "interfaces/_categories_.categoryinterfacea1.md", - "interfaces/_categories_.categoryinterfacea1.md#value", - "interfaces/_categories_.categoryinterfacea2.md", - "interfaces/_categories_.categoryinterfacea2.md#value", - "interfaces/_categories_.otherinterfacea.md", - "interfaces/_categories_.otherinterfacea.md#value", - "modules/_classes_.md", - "classes/_classes_.baseclass.md", - "classes/_classes_.genericclass.md", - "classes/_classes_.internalclass.md", - "classes/_classes_.nongenericclass.md", - "classes/_classes_.subclassa.md", - "classes/_classes_.subclassb.md", - "interfaces/_classes_.inameinterface.md", - "interfaces/_classes_.iprintinterface.md", - "interfaces/_classes_.iprintnameinterface.md", - "classes/_classes_.baseclass.md", - "classes/_classes_.baseclass.md#constructor", - "classes/_classes_.baseclass.md#private-internalclass", - "classes/_classes_.baseclass.md#protected-kind", - "classes/_classes_.baseclass.md#name", - "classes/_classes_.baseclass.md#static-instance", - "classes/_classes_.baseclass.md#static-instances", - "classes/_classes_.baseclass.md#abstract-abstractmethod", - "classes/_classes_.baseclass.md#arrowfunction", - "classes/_classes_.baseclass.md#private-checkname", - "classes/_classes_.baseclass.md#getname", - "classes/_classes_.baseclass.md#setname", - "classes/_classes_.baseclass.md#static-catest", - "classes/_classes_.baseclass.md#static-getinstance", - "classes/_classes_.baseclass.md#static-getname", - "classes/_classes_.genericclass.md", - "classes/_classes_.genericclass.md#constructor", - "classes/_classes_.genericclass.md#protected-p2", - "classes/_classes_.genericclass.md#p3", - "classes/_classes_.genericclass.md#private-p4", - "classes/_classes_.genericclass.md#readonly-p5", - "classes/_classes_.genericclass.md#value", - "classes/_classes_.genericclass.md#getvalue", - "classes/_classes_.genericclass.md#setvalue", - "classes/_classes_.internalclass.md", - "classes/_classes_.internalclass.md#constructor", - "classes/_classes_.nongenericclass.md", - "classes/_classes_.nongenericclass.md#constructor", - "classes/_classes_.nongenericclass.md#protected-p2", - "classes/_classes_.nongenericclass.md#p3", - "classes/_classes_.nongenericclass.md#readonly-p5", - "classes/_classes_.nongenericclass.md#value", - "classes/_classes_.nongenericclass.md#getvalue", - "classes/_classes_.nongenericclass.md#setvalue", - "classes/_classes_.subclassa.md", - "classes/_classes_.subclassa.md#constructor", - "classes/_classes_.subclassa.md#protected-kind", - "classes/_classes_.subclassa.md#name", - "classes/_classes_.subclassa.md#static-instance", - "classes/_classes_.subclassa.md#static-instances", - "classes/_classes_.subclassa.md#nameproperty", - "classes/_classes_.subclassa.md#readonlynameproperty", - "classes/_classes_.subclassa.md#writeonlynameproperty", - "classes/_classes_.subclassa.md#abstractmethod", - "classes/_classes_.subclassa.md#arrowfunction", - "classes/_classes_.subclassa.md#getname", - "classes/_classes_.subclassa.md#print", - "classes/_classes_.subclassa.md#printname", - "classes/_classes_.subclassa.md#setname", - "classes/_classes_.subclassa.md#static-catest", - "classes/_classes_.subclassa.md#static-getinstance", - "classes/_classes_.subclassa.md#static-getname", - "classes/_classes_.subclassb.md", - "classes/_classes_.subclassb.md#constructor", - "classes/_classes_.subclassb.md#protected-kind", - "classes/_classes_.subclassb.md#name", - "classes/_classes_.subclassb.md#static-instance", - "classes/_classes_.subclassb.md#static-instances", - "classes/_classes_.subclassb.md#abstractmethod", - "classes/_classes_.subclassb.md#arrowfunction", - "classes/_classes_.subclassb.md#dosomething", - "classes/_classes_.subclassb.md#getname", - "classes/_classes_.subclassb.md#setname", - "classes/_classes_.subclassb.md#static-catest", - "classes/_classes_.subclassb.md#static-getinstance", - "classes/_classes_.subclassb.md#static-getname", - "interfaces/_classes_.inameinterface.md", - "interfaces/_classes_.inameinterface.md#name", - "interfaces/_classes_.inameinterface.md#getname", - "interfaces/_classes_.iprintinterface.md", - "interfaces/_classes_.iprintinterface.md#print", - "interfaces/_classes_.iprintnameinterface.md", - "interfaces/_classes_.iprintnameinterface.md#name", - "interfaces/_classes_.iprintnameinterface.md#getname", - "interfaces/_classes_.iprintnameinterface.md#print", - "interfaces/_classes_.iprintnameinterface.md#printname", - "modules/_comments_.md", - "modules/_comments_.md#let-commentswithfencedblock", - "modules/_comments_.md#let-commentswithincludes", - "modules/_comments_.md#let-commentswithsymbollinks", - "modules/_comments_.md#let-commentswithtags", - "modules/_comments_.md#commentsinreturn", - "modules/_comments_.md#functionwithdoclink", - "modules/_destrucuting_.md", - "interfaces/_destrucuting_.i.md", - "modules/_destrucuting_.md#destructarraya", - "modules/_destrucuting_.md#destructarrayb", - "modules/_destrucuting_.md#destructarrayc", - "modules/_destrucuting_.md#destructarraywithignoresa", - "modules/_destrucuting_.md#destructarraywithignoresrest", - "modules/_destrucuting_.md#destructarraywithrest", - "modules/_destrucuting_.md#destructarraywithresta", - "modules/_destrucuting_.md#destructarraywithrestb", - "modules/_destrucuting_.md#destructobjecta", - "modules/_destrucuting_.md#destructobjectb", - "modules/_destrucuting_.md#destructobjectc", - "modules/_destrucuting_.md#drawtext", - "interfaces/_destrucuting_.i.md", - "interfaces/_destrucuting_.i.md#name", - "modules/_functions_.md", - "modules/_functions_.modulefunction.md", - "modules/_functions_.md#buildname", - "modules/_functions_.md#exportedfunction", - "modules/_functions_.md#functionwithdefaults", - "modules/_functions_.md#functionwithoptionalvalue", - "modules/_functions_.md#functionwithparameters", - "modules/_functions_.md#functionwithrest", - "modules/_functions_.md#internalfunction", - "modules/_functions_.md#multiplesignatures", - "modules/_functions_.md#const-variablefunction", - "modules/_functions_.modulefunction.md", - "modules/_functions_.modulefunction.md#let-functionvariable", - "modules/_functions_.modulefunction.md#append", - "modules/_functions_.modulefunction.md#prepend", - "modules/_literals_.md", - "modules/_literals_.md#let-typeliteral", - "modules/_literals_.md#const-objectliteral", - "modules/_variables_.md", - "modules/_variables_.md#let-color", - "modules/_variables_.md#let-decimal", - "modules/_variables_.md#let-isdone", - "modules/_variables_.md#let-list", - "modules/_variables_.md#let-n", - "modules/_variables_.md#let-notsure", - "modules/_variables_.md#let-u", - "modules/_variables_.md#let-x", -] -`; - -exports[`MarkdownTheme getUrls should getUrls' 1`] = ` -Array [ - "README.md", - "modules/_categories_.md", - "modules/_classes_.md", - "modules/_comments_.md", - "modules/_destrucuting_.md", - "modules/_functions_.md", - "modules/_literals_.md", - "modules/_variables_.md", - "modules/_categories_.md", - "interfaces/_categories_.categoryinterfacea1.md", - "interfaces/_categories_.categoryinterfacea2.md", - "interfaces/_categories_.otherinterfacea.md", - "modules/_categories_.md#let-categoryvariablea1", - "modules/_categories_.md#let-categoryvariablea2", - "modules/_categories_.md#let-categoryvariableb1", - "modules/_categories_.md#let-othervariablea", - "modules/_categories_.md#let-othervariableb", - "modules/_categories_.md#categoryfunctiona1", - "modules/_categories_.md#categoryfunctiona2", - "modules/_categories_.md#categoryfunctiona3", - "modules/_categories_.md#categoryfunctionb2", - "modules/_categories_.md#otherfunctiona", - "modules/_categories_.md#otherfunctionb", - "interfaces/_categories_.categoryinterfacea1.md", - "interfaces/_categories_.categoryinterfacea1.md#value", - "interfaces/_categories_.categoryinterfacea2.md", - "interfaces/_categories_.categoryinterfacea2.md#value", - "interfaces/_categories_.otherinterfacea.md", - "interfaces/_categories_.otherinterfacea.md#value", - "modules/_classes_.md", - "classes/_classes_.baseclass.md", - "classes/_classes_.genericclass.md", - "classes/_classes_.internalclass.md", - "classes/_classes_.nongenericclass.md", - "classes/_classes_.subclassa.md", - "classes/_classes_.subclassb.md", - "interfaces/_classes_.inameinterface.md", - "interfaces/_classes_.iprintinterface.md", - "interfaces/_classes_.iprintnameinterface.md", - "classes/_classes_.baseclass.md", - "classes/_classes_.baseclass.md#constructor", - "classes/_classes_.baseclass.md#private-internalclass", - "classes/_classes_.baseclass.md#protected-kind", - "classes/_classes_.baseclass.md#name", - "classes/_classes_.baseclass.md#static-instance", - "classes/_classes_.baseclass.md#static-instances", - "classes/_classes_.baseclass.md#abstract-abstractmethod", - "classes/_classes_.baseclass.md#arrowfunction", - "classes/_classes_.baseclass.md#private-checkname", - "classes/_classes_.baseclass.md#getname", - "classes/_classes_.baseclass.md#setname", - "classes/_classes_.baseclass.md#static-catest", - "classes/_classes_.baseclass.md#static-getinstance", - "classes/_classes_.baseclass.md#static-getname", - "classes/_classes_.genericclass.md", - "classes/_classes_.genericclass.md#constructor", - "classes/_classes_.genericclass.md#protected-p2", - "classes/_classes_.genericclass.md#p3", - "classes/_classes_.genericclass.md#private-p4", - "classes/_classes_.genericclass.md#readonly-p5", - "classes/_classes_.genericclass.md#value", - "classes/_classes_.genericclass.md#getvalue", - "classes/_classes_.genericclass.md#setvalue", - "classes/_classes_.internalclass.md", - "classes/_classes_.internalclass.md#constructor", - "classes/_classes_.nongenericclass.md", - "classes/_classes_.nongenericclass.md#constructor", - "classes/_classes_.nongenericclass.md#protected-p2", - "classes/_classes_.nongenericclass.md#p3", - "classes/_classes_.nongenericclass.md#readonly-p5", - "classes/_classes_.nongenericclass.md#value", - "classes/_classes_.nongenericclass.md#getvalue", - "classes/_classes_.nongenericclass.md#setvalue", - "classes/_classes_.subclassa.md", - "classes/_classes_.subclassa.md#constructor", - "classes/_classes_.subclassa.md#protected-kind", - "classes/_classes_.subclassa.md#name", - "classes/_classes_.subclassa.md#static-instance", - "classes/_classes_.subclassa.md#static-instances", - "classes/_classes_.subclassa.md#nameproperty", - "classes/_classes_.subclassa.md#readonlynameproperty", - "classes/_classes_.subclassa.md#writeonlynameproperty", - "classes/_classes_.subclassa.md#abstractmethod", - "classes/_classes_.subclassa.md#arrowfunction", - "classes/_classes_.subclassa.md#getname", - "classes/_classes_.subclassa.md#print", - "classes/_classes_.subclassa.md#printname", - "classes/_classes_.subclassa.md#setname", - "classes/_classes_.subclassa.md#static-catest", - "classes/_classes_.subclassa.md#static-getinstance", - "classes/_classes_.subclassa.md#static-getname", - "classes/_classes_.subclassb.md", - "classes/_classes_.subclassb.md#constructor", - "classes/_classes_.subclassb.md#protected-kind", - "classes/_classes_.subclassb.md#name", - "classes/_classes_.subclassb.md#static-instance", - "classes/_classes_.subclassb.md#static-instances", - "classes/_classes_.subclassb.md#abstractmethod", - "classes/_classes_.subclassb.md#arrowfunction", - "classes/_classes_.subclassb.md#dosomething", - "classes/_classes_.subclassb.md#getname", - "classes/_classes_.subclassb.md#setname", - "classes/_classes_.subclassb.md#static-catest", - "classes/_classes_.subclassb.md#static-getinstance", - "classes/_classes_.subclassb.md#static-getname", - "interfaces/_classes_.inameinterface.md", - "interfaces/_classes_.inameinterface.md#name", - "interfaces/_classes_.inameinterface.md#getname", - "interfaces/_classes_.iprintinterface.md", - "interfaces/_classes_.iprintinterface.md#print", - "interfaces/_classes_.iprintnameinterface.md", - "interfaces/_classes_.iprintnameinterface.md#name", - "interfaces/_classes_.iprintnameinterface.md#getname", - "interfaces/_classes_.iprintnameinterface.md#print", - "interfaces/_classes_.iprintnameinterface.md#printname", - "modules/_comments_.md", - "modules/_comments_.md#let-commentswithfencedblock", - "modules/_comments_.md#let-commentswithincludes", - "modules/_comments_.md#let-commentswithsymbollinks", - "modules/_comments_.md#let-commentswithtags", - "modules/_comments_.md#commentsinreturn", - "modules/_comments_.md#functionwithdoclink", - "modules/_destrucuting_.md", - "interfaces/_destrucuting_.i.md", - "modules/_destrucuting_.md#destructarraya", - "modules/_destrucuting_.md#destructarrayb", - "modules/_destrucuting_.md#destructarrayc", - "modules/_destrucuting_.md#destructarraywithignoresa", - "modules/_destrucuting_.md#destructarraywithignoresrest", - "modules/_destrucuting_.md#destructarraywithrest", - "modules/_destrucuting_.md#destructarraywithresta", - "modules/_destrucuting_.md#destructarraywithrestb", - "modules/_destrucuting_.md#destructobjecta", - "modules/_destrucuting_.md#destructobjectb", - "modules/_destrucuting_.md#destructobjectc", - "modules/_destrucuting_.md#drawtext", - "interfaces/_destrucuting_.i.md", - "interfaces/_destrucuting_.i.md#name", - "modules/_functions_.md", - "modules/_functions_.modulefunction.md", - "modules/_functions_.md#buildname", - "modules/_functions_.md#exportedfunction", - "modules/_functions_.md#functionwithdefaults", - "modules/_functions_.md#functionwithoptionalvalue", - "modules/_functions_.md#functionwithparameters", - "modules/_functions_.md#functionwithrest", - "modules/_functions_.md#internalfunction", - "modules/_functions_.md#multiplesignatures", - "modules/_functions_.md#const-variablefunction", - "modules/_functions_.modulefunction.md", - "modules/_functions_.modulefunction.md#let-functionvariable", - "modules/_functions_.modulefunction.md#append", - "modules/_functions_.modulefunction.md#prepend", - "modules/_literals_.md", - "modules/_literals_.md#let-typeliteral", - "modules/_literals_.md#const-objectliteral", - "modules/_variables_.md", - "modules/_variables_.md#let-color", - "modules/_variables_.md#let-decimal", - "modules/_variables_.md#let-isdone", - "modules/_variables_.md#let-list", - "modules/_variables_.md#let-n", - "modules/_variables_.md#let-notsure", - "modules/_variables_.md#let-u", - "modules/_variables_.md#let-x", -] -`; diff --git a/docs-gen/src/components/__snapshots__/front-matter.component.spec.ts.snap b/docs-gen/src/components/__snapshots__/front-matter.component.spec.ts.snap deleted file mode 100644 index 9dd83d215f253..0000000000000 --- a/docs-gen/src/components/__snapshots__/front-matter.component.spec.ts.snap +++ /dev/null @@ -1,27 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FrontMatterComponent should set correct label for globals file 1`] = `"Globals"`; - -exports[`FrontMatterComponent should compile set correct label for index without a README 1`] = `"Globals"`; - -exports[`FrontMatterComponent should parse a quoted string 1`] = `"xyx\\\\'s \\"quoted\\" title"`; - -exports[`FrontMatterComponent should prepend YAML block to start of page 1`] = ` -"--- -id: \\"_access_access_\\" -title: \\"Page title\\" -sidebar_label: \\"Page title\\" ---- - -[CONTENT]" -`; - -exports[`FrontMatterComponent should set correct label for index with a README 1`] = `"README"`; - -exports[`FrontMatterComponent should set correct title for index page 1`] = `"Project name"`; - -exports[`FrontMatterComponent should set correct title for index page if packageInfo label available 1`] = `"Package Label"`; - -exports[`FrontMatterComponent should set correct title for pages without a navigation match 1`] = `"Project name"`; - -exports[`FrontMatterComponent should set id 1`] = `"_access_access_"`; diff --git a/docs-gen/src/components/__snapshots__/helpers.component.spec.ts.snap b/docs-gen/src/components/__snapshots__/helpers.component.spec.ts.snap deleted file mode 100644 index 76f3e10d81f93..0000000000000 --- a/docs-gen/src/components/__snapshots__/helpers.component.spec.ts.snap +++ /dev/null @@ -1,27 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`HelpersComponent should build @link references' 1`] = ` -"Taken from http://usejsdoc.org/tags-inline-link.html. -" -`; - -exports[`HelpersComponent should convert comments with includes' 1`] = ` -"This is a simple example on how to use include. - -![My image alt text](../media/logo.png) - -![My not found image](media://VOID.png) - - -This is an example of handlebars include - -This is a simple example on a handlebars file. -" -`; - -exports[`HelpersComponent should convert symbols brackets to symbol links' 1`] = ` -"- Link to an external reflection: [BaseClass](../classes/_classes_.baseclass.md) -- Link to an internal reflection: [commentsInReturn](_comments_.md#commentsinreturn) -- Link to an undefined reflection: [[VOID]] -" -`; diff --git a/docs-gen/src/components/front-matter.component.spec.ts b/docs-gen/src/components/front-matter.component.spec.ts deleted file mode 100644 index 25fe1486cd084..0000000000000 --- a/docs-gen/src/components/front-matter.component.spec.ts +++ /dev/null @@ -1,130 +0,0 @@ -import * as path from 'path'; -import { Application } from 'typedoc'; - -const { FrontMatterComponent } = require('components/front-matter.component'); -describe(`FrontMatterComponent`, () => { - let frontMatterComponent; - let app; - - beforeAll(() => { - app = new Application(); - app.bootstrap({ - mode: 'file', - module: 'CommonJS', - target: 'ES5', - readme: 'none', - theme: 'markdown', - logger: 'none', - plugin: path.join(__dirname, '../../../dist/index'), - }); - app.convert(['./test/stubs/functions.ts']); - app.renderer.addComponent('frontmatter', new FrontMatterComponent(app.renderer)); - frontMatterComponent = app.renderer.getComponent('frontmatter'); - }); - - test(`should prepend YAML block to start of page`, () => { - expect(true).toBeTruthy(); - }); - - test(`should prepend YAML block to start of page`, () => { - const spy = jest.spyOn(frontMatterComponent, 'getTitleFromNavigation').mockReturnValue('Page title'); - const page = { - contents: '[CONTENT]', - url: 'modules/_access_access_.md', - model: { name: '"access/access"' }, - project: { url: 'index.md' }, - }; - frontMatterComponent.onPageEnd(page); - expect(page.contents).toMatchSnapshot(); - spy.mockRestore(); - }); - - test(`should set id`, () => { - const page = { url: 'modules/_access_access_.md' }; - expect(frontMatterComponent.getId(page)).toMatchSnapshot(); - }); - - test(`should set correct title for index page`, () => { - const page = { - url: 'index.md', - project: { url: 'index.md', name: 'Project name' }, - }; - expect(frontMatterComponent.getTitle(page)).toMatchSnapshot(); - }); - - test(`should set correct title for pages without a navigation match`, () => { - const spy = jest.spyOn(frontMatterComponent, 'getTitleFromNavigation').mockReturnValue(null); - const page = { - url: 'index.md', - project: { url: 'page.md', name: 'Project name' }, - }; - expect(frontMatterComponent.getTitle(page)).toMatchSnapshot(); - spy.mockRestore(); - }); - - test(`should set correct title for index page if packageInfo label available`, () => { - const page = { - url: 'index.md', - project: { url: 'index.md', packageInfo: { label: 'Package Label' } }, - }; - expect(frontMatterComponent.getTitle(page)).toMatchSnapshot(); - }); - - test(`should compile set correct label for index without a README`, () => { - const spy = jest.spyOn(frontMatterComponent, 'getTitleFromNavigation').mockReturnValue(null); - const page = { - url: 'index.md', - project: { url: 'index.md' }, - }; - expect(frontMatterComponent.getLabel(page)).toMatchSnapshot(); - spy.mockRestore(); - }); - - test(`should set correct label for index with a README`, () => { - const spy = jest.spyOn(frontMatterComponent, 'getTitleFromNavigation').mockReturnValue(null); - const page = { - url: 'index.md', - project: { url: 'index.md', readme: 'README' }, - }; - expect(frontMatterComponent.getLabel(page)).toMatchSnapshot(); - spy.mockRestore(); - }); - - test(`should set correct label for globals file`, () => { - const page = { - url: 'globals.md', - project: { url: 'index.md' }, - }; - expect(frontMatterComponent.getLabel(page)).toMatchSnapshot(); - }); - - test(`should parse a quoted string`, () => { - expect(frontMatterComponent.escapeYAMLString(`xyx's "quoted" title`)).toMatchSnapshot(); - }); - - test(`should find title from navigation object`, () => { - const page = { - navigation: { - children: [ - { - url: 'urla', - title: 'titlea', - children: [ - { url: 'urla1', title: 'titlea1' }, - { - url: 'urlb2', - title: 'titleb2', - children: [{ url: 'urlc1', title: 'titlec1' }], - }, - ], - }, - { url: 'urlb', title: 'titleb' }, - ], - }, - }; - expect(frontMatterComponent.getTitleFromNavigation(page, 'urlb')).toEqual('titleb'); - expect(frontMatterComponent.getTitleFromNavigation(page, 'urla1')).toEqual('titlea1'); - expect(frontMatterComponent.getTitleFromNavigation(page, 'urlc1')).toEqual('titlec1'); - expect(frontMatterComponent.getTitleFromNavigation(page, 'url')).toEqual(null); - }); -}); diff --git a/docs-gen/src/components/front-matter.component.ts b/docs-gen/src/components/front-matter.component.ts deleted file mode 100644 index 02e46c09014b4..0000000000000 --- a/docs-gen/src/components/front-matter.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as path from 'path'; -import { NavigationItem } from 'typedoc'; -import { Component, ContextAwareRendererComponent } from 'typedoc/dist/lib/output/components'; -import { PageEvent } from 'typedoc/dist/lib/output/events'; - -@Component({ name: 'frontmatter' }) -export class FrontMatterComponent extends ContextAwareRendererComponent { - initialize() { - super.initialize(); - - this.listenTo(this.application.renderer, { - [PageEvent.END]: this.onPageEnd, - }); - } - - onPageEnd(page: PageEvent) { - page.contents = page.contents.replace(/^/, this.getYamlString(page) + '\n\n').replace(/[\r\n]{3,}/g, '\n\n'); - } - - getYamlString(page: PageEvent) { - const yaml = `--- -id: "${this.escapeYAMLString(this.getId(page))}" -title: "${this.escapeYAMLString(this.getTitle(page))}" -sidebar_label: "${this.escapeYAMLString(this.getLabel(page))}" ----`; - return yaml; - } - - getId(page: PageEvent) { - return this.stripExt(page.url); - } - - getTitle(page: PageEvent) { - if (page.url === page.project.url) { - return this.getProjectName(page); - } - return this.getTitleFromNavigation(page, page.url) || this.getProjectName(page); - } - - getLabel(page: PageEvent) { - if (this.stripExt(page.url) === 'globals') { - return 'Globals'; - } - const title = this.getTitleFromNavigation(page, page.url); - return title ? title : !!page.project.readme ? 'README' : 'Globals'; - } - - // prettier-ignore - escapeYAMLString(str: string) { - return str.replace(/([^\\])'/g, '$1\\\''); - } - - getProjectName(page: PageEvent) { - return (page.project.packageInfo && page.project.packageInfo.label) || page.project.name; - } - - getTitleFromNavigation(page: PageEvent, url: string) { - const item = this.findNavigationItem(page.navigation.children, url, null); - return item ? item.title : null; - } - - findNavigationItem(navigation: NavigationItem[], url, item: NavigationItem) { - navigation.forEach(navigationChild => { - if (navigationChild.url === url) { - item = navigationChild; - return; - } - if (navigationChild.children) { - item = this.findNavigationItem(navigationChild.children, url, item); - } - }); - return item; - } - - stripExt(url: string) { - return path.basename(url, path.extname(url)); - } -} diff --git a/docs-gen/src/components/helpers.component.spec.ts b/docs-gen/src/components/helpers.component.spec.ts deleted file mode 100644 index 9738e4d26cf59..0000000000000 --- a/docs-gen/src/components/helpers.component.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as fs from 'fs-extra'; -import * as Handlebars from 'handlebars'; -import * as path from 'path'; -import { Application } from 'typedoc'; - -describe(`HelpersComponent`, () => { - let app; - let project; - let pluginInstance; - const out = path.join(__dirname, 'tmp'); - beforeAll(() => { - app = new Application(); - app.bootstrap({ - module: 'CommonJS', - target: 'ES5', - readme: 'none', - theme: 'markdown', - logger: 'none', - includes: './test/stubs/inc/', - media: './test/stubs/media/', - listInvalidSymbolLinks: true, - plugin: path.join(__dirname, '../../dist/index'), - }); - project = app.convert(app.expandInputFiles(['./test/stubs/'])); - app.generateDocs(project, out); - pluginInstance = app.renderer.getComponent('helpers'); - }); - - afterAll(() => { - fs.removeSync(out); - }); - - test(`should define helper'`, () => { - const helpers = Handlebars.helpers; - expect(helpers.comment).toBeDefined(); - }); - - test(`should convert symbols brackets to symbol links'`, () => { - expect( - Handlebars.helpers.comment.call(project.findReflectionByName('commentsWithSymbolLinks').comment.text), - ).toMatchSnapshot(); - }); - - test(`should set warnings if symbol not found'`, () => { - expect(pluginInstance.warnings.length > 0).toBeTruthy(); - }); - - test(`should convert comments with includes'`, () => { - expect( - Handlebars.helpers.comment.call(project.findReflectionByName('commentsWithIncludes').comment.text), - ).toMatchSnapshot(); - }); - - test(`should build @link references'`, () => { - expect( - Handlebars.helpers.comment.call(project.findReflectionByName('functionWithDocLink').signatures[0].comment.text), - ).toMatchSnapshot(); - }); -}); diff --git a/docs-gen/src/components/helpers.component.ts b/docs-gen/src/components/helpers.component.ts deleted file mode 100644 index 78d186644fcb1..0000000000000 --- a/docs-gen/src/components/helpers.component.ts +++ /dev/null @@ -1,230 +0,0 @@ -import * as fs from 'fs-extra'; -import * as Handlebars from 'handlebars'; -import * as path from 'path'; -import { MarkedLinksPlugin, ProjectReflection, Reflection } from 'typedoc'; -import { Component, ContextAwareRendererComponent } from 'typedoc/dist/lib/output/components'; -import { PageEvent, RendererEvent } from 'typedoc/dist/lib/output/events'; -import * as Util from 'util'; - -import MarkdownTheme from '../theme'; - -/** - * This component is essentially a combination of TypeDoc's 'MarkedPlugin' and 'MarkedLinksPlugin'. - * The options are unchanged , but strips out all of the html configs. - */ - -@Component({ name: 'helpers' }) -export class ContextAwareHelpersComponent extends ContextAwareRendererComponent { - /** - * The path referenced files are located in. - */ - private includes?: string; - - /** - * Path to the output media directory. - */ - private mediaDirectory?: string; - - /** - * The pattern used to find references in markdown. - */ - private includePattern: RegExp = /\[\[include:([^\]]+?)\]\]/g; - - /** - * The pattern used to find media links. - */ - private mediaPattern: RegExp = /media:\/\/([^ "\)\]\}]+)/g; - - /** - * Regular expression for detecting bracket links. - */ - private brackets: RegExp = /\[\[([^\]]+)\]\]/g; - - /** - * Regular expression for detecting inline tags like {@link ...}. - */ - private inlineTag: RegExp = /(?:\[(.+?)\])?\{@(link|linkcode|linkplain)\s+((?:.|\n)+?)\}/gi; - - private listInvalidSymbolLinks: boolean; - - private warnings: string[] = []; - - initialize() { - super.initialize(); - - this.includes = this.application.options.getValue('includes'); - this.mediaDirectory = this.application.options.getValue('media'); - this.listInvalidSymbolLinks = this.application.options.getValue('listInvalidSymbolLinks'); - - this.listenTo( - this.owner, - { - [RendererEvent.END]: this.onEndRenderer, - }, - undefined, - 100, - ); - - const component = this; - - MarkdownTheme.handlebars.registerHelper('comment', function(this: string) { - return component.parseComments(this); - }); - - MarkdownTheme.handlebars.registerHelper('breadcrumbs', function(this: PageEvent) { - return component.breadcrumb(this.model, this.project, []); - }); - - MarkdownTheme.handlebars.registerHelper('relativeURL', (url: string) => { - return url ? this.getRelativeUrl(url) : url; - }); - } - - public breadcrumb(model: Reflection, project: ProjectReflection, md: string[]) { - const theme = this.application.renderer.theme as MarkdownTheme; - if (model && model.parent) { - this.breadcrumb(model.parent, project, md); - if (model.url) { - md.push(`[${model.name}](${this.getRelativeUrl(model.url)})`); - } else { - md.push(model.url); - } - } else { - if (!!project.readme) { - md.push(`[${project.name}](${this.getRelativeUrl(theme.indexName + theme.fileExt)})`); - } - md.push(`[${project.readme ? 'Globals' : project.name}](${this.getRelativeUrl(project.url)})`); - } - return md.join(' › '); - } - - /** - * Parse the given comemnts string and return the resulting html. - * - * @param text The markdown string that should be parsed. - * @param context The current handlebars context. - * @returns The resulting html string. - */ - public parseComments(text: string) { - const context = Object.assign(text, ''); - - if (this.includes) { - text = text.replace(this.includePattern, (match: string, includesPath: string) => { - includesPath = path.join(this.includes!, includesPath.trim()); - if (fs.existsSync(includesPath) && fs.statSync(includesPath).isFile()) { - const contents = fs.readFileSync(includesPath, 'utf-8'); - if (includesPath.slice(-4).toLocaleLowerCase() === '.hbs') { - const template = Handlebars.compile(contents); - return template(context); - } else { - return contents; - } - } else { - return ''; - } - }); - } - - if (this.mediaDirectory) { - text = text.replace(this.mediaPattern, (match: string, mediaPath: string) => { - if (fs.existsSync(path.join(this.mediaDirectory!, mediaPath))) { - return this.getRelativeUrl('media') + '/' + mediaPath; - } else { - return match; - } - }); - } - - return this.replaceInlineTags(this.replaceBrackets(text)); - } - - /** - * Find all references to symbols within the given text and transform them into a link. - * - * This function is aware of the current context and will try to find the symbol within the - * current reflection. It will walk up the reflection chain till the symbol is found or the - * root reflection is reached. As a last resort the function will search the entire project - * for the given symbol. - * - * @param text The text that should be parsed. - * @returns The text with symbol references replaced by links. - */ - private replaceBrackets(text: string): string { - return text.replace(this.brackets, (match: string, content: string): string => { - const split = MarkedLinksPlugin.splitLinkText(content); - return this.buildLink(match, split.target, split.caption); - }); - } - - /** - * Find symbol {@link ...} strings in text and turn into html links - * - * @param text The string in which to replace the inline tags. - * @return The updated string. - */ - private replaceInlineTags(text: string): string { - return text.replace(this.inlineTag, (match: string, leading: string, tagName: string, content: string): string => { - const split = MarkedLinksPlugin.splitLinkText(content); - const target = split.target; - const caption = leading || split.caption; - const monospace = tagName === 'linkcode'; - - return this.buildLink(match, target, caption, monospace); - }); - } - - /** - * Format a link with the given text and target. - * - * @param original The original link string, will be returned if the target cannot be resolved.. - * @param target The link target. - * @param caption The caption of the link. - * @param monospace Whether to use monospace formatting or not. - * @returns A html link tag. - */ - private buildLink(original: string, target: string, caption: string, monospace?: boolean): string { - if (!this.urlPrefix.test(target)) { - let reflection: Reflection | undefined; - if (this.reflection) { - reflection = this.reflection.findReflectionByName(target); - } else if (this.project) { - reflection = this.project.findReflectionByName(target); - } - - if (reflection && reflection.url) { - if (this.urlPrefix.test(reflection.url)) { - target = reflection.url; - } else { - target = this.getRelativeUrl(reflection.url); - } - } else { - const fullName = (this.reflection || this.project)!.getFullName(); - this.warnings.push(`In ${fullName}: ${original}`); - return original; - } - } - - if (monospace) { - caption = '`' + caption + '`'; - } - - return Util.format('[%s](%s)', caption, target); - } - - /** - * Triggered when [[Renderer]] is finished - */ - onEndRenderer(event: RendererEvent) { - if (this.listInvalidSymbolLinks && this.warnings.length > 0) { - this.application.logger.write(''); - this.application.logger.warn( - 'Found invalid symbol reference(s) in JSDocs, ' + - 'they will not render as links in the generated documentation.', - ); - - for (const warning of this.warnings) { - this.application.logger.write(' ' + warning); - } - } - } -} diff --git a/docs-gen/src/components/options.component.ts b/docs-gen/src/components/options.component.ts deleted file mode 100644 index d938ce4569f4d..0000000000000 --- a/docs-gen/src/components/options.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, ContextAwareRendererComponent } from 'typedoc/dist/lib/output/components'; - -import MarkdownTheme from '../theme'; - -@Component({ name: 'options' }) -export class OptionsComponent extends ContextAwareRendererComponent { - initialize() { - super.initialize(); - - const namedAnchors = this.application.options.getValue('namedAnchors'); - const hideBreadcrumbs = this.application.options.getValue('hideBreadcrumbs'); - const hideIndexes = this.application.options.getValue('hideIndexes'); - const hideSourceFiles = this.application.options.getValue('hideSources'); - - MarkdownTheme.handlebars.registerHelper('ifNamedAnchors', function(options) { - return namedAnchors ? options.fn(this) : options.inverse(this); - }); - - MarkdownTheme.handlebars.registerHelper('ifBreadcrumbs', function(options) { - return hideBreadcrumbs ? options.inverse(this) : options.fn(this); - }); - - MarkdownTheme.handlebars.registerHelper('ifIndexes', function(options) { - return hideIndexes ? options.inverse(this) : options.fn(this); - }); - - MarkdownTheme.handlebars.registerHelper('ifSources', function(options) { - return hideSourceFiles ? options.inverse(this) : options.fn(this); - }); - } -} diff --git a/docs-gen/src/index.ts b/docs-gen/src/index.ts deleted file mode 100644 index 869d23835914f..0000000000000 --- a/docs-gen/src/index.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Application } from 'typedoc/dist/lib/application'; -import { ParameterType } from 'typedoc/dist/lib/utils/options/declaration'; - -import { MarkdownPlugin } from './plugin'; -import CubejsGroupPlugin from './plugins/CubejsGroupPlugin'; -import NoInheritPlugin from './plugins/NoInheritPlugin'; -import {LinkPlugin} from './plugins/LinkPlugin'; - -export = (PluginHost: Application) => { - const app = PluginHost.owner; - if (app.converter.hasComponent('markdown')) { - return; - } - - app.options.addDeclaration({ - help: 'Markdown Plugin: Deprecated in favour of theme.', - name: 'platform', - type: ParameterType.String, - }); - - app.options.addDeclaration({ - help: 'Markdown Plugin: Deprecated.', - name: 'hideProjectTitle', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: 'Markdown Plugin: Do not print source file link rendering.', - name: 'hideSources', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: 'Markdown Plugin: Do not print breadcrumbs.', - name: 'hideBreadcrumbs', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: 'Markdown Plugin: Do not print indexes.', - name: 'hideIndexes', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: - 'Markdown Plugin: Use HTML named anchors as fragment identifiers for engines that do not automatically assign header ids.', - name: 'namedAnchors', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: - 'Markdown Plugin: Use long navigation title instead of default short one (applicable to navigation / front-matter only).', - name: 'longTitle', - type: ParameterType.Boolean, - }); - - app.options.addDeclaration({ - help: 'Skips updating of the sidebar.json file when used with docusaurus or docusaurus2 theme', - name: 'skipSidebar', - type: ParameterType.Boolean, - - }); - - app.converter.addComponent('markdown', new MarkdownPlugin(app.converter)); - - app.converter.removeComponent('group'); - app.converter.addComponent('cubejs-group', new CubejsGroupPlugin(app.converter)) - - app.converter.addComponent('no-inherit', new NoInheritPlugin(app.converter)); - app.converter.addComponent('link', new LinkPlugin(app.converter)); -}; diff --git a/docs-gen/src/plugin.ts b/docs-gen/src/plugin.ts deleted file mode 100644 index a0a0f5436dd8e..0000000000000 --- a/docs-gen/src/plugin.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as path from 'path'; -import { Renderer } from 'typedoc'; -import { Converter } from 'typedoc/dist/lib/converter'; -import { Component, ConverterComponent } from 'typedoc/dist/lib/converter/components'; - -@Component({ name: 'markdown' }) -export class MarkdownPlugin extends ConverterComponent { - initialize() { - this.listenTo(this.owner, { - [Converter.EVENT_BEGIN]: this.onBegin, - [Converter.EVENT_RESOLVE_BEGIN]: this.onResolveBegin, - }); - } - - /** - * Overide the default assets for any custom themes to inherit - */ - onBegin() { - Renderer.getDefaultTheme = () => path.join(__dirname, 'resources'); - } - - /** - * Read the theme option and load the paths of any recognised built in themes - * Otherwise pass the path through to the Renderer - */ - onResolveBegin() { - const options = this.application.options; - const theme = (options.getValue('platform') as string) || (options.getValue('theme') as string); - - // if the theme is 'default' or 'markdown' load the base markdown theme - if (theme === 'default' || theme === 'markdown') { - options.setValue('theme', path.join(__dirname)); - } - - // load any built in sub themes - const subThemes = ['docusaurus', 'docusaurus2', 'vuepress', 'gitbook', 'bitbucket']; - if (subThemes.includes(theme)) { - options.setValue('theme', path.join(__dirname, 'subthemes', theme)); - } - } -} diff --git a/docs-gen/src/plugins/CubejsGroupPlugin.ts b/docs-gen/src/plugins/CubejsGroupPlugin.ts deleted file mode 100644 index e0bd48274c91c..0000000000000 --- a/docs-gen/src/plugins/CubejsGroupPlugin.ts +++ /dev/null @@ -1,313 +0,0 @@ -import { ContainerReflection, DeclarationReflection, Reflection, ReflectionKind } from 'typedoc'; -import { Context, Converter } from 'typedoc/dist/lib/converter'; -import { ConverterComponent } from 'typedoc/dist/lib/converter/components'; -import { Comment, ReferenceType, ReflectionGroup, SourceDirectory } from 'typedoc/dist/lib/models'; -import { Component } from 'typedoc/dist/lib/utils'; - -const STICKY_TAG_NAME = 'stickytypes'; - -@Component({ name: 'cubejs-group' }) -export default class CubejsGroupPlugin extends ConverterComponent { - /** - * Define the sort order of reflections. - */ - static WEIGHTS = [ - ReflectionKind.Class, - ReflectionKind.Function, - ReflectionKind.Global, - ReflectionKind.Module, - ReflectionKind.Namespace, - ReflectionKind.Interface, - ReflectionKind.Enum, - ReflectionKind.EnumMember, - ReflectionKind.TypeAlias, - - ReflectionKind.Constructor, - ReflectionKind.Event, - ReflectionKind.Property, - ReflectionKind.Variable, - ReflectionKind.Accessor, - ReflectionKind.Method, - ReflectionKind.ObjectLiteral, - - ReflectionKind.Parameter, - ReflectionKind.TypeParameter, - ReflectionKind.TypeLiteral, - ReflectionKind.CallSignature, - ReflectionKind.ConstructorSignature, - ReflectionKind.IndexSignature, - ReflectionKind.GetSignature, - ReflectionKind.SetSignature, - ]; - - /** - * Define the singular name of individual reflection kinds. - */ - static SINGULARS = (function () { - const singulars = {}; - singulars[ReflectionKind.Enum] = 'Enumeration'; - singulars[ReflectionKind.EnumMember] = 'Enumeration member'; - return singulars; - })(); - - /** - * Define the plural name of individual reflection kinds. - */ - static PLURALS = (function () { - const plurals = {}; - plurals[ReflectionKind.Class] = 'Classes'; - plurals[ReflectionKind.Property] = 'Properties'; - plurals[ReflectionKind.Enum] = 'Enumerations'; - plurals[ReflectionKind.EnumMember] = 'Enumeration members'; - plurals[ReflectionKind.TypeAlias] = 'Type aliases'; - return plurals; - })(); - - static orderByName = new Map(); - - /** - * Create a new CubejsGroupPlugin instance. - */ - initialize() { - this.listenTo( - this.owner, - { - [Converter.EVENT_RESOLVE]: this.onResolve, - [Converter.EVENT_RESOLVE_END]: this.onEndResolve, - }, - null, - 1 - ); - } - - private populateOrder(children: Reflection[] = []) { - const MAGIC = 100_000; - - function findOrderAndRemove(comment?: Comment) { - const orderTag = (comment?.tags || []).find((tag) => tag.tagName === 'order'); - - if (orderTag) { - comment.removeTags('order'); - // CommentPlugin.removeTags(comment, 'order'); - return parseInt(orderTag.text, 10) - MAGIC; - } - } - - function getOrder(reflection: Reflection) { - if (reflection.hasComment()) { - return findOrderAndRemove(reflection.comment); - } else if (reflection instanceof DeclarationReflection) { - return findOrderAndRemove(reflection.signatures?.[0]?.comment); - } - - return 0; - } - - children.forEach((reflection) => { - if (!CubejsGroupPlugin.orderByName.has(reflection.name)) { - CubejsGroupPlugin.orderByName.set(reflection.name, getOrder(reflection) || 0); - } - }); - } - - private onResolve(context: Context, reflection: ContainerReflection) { - reflection.kindString = CubejsGroupPlugin.getKindSingular(reflection.kind); - - if (reflection.children && reflection.children.length > 0) { - this.populateOrder(reflection.children); - reflection.children.sort(CubejsGroupPlugin.sortCallback); - reflection.groups = CubejsGroupPlugin.getReflectionGroups(reflection.children); - } - } - - /** - * Triggered when the converter has finished resolving a project. - * - * @param context The context object describing the current state the converter is in. - */ - private onEndResolve(context: Context) { - function walkDirectory(directory: SourceDirectory) { - directory.groups = CubejsGroupPlugin.getReflectionGroups(directory.getAllReflections()); - - for (const key in directory.directories) { - if (!directory.directories.hasOwnProperty(key)) { - continue; - } - walkDirectory(directory.directories[key]); - } - } - - const project = context.project; - if (project.children && project.children.length > 0) { - this.populateOrder(project.children); - project.children.sort(CubejsGroupPlugin.sortCallback); - project.groups = CubejsGroupPlugin.getReflectionGroups(project.children); - } - - walkDirectory(project.directory); - project.files.forEach((file) => { - file.groups = CubejsGroupPlugin.getReflectionGroups(file.reflections); - }); - } - - private static getStickyTypes(reflection: DeclarationReflection): string[] { - const typeNames = []; - let comment: Comment; - - if (reflection.comment?.getTag(STICKY_TAG_NAME) != null) { - comment = reflection.comment; - } - - if (!comment) { - reflection.signatures?.some((sig) => { - if (sig.comment?.getTag(STICKY_TAG_NAME) != null) { - comment = sig.comment; - return true; - } - return false; - }); - } - - if (comment) { - const { text } = comment.getTag(STICKY_TAG_NAME); - comment.removeTags(STICKY_TAG_NAME); - // CommentPlugin.removeTags(comment, STICKY_TAG_NAME); - - if (text.trim()) { - return text.split(',').map((name) => name.trim()); - } - - reflection.signatures?.forEach((sig) => { - // Parameter types - sig.parameters?.forEach((param) => { - if (param.type instanceof ReferenceType) { - typeNames.push(param.type.name); - } - }); - - // Return type - if (sig.type && sig.type instanceof ReferenceType) { - typeNames.push(sig.type.name); - } - }); - - reflection.extendedTypes?.forEach((type: ReferenceType) => { - type.typeArguments?.forEach((typeArgument: any) => { - typeArgument.name && typeNames.push(typeArgument.name); - }); - }); - } - - return typeNames; - } - - /** - * Create a grouped representation of the given list of reflections. - * - * Reflections are grouped by kind and sorted by weight and name. - * - * @param reflections The reflections that should be grouped. - * @returns An array containing all children of the given reflection grouped by their kind. - */ - static getReflectionGroups(reflections: Reflection[]): ReflectionGroup[] { - const groups = new Map(); - const handledReflections = new Set(); - const reflectionByName = new Map(); - - reflections.forEach((child) => reflectionByName.set(child.name, child)); - - reflections.forEach((child) => { - if (handledReflections.has(child.name)) { - return; - } - - let typeNames = []; - if (child instanceof DeclarationReflection) { - typeNames = CubejsGroupPlugin.getStickyTypes(child); - } - - if (!groups.has(child.kind)) { - groups.set(child.kind, new ReflectionGroup(CubejsGroupPlugin.getKindPlural(child.kind), child.kind)); - } - - groups.get(child.kind).children.push(child); - - typeNames.forEach((name) => { - if (reflectionByName.has(name)) { - (reflectionByName.get(name) as any).stickToParent = child.name; - groups.get(child.kind).children.push(reflectionByName.get(name)); - handledReflections.add(name); - } - }); - }); - - return [...groups.values()]; - } - - /** - * Transform the internal typescript kind identifier into a human readable version. - * - * @param kind The original typescript kind identifier. - * @returns A human readable version of the given typescript kind identifier. - */ - private static getKindString(kind: ReflectionKind): string { - let str = ReflectionKind[kind]; - str = str.replace(/(.)([A-Z])/g, (m, a, b) => a + ' ' + b.toLowerCase()); - return str; - } - - /** - * Return the singular name of a internal typescript kind identifier. - * - * @param kind The original internal typescript kind identifier. - * @returns The singular name of the given internal typescript kind identifier - */ - static getKindSingular(kind: ReflectionKind): string { - if (CubejsGroupPlugin.SINGULARS[kind]) { - return CubejsGroupPlugin.SINGULARS[kind]; - } else { - return CubejsGroupPlugin.getKindString(kind); - } - } - - /** - * Return the plural name of a internal typescript kind identifier. - * - * @param kind The original internal typescript kind identifier. - * @returns The plural name of the given internal typescript kind identifier - */ - static getKindPlural(kind: ReflectionKind): string { - if (CubejsGroupPlugin.PLURALS[kind]) { - return CubejsGroupPlugin.PLURALS[kind]; - } else { - return this.getKindString(kind) + 's'; - } - } - - /** - * Callback used to sort reflections by weight defined by ´CubejsGroupPlugin.WEIGHTS´ and name. - * - * @param a The left reflection to sort. - * @param b The right reflection to sort. - * @returns The sorting weight. - */ - static sortCallback(a: Reflection, b: Reflection): number { - const aWeight = CubejsGroupPlugin.orderByName.get(a.name) || CubejsGroupPlugin.WEIGHTS.indexOf(a.kind); - const bWeight = CubejsGroupPlugin.orderByName.get(b.name) || CubejsGroupPlugin.WEIGHTS.indexOf(b.kind); - - if (aWeight === bWeight) { - if (a.flags.isStatic && !b.flags.isStatic) { - return 1; - } - if (!a.flags.isStatic && b.flags.isStatic) { - return -1; - } - if (a.name === b.name) { - return 0; - } - return a.name > b.name ? 1 : -1; - } else { - return aWeight - bWeight; - } - } -} diff --git a/docs-gen/src/plugins/LinkPlugin.ts b/docs-gen/src/plugins/LinkPlugin.ts deleted file mode 100644 index 1b9bb144e3a9e..0000000000000 --- a/docs-gen/src/plugins/LinkPlugin.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { camelize, dasherize, underscore } from 'inflection'; -import { DeclarationReflection, Reflection, ReflectionKind, ParameterReflection, SignatureReflection } from 'typedoc'; -import { Context, Converter } from 'typedoc/dist/lib/converter'; -import { ConverterComponent } from 'typedoc/dist/lib/converter/components'; -import { Comment } from 'typedoc/dist/lib/models/comments'; -import { Component } from 'typedoc/dist/lib/utils'; - -const linkRegex = /{@see\s([^}]*)}/g; - -@Component({ name: 'link' }) -export class LinkPlugin extends ConverterComponent { - static anchorName(link) { - return ( - '#' + - dasherize(underscore(link.replace(/[A-Z]{2,}(?=[A-Z])/, (v) => camelize(v.toLowerCase())).replace(/#/g, '-'))) - ); - } - - static toLink(name, reflection: Reflection | string) { - let link = name; - - if (reflection instanceof Reflection) { - if (reflection.kindOf(ReflectionKind.TypeAlias) && !(reflection as any).stickToParent) { - link = `Types${name}`; - } - if ((reflection as any).stickToParent) { - link = (reflection as any).stickToParent + name; - } - } - - return `[${name}](${LinkPlugin.anchorName(link)})`; - } - - private static replaceAnnotations(comment: Comment, reflections: Reflection[]) { - const replacer = (_, name) => { - const reflection = reflections.find((reflection) => reflection.name === name); - return this.toLink(name, reflection); - } - comment.text = comment.text.replace(linkRegex, replacer); - comment.shortText = comment.shortText.replace(linkRegex, replacer); - } - - initialize() { - this.listenTo(this.owner, { - [Converter.EVENT_RESOLVE_END]: this.onEndResolve, - }); - } - - onEndResolve(context: Context) { - const reflections = Object.values(context.project.reflections); - - reflections.forEach((reflection) => { - reflection.comment && LinkPlugin.replaceAnnotations(reflection.comment, reflections); - - if (reflection instanceof DeclarationReflection) { - reflection.signatures?.forEach((sig) => { - sig.comment && LinkPlugin.replaceAnnotations(sig.comment, reflections); - }); - } - - if (reflection instanceof SignatureReflection) { - reflection.parameters?.forEach((param) => { - param.comment && LinkPlugin.replaceAnnotations(param.comment, reflections); - }); - } - }); - } -} diff --git a/docs-gen/src/plugins/NoInheritPlugin.ts b/docs-gen/src/plugins/NoInheritPlugin.ts deleted file mode 100644 index 07fb677b6fc90..0000000000000 --- a/docs-gen/src/plugins/NoInheritPlugin.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Reflection, ReflectionKind, DeclarationReflection } from 'typedoc/dist/lib/models/reflections/index'; -import { Component, ConverterComponent } from 'typedoc/dist/lib/converter/components'; -import { Converter } from 'typedoc/dist/lib/converter/converter'; -import { Context } from 'typedoc/dist/lib/converter/context'; -import { CommentPlugin } from 'typedoc/dist/lib/converter/plugins/CommentPlugin'; -import { Type, ReferenceType } from 'typedoc/dist/lib/models'; - -/** - * A handler that deals with inherited reflections. - */ -@Component({ name: 'no-inherit' }) -export default class NoInheritPlugin extends ConverterComponent { - /** - * A list of classes/interfaces that don't inherit reflections. - */ - private noInherit: DeclarationReflection[]; - - /** - * A list of reflections that are inherited from a super. - */ - private inheritedReflections: DeclarationReflection[]; - - /** - * Create a new CommentPlugin instance. - */ - initialize() { - this.listenTo(this.owner, Converter.EVENT_BEGIN, this.onBegin); - this.listenTo(this.owner, Converter.EVENT_CREATE_DECLARATION, this.onDeclaration, -100); // after CommentPlugin - this.listenTo(this.owner, Converter.EVENT_RESOLVE_BEGIN, this.onBeginResolve); - } - - /** - * Triggered when the converter begins converting a project. - * - * @param context The context object describing the current state the converter is in. - */ - private onBegin(context: Context) { - this.noInherit = []; - this.inheritedReflections = []; - } - - /** - * Triggered when the converter has created a declaration or signature reflection. - * - * Builds the list of classes/interfaces that don't inherit docs and - * the list of reflections that are inherited that could end up being removed. - * - * @param context The context object describing the current state the converter is in. - * @param reflection The reflection that is currently processed. - * @param node The node that is currently processed if available. - */ - private onDeclaration(context: Context, reflection: Reflection, node?) { - if (reflection instanceof DeclarationReflection) { - // class or interface that won't inherit docs - if ( - reflection.kindOf(ReflectionKind.ClassOrInterface) && - reflection.comment && - reflection.comment.hasTag('noinheritdoc') - ) { - this.noInherit.push(reflection); - reflection.comment.removeTags('noinheritdoc') - } - // class or interface member inherited from a super - if ( - reflection.inheritedFrom && - reflection.parent && - reflection.parent.kindOf(ReflectionKind.ClassOrInterface) && - (!reflection.overwrites || (reflection.overwrites && reflection.overwrites !== reflection.inheritedFrom)) - ) { - this.inheritedReflections.push(reflection); - } - } - } - - /** - * Triggered when the converter begins resolving a project. - * - * Goes over the list of inherited reflections and removes any that are down the hierarchy - * from a class that doesn't inherit docs. - * - * @param context The context object describing the current state the converter is in. - */ - private onBeginResolve(context: Context) { - if (this.noInherit) { - const project = context.project; - const removals: Reflection[] = []; - - this.inheritedReflections.forEach((reflection) => { - // Look through the inheritance chain for a reflection that is flagged as noInherit for this reflection - if (this.isNoInheritRecursive(context, reflection, 0)) { - removals.push(reflection); - } - }); - - removals.forEach((removal) => { - project.removeReflection(removal); - }); - } - } - - /** - * Checks whether some DeclarationReflection is in the noInherit list. - * @param search The DeclarationReflection to search for in the list. - */ - private isNoInherit(search: DeclarationReflection): boolean { - if (this.noInherit.find((no: DeclarationReflection) => no.id === search.id && no.name === search.name)) { - return true; - } - return false; - } - - /** - * Checks whether some Reflection is in the inheritedReflections list. - * @param search The Reflection to search for in the list. - */ - private isInherited(search: Reflection): boolean { - if (this.inheritedReflections.find((inh: Reflection) => inh.id === search.id && inh.name === search.name)) { - return true; - } - return false; - } - - /** - * Checks whether some reflection's inheritance chain is broken by a class or interface that doesn't inherit docs. - * @param context The context object describing the current state the converter is in. - * @param current The current reflection being evaluated for non-inheritance. - * @param depth The current recursion depth, used for stopping on excessively long inheritance chains. - */ - private isNoInheritRecursive(context: Context, current: Reflection, depth: number): boolean { - if (depth > 20) { - this.application.logger.warn( - `Found inheritance chain with depth > 20, stopping no inherit check: ${current.getFullName()}` - ); - return false; // stop if we've recursed more than 20 times - } - - // As we move up the chain, check if the reflection parent is in the noInherit list - const parent = current.parent as DeclarationReflection; - if (!parent) return false; - if (this.isNoInherit(parent) && (depth === 0 || this.isInherited(current))) { - return true; - } - - const checkExtended = (type: Type) => { - const extended = this.resolveType(context, parent, type); - if (extended instanceof Reflection) { - const upLevel = extended.getChildByName(current.name); - if (upLevel && this.isNoInheritRecursive(context, upLevel, depth + 1)) { - return true; - } - } - return false; - }; - - if (parent.extendedTypes) { - if (parent.extendedTypes.some(checkExtended)) { - return true; - } - } - - return false; - } - - /** - * Takes some ReferenceType and resolves it to a reflection. - * This is needed because we are operating prior to the TypePlugin resolving types. - * @param context The context object describing the current state the converter is in. - * @param reflection The reflection context. - * @param typeProp The type to find relative to the reflection. - */ - private resolveType(context: Context, reflection: Reflection, typeProp: Type): Reflection { - const project = context.project; - if (typeProp instanceof ReferenceType) { - const type: any = typeProp; - // @ts-ignore - if (type.symbolID === ReferenceType.SYMBOL_ID_RESOLVE_BY_NAME) { - return reflection.findReflectionByName(type.name); - // @ts-ignore - } else if (!type.reflection && type.symbolID !== ReferenceType.SYMBOL_ID_RESOLVED) { - // @ts-ignore - return project.reflections[project.symbolMapping[type.symbolID]]; - } else { - return type.reflection; - } - } - return null; - } -} diff --git a/docs-gen/src/resources/helpers/__snapshots__/_helpers.spec.ts.snap b/docs-gen/src/resources/helpers/__snapshots__/_helpers.spec.ts.snap deleted file mode 100644 index 3debe740cde71..0000000000000 --- a/docs-gen/src/resources/helpers/__snapshots__/_helpers.spec.ts.snap +++ /dev/null @@ -1,60 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Helpers declarationTitle helper should compi;e 1`] = `"**color**: *string* = \\"blue\\""`; - -exports[`Helpers literal helper should compile object literal 1`] = ` -"!spaces* **valueA**: *number* = 100 - -!spaces* **valueB**: *boolean* = true - -!spaces* **valueZ**: *string* = \\"foo\\" - -!spaces* **valueY**(): *string* - - -!spaces* **valueX**: *object* - -!spaces * **valueA**: *number[]* = [100, 200, 300] - -!spaces * **valueZ**: *string* = \\"foo\\" - -!spaces * **valueY**(\`z\`: string): *object* - - -!spaces * **a**: *string* = \\"test\\" - -!spaces * **b**: *string* = z - - -" -`; - -exports[`Helpers literal helper should compile type literal 1`] = ` -" -" -`; - -exports[`Helpers parameterNameAndType helper sould compile 1`] = `"▪\`Const\` **objectLiteral**: *object*"`; - -exports[`Helpers parameterTable helper should compile 1`] = ` -" -Name | Type | Default | Description | ------- | ------ | ------ | ------ | -\`valueA\` | string | \\"defaultValue\\" | A parameter with a default string value. | -\`valueB\` | number | 100 | A parameter with a default numeric value. | -\`valueC\` | number | Number.NaN | A parameter with a default NaN value. | -\`valueD\` | boolean | true | A parameter with a default boolean value. | -\`valueE\` | boolean | null | A parameter with a default null value. | -" -`; - -exports[`Helpers signatureTitle helper should compile 1`] = ` -"**functionWithParameters**(\`paramZ\`: string, \`paramG\`: any, \`paramA\`: Object): *number* -" -`; - -exports[`Helpers type helper should compile intrinsic type 1`] = `"string"`; - -exports[`Helpers typeAndParent helper should compile 1`] = `"[INameInterface](../interfaces/_classes_.inameinterface.md).[name](../interfaces/_classes_.inameinterface.md#name)"`; - -exports[`Helpers utils helpers should compile stripLineBreaks helper: line 1 line2 1`] = `"line 1 line2 "`; diff --git a/docs-gen/src/resources/helpers/_helpers.spec.ts b/docs-gen/src/resources/helpers/_helpers.spec.ts deleted file mode 100644 index 9f2d99e498fe8..0000000000000 --- a/docs-gen/src/resources/helpers/_helpers.spec.ts +++ /dev/null @@ -1,185 +0,0 @@ -import * as fs from 'fs-extra'; -import * as Handlebars from 'handlebars'; -import * as path from 'path'; -import { Application } from 'typedoc'; - -const handlebarsHelpersOptionsStub = { - fn: () => 'true', - inverse: () => 'false', - hash: {}, -}; - -describe(`Helpers`, () => { - let app; - let project: any; - const out = path.join(__dirname, 'tmp'); - - beforeAll(() => { - app = new Application(); - app.bootstrap({ - module: 'CommonJS', - target: 'ES5', - readme: 'none', - theme: 'markdown', - logger: 'none', - plugin: path.join(__dirname, '../../../dist/index'), - }); - project = app.convert(app.expandInputFiles(['./test/stubs/'])); - app.generateDocs(project, out); - }); - - afterAll(() => { - fs.removeSync(out); - }); - - describe(`utils helpers`, () => { - test(`should compile headings helper`, () => { - expect(Handlebars.helpers.heading.call(this, 2)).toEqual('##'); - }); - test(`should compile stripLineBreaks helper`, () => { - const result = Handlebars.helpers.stripLineBreaks.call('line 1\n line2\n'); - expect(result).toMatchSnapshot('line 1 line2'); - }); - test(`should compile spaces helper`, () => { - const result = Handlebars.helpers.spaces.call(this, 3); - expect(result).toEqual('!spaces '); - }); - }); - - describe(`declarationTitle helper`, () => { - test(`should compi;e`, () => { - expect(Handlebars.helpers.declarationTitle.call(project.findReflectionByName('color'))).toMatchSnapshot(); - }); - }); - - describe(`ifHasTypeDeclarations helper`, () => { - test(`should return true if ifHasTypeDeclarations is true and expectation is truthy`, () => { - const result = Handlebars.helpers.ifHasTypeDeclarations.call( - project.findReflectionByName('drawText').signatures[0], - true, - handlebarsHelpersOptionsStub, - ); - expect(result).toEqual('true'); - }); - - test(`should return true if ifHasTypeDeclarations is false and expectation is truthy`, () => { - const data = project.findReflectionByName('exportedFunction'); - const result = Handlebars.helpers.ifHasTypeDeclarations.call( - data.signatures[0], - true, - handlebarsHelpersOptionsStub, - ); - expect(result).toEqual('false'); - }); - - test(`should return true if ifHasTypeDeclarations is false and expectation is falsey`, () => { - const data = project.findReflectionByName('exportedFunction'); - const result = Handlebars.helpers.ifHasTypeDeclarations.call( - data.signatures[0], - false, - handlebarsHelpersOptionsStub, - ); - expect(result).toEqual('true'); - }); - }); - - describe(`ifIsLiteralType helper`, () => { - test(`should return true if isLiteralType is is true and expectation is truthy`, () => { - const data = project.findReflectionByName('objectLiteral'); - const result = Handlebars.helpers.ifIsLiteralType.call(data, true, handlebarsHelpersOptionsStub); - expect(result).toEqual('true'); - }); - - test(`should return false if isLiteralType is is true and expectation is falsey`, () => { - const data = project.findReflectionByName('objectLiteral'); - const result = Handlebars.helpers.ifIsLiteralType.call(data, false, handlebarsHelpersOptionsStub); - expect(result).toEqual('false'); - }); - - test(`should return true if isLiteralType is is false and expectation is falsey`, () => { - const data = project.findReflectionByName('color'); - const result = Handlebars.helpers.ifIsLiteralType.call(data, false, handlebarsHelpersOptionsStub); - expect(result).toEqual('true'); - }); - }); - - describe(`ifParentIsObjectLiteral helper`, () => { - test(`should return true if ifParentIsObjectLiteral is is true and expectation is truthy`, () => { - const data = { - parent: { - parent: { - kind: 2097152, - }, - }, - }; - const result = Handlebars.helpers.ifParentIsObjectLiteral.call(data, true, handlebarsHelpersOptionsStub); - expect(result).toEqual('true'); - }); - - test(`should return false if ifParentIsObjectLiteral is is false and expectation is truthy`, () => { - const data = {}; - const result = Handlebars.helpers.ifParentIsObjectLiteral.call(data, true, handlebarsHelpersOptionsStub); - expect(result).toEqual('false'); - }); - - test(`should return true if ifParentIsObjectLiteral is is false and expectation is falsey`, () => { - const data = {}; - const result = Handlebars.helpers.ifParentIsObjectLiteral.call(data, false, handlebarsHelpersOptionsStub); - expect(result).toEqual('true'); - }); - }); - - describe(`literal helper`, () => { - test(`should compile object literal`, () => { - const data = project.findReflectionByName('objectLiteral'); - const result = Handlebars.helpers.literal.call(data); - expect(result).toMatchSnapshot(); - }); - - test(`should compile type literal`, () => { - const data = project.findReflectionByName('typeLiteral'); - const result = Handlebars.helpers.literal.call(data); - expect(result).toMatchSnapshot(); - }); - }); - - describe(`parameterNameAndType helper`, () => { - test(`sould compile`, () => { - const data = project.findReflectionByName('objectLiteral'); - const result = Handlebars.helpers.parameterNameAndType.call(data); - expect(result).toMatchSnapshot(); - }); - }); - - describe(`parameterTable helper`, () => { - test(`should compile`, () => { - const data = project.findReflectionByName('functionWithDefaults'); - const result = Handlebars.helpers.parameterTable.call(data.signatures[0].parameters); - expect(result).toMatchSnapshot(); - }); - }); - - describe(`signatureTitle helper`, () => { - test(`should compile`, () => { - const data = project.findReflectionByName('functionWithParameters'); - const result = Handlebars.helpers.signatureTitle.call(data.signatures[0]); - expect(result).toMatchSnapshot(); - }); - }); - - describe(`typeAndParent helper`, () => { - test(`should compile`, () => { - const data = project.findReflectionByName('BaseClass'); - const result = Handlebars.helpers.typeAndParent.call(data.children[3].implementationOf); - expect(result).toMatchSnapshot(); - }); - }); - - describe(`type helper`, () => { - test(`should compile intrinsic type`, () => { - const data = project.findReflectionByName('color'); - const result = Handlebars.helpers.type.call(data.type); - expect(result).toMatchSnapshot(); - }); - }); -}); diff --git a/docs-gen/src/resources/helpers/breadcrumbs.ts b/docs-gen/src/resources/helpers/breadcrumbs.ts deleted file mode 100644 index d456a2d83cabd..0000000000000 --- a/docs-gen/src/resources/helpers/breadcrumbs.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PageEvent } from 'typedoc/dist/lib/output/events'; - -import MarkdownTheme from '../../theme'; - -export function breadcrumbs(this: PageEvent) { - return MarkdownTheme.handlebars.helpers.breadcrumbs.call(this); -} diff --git a/docs-gen/src/resources/helpers/comment.ts b/docs-gen/src/resources/helpers/comment.ts deleted file mode 100644 index a5ac2330a348f..0000000000000 --- a/docs-gen/src/resources/helpers/comment.ts +++ /dev/null @@ -1,5 +0,0 @@ -import MarkdownTheme from '../../theme'; - -export function comment(this: string) { - return MarkdownTheme.handlebars.helpers.comment.call(this); -} diff --git a/docs-gen/src/resources/helpers/declaration-title.ts b/docs-gen/src/resources/helpers/declaration-title.ts deleted file mode 100644 index a65fd0652ab3c..0000000000000 --- a/docs-gen/src/resources/helpers/declaration-title.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { DeclarationReflection, ReflectionKind } from 'typedoc'; -import { ReferenceType } from 'typedoc/dist/lib/models'; -import { memberSymbol } from './member-symbol'; -import { type } from './type'; - -export function declarationTitle(this: DeclarationReflection, showSymbol: boolean) { - if (!this.type && !this.defaultValue && !this.typeHierarchy?.types.length) { - return ''; - } - if (this.type && type.call(this.type).toString() === 'object') { - return ''; - } - - const md = []; - const isOptional = this.flags.map((flag) => flag).includes('Optional'); - - if (showSymbol) { - md.push(`\n${memberSymbol.call(this)}\n`); - } - - md.push(`${this.name}${isOptional ? '? ' : ''}`); - - if (this.typeHierarchy?.types.length) { - if (this.typeHierarchy?.isTarget) { - return ''; - } - const [parent] = this.typeHierarchy.types; - if (parent instanceof ReferenceType) { - const name = parent.reflection === undefined ? parent.symbolFullyQualifiedName : parent.name; - - md.push('extends'); - md.push(name); - - if (parent.typeArguments) { - md.push(`‹${parent.typeArguments.map((typeArgument) => type.call(typeArgument)).join(', ')}›`.trim()); - } - } - } - - // We want to display enum members like: - // • DAY = "day" - if (this.kind !== ReflectionKind.EnumMember) { - md[md.length - 1] += ':'; - } - - if (this.type) { - md.push(type.call(this.type)); - } - if (this.defaultValue) { - md.push(`= ${this.defaultValue}`); - } - - if (showSymbol) { - md.push(`\n${memberSymbol.call(this)}\n`); - } - - return md.join(' '); -} diff --git a/docs-gen/src/resources/helpers/heading.ts b/docs-gen/src/resources/helpers/heading.ts deleted file mode 100644 index 6916dc07ec722..0000000000000 --- a/docs-gen/src/resources/helpers/heading.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function heading(level: number) { - return [...Array(level)].map(() => '#').join(''); -} diff --git a/docs-gen/src/resources/helpers/hierarchy-level.ts b/docs-gen/src/resources/helpers/hierarchy-level.ts deleted file mode 100644 index 4c0ca9a5e90c3..0000000000000 --- a/docs-gen/src/resources/helpers/hierarchy-level.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DeclarationReflection, ReferenceType } from 'typedoc/dist/lib/models'; - -import { spaces } from './spaces'; - -export function hierachyLevel(this: ReferenceType) { - const reflection = this.reflection as DeclarationReflection; - const symbol = reflection && reflection.extendedTypes ? `${spaces(2)}↳` : '*'; - return symbol; -} diff --git a/docs-gen/src/resources/helpers/if-breadcrumbs.ts b/docs-gen/src/resources/helpers/if-breadcrumbs.ts deleted file mode 100644 index 599a9371e642f..0000000000000 --- a/docs-gen/src/resources/helpers/if-breadcrumbs.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PageEvent } from 'typedoc/dist/lib/output/events'; - -import MarkdownTheme from '../../theme'; - -export function ifBreadcrumbs(this: PageEvent, options) { - if (MarkdownTheme.isSingleFile) { - return options.inverse(this); - } - return MarkdownTheme.handlebars.helpers.ifBreadcrumbs.call(this, options); -} diff --git a/docs-gen/src/resources/helpers/if-cond.ts b/docs-gen/src/resources/helpers/if-cond.ts deleted file mode 100644 index 1d36ccc01d5c8..0000000000000 --- a/docs-gen/src/resources/helpers/if-cond.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Handlebars if helper with condition. - * - * @param v1 The first value to be compared. - * @param operator The operand to perform on the two given values. - * @param v2 The second value to be compared - * @param options The current handlebars object. - * @param this The current handlebars this. - * @returns {*} - */ -export function ifCond(v1: any, operator: any, v2: any, options: any) { - switch (operator) { - case '==': - return v1 == v2 ? options.fn(this) : options.inverse(this); - case '!=': - return v1 != v2 ? options.fn(this) : options.inverse(this); - case '===': - return v1 === v2 ? options.fn(this) : options.inverse(this); - case '<': - return v1 < v2 ? options.fn(this) : options.inverse(this); - case '<=': - return v1 <= v2 ? options.fn(this) : options.inverse(this); - case '>': - return v1 > v2 ? options.fn(this) : options.inverse(this); - case '>=': - return v1 >= v2 ? options.fn(this) : options.inverse(this); - case '&&': - return v1 && v2 ? options.fn(this) : options.inverse(this); - case '||': - return v1 || v2 ? options.fn(this) : options.inverse(this); - default: - return options.inverse(this); - } -} diff --git a/docs-gen/src/resources/helpers/if-has-type-declarations.ts b/docs-gen/src/resources/helpers/if-has-type-declarations.ts deleted file mode 100644 index 32e82f9a4fa91..0000000000000 --- a/docs-gen/src/resources/helpers/if-has-type-declarations.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ReflectionType, SignatureReflection } from 'typedoc/dist/lib/models'; - -export function ifHasTypeDeclarations(this: SignatureReflection, truthy: boolean, options: any) { - const parameterDeclarations = - this.parameters && - this.parameters.map(parameter => { - const type = parameter.type as ReflectionType; - return ( - parameter.type && - type.declaration && - ((type.declaration.children && type.declaration.children.length > 0) || - (type.declaration.signatures && type.declaration.signatures.length > 0)) - ); - }); - const hasTypeDeclarations = parameterDeclarations && parameterDeclarations.some(parameterDeclaration => parameterDeclaration); - - if (hasTypeDeclarations && truthy) { - return options.fn(this); - } - return !hasTypeDeclarations && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-indexes.ts b/docs-gen/src/resources/helpers/if-indexes.ts deleted file mode 100644 index 40ca5be5d8200..0000000000000 --- a/docs-gen/src/resources/helpers/if-indexes.ts +++ /dev/null @@ -1,5 +0,0 @@ -import MarkdownTheme from '../../theme'; - -export function ifIndexes(options) { - return MarkdownTheme.handlebars.helpers.ifIndexes.call(this, options); -} diff --git a/docs-gen/src/resources/helpers/if-is-function-type.ts b/docs-gen/src/resources/helpers/if-is-function-type.ts deleted file mode 100644 index 3ab2bed9cdffd..0000000000000 --- a/docs-gen/src/resources/helpers/if-is-function-type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DeclarationReflection } from 'typedoc'; -import { type } from './type'; - -export function ifIsFunctionType(this: DeclarationReflection, truthy: boolean, options: any) { - const isFunctionType = type.call(this).toString() === 'function'; - - if (isFunctionType && truthy) { - return options.fn(this); - } - return !isFunctionType && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-is-literal-type.ts b/docs-gen/src/resources/helpers/if-is-literal-type.ts deleted file mode 100644 index 28cbfeffb7113..0000000000000 --- a/docs-gen/src/resources/helpers/if-is-literal-type.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DeclarationReflection, ReflectionKind } from 'typedoc'; - -export function ifIsLiteralType(this: DeclarationReflection, truthy: boolean, options: any) { - const isLiteralType = this.kind === ReflectionKind.ObjectLiteral || this.kind === ReflectionKind.TypeLiteral; - if (isLiteralType && truthy) { - return options.fn(this); - } - return !isLiteralType && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-named-anchors.ts b/docs-gen/src/resources/helpers/if-named-anchors.ts deleted file mode 100644 index ca90cab321838..0000000000000 --- a/docs-gen/src/resources/helpers/if-named-anchors.ts +++ /dev/null @@ -1,5 +0,0 @@ -import MarkdownTheme from '../../theme'; - -export function ifNamedAnchors(options) { - return MarkdownTheme.handlebars.helpers.ifNamedAnchors.call(this, options); -} diff --git a/docs-gen/src/resources/helpers/if-parent-is-module.ts b/docs-gen/src/resources/helpers/if-parent-is-module.ts deleted file mode 100644 index 9bb810c1789dc..0000000000000 --- a/docs-gen/src/resources/helpers/if-parent-is-module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DeclarationReflection, ReflectionKind } from 'typedoc'; - -export function ifParentIsModule(this: DeclarationReflection, truthy: boolean, options: any) { - const parentIsModule = this.parent && this.parent.kind === ReflectionKind.Module; - if (parentIsModule && truthy) { - return options.fn(this); - } - return !parentIsModule && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-parent-is-object-literal.ts b/docs-gen/src/resources/helpers/if-parent-is-object-literal.ts deleted file mode 100644 index 35ef7b7e550d1..0000000000000 --- a/docs-gen/src/resources/helpers/if-parent-is-object-literal.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DeclarationReflection, ReflectionKind } from 'typedoc'; - -export function ifParentIsObjectLiteral(this: DeclarationReflection, truthy: boolean, options: any) { - const parentIsObjectLiteral = this.parent && this.parent.parent && this.parent.parent.kind === ReflectionKind.ObjectLiteral; - if (parentIsObjectLiteral && truthy) { - return options.fn(this); - } - return !parentIsObjectLiteral && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-parent-kind-is.ts b/docs-gen/src/resources/helpers/if-parent-kind-is.ts deleted file mode 100644 index 021e7a5c6b55c..0000000000000 --- a/docs-gen/src/resources/helpers/if-parent-kind-is.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DeclarationReflection } from 'typedoc'; - -export function ifParentKindIs(this: DeclarationReflection, kindString: string, truthy: boolean = true, options: any) { - const equals = this.parent && this.parent.kindString === kindString; - - return !equals && !truthy ? options.fn(this) : options.inverse(this); -} diff --git a/docs-gen/src/resources/helpers/if-sources.ts b/docs-gen/src/resources/helpers/if-sources.ts deleted file mode 100644 index 19a5ba9f11ce4..0000000000000 --- a/docs-gen/src/resources/helpers/if-sources.ts +++ /dev/null @@ -1,5 +0,0 @@ -import MarkdownTheme from '../../theme'; - -export function ifSources(options) { - return MarkdownTheme.handlebars.helpers.ifSources.call(this, options); -} diff --git a/docs-gen/src/resources/helpers/literal.ts b/docs-gen/src/resources/helpers/literal.ts deleted file mode 100644 index 56e7863537868..0000000000000 --- a/docs-gen/src/resources/helpers/literal.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { DeclarationReflection } from 'typedoc'; -import { ReflectionKind, ReflectionType } from 'typedoc/dist/lib/models'; -import { declarationTitle } from './declaration-title'; -import { signatureTitle } from './signature-title'; -import { spaces } from './spaces'; - -export function literal(this: DeclarationReflection) { - const md = []; - - if (this.children) { - this.children.forEach(child => { - md.push(objectProperty(md, 0, child)); - }); - } - return md.join('') + '\n'; -} - -function objectProperty(md: any[], spaceLength: number, property: DeclarationReflection) { - if (property.type instanceof ReflectionType) { - md.push(`${spaces(spaceLength)}* ${signatureTitle.call(property, false)}\n\n`); - if (property.type.declaration) { - md.push(objectProperty(md, spaceLength + 2, property.type.declaration)); - } - if (property.type.declaration && property.type.declaration.signatures) { - property.type.declaration.signatures.forEach(signature => { - if (signature.kind !== ReflectionKind.CallSignature) { - md.push(`${spaces(spaceLength)}* ${signatureTitle.call(signature, false)}\n\n`); - if (signature.type instanceof ReflectionType) { - md.push(objectProperty(md, spaceLength + 2, signature.type.declaration)); - } - } - }); - } - } else { - if (property.signatures) { - property.signatures.forEach(signature => { - md.push(`${spaces(spaceLength)}* ${signatureTitle.call(signature, false)}\n\n`); - if (signature.type instanceof ReflectionType) { - md.push(objectProperty(md, spaceLength + 2, signature.type.declaration)); - } - }); - } else { - if (property.kind !== ReflectionKind.TypeLiteral) { - md.push(`${spaces(spaceLength)}* ${declarationTitle.call(property, false)}\n\n`); - } - } - } - if (property.children) { - property.children.forEach(child => { - md.push(objectProperty(md, property.kind === ReflectionKind.TypeLiteral ? spaceLength : spaceLength + 2, child)); - }); - } -} diff --git a/docs-gen/src/resources/helpers/member-symbol.ts b/docs-gen/src/resources/helpers/member-symbol.ts deleted file mode 100644 index bcc152442394c..0000000000000 --- a/docs-gen/src/resources/helpers/member-symbol.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { - DeclarationReflection, -} from 'typedoc'; - -export function memberSymbol(this: DeclarationReflection) { - return '```'; -} diff --git a/docs-gen/src/resources/helpers/member-title.ts b/docs-gen/src/resources/helpers/member-title.ts deleted file mode 100644 index 074d80d7f1cbc..0000000000000 --- a/docs-gen/src/resources/helpers/member-title.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { DeclarationReflection, ReflectionKind } from 'typedoc'; -import { heading } from './heading'; - -export function memberTitle(this: DeclarationReflection) { - if (this.parent?.kindOf(ReflectionKind.Enum)) { - return ''; - } - - const md = []; - let parentName = ''; - let headingLevel = 3; - if (!(this as any).stickToParent) { - if (this.parent?.kindOf(ReflectionKind.Module)) { - headingLevel = 2; - - if (this.kind === ReflectionKind.TypeAlias) { - // headingLevel = 4; - headingLevel = 3; - } - } - - const isParentTopLevel = this.parent.kind === 1; - const isHeadingLevel3 = headingLevel === 3; - parentName = isParentTopLevel - ? (isHeadingLevel3 ? 'Types' : '') - : this.parent.name.replace(/"/, ''); - } - - - md.push(heading(headingLevel)); - if (parentName) { - md.push(`<--{"id" : "${parentName}"}--> `); - } - md.push(this.name); - return md.join(' '); -} diff --git a/docs-gen/src/resources/helpers/meta.ts b/docs-gen/src/resources/helpers/meta.ts deleted file mode 100644 index edbd852e321a5..0000000000000 --- a/docs-gen/src/resources/helpers/meta.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ProjectReflection } from 'typedoc'; -import { CommentTag, ContainerReflection } from 'typedoc/dist/lib/models'; - -export function meta(this: ProjectReflection) { - function findModuleRelection(reflection?: ContainerReflection) { - if (!reflection) { - return null; - } - - if (reflection?.comment) { - return reflection; - } - - return findModuleRelection(reflection?.children?.[0]); - } - - function tagConverter(tag: string) { - const tags = { - menucategory: 'category', - subcategory: 'subCategory', - menuorder: 'menuOrder' - }; - - return tags[tag] ?? tag; - } - - const moduleReflection = findModuleRelection(this); - - if (moduleReflection) { - const { comment } = moduleReflection; - const md = ['---']; - - (comment?.tags || []).forEach((tag: CommentTag) => { - if (tag.tagName !== 'description') { - const text = tag.text.startsWith('@') ? `'${tag.text}'` : tag.text; - md.push(`${tagConverter(tag.tagName)}: ${text}`.replace('\n', '')); - } - }); - md.push('---'); - const description = (comment?.tags || []).find((tag: CommentTag) => tag.tagName === 'description'); - - if (description) { - md.push(''); - md.push(description.text); - } - - return md.join('\n'); - } - - return ''; -} diff --git a/docs-gen/src/resources/helpers/new-line.ts b/docs-gen/src/resources/helpers/new-line.ts deleted file mode 100644 index ff762e35d080f..0000000000000 --- a/docs-gen/src/resources/helpers/new-line.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function newline() { - return '\n'; -} diff --git a/docs-gen/src/resources/helpers/param-type-to-string.ts b/docs-gen/src/resources/helpers/param-type-to-string.ts deleted file mode 100644 index 80d0b7330ad47..0000000000000 --- a/docs-gen/src/resources/helpers/param-type-to-string.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ParameterReflection } from 'typedoc'; -import { ReflectionType, UnionType } from 'typedoc/dist/lib/models'; - -import { signatureTitle } from './signature-title'; -import { type } from './type'; - -export default function paramTypeToString(parameter: ParameterReflection) { - let typeOut; - - if (parameter.type instanceof ReflectionType && parameter.type.toString() === 'function') { - const declarations = parameter.type.declaration.signatures?.map((sig) => signatureTitle.call(sig, false, true)); - typeOut = declarations.join(' | ').replace(/\n/, ''); - } else if (parameter.type instanceof UnionType) { - typeOut = parameter.type.types - .map((currentType) => { - if (currentType instanceof ReflectionType) { - const declarations = currentType.declaration.signatures?.map((sig) => signatureTitle.call(sig, false, true)); - return declarations.join(' | ').replace(/\n/, ''); - } - return type.call(currentType); - }) - .join(' | '); - } else { - typeOut = type.call(parameter.type); - } - - return typeOut; -} diff --git a/docs-gen/src/resources/helpers/parameter-name-and-type.ts b/docs-gen/src/resources/helpers/parameter-name-and-type.ts deleted file mode 100644 index 042db2f40a9f9..0000000000000 --- a/docs-gen/src/resources/helpers/parameter-name-and-type.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ParameterReflection } from 'typedoc'; -import { type } from './type'; - -export function parameterNameAndType(this: ParameterReflection, displaySymbol = true) { - const md = []; - if (displaySymbol) { - md.push('-'); - } - if (this.flags && !this.flags.isRest) { - md.push(this.flags.map(flag => `\`${flag}\` `)); - } - md.push(`${this.flags.isRest ? '...' : ''} **${this.name}**`); - if (this.type) { - md.push(`: \`${type.call(this.type)}\``); - } - if (this.defaultValue) { - md.push(`= ${this.defaultValue}`); - } - return md.join(''); -} diff --git a/docs-gen/src/resources/helpers/parameter-table-jsx.ts b/docs-gen/src/resources/helpers/parameter-table-jsx.ts deleted file mode 100644 index ece933f8abf15..0000000000000 --- a/docs-gen/src/resources/helpers/parameter-table-jsx.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ParameterReflection } from 'typedoc'; - -import paramTypeToString from './param-type-to-string'; - -const printJson = (input) => JSON.stringify(input, null, 2); - -export function parameterTableJsx(this: ParameterReflection[], hideUncommented: boolean) { - - const defaultValues = this.map((param) => !!param.defaultValue); - const hasDefaultValues = !defaultValues.every((value) => !value); - - const comments = this.map( - (param) => (param.comment && !!param.comment.text) || (param.comment && !!param.comment.shortText) - ); - const hasComments = !comments.every((value) => !value); - - const columns = [ - 'Name', - 'Type', - ]; - - if (hasDefaultValues) { - columns.push('Default'); - } - - if (hasComments) { - columns.push('Description'); - } - - if (hideUncommented && !hasComments) { - return ''; - } - - const data = this.map((parameter) => { - const isOptional = parameter.flags.includes('Optional'); - - const paramName = `${parameter.flags.isRest ? '...' : ''}${parameter.name}${isOptional ? '?' : ''}`; - const typeOut = paramTypeToString(parameter); - const paramType = typeOut - ? typeOut.toString() - : ''; - const commentsText = []; - - if (hasComments) { - if (parameter.comment && parameter.comment.shortText) { - commentsText.push( - parameter.comment.shortText - ); - } - if (parameter.comment && parameter.comment.text) { - parameter.comment.text - } - } - - return { - Name: paramName, - Type: paramType, - Default: parameter.defaultValue ? parameter.defaultValue : '-', - Description: commentsText.join(''), - }; - }); - - return ` - - -`; -} diff --git a/docs-gen/src/resources/helpers/parameter-table.ts b/docs-gen/src/resources/helpers/parameter-table.ts deleted file mode 100644 index f4c23048eeeb7..0000000000000 --- a/docs-gen/src/resources/helpers/parameter-table.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ParameterReflection } from 'typedoc'; - -import MarkdownTheme from '../../theme'; -import { stripLineBreaks } from './strip-line-breaks'; -import paramTypeToString from './param-type-to-string'; - -export function parameterTable(this: ParameterReflection[], hideUncommented: boolean) { - const md = []; - const defaultValues = this.map((param) => !!param.defaultValue); - const hasDefaultValues = !defaultValues.every((value) => !value); - - const comments = this.map( - (param) => (param.comment && !!param.comment.text) || (param.comment && !!param.comment.shortText) - ); - const hasComments = !comments.every((value) => !value); - - const headers = ['Name', 'Type']; - - if (hasDefaultValues) { - headers.push('Default'); - } - - if (hasComments) { - headers.push('Description'); - } - - if (hideUncommented && !hasComments) { - return ''; - } - - if (hideUncommented) { - md.push('**Parameters:**\n'); - } - - const rows = this.map((parameter) => { - const isOptional = parameter.flags.includes('Optional'); - - const typeOut = paramTypeToString(parameter); - - const row = [ - `${parameter.flags.isRest ? '...' : ''}${parameter.name}${isOptional ? '?' : ''}`, - typeOut ? typeOut.toString().replace(/\|/g, '|') : '', - ]; - if (hasDefaultValues) { - row.push(parameter.defaultValue ? parameter.defaultValue : '-'); - } - if (hasComments) { - const commentsText = []; - if (parameter.comment && parameter.comment.shortText) { - commentsText.push( - MarkdownTheme.handlebars.helpers.comment.call(stripLineBreaks.call(parameter.comment.shortText)) - ); - } - if (parameter.comment && parameter.comment.text) { - commentsText.push(MarkdownTheme.handlebars.helpers.comment.call(stripLineBreaks.call(parameter.comment.text))); - } - row.push(commentsText.length > 0 ? commentsText.join(' ') : '-'); - } - return `${row.join(' | ')} |\n`; - }); - - md.push(`\n${headers.join(' | ')} |\n${headers.map(() => '------').join(' | ')} |\n${rows.join('')}`); - - return md.join(''); -} diff --git a/docs-gen/src/resources/helpers/reflection-title.ts b/docs-gen/src/resources/helpers/reflection-title.ts deleted file mode 100644 index 5893f23cef905..0000000000000 --- a/docs-gen/src/resources/helpers/reflection-title.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { PageEvent } from 'typedoc/dist/lib/output/events'; - -export function reflectionTitle(this: PageEvent) { - const title = []; - if (this.model.kindString) { - title.push(`${this.model.kindString}:`); - } - title.push(this.model.name); - if (this.model.typeParameters) { - const typeParameters = this.model.typeParameters.map((typeParameter) => typeParameter.name).join(', '); - title.push(`‹**${typeParameters}**›`); - } - return title.join(' '); -} diff --git a/docs-gen/src/resources/helpers/relative-url.ts b/docs-gen/src/resources/helpers/relative-url.ts deleted file mode 100644 index 8d8d4b4a28623..0000000000000 --- a/docs-gen/src/resources/helpers/relative-url.ts +++ /dev/null @@ -1,5 +0,0 @@ -import MarkdownTheme from '../../theme'; - -export function relativeURL(url: string) { - return MarkdownTheme.handlebars.helpers.relativeURL(url); -} diff --git a/docs-gen/src/resources/helpers/signature-title.ts b/docs-gen/src/resources/helpers/signature-title.ts deleted file mode 100644 index 5e5fff0a61aa9..0000000000000 --- a/docs-gen/src/resources/helpers/signature-title.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { SignatureReflection } from 'typedoc'; - -import { memberSymbol } from './member-symbol'; -import { type } from './type'; -import { ReflectionType } from 'typedoc/dist/lib/models'; -import paramTypeToString from './param-type-to-string'; - -export function signatureTitle(this: SignatureReflection, showSymbol: boolean = false) { - const md = []; - - if (showSymbol) { - md.push(`\n${memberSymbol.call(this)}typescript\n`); - } - - // eg: `static` - if (this.parent?.flags) { - md.push( - this.parent.flags - .map((flag) => `${flag} `) - .join(' ') - .toLowerCase() - ); - // md.push(' '); - } - - if (this.name === '__get') { - md.push(`**get ${this.parent.name}**`); - } else if (this.name === '__set') { - md.push(`**set ${this.parent.name}**`); - } else if (this.name !== '__call') { - md.push(this.name); - } - if (this.typeParameters) { - md.push(`<${this.typeParameters.map((typeParameter) => typeParameter.name).join(', ')}>`); - } - const params = this.parameters - ? this.parameters - .map((param) => { - const paramsmd = []; - if (param.flags.isRest) { - paramsmd.push('...'); - } - paramsmd.push(`${param.name}`); - if (param.flags.isOptional) { - paramsmd.push('?'); - } - paramsmd.push(`: ${paramTypeToString(param)}`); - return paramsmd.join(''); - }) - .join(', ') - : ''; - md.push(`(${params})`); - - if (this.type) { - md.push(!showSymbol ? ' =>' : ':'); - - if (this.type instanceof ReflectionType && type.call(this.type).toString() === 'function') { - const declarations = this.type.declaration.signatures?.map((sig) => signatureTitle.call(sig, false, true)); - md.push(declarations.join(' | ').replace(/\n/, '')); - } else { - md.push(` ${type.call(this.type)}`); - } - } - - if (showSymbol) { - md.push(`\n${memberSymbol.call(this)}\n`); - } - - return md.join('') + '\n'; -} diff --git a/docs-gen/src/resources/helpers/spaces.ts b/docs-gen/src/resources/helpers/spaces.ts deleted file mode 100644 index 414df8f9a0530..0000000000000 --- a/docs-gen/src/resources/helpers/spaces.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function spaces(length: number) { - return `!spaces${[...Array(length)].map(() => ' ').join('')}`; -} diff --git a/docs-gen/src/resources/helpers/strip-line-breaks.ts b/docs-gen/src/resources/helpers/strip-line-breaks.ts deleted file mode 100644 index 23f592c540314..0000000000000 --- a/docs-gen/src/resources/helpers/strip-line-breaks.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function stripLineBreaks(this: string) { - return this.replace(/\n/g, ' '); -} diff --git a/docs-gen/src/resources/helpers/type-and-parent.ts b/docs-gen/src/resources/helpers/type-and-parent.ts deleted file mode 100644 index c75dcfca77326..0000000000000 --- a/docs-gen/src/resources/helpers/type-and-parent.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { SignatureReflection } from 'typedoc'; -import { ArrayType, ReferenceType } from 'typedoc/dist/lib/models/types'; - -import MarkdownTheme from '../../theme'; - -export function typeAndParent(this: ArrayType | ReferenceType) { - if (this instanceof ReferenceType && this.reflection) { - const md = []; - if (this.reflection instanceof SignatureReflection) { - if (this.reflection.parent.parent.url) { - md.push( - `[${this.reflection.parent.parent.name}](${MarkdownTheme.handlebars.helpers.relativeURL( - this.reflection.parent.parent.url, - )})`, - ); - } else { - md.push(this.reflection.parent.parent.name); - } - } else { - if (this.reflection.parent.url) { - md.push( - `[${this.reflection.parent.name}](${MarkdownTheme.handlebars.helpers.relativeURL( - this.reflection.parent.url, - )})`, - ); - } else { - md.push(this.reflection.parent.name); - } - if (this.reflection.url) { - md.push(`[${this.reflection.name}](${MarkdownTheme.handlebars.helpers.relativeURL(this.reflection.url)})`); - } else { - md.push(this.reflection.name); - } - } - return md.join('.'); - } - return 'void'; -} diff --git a/docs-gen/src/resources/helpers/type.ts b/docs-gen/src/resources/helpers/type.ts deleted file mode 100644 index 1c9effda55ced..0000000000000 --- a/docs-gen/src/resources/helpers/type.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { - ArrayType, - IntersectionType, - IntrinsicType, - ReferenceType, - ReflectionType, - StringLiteralType, - TupleType, - TypeOperatorType, - UnionType, -} from 'typedoc/dist/lib/models/types'; - -import { LinkPlugin } from '../../plugins/LinkPlugin'; - -export function type( - this: - | ArrayType - | IntersectionType - | IntrinsicType - | ReferenceType - | StringLiteralType - | TupleType - | UnionType - | TypeOperatorType -) { - if (this instanceof ReferenceType && (this.reflection || (this.name && this.typeArguments))) { - return getReferenceType(this); - } - - if (this instanceof ArrayType && this.elementType) { - return getArrayType(this); - } - - if (this instanceof UnionType && this.types) { - return getUnionType(this); - } - - if (this instanceof IntersectionType && this.types) { - return getIntersectionType(this); - } - - if (this instanceof TupleType && this.elements) { - return getTupleType(this); - } - - if (this instanceof IntrinsicType && this.name) { - return getIntrinsicType(this); - } - - if (this instanceof StringLiteralType && this.value) { - return getStringLiteralType(this); - } - - if (this instanceof TypeOperatorType || this instanceof ReflectionType) { - return this; - } - - return this; -} - -function getReferenceType(model: ReferenceType) { - const md = []; - - md.push(model.name); - - if (model.typeArguments) { - md.push(`<${model.typeArguments.map((typeArgument) => `${type.call(typeArgument)}`).join(', ')}>`); - } - - return md.join(''); -} - -function getArrayType(model: ArrayType) { - return `${type.call(model.elementType)}[]`; -} - -function getUnionType(model: UnionType) { - return model.types.map((unionType) => type.call(unionType)).join(' | '); -} - -function getIntersectionType(model: IntersectionType) { - return model.types.map((intersectionType) => type.call(intersectionType)).join(' & '); -} - -function getTupleType(model: TupleType) { - return `[${model.elements.map((element) => type.call(element)).join(', ')}]`; -} - -function getIntrinsicType(model: IntrinsicType) { - return model.name; -} - -function getStringLiteralType(model: StringLiteralType) { - return `"${model.value}"`; -} diff --git a/docs-gen/src/resources/layouts/default.hbs b/docs-gen/src/resources/layouts/default.hbs deleted file mode 100755 index 4fdf50b11e9a6..0000000000000 --- a/docs-gen/src/resources/layouts/default.hbs +++ /dev/null @@ -1 +0,0 @@ -{{{contents}}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/comment.hbs b/docs-gen/src/resources/partials/comment.hbs deleted file mode 100755 index a4555b42b7ae1..0000000000000 --- a/docs-gen/src/resources/partials/comment.hbs +++ /dev/null @@ -1,37 +0,0 @@ -{{#with comment}} - -{{#if hasVisibleComponent}} - -{{#if shortText}} - -{{#with shortText}} - -{{{comment}}} - -{{/with}} - -{{/if}} - -{{#if text}} - -{{#with text}} - -{{{comment}}} - -{{/with}} - -{{/if}} - -{{#if tags}} - -{{#each tags}} - -**`{{tagName}}`** {{#if text}}{{#with text}}{{{comment}}}{{/with}}{{/if}} - -{{/each}} - -{{/if}} - -{{/if}} - -{{/with}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/header.hbs b/docs-gen/src/resources/partials/header.hbs deleted file mode 100644 index 9a2f133bf36bd..0000000000000 --- a/docs-gen/src/resources/partials/header.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{{#ifBreadcrumbs}} -{{{breadcrumbs}}} -{{/ifBreadcrumbs}} - -{{heading 1}} {{{reflectionTitle}}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/hierarchy.hbs b/docs-gen/src/resources/partials/hierarchy.hbs deleted file mode 100755 index 3e9084b6c49c1..0000000000000 --- a/docs-gen/src/resources/partials/hierarchy.hbs +++ /dev/null @@ -1,23 +0,0 @@ -{{#each types}} - -{{#if ../isTarget}} - -{{hierachyLevel}} **{{this}}** - -{{else}} - -{{hierachyLevel}} {{{type}}} - -{{/if}} - -{{#if @last}} - -{{#with ../next}} - -{{> hierarchy}} - -{{/with}} - -{{/if}} - -{{/each}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/index.hbs b/docs-gen/src/resources/partials/index.hbs deleted file mode 100755 index 73bb574836a09..0000000000000 --- a/docs-gen/src/resources/partials/index.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{{#if groups}} - -{{heading 2}} Index - -{{#each groups}} - -{{#if categories}} - -{{#each categories}} - -{{heading 3}} {{title}} {{../title}} - -{{#each children}} -* [{{{name}}}]({{relativeURL url}}) -{{/each}} - -{{/each}} - -{{else}} - -{{heading 3}} {{title}} - -{{#each children}} -* [{{{name}}}]({{relativeURL url}}) -{{/each}} - -{{/if}} - -{{/each}} - -{{/if}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/main.hbs b/docs-gen/src/resources/partials/main.hbs deleted file mode 100644 index 165bc8731494a..0000000000000 --- a/docs-gen/src/resources/partials/main.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{{meta}}} - -{{> members}} diff --git a/docs-gen/src/resources/partials/member.declaration.hbs b/docs-gen/src/resources/partials/member.declaration.hbs deleted file mode 100755 index 8bb0e10873403..0000000000000 --- a/docs-gen/src/resources/partials/member.declaration.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{{declarationTitle true}}} - -{{> comment}} - -{{#if type.declaration}} - -{{#with type.declaration.children}} - -{{{parameterTableJsx false}}} - -{{/with}} - -{{/if}} diff --git a/docs-gen/src/resources/partials/member.getterSetter.hbs b/docs-gen/src/resources/partials/member.getterSetter.hbs deleted file mode 100755 index 86f120171a281..0000000000000 --- a/docs-gen/src/resources/partials/member.getterSetter.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if getSignature}} - -{{#with getSignature}} - -{{> member.signature }} - -{{/with}} - -{{/if}} - -{{#if setSignature}} - -{{#with setSignature}} - -{{> member.signature }} - -{{/with}} - -{{/if}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/member.hbs b/docs-gen/src/resources/partials/member.hbs deleted file mode 100644 index 853cb29f8892e..0000000000000 --- a/docs-gen/src/resources/partials/member.hbs +++ /dev/null @@ -1,84 +0,0 @@ -{{#ifCond kindString '!=' 'Module'}} -{{#if name}} - - -{{{ memberTitle }}} - -{{!-- {{#ifParentIsModule true}} - -{{heading 2}} {{{ memberTitle }}} - -{{else}} - -{{#ifParentKindIs 'Enumeration' false}} - -{{heading 3}} {{{ memberTitle }}} - -{{/ifParentKindIs}} - -{{/ifParentIsModule}} --}} - -{{/if}} -{{/ifCond}} - -{{#if signatures}} - -{{#each signatures}} - -{{> member.signature }} - -{{/each}} - -{{else}} - -{{#if hasGetterOrSetter}} - -{{> member.getterSetter}} - -{{else}} - -{{#ifCond kindString '!=' 'Module'}} - -{{> member.declaration}} - -{{/ifCond}} - -{{/if}} - -{{/if}} - -{{#each groups}} - -{{#ifCond title '===' 'Type aliases'}} -## Types -{{/ifCond}} - -{{#each children}} - -{{#unless hasOwnDocument}} - -{{#ifIsLiteralType true}} - -{{> member.declaration}} - -{{{literal}}} - -{{/ifIsLiteralType}} - -{{#ifIsLiteralType false}} - -{{> member hideHr=true}} - -{{/ifIsLiteralType}} - -{{/unless}} - -{{/each}} - -{{/each}} - -{{#unless @last}} -{{#unless hideHr}} -___ -{{/unless}} -{{/unless}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/member.indexSignatures.hbs b/docs-gen/src/resources/partials/member.indexSignatures.hbs deleted file mode 100644 index 10489c8689ade..0000000000000 --- a/docs-gen/src/resources/partials/member.indexSignatures.hbs +++ /dev/null @@ -1,17 +0,0 @@ -* \[{{#each indexSignature.parameters}}{{parameterNameAndType false}}{{/each}}\]: {{#with indexSignature.type}}{{{type}}}{{/with}} - -{{#with indexSignature}} - -{{> comment}} - -{{/with}} - -{{#if indexSignature.type.declaration}} - -{{#with indexSignature.type.declaration}} - -{{> parameter}} - -{{/with}} - -{{/if}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/member.signature.hbs b/docs-gen/src/resources/partials/member.signature.hbs deleted file mode 100644 index 54e93ac1a5945..0000000000000 --- a/docs-gen/src/resources/partials/member.signature.hbs +++ /dev/null @@ -1,63 +0,0 @@ -{{{signatureTitle true }}} - -{{#unless hideSources}} - -{{> member.sources}} - -{{/unless}} - -{{> comment}} - -{{#if typeParameters}} - -**Type parameters:** - -{{> typeParameters}} - -{{/if}} - -{{#if parameters}} - -{{#with parameters}} - -{{{parameterTableJsx true}}} - -{{/with}} - -{{/if}} - -{{#if type}} - -{{#with type}} -{{#ifIsFunctionType false}} - -{{#unless hideSources}} - -{{#if comment.returns}} - -**Returns:** *{{{type}}}* - -{{#with comment.returns}} - -{{{comment}}} - -{{/with}} - -{{/if}} - -{{/unless}} - -{{#if type.declaration}} - -{{#with type.declaration}} - -{{> parameter}} - -{{/with}} - -{{/if}} - -{{/ifIsFunctionType}} -{{/with}} - -{{/if}} diff --git a/docs-gen/src/resources/partials/member.sources.hbs b/docs-gen/src/resources/partials/member.sources.hbs deleted file mode 100755 index d095579f66554..0000000000000 --- a/docs-gen/src/resources/partials/member.sources.hbs +++ /dev/null @@ -1,39 +0,0 @@ -{{#if implementationOf}} - -*Implementation of {{#with implementationOf}}{{typeAndParent}}{{/with}}* - -{{/if}} - -{{#if inheritedFrom}} - -*Inherited from {{#with inheritedFrom}}{{{typeAndParent}}}{{/with}}* - -{{/if}} - -{{#if overwrites}} - -*Overrides {{#with overwrites}}{{typeAndParent}}{{/with}}* - -{{/if}} - -{{#ifSources}} - -{{#if sources}} - -{{#each sources}} - -{{#if url}} - -*Defined in [{{fileName}}:{{line}}]({{url}})* - -{{else}} - -Defined in {{fileName}}:{{line}} - -{{/if}} - -{{/each}} - -{{/if}} - -{{/ifSources}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/members.group.hbs b/docs-gen/src/resources/partials/members.group.hbs deleted file mode 100755 index 49aad19051e95..0000000000000 --- a/docs-gen/src/resources/partials/members.group.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{{#if categories}} - -{{#each categories}} - -{{#unless @first}} -___ -{{/unless}} - -{{heading 2}} {{title}} {{../title}} - -{{#each children}} - -{{> member}} - -{{/each}} - -{{/each}} - -{{else}} - -{{#each children}} - -{{#unless hasOwnDocument}} - -{{> member}} - -{{/unless}} - -{{/each}} - -{{/if}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/members.hbs b/docs-gen/src/resources/partials/members.hbs deleted file mode 100755 index 0123b04be668d..0000000000000 --- a/docs-gen/src/resources/partials/members.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{#each groups}} - -{{#unless allChildrenHaveOwnDocument}} - -{{> members.group}} - -{{/unless}} - -{{/each}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/parameter.hbs b/docs-gen/src/resources/partials/parameter.hbs deleted file mode 100644 index df5168ff86e36..0000000000000 --- a/docs-gen/src/resources/partials/parameter.hbs +++ /dev/null @@ -1,77 +0,0 @@ -{{!-- not used --}} - -{{#if signatures}} - -{{#each signatures}} - -{{> member.signature hideSources=true }} - -{{/each}} - -{{/if}} - -{{#if indexSignature}} - -{{> member.indexSignatures}} - -{{/if}} - -{{#ifIsLiteralType true}} - -{{{literal}}} - -{{/ifIsLiteralType}} - -{{#ifIsLiteralType false}} - -{{#each children}} - -{{#if signatures}} - -{{#if flags.isRest}}...{{/if}} {{{ name}}} {{#if isOptional}}?{{/if}}: function - -{{#each signatures}} - -{{> member.signature}} - -{{/each}} - -{{else}} -1111111 -{{{parameterNameAndType}}} - -{{> comment}} -2222222 -{{#if children}} - -{{> parameter}} - -{{/if}} - -{{#if type.declaration}} - -{{#with type.declaration}} - -## type.declaration - -{{#ifIsLiteralType true}} - -{{{literal}}} - -{{/ifIsLiteralType}} - -{{#ifIsLiteralType false}} - -{{> parameter}} - -{{/ifIsLiteralType}} - -{{/with}} - -{{/if}} - -{{/if}} - -{{/each}} - -{{/ifIsLiteralType}} \ No newline at end of file diff --git a/docs-gen/src/resources/partials/typeParameters.hbs b/docs-gen/src/resources/partials/typeParameters.hbs deleted file mode 100755 index 78dccf34b607a..0000000000000 --- a/docs-gen/src/resources/partials/typeParameters.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{{#each typeParameters}} - -{{{parameterNameAndType}}} - -{{> comment}} - -{{/each}} \ No newline at end of file diff --git a/docs-gen/src/resources/templates/index.hbs b/docs-gen/src/resources/templates/index.hbs deleted file mode 100644 index b4e7f01c51be5..0000000000000 --- a/docs-gen/src/resources/templates/index.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{#if model.readme}} - -{{#with model.readme}} - -{{{comment}}} - -{{/with}} - -{{/if}} \ No newline at end of file diff --git a/docs-gen/src/resources/templates/reflection.hbs b/docs-gen/src/resources/templates/reflection.hbs deleted file mode 100755 index de8b2a20a873a..0000000000000 --- a/docs-gen/src/resources/templates/reflection.hbs +++ /dev/null @@ -1,85 +0,0 @@ -{{#with model}} - -{{#if hasComment}} - -{{> comment}} - -{{/if}} - -{{/with}} - -{{#if model.typeParameters}} - -{{heading 2}} Type parameters - -{{#with model}} -{{> typeParameters}} -{{/with}} - -{{/if}} - -{{#if model.typeHierarchy}} - -{{heading 2}} Hierarchy - -{{#with model.typeHierarchy}} - -{{> hierarchy}} - -{{/with}} - -{{/if}} - -{{#if model.implementedTypes}} - -{{heading 2}} Implements - -{{#each model.implementedTypes}} -* {{{type}}} -{{/each}} - -{{/if}} - -{{#if model.implementedBy}} - -{{heading 2}} Implemented by - -{{#each model.implementedBy}} -* {{{type}}} -{{/each}} - -{{/if}} - -{{#if model.signatures}} - -{{{heading 2}}} Callable - -{{#with model}} - -{{#each signatures}} - -{{> member.signature }} - -{{/each}} - -{{/with}} - -{{/if}} - -{{#if model.indexSignature}} - -{{heading 2}} Indexable - -{{#with model}} - -{{> member.indexSignatures}} - -{{/with}} - -{{/if}} - -{{#with model}} - -{{> main}} - -{{/with}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/bitbucket/theme.ts b/docs-gen/src/subthemes/bitbucket/theme.ts deleted file mode 100644 index 7ea51c49e17ab..0000000000000 --- a/docs-gen/src/subthemes/bitbucket/theme.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Reflection } from 'typedoc/dist/lib/models'; -import { Renderer } from 'typedoc/dist/lib/output/renderer'; - -import MarkdownTheme from '../../theme'; - -export default class BitbucketTheme extends MarkdownTheme { - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - } - - toAnchorRef(reflection: Reflection) { - function parseAnchorRef(ref: string) { - return ref.replace(/"/g, '').replace(/ /g, '-'); - } - let anchorPrefix = ''; - reflection.flags.forEach(flag => (anchorPrefix += `${flag}-`)); - const prefixRef = parseAnchorRef(anchorPrefix); - const reflectionRef = parseAnchorRef(reflection.name); - const anchorRef = prefixRef + reflectionRef; - return 'markdown-header-' + anchorRef.toLowerCase(); - } -} diff --git a/docs-gen/src/subthemes/docusaurus/partials/header.hbs b/docs-gen/src/subthemes/docusaurus/partials/header.hbs deleted file mode 100644 index 54846b2f6472a..0000000000000 --- a/docs-gen/src/subthemes/docusaurus/partials/header.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#ifBreadcrumbs}} -{{{breadcrumbs}}} -{{/ifBreadcrumbs}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/docusaurus/theme.ts b/docs-gen/src/subthemes/docusaurus/theme.ts deleted file mode 100644 index abb43712626ee..0000000000000 --- a/docs-gen/src/subthemes/docusaurus/theme.ts +++ /dev/null @@ -1,96 +0,0 @@ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import { RendererEvent } from 'typedoc/dist/lib/output/events'; -import { Renderer } from 'typedoc/dist/lib/output/renderer'; - -import { FrontMatterComponent } from '../../components/front-matter.component'; -import MarkdownTheme from '../../theme'; - -export default class DocusaurusTheme extends MarkdownTheme { - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - this.indexName = 'index'; - renderer.addComponent('frontmatter', new FrontMatterComponent(renderer)); - this.listenTo(renderer, RendererEvent.END, this.onRendererEnd, 1024); - } - - onRendererEnd(renderer: RendererEvent) { - if (!this.application.options.getValue('skipSidebar')) { - const docusarusRoot = this.findDocusaurusRoot(renderer.outputDirectory); - if (docusarusRoot === null) { - this.application.logger.warn( - `[typedoc-markdown-plugin] sidebars.json not written as could not locate docusaurus root directory. In order to to implemnent sidebars.json functionality, the output directory must be a child of a 'docs' directory.`, - ); - return; - } - this.writeSideBar(renderer, docusarusRoot); - } - } - - writeSideBar(renderer: RendererEvent, docusarusRoot: string) { - const childDirectory = renderer.outputDirectory.split(docusarusRoot + 'docs/')[1]; - const docsRoot = childDirectory ? childDirectory + '/' : ''; - const websitePath = docusarusRoot + 'website'; - const packageName = renderer.project.packageInfo.name; - const navObject = this.getNavObject(renderer, docsRoot); - const sidebarPath = websitePath + '/sidebars.json'; - let contents: any; - if (!fs.existsSync(sidebarPath)) { - contents = '{}'; - if (!fs.existsSync(websitePath)) { - fs.mkdirSync(websitePath); - } - } else { - contents = fs.readFileSync(sidebarPath); - } - const jsonContent = JSON.parse(contents.toString()); - const update = { - ...jsonContent, - [packageName]: navObject, - }; - try { - fs.writeFileSync(sidebarPath, JSON.stringify(update, null, 2)); - this.application.logger.write(`[typedoc-plugin-markdown] sidebars.json updated at ${sidebarPath}`); - } catch (e) { - this.application.logger.write(`[typedoc-plugin-markdown] failed to update sidebars.json at ${sidebarPath}`); - } - } - - getNavObject(renderer: RendererEvent, docsRoot: string) { - const projectUrls = [docsRoot + this.indexName.replace('.md', '')]; - if (renderer.project.url === 'globals.md') { - projectUrls.push(docsRoot + 'globals'); - } - const navObject = { - ['Introduction']: projectUrls, - }; - - this.getNavigation(renderer.project).children.forEach(rootNavigation => { - navObject[rootNavigation.title] = rootNavigation.children.map(item => { - return docsRoot + item.url.replace('.md', ''); - }); - }); - - return navObject; - } - - findDocusaurusRoot(outputDirectory: string) { - const docsName = 'docs'; - function splitPath(dir: string) { - const parts = dir.split(/(\/|\\)/); - if (!parts.length) { - return parts; - } - return !parts[0].length ? parts.slice(1) : parts; - } - function testDir(parts) { - if (parts.length === 0) { - return null; - } - const p = parts.join(''); - const itdoes = fs.existsSync(path.join(p, docsName)); - return itdoes ? p : testDir(parts.slice(0, -1)); - } - return testDir(splitPath(outputDirectory)); - } -} diff --git a/docs-gen/src/subthemes/docusaurus2/partials/header.hbs b/docs-gen/src/subthemes/docusaurus2/partials/header.hbs deleted file mode 100644 index 54846b2f6472a..0000000000000 --- a/docs-gen/src/subthemes/docusaurus2/partials/header.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#ifBreadcrumbs}} -{{{breadcrumbs}}} -{{/ifBreadcrumbs}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/docusaurus2/theme.ts b/docs-gen/src/subthemes/docusaurus2/theme.ts deleted file mode 100644 index 7213e7d3b48e1..0000000000000 --- a/docs-gen/src/subthemes/docusaurus2/theme.ts +++ /dev/null @@ -1,99 +0,0 @@ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import { RendererEvent } from 'typedoc/dist/lib/output/events'; -import { Renderer } from 'typedoc/dist/lib/output/renderer'; - -import { FrontMatterComponent } from '../../components/front-matter.component'; -import MarkdownTheme from '../../theme'; - -export default class Docusaurus2Theme extends MarkdownTheme { - sidebarName: string; - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - this.indexName = 'index'; - this.sidebarName = 'sidebars.js'; - renderer.addComponent('frontmatter', new FrontMatterComponent(renderer)); - this.listenTo(renderer, RendererEvent.END, this.onRendererEnd, 1024); - } - - onRendererEnd(renderer: RendererEvent) { - if (!this.application.options.getValue('skipSidebar')) { - const docusarusRoot = this.findDocusaurus2Root(renderer.outputDirectory); - if (docusarusRoot === null) { - this.application.logger.warn( - `[typedoc-markdown-plugin] ${this.sidebarName} not written as could not locate docusaurus root directory. In order to to implemnent ${this.sidebarName} functionality, the output directory must be a child of a 'docs' directory.`, - ); - return; - } - this.writeSideBar(renderer, docusarusRoot); - } - } - - writeSideBar(renderer: RendererEvent, docusarusRoot: string) { - const childDirectory = renderer.outputDirectory.split(docusarusRoot + 'docs/')[1]; - const docsRoot = childDirectory ? childDirectory + '/' : ''; - const websitePath = docusarusRoot; - const navObject = this.getNavObject(renderer, docsRoot); - const sidebarPath = websitePath + this.sidebarName; - let jsonContent: any; - if (!fs.existsSync(sidebarPath)) { - if (!fs.existsSync(websitePath)) { - fs.mkdirSync(websitePath); - } - jsonContent = JSON.parse('{}'); - } else { - jsonContent = require(sidebarPath); - } - let firstKey = Object.keys(jsonContent)[0]; - if (!firstKey) { - firstKey = 'docs'; - } - jsonContent[firstKey] = Object.assign({}, jsonContent[firstKey], navObject); - try { - fs.writeFileSync(sidebarPath, 'module.exports = ' + JSON.stringify(jsonContent, null, 2) + ';'); - this.application.logger.write(`[typedoc-plugin-markdown] ${this.sidebarName} updated at ${sidebarPath}`); - } catch (e) { - this.application.logger.write(`[typedoc-plugin-markdown] failed to update ${this.sidebarName} at ${sidebarPath}`); - } - } - - getNavObject(renderer: RendererEvent, docsRoot: string) { - const navObject = {}; - let url = ''; - let navKey = ''; - this.getNavigation(renderer.project).children.forEach(rootNavigation => { - rootNavigation.children.map(item => { - url = item.url.replace('.md', ''); - navKey = url.substring(0, url.indexOf('/')); - if (navKey !== undefined && navKey.length) { - navKey = navKey[0].toUpperCase() + navKey.slice(1); - } - if (navObject[navKey] === undefined) { - navObject[navKey] = []; - } - navObject[navKey].push(docsRoot + url); - }); - }); - return navObject; - } - - findDocusaurus2Root(outputDirectory: string) { - const docsName = 'docs'; - function splitPath(dir: string) { - const parts = dir.split(/(\/|\\)/); - if (!parts.length) { - return parts; - } - return !parts[0].length ? parts.slice(1) : parts; - } - function testDir(parts) { - if (parts.length === 0) { - return null; - } - const p = parts.join(''); - const itdoes = fs.existsSync(path.join(p, docsName)); - return itdoes ? p : testDir(parts.slice(0, -1)); - } - return testDir(splitPath(outputDirectory)); - } -} diff --git a/docs-gen/src/subthemes/gitbook/partials/header.hbs b/docs-gen/src/subthemes/gitbook/partials/header.hbs deleted file mode 100644 index ee818e8652f0b..0000000000000 --- a/docs-gen/src/subthemes/gitbook/partials/header.hbs +++ /dev/null @@ -1 +0,0 @@ -{{heading 1}} {{{reflectionTitle}}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/gitbook/theme.ts b/docs-gen/src/subthemes/gitbook/theme.ts deleted file mode 100644 index f64ad6a351e62..0000000000000 --- a/docs-gen/src/subthemes/gitbook/theme.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as fs from 'fs-extra'; -import { RendererEvent } from 'typedoc/dist/lib/output/events'; -import { Renderer } from 'typedoc/dist/lib/output/renderer'; - -import MarkdownTheme from '../../theme'; - -export default class GitbookTheme extends MarkdownTheme { - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - this.listenTo(renderer, RendererEvent.END, this.writeSummary, 1024); - } - - writeSummary(renderer: RendererEvent) { - const outputDirectory = renderer.outputDirectory; - const summaryMarkdown = this.getSummaryMarkdown(renderer); - try { - fs.writeFileSync(`${outputDirectory}/SUMMARY.md`, summaryMarkdown); - this.application.logger.write(`[typedoc-plugin-markdown] SUMMARY.md written to ${outputDirectory}`); - } catch (e) { - this.application.logger.write(`[typedoc-plugin-markdown] failed to write SUMMARY at ${outputDirectory}`); - } - } - - getSummaryMarkdown(renderer: RendererEvent) { - const md = []; - md.push(`* [Globals](globals.md)`); - this.getNavigation(renderer.project).children.forEach(rootNavigation => { - if (rootNavigation.children) { - md.push(`* [${rootNavigation.title}](${rootNavigation.url})`); - rootNavigation.children.forEach(item => { - md.push(` * [${item.title}](${item.url})`); - }); - } - }); - return md.join('\n'); - } - - allowedDirectoryListings() { - return ['README.md', 'globals.md', 'classes', 'enums', 'interfaces', 'modules', 'media', '.DS_Store', 'SUMMARY.md']; - } -} diff --git a/docs-gen/src/subthemes/vuepress/partials/header.hbs b/docs-gen/src/subthemes/vuepress/partials/header.hbs deleted file mode 100644 index ee818e8652f0b..0000000000000 --- a/docs-gen/src/subthemes/vuepress/partials/header.hbs +++ /dev/null @@ -1 +0,0 @@ -{{heading 1}} {{{reflectionTitle}}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/vuepress/partials/main.hbs b/docs-gen/src/subthemes/vuepress/partials/main.hbs deleted file mode 100644 index b13ea23b23e09..0000000000000 --- a/docs-gen/src/subthemes/vuepress/partials/main.hbs +++ /dev/null @@ -1 +0,0 @@ -{{> members}} \ No newline at end of file diff --git a/docs-gen/src/subthemes/vuepress/theme.ts b/docs-gen/src/subthemes/vuepress/theme.ts deleted file mode 100644 index 4d96cd1aadffb..0000000000000 --- a/docs-gen/src/subthemes/vuepress/theme.ts +++ /dev/null @@ -1,118 +0,0 @@ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import { RendererEvent } from 'typedoc/dist/lib/output/events'; -import { Renderer } from 'typedoc/dist/lib/output/renderer'; - -import MarkdownTheme from '../../theme'; - -/** - * Creates `api-sidebar.json` in `.vuepress` directory. - * May be used in `.vuepress/config.json` as follows: - * @example - * const apiSideBar = require("./api-sidebar.json"); - * const apiSideBarRelative = require('./api-sidebar-relative.json'); - * - * // Without groups - * module.exports = { - * themeConfig: { - * sidebar: ["some-content", ...apiSideBar] - * } - * }; - * - * // With groups - * module.exports = { - * themeConfig: { - * sidebar: ["some-content", { title: "API", children: apiSideBar }] - * } - * }; - * - * // Multiple Sidebar - * module.exports = { - * themeConfig: { - * sidebar: { - * '/guide/': ['some-content'], - * '/api/': apiSideBarRelative, - * '/': ['other'], - * }, - * }, - * }; - */ -export default class VuePressTheme extends MarkdownTheme { - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - this.listenTo(renderer, RendererEvent.END, this.onRendererEnd, 1024); - } - - onRendererEnd(renderer: RendererEvent) { - const root = this.findRoot(renderer.outputDirectory); - if (root === null) { - this.application.logger.warn( - `[typedoc-markdown-plugin] sidebars.json not written as could not locate VuePress root directory. In order to to implemnent sidebars.json functionality, the output directory must be a child of a 'docs' directory.`, - ); - return; - } - this.writeSideBar(renderer, root); - } - - writeSideBar(renderer: RendererEvent, root: string) { - const childDirectory = renderer.outputDirectory.split(root + 'docs/')[1]; - const docsRoot = childDirectory ? childDirectory + '/' : ''; - const vuePressRoot = root + 'docs/.vuepress'; - const navObject = this.getNavObject(renderer, docsRoot); - const sidebarPath = vuePressRoot + '/api-sidebar.json'; - const relativeNavObject = this.getNavObject(renderer); - const relativeSidebarPath = vuePressRoot + '/api-sidebar-relative.json'; - - if (!fs.existsSync(vuePressRoot)) { - fs.mkdirSync(vuePressRoot); - } - - try { - fs.writeFileSync(sidebarPath, JSON.stringify(navObject, null, 2)); - fs.writeFileSync(relativeSidebarPath, JSON.stringify(relativeNavObject, null, 2)); - this.application.logger.write(`[typedoc-plugin-markdown] sidebars.json updated at ${sidebarPath}`); - } catch (e) { - this.application.logger.write(`[typedoc-plugin-markdown] failed to update sidebars.json at ${sidebarPath}`); - } - } - - getNavObject(renderer: RendererEvent, docsRoot: string = '') { - const projectUrls = [docsRoot + this.indexName.replace('.md', '')]; - if (renderer.project.url === 'globals.md') { - projectUrls.push(docsRoot + 'globals'); - } - - // const packageName = MarkdownPlugin.project.packageInfo.name; - const navObject = []; // [{ title: packageName, children: projectUrls }] - - this.getNavigation(renderer.project).children.forEach(rootNavigation => { - navObject.push({ - title: rootNavigation.title, - children: rootNavigation.children.map(item => { - return docsRoot + item.url.replace('.md', ''); - }), - }); - }); - return navObject; - } - - findRoot(outputDirectory: string) { - const docsName = 'docs'; - function splitPath(dir: string) { - const parts = dir.split(/(\/|\\)/); - if (!parts.length) { - return parts; - } - return !parts[0].length ? parts.slice(1) : parts; - } - function testDir(parts) { - if (parts.length === 0) { - return null; - } - const p = parts.join(''); - const itdoes = fs.existsSync(path.join(p, docsName)); - return itdoes ? p : testDir(parts.slice(0, -1)); - } - return testDir(splitPath(outputDirectory)); - } -} diff --git a/docs-gen/src/theme.spec.ts b/docs-gen/src/theme.spec.ts deleted file mode 100644 index a557555f6a285..0000000000000 --- a/docs-gen/src/theme.spec.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import { Application, UrlMapping } from 'typedoc'; - -describe(`MarkdownTheme`, () => { - function getExpectedUrls(urlMappings: UrlMapping[]) { - const expectedUrls = []; - urlMappings.forEach(urlMapping => { - expectedUrls.push(urlMapping.url); - urlMapping.model.children.forEach(reflection => { - expectedUrls.push(reflection.url); - }); - }); - return expectedUrls; - } - - let app; - let project; - let theme; - const out = path.join(__dirname, 'tmp'); - beforeAll(() => { - app = new Application(); - app.bootstrap({ - module: 'CommonJS', - target: 'ES5', - readme: 'none', - theme: 'markdown', - logger: 'none', - plugin: path.join(__dirname, '../dist/index'), - }); - project = app.convert(app.expandInputFiles(['./test/stubs/'])); - app.generateDocs(project, out); - theme = app.renderer.theme; - }); - - afterAll(() => { - fs.removeSync(out); - }); - - describe(`getUrls`, () => { - test(`should getUrls'`, () => { - const urlMappings = theme.getUrls(project); - expect(getExpectedUrls(urlMappings)).toMatchSnapshot(); - }); - - test(`should getUrls when readme is defined`, () => { - const spy = jest.spyOn(app.options, 'getValue').mockReturnValue('./README.md'); - const urlMappings = theme.getUrls(project); - expect(getExpectedUrls(urlMappings)).toMatchSnapshot(); - spy.mockRestore(); - }); - - test(`should get navigation`, () => { - expect(theme.getNavigation(project)).toMatchSnapshot(); - }); - }); - - describe(`output directory`, () => { - let directoryListingSpy; - - beforeAll(() => { - directoryListingSpy = jest.spyOn(fs, 'readdirSync'); - }); - - test(`should test output directory true with all allowed files and directories`, () => { - directoryListingSpy.mockReturnValue([ - '.DS_Store', - 'README.md', - 'globals.md', - 'classes', - 'enums', - 'interfaces', - 'media', - 'modules', - ]); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory true with some files directories`, () => { - directoryListingSpy.mockReturnValue(['README.md', 'classes', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory true with just index`, () => { - directoryListingSpy.mockReturnValue(['README.md']); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory false with unkown index`, () => { - directoryListingSpy.mockReturnValue(['Unrecognised.md', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false with hidden files`, () => { - directoryListingSpy.mockReturnValue(['.git', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false without an index`, () => { - directoryListingSpy.mockReturnValue(['globals.md', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false with unknown folder`, () => { - directoryListingSpy.mockReturnValue(['README.md', 'folder']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - }); - - describe(`output directory`, () => { - let directoryListingSpy; - beforeAll(() => { - directoryListingSpy = jest.spyOn(fs, 'readdirSync'); - }); - - test(`should test output directory true with all allowed files and directories`, () => { - directoryListingSpy.mockReturnValue([ - '.DS_Store', - 'README.md', - 'globals.md', - 'classes', - 'enums', - 'interfaces', - 'media', - 'modules', - ]); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory true with some files directories`, () => { - directoryListingSpy.mockReturnValue(['README.md', 'classes', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory true with just index`, () => { - directoryListingSpy.mockReturnValue(['README.md']); - expect(theme.isOutputDirectory('/path')).toBeTruthy(); - }); - - test(`should test output directory false with unkown index`, () => { - directoryListingSpy.mockReturnValue(['Unrecognised.md', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false with hidden files`, () => { - directoryListingSpy.mockReturnValue(['.git', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false without an index`, () => { - directoryListingSpy.mockReturnValue(['globals.md', 'classes', 'enums', 'interfaces', 'media', 'modules']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - - test(`should test output directory false with unknown folder`, () => { - directoryListingSpy.mockReturnValue(['README.md', 'folder']); - expect(theme.isOutputDirectory('/path')).toBeFalsy(); - }); - }); -}); diff --git a/docs-gen/src/theme.ts b/docs-gen/src/theme.ts deleted file mode 100644 index dfb8bebadce4b..0000000000000 --- a/docs-gen/src/theme.ts +++ /dev/null @@ -1,378 +0,0 @@ -import * as Handlebars from 'handlebars'; -import { - ContainerReflection, - DeclarationReflection, - NavigationItem, - ProjectReflection, - Reflection, - ReflectionKind, - Renderer, - UrlMapping, -} from 'typedoc'; -import { PageEvent } from 'typedoc/dist/lib/output/events'; -import { Theme } from 'typedoc/dist/lib/output/theme'; -import { TemplateMapping } from 'typedoc/dist/lib/output/themes/DefaultTheme'; - -import { ContextAwareHelpersComponent } from './components/helpers.component'; -import { OptionsComponent } from './components/options.component'; - -/** - * The MarkdownTheme is based on TypeDoc's DefaultTheme @see https://github.com/TypeStrong/typedoc/blob/master/src/lib/output/themes/DefaultTheme.ts. - * - html specific components are removed from the renderer - * - markdown specefic components have been added - */ - -export default class MarkdownTheme extends Theme { - /** - * @See DefaultTheme.MAPPINGS - */ - static MAPPINGS: TemplateMapping[] = [ - { - kind: [ReflectionKind.Class], - isLeaf: false, - directory: 'classes', - template: 'reflection.hbs', - }, - { - kind: [ReflectionKind.Interface], - isLeaf: false, - directory: 'interfaces', - template: 'reflection.hbs', - }, - { - kind: [ReflectionKind.Enum], - isLeaf: false, - directory: 'enums', - template: 'reflection.hbs', - }, - { - kind: [ReflectionKind.Namespace, ReflectionKind.Module], - isLeaf: false, - directory: 'modules', - template: 'reflection.hbs' - }, - ]; - - /** - * @See DefaultTheme.URL_PREFIX - */ - static URL_PREFIX: RegExp = /^(http|ftp)s?:\/\//; - - // creates an isolated Handlebars environment to store context aware helpers - static handlebars = Handlebars.create(); - - // is documentation generated as a single output file - static isSingleFile = false; - - // the root of generated docs - indexName = ''; - - // the file extension of the generated docs - fileExt = '.md'; - - constructor(renderer: Renderer, basePath: string) { - super(renderer, basePath); - this.listenTo(renderer, PageEvent.END, this.onPageEnd, 1024); - - // cleanup html specific components - renderer.removeComponent('assets'); - renderer.removeComponent('javascript-index'); - renderer.removeComponent('toc'); - renderer.removeComponent('pretty-print'); - - // add markdown related componenets - renderer.addComponent('helpers', new ContextAwareHelpersComponent(renderer)); - renderer.addComponent('options', new OptionsComponent(renderer)); - - this.indexName = this.application.options.getValue('name'); - - if (!this.indexName) { - throw new Error('`--name` must be provided') - } - } - - /** - * Test if directory is output directory - * @param outputDirectory - */ - isOutputDirectory(outputDirectory: string) { - return true; - } - - /** - * This method is essentially a copy of the TypeDocs DefaultTheme.getUrls with extensions swapped out to .md - * Map the models of the given project to the desired output files. - * - * @param project The project whose urls should be generated. - * @returns A list of [[UrlMapping]] instances defining which models - * should be rendered to which files. - */ - getUrls(project: ProjectReflection): UrlMapping[] { - const urls: UrlMapping[] = []; - const entryPoint = this.getEntryPoint(project); - const inlineGroupTitles = ['Functions', 'Variables', 'Object literals']; - - if (project.groups) { - MarkdownTheme.isSingleFile = - project.groups && project.groups.every((group) => inlineGroupTitles.includes(group.title)); - } - - - entryPoint.url = this.indexName + this.fileExt; - urls.push( - new UrlMapping( - this.indexName + this.fileExt, - { ...entryPoint, displayReadme: MarkdownTheme.isSingleFile }, - 'reflection.hbs', - ), - ); - - - if (entryPoint.children) { - entryPoint.children.forEach((child: Reflection) => { - if (child instanceof DeclarationReflection) { - this.buildUrls(child, urls); - } - }); - } - - return urls; - } - - /** - * This is mostly a copy of the TypeDoc DefaultTheme.buildUrls method with .html ext switched to .md - * Builds the url for the the given reflection and all of its children. - * - * @param reflection The reflection the url should be created for. - * @param urls The array the url should be appended to. - * @returns The altered urls array. - */ - - buildUrls(reflection: DeclarationReflection, urls: UrlMapping[]): UrlMapping[] { - return []; - const mapping = MarkdownTheme.getMapping(reflection); - if (mapping) { - if (!reflection.url || !MarkdownTheme.URL_PREFIX.test(reflection.url)) { - const url = this.toUrl(mapping, reflection); - urls.push(new UrlMapping(url, reflection, mapping.template)); - reflection.url = url; - reflection.hasOwnDocument = true; - } - for (const child of reflection.children || []) { - if (mapping.isLeaf) { - this.applyAnchorUrl(child, reflection); - } else { - this.buildUrls(child, urls); - } - } - } else if (reflection.parent) { - this.applyAnchorUrl(reflection, reflection.parent); - } - return urls; - } - - /** - * Returns the full url of a given mapping and reflection - * @param mapping - * @param reflection - */ - toUrl(mapping: TemplateMapping, reflection: DeclarationReflection) { - return mapping.directory + '/' + this.getUrl(reflection) + this.fileExt; - } - - /** - * @see DefaultTheme.getUrl - * Return a url for the given reflection. - * - * @param reflection The reflection the url should be generated for. - * @param relative The parent reflection the url generation should stop on. - * @param separator The separator used to generate the url. - * @returns The generated url. - */ - getUrl(reflection: Reflection, relative?: Reflection, separator: string = '.'): string { - let url = reflection.getAlias(); - - if (reflection.parent && reflection.parent !== relative && !(reflection.parent instanceof ProjectReflection)) { - url = this.getUrl(reflection.parent, relative, separator) + separator + url; - } - - return url; - } - - /** - * Similar to DefaultTheme.applyAnchorUrl method with added but the anchors are computed from the reflection structure - * Generate an anchor url for the given reflection and all of its children. - * - * @param reflection The reflection an anchor url should be created for. - * @param container The nearest reflection having an own document. - */ - applyAnchorUrl(reflection: Reflection, container: Reflection) { - if (!reflection.url || !MarkdownTheme.URL_PREFIX.test(reflection.url)) { - const anchor = this.toAnchorRef(reflection); - reflection.url = container.url + '#' + anchor; - reflection.anchor = anchor; - reflection.hasOwnDocument = false; - } - reflection.traverse((child) => { - if (child instanceof DeclarationReflection) { - this.applyAnchorUrl(child, container); - } - }); - } - - /** - * Converts a reflection to anchor ref - * @param reflection - */ - toAnchorRef(reflection: Reflection) { - function parseAnchorRef(ref: string) { - return ref.replace(/["\$]/g, '').replace(/ /g, '-'); - } - let anchorPrefix = ''; - reflection.flags.forEach((flag) => (anchorPrefix += `${flag}-`)); - const prefixRef = parseAnchorRef(anchorPrefix); - const reflectionRef = parseAnchorRef(reflection.name); - const anchorRef = prefixRef + reflectionRef; - return anchorRef.toLowerCase(); - } - - /** - * Copy of default theme DefaultTheme.getEntryPoint - * @param project - */ - getEntryPoint(project: ProjectReflection): ContainerReflection { - const entryPoint = this.owner.entryPoint; - - // if (project.children?.[0].comment.tags?.[0] !== undefined) { - // project.children[0].comment.tags[0].text = 'hello , World'; - - // return project.children[0].children[0]; - // } - - if (entryPoint) { - const reflection = project.getChildByName(entryPoint); - if (reflection) { - if (reflection instanceof ContainerReflection) { - return reflection; - } else { - this.application.logger.warn('The given entry point `%s` is not a container.', entryPoint); - } - } else { - this.application.logger.warn('The entry point `%s` could not be found.', entryPoint); - } - } - return project; - } - - getNavigation(project: ProjectReflection) { - function createNavigationGroup(name: string, url = null) { - const navigationGroup = new NavigationItem(name, url); - navigationGroup.children = []; - delete navigationGroup.cssClasses; - delete navigationGroup.reflection; - return navigationGroup; - } - - function getNavigationGroup(reflection: DeclarationReflection) { - if (reflection.kind === ReflectionKind.Namespace) { - return namespacesNavigation; - } - // if (reflection.kind === ReflectionKind.Module) { - // return modulesNavigation; - // } - if (reflection.kind === ReflectionKind.Class) { - return classesNavigation; - } - if (reflection.kind === ReflectionKind.Enum) { - return enumsNavigation; - } - if (reflection.kind === ReflectionKind.Interface) { - return interfacesNavigation; - } - return null; - } - - function addNavigationItem( - longTitle: boolean, - reflection: DeclarationReflection, - parentNavigationItem?: NavigationItem, - group?, - ) { - let navigationGroup: NavigationItem; - if (group) { - navigationGroup = group; - } else { - navigationGroup = getNavigationGroup(reflection); - } - let titlePrefix = ''; - if (longTitle && parentNavigationItem && parentNavigationItem.title) { - titlePrefix = parentNavigationItem.title.replace(/\"/g, '') + '.'; - } - - const title = titlePrefix + reflection.name.replace(/\"/g, ''); - const url = reflection.url; - const nav = new NavigationItem(title, url, parentNavigationItem); - nav.parent = parentNavigationItem; - - navigationGroup.children.push(nav); - if (reflection.children) { - reflection.children.forEach((reflectionChild) => { - if (reflectionChild.hasOwnDocument) { - addNavigationItem(longTitle, reflectionChild as DeclarationReflection, nav, navigationGroup); - } - }); - } - delete nav.cssClasses; - delete nav.reflection; - return nav; - } - const isModules = this.application.options.getValue('mode') === 1; - const isLongTitle = this.application.options.getValue('longTitle') as boolean; - const navigation = createNavigationGroup(project.name, this.indexName + this.fileExt); - // const modulesNavigation = createNavigationGroup('Modules'); - const namespacesNavigation = createNavigationGroup('Namespaces'); - const classesNavigation = createNavigationGroup('Classes'); - const enumsNavigation = createNavigationGroup('Enums'); - const interfacesNavigation = createNavigationGroup('Interfaces'); - - if (project.groups) { - if (!isModules) { - project.groups.forEach((group) => { - group.children.forEach((reflection) => { - if (reflection.hasOwnDocument) { - addNavigationItem(isLongTitle, reflection as DeclarationReflection); - } - }); - }); - } - } - - navigation.children = []; - - return navigation; - } - - private onPageEnd(page: PageEvent) { - page.contents = page.contents ? MarkdownTheme.formatContents(page.contents) : ''; - } - - /** - * @see DefaultTheme.getMapping - * Return the template mapping for the given reflection. - * - * @param reflection The reflection whose mapping should be resolved. - * @returns The found mapping or undefined if no mapping could be found. - */ - static getMapping(reflection: DeclarationReflection): TemplateMapping | undefined { - return MarkdownTheme.MAPPINGS.find((mapping) => reflection.kindOf(mapping.kind)); - } - - static formatContents(contents: string) { - return ( - contents - .replace(/[\r\n]{3,}/g, '\n\n') - .replace(/!spaces/g, '') - .replace(/^\s+|\s+$/g, '') + '\n' - ); - } -} diff --git a/docs-gen/tasks/fixtures.js b/docs-gen/tasks/fixtures.js deleted file mode 100644 index de3d1d8ceeb86..0000000000000 --- a/docs-gen/tasks/fixtures.js +++ /dev/null @@ -1,44 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const { Application } = require('typedoc'); - -const app = new Application({ - mode: 'Modules', - module: 'CommonJS', - experimentalDecorators: true, - jsx: true, - target: 'es2015', -}); - -const fixturesDir = './test/fixtures'; -const inputFiles = app.expandInputFiles(['./test/stubs']); - -if (!fs.existsSync(fixturesDir)) { - fs.mkdirSync(fixturesDir); -} - -inputFiles.forEach(file => { - const result = app.convert(app.expandInputFiles([file])); - fs.writeFileSync(`${fixturesDir}/${path.basename(file)}.json`, JSON.stringify(result, replacer)); - console.log(`[typedoc-plugin-markdown(task:fixtures)] writing ${path.basename(file)}.json fixture`); -}); - -function replacer(key, value) { - if ( - key === 'parent' || - key === 'reflection' || - key === 'reflections' || - key === 'symbolMapping' || - key === 'file' || - key === 'cssClasses' || - key === '_alias' || - key === '_aliases' || - key === 'directory' || - key === 'packageInfo' || - key === 'files' || - key === 'readme' - ) { - return null; - } - return value; -} diff --git a/docs-gen/tasks/generate.js b/docs-gen/tasks/generate.js deleted file mode 100644 index 50cfdedb23ad5..0000000000000 --- a/docs-gen/tasks/generate.js +++ /dev/null @@ -1,64 +0,0 @@ -const TypeDoc = require('typedoc'); -const path = require('path'); -const fs = require('fs-extra'); - -const outputDir = '../docs/content/Frontend-Integrations'; - -const app = new TypeDoc.Application(); - -app.options.addReader(new TypeDoc.TSConfigReader()); - -app.bootstrap({ - excludeExternals: true, - includeDeclarations: true, - plugin: ['./dist/index.js'], - hideSources: true, - hideIndexes: true, - name: 'docs', -}); - -const projects = [ - { - name: '@cubejs-client-core', - docsPath: '../packages/cubejs-client-core/index.d.ts', - outputDir, - }, - { - name: '@cubejs-client-react', - docsPath: '../packages/cubejs-client-react/index.d.ts', - outputDir, - }, - { - name: '@cubejs-client-ws-transport', - docsPath: '../packages/cubejs-client-ws-transport/index.d.ts', - outputDir, - }, -]; - -let failure = false; - -projects.forEach(({ name, docsPath, outputDir }) => { - const tmpDir = path.join(outputDir, 'tmp'); - const project = app.convert(app.expandInputFiles([docsPath])); - - if (project) { - app.generateDocs(project, tmpDir); - - if (fs.existsSync(tmpDir)) { - const [tmpFileName] = fs.readdirSync(tmpDir); - - const pathArr = tmpDir.split('/'); - pathArr.splice(-1, 1); - const out = path.join(...pathArr); - const currentPath = path.join(out, `${name}.md`); - - fs.copyFileSync(path.join(tmpDir, tmpFileName), currentPath); - fs.removeSync(tmpDir); - } - } else { - console.error(`Error while generating '${name}' docs`); - failure = true; - } -}); - -process.exit(failure ? 1 : 0); diff --git a/docs-gen/tasks/link-plugin.js b/docs-gen/tasks/link-plugin.js deleted file mode 100644 index e108e4d9e4771..0000000000000 --- a/docs-gen/tasks/link-plugin.js +++ /dev/null @@ -1,7 +0,0 @@ -const fs = require('fs'); -const { join } = require('path'); -// symlink to self for running local examples/tests -const pluginPath = join(__dirname, '..', 'node_modules/typedoc-plugin-markdown'); -if (!fs.existsSync(pluginPath)) { - fs.symlinkSync(join(__dirname, '..'), pluginPath); -} diff --git a/docs-gen/template/publish.js b/docs-gen/template/publish.js deleted file mode 100644 index 3f7fbd6018c49..0000000000000 --- a/docs-gen/template/publish.js +++ /dev/null @@ -1,151 +0,0 @@ -const fs = require('fs-extra'); -const inline = require('jsdoc/tag/inline'); -const inflection = require('inflection'); - -let typeDefs = []; -let knownClassNames = []; - -const anchorName = (link) => inflection.dasherize(inflection.underscore(link.replace(/#/g, '-'))); - -const resolveInlineLinks = (str) => inline.replaceInlineTags(str, { - link: (string, { completeTag, text }) => string.replace(completeTag, `[${text}](#${anchorName(text)})`), -}).newString; - -const renderLinks = (p) => { - if (p.type.names[0] === '*') { - return '*'; - } - if (p.type && knownClassNames.indexOf(p.type.names.join('#')) !== -1) { - return `[${p.type.names.join('#')}](#${anchorName(p.type.names.join('-'))})`; - } - if (p.type) { - return `\`${p.type.names.join('|')}\``; - } - return p; -}; - -function generateParams(doclet, field = 'params') { - const params = doclet[field].map((p) => { - const optional = p.optional ? '**Optional**' : null; - const defaultValue = p.defaultvalue ? `**Default:** \`${p.defaultvalue}\`` : null; - const type = p.type && p.type.parsedType && - (p.type.parsedType.name || p.type.parsedType.parsedExpression || p.type.parsedType.typeExpression); - const formattedType = type ? `: ${type}` : ''; - const options = [optional, defaultValue].filter((f) => !!f); - - if (!p.description && typeDefs.find((td) => td.name === type)) { - p.description = `See {@link ${type}}`; - } - - p.description = (p.description || '').replace(/\n/g, ' ').trim(); - - return `- \`${p.name}${formattedType}\`${options.length ? ` (${options.join(', ')})` : ''}${ - p.description ? ` - ${resolveInlineLinks(p.description)}` : '' - }`; - }); - - if (field === 'properties') { - return `**Properties:**\n\n${params.join('\n')}\n`; - } - - return `**Parameters:**\n\n${params.join('\n')}\n`; -} - -function generateTypeDefs(doclets) { - if (!doclets.length) { - return ''; - } - - const res = doclets.map((doclet) => [`## ${doclet.name}`, doclet.description, generateParams(doclet, 'properties'), '\n'] - .filter((d) => !!d) - .join('\n')); - - return res.join('\n'); -} - -const generateFunctionDocletSection = (doclet, isConstructor) => { - const title = doclet.name; - const header = `##${doclet.longname.indexOf('#') !== -1 || isConstructor ? '#' : ''} ${title}${ - isConstructor ? ' Constructor' : '' - }\n`; - const args = - (doclet.params && - doclet.params - .filter((p) => p.name.indexOf('.') === -1) - .map((p) => (p.optional ? `[${p.name}]` : p.name)) - .join(', ')) || - ''; - const signature = `\`${isConstructor ? 'new ' : ''}${doclet.meta.code.name || doclet.name}(${args})\`\n`; - const params = doclet.params ? generateParams(doclet) : ''; - const returns = doclet.returns ? - `**Returns:** ${doclet.returns.map( - (p) => `${p.type ? renderLinks(p) : ''}${p.description ? ` ${resolveInlineLinks(p.description)}` : ''}` - )}` : - ''; - return [header, signature, doclet.description && `${resolveInlineLinks(doclet.description)}\n`, params, returns, '\n'] - .filter((f) => !!f) - .join('\n'); -}; - -const generateClassSection = (doclet) => { - const header = `## ${doclet.name}\n`; - let classSection = [header, (doclet.classdesc || doclet.description).trim(), '\n'].join('\n'); - if (doclet.params && doclet.params.length) { - classSection = classSection.concat(generateFunctionDocletSection(doclet, true)); - } - return classSection; -}; - -const tagValue = (doclet, tagOriginalTitle) => { - const tag = doclet.tags && doclet.tags.find((t) => t.originalTitle === tagOriginalTitle); - return tag && tag.value; -}; - -const generateModuleSection = (doclet) => `--- -title: '${doclet.name}' -permalink: ${tagValue(doclet, 'permalink')} -category: ${tagValue(doclet, 'category')} -subCategory: Reference -menuOrder: ${tagValue(doclet, 'menuOrder')} ---- - -${doclet.description}\n\n`; - -const generateMarkDown = (doclets, parent) => { - if (!parent) { - const rootModule = doclets.find((d) => d.kind === 'module' && d.description); - return generateModuleSection(rootModule).concat(generateMarkDown(doclets, rootModule)); - } - const children = doclets.filter((d) => d.memberof === parent.longname); - const order = (doclet) => parseInt(tagValue(doclet, 'order'), 10) || 0; - children.sort((a, b) => order(a) - order(b)); - return children - .map((child) => { - if (child.kind === 'class') { - return generateClassSection(child) - .concat(generateMarkDown(doclets, child)) - .concat(generateTypeDefs(typeDefs.filter((td) => td.memberof === child.name))); - } else if (child.kind === 'function' || child.kind === 'member') { - return generateFunctionDocletSection(child); - } - return null; - }) - .filter((markdown) => !!markdown) - .join(''); -}; - -const classNamesFrom = (doclets) => doclets.filter((d) => d.kind === 'class').map((d) => d.name); - -exports.publish = (data, { destination }) => { - knownClassNames = classNamesFrom(data().get()); - typeDefs = data() - .get() - .filter((d) => d.kind === 'typedef'); - - const markDown = generateMarkDown( - data() - .get() - .filter((d) => !d.undocumented && d.kind !== 'typedef') - ); - fs.writeFile(destination, markDown); -}; diff --git a/docs-gen/test/options.json b/docs-gen/test/options.json deleted file mode 100644 index 8aa2a00cbf7aa..0000000000000 --- a/docs-gen/test/options.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "inputFiles": "./test/stubs/src", - "target": "ES5", - "name": "My API", - "readme": "none", - "includes": "./test/stubs/inc/", - "media": "./test/stubs/media/" -} diff --git a/docs-gen/test/stubs/README.md b/docs-gen/test/stubs/README.md deleted file mode 100644 index a380dbf8c1e03..0000000000000 --- a/docs-gen/test/stubs/README.md +++ /dev/null @@ -1 +0,0 @@ -MY README diff --git a/docs-gen/test/stubs/inc/README.md b/docs-gen/test/stubs/inc/README.md deleted file mode 100644 index e845566c06f9b..0000000000000 --- a/docs-gen/test/stubs/inc/README.md +++ /dev/null @@ -1 +0,0 @@ -README diff --git a/docs-gen/test/stubs/inc/class-example.hbs b/docs-gen/test/stubs/inc/class-example.hbs deleted file mode 100755 index ad06e87b1cfe5..0000000000000 --- a/docs-gen/test/stubs/inc/class-example.hbs +++ /dev/null @@ -1 +0,0 @@ -This is a simple example on a handlebars file. \ No newline at end of file diff --git a/docs-gen/test/stubs/inc/class-example.md b/docs-gen/test/stubs/inc/class-example.md deleted file mode 100755 index def04801d72c9..0000000000000 --- a/docs-gen/test/stubs/inc/class-example.md +++ /dev/null @@ -1,5 +0,0 @@ -This is a simple example on how to use include. - -![My image alt text](media://logo.png) - -![My not found image](media://VOID.png) diff --git a/docs-gen/test/stubs/media/logo.png b/docs-gen/test/stubs/media/logo.png deleted file mode 100755 index 120c55ad67864..0000000000000 Binary files a/docs-gen/test/stubs/media/logo.png and /dev/null differ diff --git a/docs-gen/test/stubs/src/categories.ts b/docs-gen/test/stubs/src/categories.ts deleted file mode 100644 index 33778a7dbf0db..0000000000000 --- a/docs-gen/test/stubs/src/categories.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @category CategoryA - */ -let categoryVariableA1 = true; - -/** - * @category CategoryA - */ -let categoryVariableA2 = true; - -/** - * @category CategoryA - */ -function categoryFunctionA1() { - return true; -} - -/** - * @category CategoryA - */ -function categoryFunctionA2() { - return true; -} - -/** - * @category CategoryA - */ -function categoryFunctionA3() { - return true; -} - -/** - * @category CategoryA - */ -interface CategoryInterfaceA1 { - value: string; -} - -/** - * @category CategoryA - */ -interface CategoryInterfaceA2 { - value: string; -} - -/** - * @category CategoryB - */ -let categoryVariableB1 = true; - -/** - * @category CategoryB - */ -function categoryFunctionB2() { - return true; -} - -let otherVariableA = true; - -function otherFunctionA() { - return true; -} - -let otherVariableB = true; - -function otherFunctionB() { - return true; -} - -interface OtherInterfaceA { - value: string; -} diff --git a/docs-gen/test/stubs/src/classes.ts b/docs-gen/test/stubs/src/classes.ts deleted file mode 100644 index 1b9b293842880..0000000000000 --- a/docs-gen/test/stubs/src/classes.ts +++ /dev/null @@ -1,291 +0,0 @@ -/** - * This is a simple interface. - */ -export interface INameInterface { - /** - * This is a interface member of INameInterface. - * - * It should be inherited by all subinterfaces. - */ - name: string; - - /** - * This is a interface function of INameInterface. - * - * It should be inherited by all subinterfaces. - */ - getName(): string; -} - -/** - * This is a simple interface. - */ -export interface IPrintInterface { - /** - * This is a interface function of IPrintInterface - * - * It should be inherited by all subinterfaces. - */ - print(value: string): void; -} - -/** - * This is a interface inheriting from two other interfaces. - */ -export interface IPrintNameInterface extends INameInterface, IPrintInterface { - /** - * This is a interface function of IPrintNameInterface - */ - printName(): void; -} - -/** - * This is a simple base class. - * - * [[include:class-example.md]] - */ -export abstract class BaseClass implements INameInterface { - /** - * This is a simple public member. - */ - public name: string; - - /** - * This is a simple protected member. - */ - protected kind: number; - - /** - * This is a static member. - * - * Static members should not be inherited. - */ - static instance: BaseClass; - static instances: BaseClass[]; - - /** - * This is an instance member of an internal class. - */ - private internalClass: InternalClass; - - constructor(name: string); - constructor(source: BaseClass); - constructor() { - if (arguments.length > 0) { - if (typeof arguments[0] == 'string') { - this.name = arguments[0]; - } else if (arguments[0] instanceof BaseClass) { - this.name = arguments[0].name; - } - } - - this.checkName(); - } - - public abstract abstractMethod(): void; - - /** - * This is a simple member function. - * - * It should be inherited by all subclasses. This class has a static - * member with the same name, both should be documented. - * - * @returns Return the name. - */ - public getName(): string { - return this.name; - } - - /** - * This is a simple static member function. - * - * Static functions should not be inherited. This class has a - * member with the same name, both should be documented. - * - * @returns Return the name. - */ - static getName(): string { - return 'A name'; - } - - /** - * This is a simple member function. - * - * It should be inherited by all subclasses. - * - * @param name The new name. - */ - public setName(name: string) { - this.name = name; - this.checkName(); - } - - /** - * This is a simple fat arrow function. - * - * @param param1 The first parameter needed by this function. - * @param param2 The second parameter needed by this function. - * @see https://github.com/sebastian-lenz/typedoc/issues/37 - */ - public arrowFunction = (param2: string, param1: number): void => {}; - - /** - * This is a private function. - */ - private checkName() { - return true; - } - - /** - * This is a static function. - * - * Static functions should not be inherited. - * - * @returns An instance of BaseClass. - */ - static getInstance(): BaseClass { - return BaseClass.instance; - } - - /** - * @see https://github.com/sebastian-lenz/typedoc/issues/42 - */ - public static caTest( - originalValues: BaseClass, - newRecord: any, - fieldNames: string[], - mandatoryFields: string[], - ): string { - var returnval = ''; - var updates: string[] = []; - var allFields: string[] = fieldNames; - for (var j = 0; j < allFields.length; j++) { - var field = allFields[j]; - var oldValue = originalValues[field]; - var newValue = newRecord[field]; - } - return returnval; - } -} - -/** - * This is an internal class, it is not exported. - */ -class InternalClass { - constructor(options: { name: string }) {} -} - -/** - * This is a class that extends another class. - * - * This class has no own constructor, so its constructor should be inherited - * from BaseClass. - */ -export class SubClassA extends BaseClass implements IPrintNameInterface { - public name: string; - - /** - * This is a simple interface function. - */ - public print(value: string): void {} - - /** - * @inheritdoc - */ - public printName(): void { - this.print(this.getName()); - } - - /** - * Returns the name. See [[BaseClass.name]]. - * - * @returns The return value. - */ - public get nameProperty(): string { - return this.name; - } - - /** - * Sets the name. See [[BaseClass.name]]. - * - * @param value The new name. - * @returns The return value. - */ - public set nameProperty(value: string) { - this.name = value; - } - - /** - * Returns the name. See [[BaseClass.name]]. - * - * @returns The return value. - */ - public get readOnlyNameProperty(): string { - return this.name; - } - - /** - * Sets the name. See [[BaseClass.name]]. - * - * @param value The new name. - * @returns The return value. - */ - public set writeOnlyNameProperty(value: string) { - this.name = value; - } - - public abstractMethod(): void {} -} - -/** - * This is a class that extends another class. - * - * The constructor of the original class should be overwritten. - */ -export class SubClassB extends BaseClass { - public name: string; - - constructor(name: string) { - super(name); - } - - abstractMethod(): void {} - - doSomething(value: [string, SubClassA, SubClassB]) {} -} - -/** - * This is a generic class. - * - * @param T This a type parameter. - */ -export class GenericClass { - public value: T; - - /** - * Constructor short text. - * - * @param p1 Constructor param - * @param p2 Private string property - * @param p3 Public number property - * @param p4 Public implicit any property - * @param p5 Readonly property - */ - constructor(p1, protected p2: T, public p3: number, private p4: number, readonly p5: string) {} - - /** - * @param value [[getValue]] is the counterpart. - */ - public setValue(value: T) { - this.value = value; - } - - public getValue(): T { - return this.value; - } -} - -/** - * This a non generic class derived from a [[GenericClass|generic class]]. - */ -export class NonGenericClass extends GenericClass {} diff --git a/docs-gen/test/stubs/src/comments.ts b/docs-gen/test/stubs/src/comments.ts deleted file mode 100755 index 26e77eb3d13e3..0000000000000 --- a/docs-gen/test/stubs/src/comments.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Additionally you can link to other classes, members or functions using double square brackets. - * - * - Link to an external reflection: [[BaseClass]] - * - Link to an internal reflection: [[commentsInReturn]] - * - Link to an undefined reflection: [[VOID]] - */ - -export let commentsWithSymbolLinks = true; - -/** - * This is an example of include - * - * [[include:class-example.md]] [[include:VOID]] - * - * This is an example of handlebars include - * - * [[include:class-example.hbs]] - */ -export let commentsWithIncludes = true; - -/** - * @name Tag description on same line - * @description - * Tag description on new line - * - Tag description on another line - * - * @deprecated - * Another tag description - */ -export let commentsWithTags = true; - -/** - * Some comments with fence blocks - * ```typescript - * someFunction() - * ``` - * ```js - * anotherFunction() - * ``` - */ -export let commentsWithFencedBlock = true; - -/** - * Comments with a return definition - * @returns Return comments - */ -export function commentsInReturn() { - return; -} - -/** - * See {@linkcode INameInterface} and [INameInterface's name property]{@link INameInterface.name}. - * Also, check out {@link https://www.google.com|Google} and - * {@link https://github.com GitHub}. - * - * Taken from http://usejsdoc.org/tags-inline-link.html. - */ -export function functionWithDocLink() { - return; -} diff --git a/docs-gen/test/stubs/src/destrucuting.ts b/docs-gen/test/stubs/src/destrucuting.ts deleted file mode 100644 index 22d6a99831d88..0000000000000 --- a/docs-gen/test/stubs/src/destrucuting.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Destructuring objects. - */ -const { destructObjectA, destructObjectB, destructObjectC } = { - destructObjectA: 0, - destructObjectB: 'string', - destructObjectC: 0, -}; - -/** - * Destructuring arrays. - */ -const [destructArrayA, destructArrayB, destructArrayC = 10] = [0, 'string', 0]; - -/** - * Array Destructuring with rest - */ -const [destructArrayWithRestA, destructArrayWithRestB, ...destructArrayWithRest] = [1, 2, 3, 4]; - -/** - * Array Destructuring with ignores - */ -const [destructArrayWithIgnoresA, , ...destructArrayWithIgnoresRest] = [1, 2, 3, 4]; - -/** - * Destructuring function parameters. - */ -function drawText({ text = '', location: [x, y] = [0, 0], bold = false }) {} - -interface I { - name: string; -} diff --git a/docs-gen/test/stubs/src/functions.ts b/docs-gen/test/stubs/src/functions.ts deleted file mode 100644 index 438c96cb393d9..0000000000000 --- a/docs-gen/test/stubs/src/functions.ts +++ /dev/null @@ -1,148 +0,0 @@ -export function buildName(firstName: string, lastName?: string) { - if (lastName) { - return firstName + ' ' + lastName; - } else { - return firstName; - } -} - -/** - * This is an internal function. - */ -export function internalFunction(): void {} - -/** - * This is a simple exported function. - */ -export function exportedFunction(): void {} - -/** - * This is a function with multiple arguments and a return value. - * - * @param paramZ - This is a string parameter. - * @param paramG - This is a parameter flagged with any. - * This sentence is placed in the next line. - * - * @param paramA - * This is a **parameter** pointing to an interface. - * - * ~~~ - * const value:BaseClass = new BaseClass('test'); - * functionWithArguments('arg', 0, value); - * ~~~ - * - * @returns This is the return value of the function. - */ -export function functionWithParameters(paramZ: string, paramG: any, paramA: Object): number { - return 0; -} - -/** - * This is a function that is assigned to a variable. - * - * @param someParam This is some numeric parameter. - * @return This is the return value of the function. - */ -export const variableFunction = function(someParam: number): number { - return 0; -}; - -/** - * This is a function with a parameter that is optional. - * - * @param requiredParam A normal parameter. - * @param optionalParam An optional parameter. - */ -export function functionWithOptionalValue(requiredParam: string, optionalParam?: string) {} - -/** - * This is a function with a parameter that has a default value. - * - * @param valueA A parameter with a default string value. - * @param valueB A parameter with a default numeric value. - * @param valueC A parameter with a default NaN value. - * @param valueD A parameter with a default boolean value. - * @param valueE A parameter with a default null value. - * @return This is the return value of the function. - */ -export function functionWithDefaults( - valueA: string = 'defaultValue', - valueB: number = 100, - valueC: number = Number.NaN, - valueD: boolean = true, - valueE: boolean = null, -): string { - return valueA; -} - -/** - * This is a function with rest parameter. - * - * @param rest The rest parameter. - * @return This is the return value of the function. - */ -export function functionWithRest(...rest: string[]): string { - return rest.join(', '); -} - -/** - * This is the first signature of a function with multiple signatures. - * - * @param value The name value. - */ -export function multipleSignatures(value: string): string; - -/** - * This is the second signature of a function with multiple signatures. - * - * @param value An object containing the name value. - * @param value.name A value of the object. - */ -export function multipleSignatures(value: { name: string }): string; - -/** - * This is the actual implementation, this comment will not be visible - * in the generated documentation. - * - * @return This is the return value of the function. - */ -export function multipleSignatures(): string { - if (arguments.length > 0) { - if (typeof arguments[0] == 'object') { - return arguments[0].name; - } else { - return arguments[0]; - } - } - - return ''; -} - -/** - * This is a function that is extended by a module. - * - * @param arg An argument. - */ -export function moduleFunction(arg: string): string { - return ''; -} - -/** - * This is the module extending the function moduleFunction(). - */ -export module moduleFunction { - /** - * This variable is appended to a function. - */ - export let functionVariable: string; - - /** - * This function is appended to another function. - */ - export function append() {} - - /** - * This function is appended to another function. - */ - export function prepend() {} -} diff --git a/docs-gen/test/stubs/src/literals.ts b/docs-gen/test/stubs/src/literals.ts deleted file mode 100644 index 0c615b0376349..0000000000000 --- a/docs-gen/test/stubs/src/literals.ts +++ /dev/null @@ -1,27 +0,0 @@ -const objectLiteral = { - valueZ: 'foo', - valueY: function() { - return 'foo'; - }, - valueX: { - valueZ: 'foo', - valueY: (z: string) => { - return { a: 'test', b: z }; - }, - valueA: [100, 200, 300], - }, - valueA: 100, - valueB: true, -}; - -let typeLiteral: { - valueZ: string; - valueY: { (): string }; - valueX: { - valueZ: string; - valueY: { (z: string): { a: string; b: string } }; - valueA: number[]; - }; - valueA?: number; - valueB?: boolean; -}; diff --git a/docs-gen/test/stubs/src/variables.ts b/docs-gen/test/stubs/src/variables.ts deleted file mode 100644 index a3e8e6b3a8d4e..0000000000000 --- a/docs-gen/test/stubs/src/variables.ts +++ /dev/null @@ -1,15 +0,0 @@ -let isDone: boolean = false; - -let decimal: number = 6; - -let color: string = 'blue'; - -let list: number[] = [1, 2, 3]; - -let x: [string, number]; - -let notSure: any = 4; - -let u: undefined; - -let n: null = null; diff --git a/docs-gen/test/stubs/tsconfig.json b/docs-gen/test/stubs/tsconfig.json deleted file mode 100644 index 6bc28569a0aca..0000000000000 --- a/docs-gen/test/stubs/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "lib": ["es2016", "dom"], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "strictNullChecks": false, - "target": "es2015" - } -} diff --git a/docs-gen/tsconfig.json b/docs-gen/tsconfig.json deleted file mode 100644 index e03f1949993cd..0000000000000 --- a/docs-gen/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "declaration": true, - "experimentalDecorators": true, - "lib": ["es2016", "dom"], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": false, - "noUnusedLocals": false, - "outDir": "./dist", - "removeComments": true, - "sourceMap": true, - "strictNullChecks": false, - "target": "es2015", - "baseUrl": ".", - "paths": { - "react": ["node_modules/@types/react"], - "@cubejs-client/core": ["../packages/cubejs-client-core"] - } - }, - "exclude": ["./dist", "./test", "**/*.spec.ts"] -} diff --git a/docs-gen/tslint.json b/docs-gen/tslint.json deleted file mode 100644 index c50f67a4622dd..0000000000000 --- a/docs-gen/tslint.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "tslint:recommended", - "rules": { - "quotemark": [true, "single"], - "interface-over-type-literal": false, - "no-string-literal": false, - "no-console": false, - "no-var-requires": false, - "max-line-length": [true, 1140], - "no-submodule-imports": false, - "align": false, - "no-unused-expression": false, - "interface-name": false, - "object-literal-sort-keys": false, - "arrow-parens": false, - "member-ordering": false, - "member-access": false, - "object-literal-key-quotes": false, - "max-classes-per-file": false - } -} diff --git a/docs-gen/yarn.lock b/docs-gen/yarn.lock deleted file mode 100644 index 07c65b030c35b..0000000000000 --- a/docs-gen/yarn.lock +++ /dev/null @@ -1,4163 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" - integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== - dependencies: - "@babel/highlight" "^7.10.3" - -"@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" - integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== - dependencies: - "@babel/code-frame" "^7.10.3" - "@babel/generator" "^7.10.3" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.3" - "@babel/template" "^7.10.3" - "@babel/traverse" "^7.10.3" - "@babel/types" "^7.10.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" - integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== - dependencies: - "@babel/types" "^7.10.3" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" - integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== - dependencies: - "@babel/types" "^7.6.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" - integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== - dependencies: - "@babel/helper-get-function-arity" "^7.10.3" - "@babel/template" "^7.10.3" - "@babel/types" "^7.10.3" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" - integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== - dependencies: - "@babel/types" "^7.10.3" - -"@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" - integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== - dependencies: - "@babel/types" "^7.10.3" - -"@babel/helper-module-imports@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" - integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== - dependencies: - "@babel/types" "^7.10.3" - -"@babel/helper-module-transforms@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" - integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== - dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" - integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== - dependencies: - "@babel/types" "^7.10.3" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" - integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== - -"@babel/helper-replace-supers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" - integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-simple-access@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" - integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== - dependencies: - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-split-export-declaration@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" - integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-validator-identifier@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" - integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== - -"@babel/helpers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" - integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== - dependencies: - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" - integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== - dependencies: - "@babel/helper-validator-identifier" "^7.10.3" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" - integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== - -"@babel/parser@^7.6.0", "@babel/parser@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" - integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" - integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz#3e59120ed8b3c2ccc5abb1cfc7aaa3ea01cd36b6" - integrity sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550" - integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" - integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/template@^7.1.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/template@^7.10.1", "@babel/template@^7.10.3", "@babel/template@^7.3.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" - integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== - dependencies: - "@babel/code-frame" "^7.10.3" - "@babel/parser" "^7.10.3" - "@babel/types" "^7.10.3" - -"@babel/traverse@^7.1.0": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" - integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.2" - "@babel/types" "^7.6.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" - integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== - dependencies: - "@babel/code-frame" "^7.10.3" - "@babel/generator" "^7.10.3" - "@babel/helper-function-name" "^7.10.3" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.3" - "@babel/types" "^7.10.3" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" - integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.3": - version "7.10.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" - integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.3" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@jest/console@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.1.0.tgz#f67c89e4f4d04dbcf7b052aed5ab9c74f915b954" - integrity sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A== - dependencies: - "@jest/types" "^26.1.0" - chalk "^4.0.0" - jest-message-util "^26.1.0" - jest-util "^26.1.0" - slash "^3.0.0" - -"@jest/core@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.1.0.tgz#4580555b522de412a7998b3938c851e4f9da1c18" - integrity sha512-zyizYmDJOOVke4OO/De//aiv8b07OwZzL2cfsvWF3q9YssfpcKfcnZAwDY8f+A76xXSMMYe8i/f/LPocLlByfw== - dependencies: - "@jest/console" "^26.1.0" - "@jest/reporters" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.1.0" - jest-config "^26.1.0" - jest-haste-map "^26.1.0" - jest-message-util "^26.1.0" - jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-resolve-dependencies "^26.1.0" - jest-runner "^26.1.0" - jest-runtime "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" - jest-watcher "^26.1.0" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.1.0.tgz#378853bcdd1c2443b4555ab908cfbabb851e96da" - integrity sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA== - dependencies: - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - -"@jest/fake-timers@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.1.0.tgz#9a76b7a94c351cdbc0ad53e5a748789f819a65fe" - integrity sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA== - dependencies: - "@jest/types" "^26.1.0" - "@sinonjs/fake-timers" "^6.0.1" - jest-message-util "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" - -"@jest/globals@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.1.0.tgz#6cc5d7cbb79b76b120f2403d7d755693cf063ab1" - integrity sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/types" "^26.1.0" - expect "^26.1.0" - -"@jest/reporters@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.1.0.tgz#08952e90c90282e14ff49e927bdf1873617dae78" - integrity sha512-SVAysur9FOIojJbF4wLP0TybmqwDkdnFxHSPzHMMIYyBtldCW9gG+Q5xWjpMFyErDiwlRuPyMSJSU64A67Pazg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.1.0" - jest-resolve "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^4.1.3" - optionalDependencies: - node-notifier "^7.0.0" - -"@jest/source-map@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" - integrity sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.1.0.tgz#a93fa15b21ad3c7ceb21c2b4c35be2e407d8e971" - integrity sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw== - dependencies: - "@jest/console" "^26.1.0" - "@jest/types" "^26.1.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz#41a6fc8b850c3f33f48288ea9ea517c047e7f14e" - integrity sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q== - dependencies: - "@jest/test-result" "^26.1.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.1.0" - jest-runner "^26.1.0" - jest-runtime "^26.1.0" - -"@jest/transform@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.1.0.tgz#697f48898c2a2787c9b4cb71d09d7e617464e509" - integrity sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.1.0" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.1.0" - jest-regex-util "^26.0.0" - jest-util "^26.1.0" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - -"@jest/types@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.1.0.tgz#f8afaaaeeb23b5cad49dd1f7779689941dcb6057" - integrity sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@sinonjs/commons@^1.7.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" - integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5" - integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/fs-extra@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918" - integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg== - dependencies: - "@types/node" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" - integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/jest@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" - integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== - dependencies: - jest-diff "^25.2.1" - pretty-format "^25.2.1" - -"@types/node@*", "@types/node@^14.0.9": - version "14.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" - integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/prettier@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz#b6e98083f13faa1e5231bfa3bdb1b0feff536b6d" - integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ== - -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== - -"@types/react@^16.9.41": - version "16.9.49" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" - integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== - -"@types/yargs@^15.0.0": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== - dependencies: - "@types/yargs-parser" "*" - -abab@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== - -ajv@^6.5.5: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== - -babel-jest@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.1.0.tgz#b20751185fc7569a0f135730584044d1cb934328" - integrity sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg== - dependencies: - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.1.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz#c6a774da08247a28285620a64dfadbd05dd5233a" - integrity sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" - integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -babel-preset-jest@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz#612f714e5b457394acfd863793c564cbcdb7d1c1" - integrity sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w== - dependencies: - babel-plugin-jest-hoist "^26.1.0" - babel-preset-current-node-syntax "^0.1.2" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^2.0.0, chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copyfiles@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.3.0.tgz#1c26ebbe3d46bba2d309a3fd8e3aaccf53af8c76" - integrity sha512-73v7KFuDFJ/ofkQjZBMjMBFWGgkS76DzXvBMUh7djsMOE5EELWtAO/hRB6Wr5Vj5Zg+YozvoHemv0vnXpqxmOQ== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - yargs "^15.3.1" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" - integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" - integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== - -diff-sequences@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" - integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.14.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-stream@=3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.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@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" - integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.1.0.tgz#8c62e31d0f8d5a8ebb186ee81473d15dd2fbf7c8" - integrity sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw== - dependencies: - "@jest/types" "^26.1.0" - ansi-styles "^4.0.0" - jest-get-type "^26.0.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" - jest-regex-util "^26.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== - -graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -handlebars@^4.7.6: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -highlight.js@^10.2.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -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== - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflection@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" - integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -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" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.1.0.tgz#de66b0f30453bca2aff98e9400f75905da495305" - integrity sha512-HS5MIJp3B8t0NRKGMCZkcDUZo36mVRvrDETl81aqljT1S9tqiHRSpyoOvWg9ZilzZG9TDisDNaN1IXm54fLRZw== - dependencies: - "@jest/types" "^26.1.0" - execa "^4.0.0" - throat "^5.0.0" - -jest-cli@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.1.0.tgz#eb9ec8a18cf3b6aa556d9deaa9e24be12b43ad87" - integrity sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw== - dependencies: - "@jest/core" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" - prompts "^2.0.1" - yargs "^15.3.1" - -jest-config@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.1.0.tgz#9074f7539acc185e0113ad6d22ed589c16a37a73" - integrity sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.1.0" - "@jest/types" "^26.1.0" - babel-jest "^26.1.0" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.1.0" - jest-environment-node "^26.1.0" - jest-get-type "^26.0.0" - jest-jasmine2 "^26.1.0" - jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" - micromatch "^4.0.2" - pretty-format "^26.1.0" - -jest-diff@^25.2.1: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" - integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== - dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.6" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" - -jest-diff@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.1.0.tgz#00a549bdc936c9691eb4dc25d1fbd78bf456abb2" - integrity sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.0.0" - jest-get-type "^26.0.0" - pretty-format "^26.1.0" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.1.0.tgz#e35449875009a22d74d1bda183b306db20f286f7" - integrity sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA== - dependencies: - "@jest/types" "^26.1.0" - chalk "^4.0.0" - jest-get-type "^26.0.0" - jest-util "^26.1.0" - pretty-format "^26.1.0" - -jest-environment-jsdom@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz#9dc7313ffe1b59761dad1fedb76e2503e5d37c5b" - integrity sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" - jsdom "^16.2.2" - -jest-environment-node@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.1.0.tgz#8bb387b3eefb132eab7826f9a808e4e05618960b" - integrity sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" - -jest-get-type@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" - integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== - -jest-get-type@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" - integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== - -jest-haste-map@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.1.0.tgz#ef31209be73f09b0d9445e7d213e1b53d0d1476a" - integrity sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA== - dependencies: - "@jest/types" "^26.1.0" - "@types/graceful-fs" "^4.1.2" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-serializer "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - which "^2.0.2" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz#4dfe349b2b2d3c6b3a27c024fd4cb57ac0ed4b6f" - integrity sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.1.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.1.0" - is-generator-fn "^2.0.0" - jest-each "^26.1.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" - jest-runtime "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - pretty-format "^26.1.0" - throat "^5.0.0" - -jest-leak-detector@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz#039c3a07ebcd8adfa984b6ac015752c35792e0a6" - integrity sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw== - dependencies: - jest-get-type "^26.0.0" - pretty-format "^26.1.0" - -jest-matcher-utils@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz#cf75a41bd413dda784f022de5a65a2a5c73a5c92" - integrity sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA== - dependencies: - chalk "^4.0.0" - jest-diff "^26.1.0" - jest-get-type "^26.0.0" - pretty-format "^26.1.0" - -jest-message-util@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.1.0.tgz#52573fbb8f5cea443c4d1747804d7a238a3e233c" - integrity sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.1.0" - "@types/stack-utils" "^1.0.1" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.1.0.tgz#80d8286da1f05a345fbad1bfd6fa49a899465d3d" - integrity sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw== - dependencies: - "@jest/types" "^26.1.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.1.0.tgz#1ce36472f864a5dadf7dc82fa158e1c77955691b" - integrity sha512-fQVEPHHQ1JjHRDxzlLU/buuQ9om+hqW6Vo928aa4b4yvq4ZHBtRSDsLdKQLuCqn5CkTVpYZ7ARh2fbA8WkRE6g== - dependencies: - "@jest/types" "^26.1.0" - jest-regex-util "^26.0.0" - jest-snapshot "^26.1.0" - -jest-resolve@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.1.0.tgz#a530eaa302b1f6fa0479079d1561dd69abc00e68" - integrity sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg== - dependencies: - "@jest/types" "^26.1.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.1" - jest-util "^26.1.0" - read-pkg-up "^7.0.1" - resolve "^1.17.0" - slash "^3.0.0" - -jest-runner@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.1.0.tgz#457f7fc522afe46ca6db1dccf19f87f500b3288d" - integrity sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw== - dependencies: - "@jest/console" "^26.1.0" - "@jest/environment" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.1.0" - jest-docblock "^26.0.0" - jest-haste-map "^26.1.0" - jest-jasmine2 "^26.1.0" - jest-leak-detector "^26.1.0" - jest-message-util "^26.1.0" - jest-resolve "^26.1.0" - jest-runtime "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.1.0.tgz#45a37af42115f123ed5c51f126c05502da2469cb" - integrity sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA== - dependencies: - "@jest/console" "^26.1.0" - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/globals" "^26.1.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.1.0" - jest-haste-map "^26.1.0" - jest-message-util "^26.1.0" - jest-mock "^26.1.0" - jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.3.1" - -jest-serializer@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.1.0.tgz#72a394531fc9b08e173dc7d297440ac610d95022" - integrity sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w== - dependencies: - graceful-fs "^4.2.4" - -jest-snapshot@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.1.0.tgz#c36ed1e0334bd7bd2fe5ad07e93a364ead7e1349" - integrity sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.1.0" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.1.0" - graceful-fs "^4.2.4" - jest-diff "^26.1.0" - jest-get-type "^26.0.0" - jest-haste-map "^26.1.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" - jest-resolve "^26.1.0" - natural-compare "^1.4.0" - pretty-format "^26.1.0" - semver "^7.3.2" - -jest-util@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.1.0.tgz#80e85d4ba820decacf41a691c2042d5276e5d8d8" - integrity sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg== - dependencies: - "@jest/types" "^26.1.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.1.0.tgz#942c85ad3d60f78250c488a7f85d8f11a29788e7" - integrity sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw== - dependencies: - "@jest/types" "^26.1.0" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.0.0" - leven "^3.1.0" - pretty-format "^26.1.0" - -jest-watcher@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.1.0.tgz#99812a0cd931f0cb3d153180426135ab83e4d8f2" - integrity sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ== - dependencies: - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.1.0" - string-length "^4.0.1" - -jest-worker@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.1.0.tgz#65d5641af74e08ccd561c240e7db61284f82f33d" - integrity sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@^26.0.1: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.1.0.tgz#2f3aa7bcffb9bfd025473f83bbbf46a3af026263" - integrity sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw== - dependencies: - "@jest/core" "^26.1.0" - import-local "^3.0.2" - jest-cli "^26.1.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.2.2: - version "16.2.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" - integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== - dependencies: - abab "^2.0.3" - acorn "^7.1.1" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.2.0" - data-urls "^2.0.0" - decimal.js "^10.2.0" - domexception "^2.0.1" - escodegen "^1.14.1" - html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" - nwsapi "^2.2.0" - parse5 "5.1.1" - request "^2.88.2" - request-promise-native "^1.0.8" - saxes "^5.0.0" - symbol-tree "^3.2.4" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.0.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - ws "^7.2.3" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -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== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@2.x, json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== - dependencies: - universalify "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.13, lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^3.0.0: - 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== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -marked@^1.1.1: - version "1.2.9" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.9.tgz#53786f8b05d4c01a2a5a76b7d1ec9943d29d72dc" - integrity sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@4.x, micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.0, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@1.x, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-cleanup@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" - integrity sha1-esGavSl+Caf3KnFUXZUbUX5N3iw= - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.1.tgz#a355e33e6bebacef9bf8562689aed0f4230ca6f9" - integrity sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg== - dependencies: - growly "^1.3.0" - is-wsl "^2.1.1" - semver "^7.2.1" - shellwords "^0.1.1" - uuid "^7.0.3" - which "^2.0.2" - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -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== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.0.5: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -pretty-format@^25.2.1, pretty-format@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.1.0.tgz#272b9cd1f1a924ab5d443dc224899d7a65cb96ec" - integrity sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg== - dependencies: - "@jest/types" "^26.1.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.4" - -ps-tree@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" - integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== - dependencies: - event-stream "=3.3.4" - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -react-is@^16.12.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -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== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== - dependencies: - lodash "^4.17.15" - -request-promise-native@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== - dependencies: - request-promise-core "1.1.3" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.6: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -saxes@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shelljs@^0.8.4: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sisteransi@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" - integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -string-argv@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.1.2.tgz#c5b7bc03fb2b11983ba3a72333dd0559e77e4738" - integrity sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA== - -string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "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== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@2, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== - dependencies: - punycode "^2.1.1" - -ts-jest@^26.1.0: - version "26.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.1.1.tgz#b98569b8a4d4025d966b3d40c81986dd1c510f8d" - integrity sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - micromatch "4.x" - mkdirp "1.x" - semver "7.x" - yargs-parser "18.x" - -tsc-watch@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-4.2.9.tgz#d93fc74233ca4ef7ee6b12d08c0fe6aca3e19044" - integrity sha512-DlTaoDs74+KUpyWr7dCGhuscAUKCz6CiFduBN7R9RbLJSSN1moWdwoCLASE7+zLgGvV5AwXfYDiEMAsPGaO+Vw== - dependencies: - cross-spawn "^7.0.3" - node-cleanup "^2.1.2" - ps-tree "^1.2.0" - string-argv "^0.1.1" - strip-ansi "^6.0.0" - -tslib@^1.10.0, tslib@^1.8.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tslint@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.2.tgz#2433c248512cc5a7b2ab88ad44a6b1b34c6911cf" - integrity sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.10.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedoc-default-themes@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.11.4.tgz#1bc55b7c8d1132844616ff6f570e1e2cd0eb7343" - integrity sha512-Y4Lf+qIb9NTydrexlazAM46SSLrmrQRqWiD52593g53SsmUFioAsMWt8m834J6qsp+7wHRjxCXSZeiiW5cMUdw== - -typedoc@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.19.2.tgz#842a63a581f4920f76b0346bb80eb2a49afc2c28" - integrity sha512-oDEg1BLEzi1qvgdQXc658EYgJ5qJLVSeZ0hQ57Eq4JXy6Vj2VX4RVo18qYxRWz75ifAaYuYNBUCnbhjd37TfOg== - dependencies: - fs-extra "^9.0.1" - handlebars "^4.7.6" - highlight.js "^10.2.0" - lodash "^4.17.20" - lunr "^2.3.9" - marked "^1.1.1" - minimatch "^3.0.0" - progress "^2.0.3" - semver "^7.3.2" - shelljs "^0.8.4" - typedoc-default-themes "^0.11.4" - -typescript@^4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - -uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - -v8-to-istanbul@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" - integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" - integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^5.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.2.3: - version "7.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" - integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yargs-parser@18.x, yargs-parser@^18.1.1: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.1" diff --git a/docs/.env.development b/docs/.env.development deleted file mode 100644 index d51ff4e196d79..0000000000000 --- a/docs/.env.development +++ /dev/null @@ -1,2 +0,0 @@ -ALGOLIA_API_KEY='665bbb3a2c36759517a8b75ddba8601f' -ALGOLIA_INDEX_NAME='cubejs' diff --git a/docs/.env.production b/docs/.env.production deleted file mode 100644 index b90e6dad7fc92..0000000000000 --- a/docs/.env.production +++ /dev/null @@ -1,3 +0,0 @@ -ALGOLIA_API_KEY='665bbb3a2c36759517a8b75ddba8601f' -ALGOLIA_INDEX_NAME='cubejs' -PATH_PREFIX='/docs' diff --git a/docs/.gitignore b/docs/.gitignore index 52e544d0380f5..c87c9b392c020 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,13 +1,36 @@ -node_modules/ -public/ -dist/ -.cache -yarn-error.log +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc .DS_Store -.idea +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local -# Cube.js repo -cube.js/ +# vercel +.vercel -# Local Netlify folder -.netlify \ No newline at end of file +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/docs/.lintstagedrc b/docs/.lintstagedrc deleted file mode 100644 index f08a8fa9e3e61..0000000000000 --- a/docs/.lintstagedrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "CHANGELOG.md": [ - "" - ], - "*.md": [ - "prettier --write", - "markdownlint-cli2" - ], - "*.scss": [ - ], - "*.js?(x)": [ - ], - "*.ts?(x)": [ - "prettier --write" - ] -} diff --git a/docs/.markdownlint.json b/docs/.markdownlint.json deleted file mode 100644 index 6dcc594fe3bf4..0000000000000 --- a/docs/.markdownlint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "line-length": false, - "no-duplicate-heading": false, - "no-inline-html": { - "allowed_elements": [ - "a", - "img", - "p" - ] - }, - "no-trailing-punctuation": "" -} diff --git a/docs/.prettierrc b/docs/.prettierrc deleted file mode 100644 index e3d733c19b2e5..0000000000000 --- a/docs/.prettierrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": true, - "arrowParens": "always", - "trailingComma": "es5", - "bracketSpacing": true, - "jsxBracketSameLine": false, - "proseWrap": "always", - "overrides": [ - { - "files": ["*.css", "*.scss"], - "options": { - "singleQuote": false - } - } - ] -} diff --git a/docs/.textlintrc b/docs/.textlintrc deleted file mode 100644 index 932102ec9712e..0000000000000 --- a/docs/.textlintrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rules": { - "textlint-rule-alex": true, - "textlint-rule-diacritics": true, - "textlint-rule-no-todo": true, - "textlint-rule-stop-words": true - } -} diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md deleted file mode 100644 index 016797f96302f..0000000000000 --- a/docs/CHANGELOG.md +++ /dev/null @@ -1,387 +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. - -## [0.26.53](https://github.com/cube-js/cube.js/compare/v0.26.52...v0.26.53) (2021-03-11) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.49](https://github.com/cube-js/cube.js/compare/v0.26.48...v0.26.49) (2021-03-05) - - -### Features - -* **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.46](https://github.com/cube-js/cube.js/compare/v0.26.45...v0.26.46) (2021-03-04) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -## [0.26.44](https://github.com/cube-js/cube.js/compare/v0.26.43...v0.26.44) (2021-03-02) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.40](https://github.com/cube-js/cube.js/compare/v0.26.39...v0.26.40) (2021-03-01) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -## [0.26.36](https://github.com/cube-js/cube.js/compare/v0.26.35...v0.26.36) (2021-02-25) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.34](https://github.com/cube-js/cube.js/compare/v0.26.33...v0.26.34) (2021-02-25) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.31](https://github.com/cube-js/cube.js/compare/v0.26.30...v0.26.31) (2021-02-23) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.30](https://github.com/cube-js/cube.js/compare/v0.26.29...v0.26.30) (2021-02-22) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.29](https://github.com/cube-js/cube.js/compare/v0.26.28...v0.26.29) (2021-02-22) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.20](https://github.com/cube-js/cube.js/compare/v0.26.19...v0.26.20) (2021-02-19) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.26.16](https://github.com/cube-js/cube.js/compare/v0.26.15...v0.26.16) (2021-02-18) - - -### Features - -* **druid-driver:** Support CUBEJS_DB_SSL ([d8124d0](https://github.com/cube-js/cube.js/commit/d8124d0a91c926ce0e1ffd21d6d057c164b01e79)) - - - - - -## [0.26.15](https://github.com/cube-js/cube.js/compare/v0.26.14...v0.26.15) (2021-02-16) - - -### Features - -* **clickhouse-driver:** HTTPS and readOnly support ([3d60ead](https://github.com/cube-js/cube.js/commit/3d60ead920635eb85c76b51a5c301e2f1fb08cb6)) - - - - - -## [0.26.14](https://github.com/cube-js/cube.js/compare/v0.26.13...v0.26.14) (2021-02-15) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -## [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-docs/site - - - - - -## [0.26.7](https://github.com/cube-js/cube.js/compare/v0.26.6...v0.26.7) (2021-02-09) - - -### Features - -* Support for Redis Sentinel + IORedis driver. fix [#1769](https://github.com/cube-js/cube.js/issues/1769) ([a5e7972](https://github.com/cube-js/cube.js/commit/a5e7972485fa97faaf9965b9794b0cf48256f484)) -* Use REDIS_URL for IORedis options (with santinels) ([988bfe5](https://github.com/cube-js/cube.js/commit/988bfe5526be3506fe7b773d247ad89b3287fad4)) - - - - - -## [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-docs/site - - - - - -## [0.26.4](https://github.com/cube-js/cube.js/compare/v0.26.3...v0.26.4) (2021-02-02) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -# [0.26.0](https://github.com/cube-js/cube.js/compare/v0.25.33...v0.26.0) (2021-02-01) - - -### Features - -* Storing userContext inside payload.u is deprecated, moved to root ([559bd87](https://github.com/cube-js/cube.js/commit/559bd8757d9754ab486eed88d1fdb0c280b82dc9)) - - - - - -## [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-docs/site - - - - - -## [0.25.31](https://github.com/cube-js/cube.js/compare/v0.25.30...v0.25.31) (2021-01-28) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.25.28](https://github.com/cube-js/cube.js/compare/v0.25.27...v0.25.28) (2021-01-25) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.25.25](https://github.com/cube-js/cube.js/compare/v0.25.24...v0.25.25) (2021-01-24) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -## [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-docs/site - - - - - -## [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-docs/site - - - - - -## [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-docs/site - - - - - -## [0.25.14](https://github.com/cube-js/cube.js/compare/v0.25.13...v0.25.14) (2021-01-11) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.25.11](https://github.com/cube-js/cube.js/compare/v0.25.10...v0.25.11) (2021-01-04) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [0.25.4](https://github.com/cube-js/cube.js/compare/v0.25.3...v0.25.4) (2020-12-30) - - -### Features - -* **server-core:** Compatibility shim, for legacy imports ([2116799](https://github.com/cube-js/cube.js/commit/21167995045d7a5c0d1056dc034b14ec18205277)) -* **server-core:** Introduce CUBEJS_PRE_AGGREGATIONS_SCHEMA, use dev_preaggregations/prod_preaggregations by default ([e5bdf3d](https://github.com/cube-js/cube.js/commit/e5bdf3dfbd28d5e1c1e775c554c275304a0941f3)) - - - - - -## [0.25.2](https://github.com/cube-js/cube.js/compare/v0.25.1...v0.25.2) (2020-12-27) - - -### Features - -* Ability to set timeouts for polling in BigQuery/Athena ([#1675](https://github.com/cube-js/cube.js/issues/1675)) ([dc944b1](https://github.com/cube-js/cube.js/commit/dc944b1aaacc69dd74a9d9d31ceaf43e16d37ccd)), closes [#1672](https://github.com/cube-js/cube.js/issues/1672) - - - - - -## [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-docs/site - - - - - -## [0.24.14](https://github.com/cube-js/cube.js/compare/v0.24.13...v0.24.14) (2020-12-19) - - -### Features - -* Add HTTP Post to cubejs client core ([#1608](https://github.com/cube-js/cube.js/issues/1608)). Thanks to [@mnifakram](https://github.com/mnifakram)! ([1ebd6a0](https://github.com/cube-js/cube.js/commit/1ebd6a04ac97b31c6a51ef63bb1d4c040e524190)) - - - - - -## [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-docs/site - - - - - -## [0.24.11](https://github.com/cube-js/cube.js/compare/v0.24.10...v0.24.11) (2020-12-17) - -**Note:** Version bump only for package @cubejs-docs/site - - - - - -## [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-docs/site - - - - - -# Change Log - -All notable changes to this project will be documented in this file. See -[Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [0.24.8](https://github.com/cube-js/cube.js/compare/v0.24.7...v0.24.8) (2020-12-15) - -### Features - -- **@cubejs-client/core:** Added pivotConfig option to alias series with a - prefix ([#1594](https://github.com/cube-js/cube.js/issues/1594)). Thanks to - @MattGson! - ([a3342f7](https://github.com/cube-js/cube.js/commit/a3342f7fd0389ce3ad0bc62686c0e787de25f411)) - -## [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-docs/site - -## [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-docs/site - -## [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-docs/site diff --git a/docs/README.md b/docs/README.md index 9abe3c4890c1b..0e7a3972c34c9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,68 +1 @@ -# Cube.js Docs - -This repository contains the [Gatsby][link-gatsby]-powered Cube.js -Documentation: [cube.dev/docs][link-docs-live] - -Docs are Markdown files located in the main Cube.js repository in -[`docs/content`][link-docs-content]. The build process uses the Gatsby CLI to -scan the `docs/content/` folder and generate a static HTML site. - -[link-gatsby]: https://www.gatsbyjs.com/ -[link-docs-live]: https://cube.dev/docs -[link-docs-content]: https://github.com/cube-js/cube.js/tree/master/docs/content - -## Development - -To start the project in development mode, run the following: - -```bash -yarn dev -``` - -To build a production-ready version of the site, run the following: - -```bash -source .env.production -yarn build --prefix-paths -``` - -## Formatting - -Run the following to format a Markdown file: - -```bash -yarn prettier content/ --write -``` - -If the file includes any alerts (`[[info | Note]]`), then wrap the alert with -`` and `` to prevent -Prettier from messing with them. - - -## Indexing - -The search functionality is powered by [DocSearch by Algolia][link-docsearch]. -The configuration file can be [found here][link-docsearch-config]. - -[link-docsearch]: https://docsearch.algolia.com/ -[link-docsearch-config]: - https://github.com/algolia/docsearch-configs/blob/master/configs/cubejs.json - -## Deployment - -### Staging - -[Netlify][link-netlify] is used for staging and pull request previews. The -staging URL is [cubejs-docs-staging.netlify.app][link-docs-staging]. - -[link-netlify]: https://www.netlify.com/ -[link-docs-staging]: https://cubejs-docs-staging.netlify.app - -PRs automatically generate [Deploy Previews] with unique URLs that can be found -in the status checks for a PR. - -### Production - -Deployment is handled via a [GitHub action][link-gh-docs-workflow]. - -[link-gh-docs-workflow]: /.github/workflows/docs.yml +# Cube Docs diff --git a/docs/build-netlify-prod.sh b/docs/build-netlify-prod.sh deleted file mode 100755 index 1488374517c87..0000000000000 --- a/docs/build-netlify-prod.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -eo pipefail - -rm -rf .cache -rm -rf public -rm -rf dist - -yarn && yarn build --prefix-paths && mkdir -p dist/docs && mv public/_headers public/_redirects dist/ && rsync -av --delete public/ dist/docs diff --git a/docs/build-netlify.sh b/docs/build-netlify.sh deleted file mode 100755 index 7a41026bcebc9..0000000000000 --- a/docs/build-netlify.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -eo pipefail - -rm -rf .cache -rm -rf public - -yarn && yarn build:netlify diff --git a/docs/build.sh b/docs/build.sh deleted file mode 100755 index 517273ed04b90..0000000000000 --- a/docs/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -eo pipefail - -rm -rf .cache -rm -rf public - -yarn && yarn build --prefix-paths diff --git a/docs/components/common/BlogButton/Button.module.css b/docs/components/common/BlogButton/Button.module.css new file mode 100644 index 0000000000000..6431b0b89a9ed --- /dev/null +++ b/docs/components/common/BlogButton/Button.module.css @@ -0,0 +1,351 @@ +.Button { + --loader_time: 700ms; + --hover_transition: 0.2s; + + transition: background-color var(--hover_transition), color var(--hover_transition), + box-shadow var(--hover_transition), opacity var(--loader_time); + font-family: inherit; + font-weight: 700; + border: none; + margin: 0; + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + display: flex; + align-items: center; + justify-content: center; + text-decoration: none; +} + +.Button:hover { + cursor: pointer; +} + +.Button:disabled { + opacity: 0.4; + cursor: default; +} + +/* transparent */ + +.Button--transparent { + background-color: transparent; + color: var(--dark); +} + +.Button--transparent.Button--variant-outline { + box-shadow: inset 0 0 0 1px var(--dark_05); +} + +.Button--transparent.Button--variant-outline:hover, +.Button--transparent.Button--variant-outline.Button--pseudoHover { + background-color: var(--dark_bg_a04); +} + +.Button--transparent.Button--variant-outline:focus-visible, +.Button--transparent.Button--variant-outline.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--transparent.Button--variant-outline:active, +.Button--transparent.Button--variant-outline.Button--pseudoActive { + background-color: var(--dark_bg_a04); + box-shadow: inset 0 0 0 1px var(--dark_03); +} + +/* transparent-dark */ + +.Button--appearance-dark.Button--transparent { + background-color: transparent; + color: var(--white); +} + +.Button--appearance-dark.Button--transparent.Button--variant-outline { + box-shadow: inset 0 0 0 1px var(--dark_03); +} + +.Button--appearance-dark.Button--transparent.Button--variant-outline:hover, +.Button--appearance-dark.Button--transparent.Button--variant-outline.Button--pseudoHover { + background-color: var(--white_a08); +} + +.Button--appearance-dark.Button--transparent.Button--variant-outline:focus-visible, +.Button--appearance-dark.Button--transparent.Button--variant-outline.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--appearance-dark.Button--transparent.Button--variant-outline:active, +.Button--appearance-dark.Button--transparent.Button--variant-outline.Button--pseudoActive { + background-color: var(--white_a08); + box-shadow: inset 0 0 0 1px var(--dark_05); +} + +/* purple */ + +.Button--purple { + background-color: var(--purple); + color: var(--white); +} + +.Button--purple:hover, +.Button--purple.Button--pseudoHover { + background-color: var(--purple_bright); + color: var(--white); +} + +.Button--purple:focus-visible, +.Button--purple.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--purple_04_a30); +} + +.Button--purple:active, +.Button--purple.Button--pseudoActive { + background-color: var(--purple); + box-shadow: inset 0 0 0 1px var(--purple_bright); + color: var(--white); +} + +/* purple-outline */ + +.Button--purple.Button--variant-outline { + background-color: var(--white); + color: var(--purple_bright); + box-shadow: inset 0 0 0 1px var(--purple_04_a30); +} + +.Button--purple.Button--variant-outline:hover, +.Button--purple.Button--variant-outline.Button--pseudoHover { + background-color: var(--purple_bg_a08); + color: var(--purple_bright); +} + +.Button--purple.Button--variant-outline:focus-visible, +.Button--purple.Button--variant-outline.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--purple_04_a30); +} + +.Button--purple.Button--variant-outline:active, +.Button--purple.Button--variant-outline.Button--pseudoActive { + background-color: var(--purple_bg_a08); + box-shadow: inset 0 0 0 1px var(--purple_bright); + color: var(--purple_bright); +} + +/* autoprefixer: ignore next */ +@supports not selector(:focus-visible) { + .Button--purple:focus { + box-shadow: 0 0 0 3px var(--purple_04_a30); + } +} + +/* pink */ + +.Button--pink { + background-color: var(--pink); + color: var(--white); +} + +.Button--pink:hover, +.Button--pink.Button--pseudoHover { + background-color: var(--pink_bright); + color: var(--white); +} + +.Button--pink:focus-visible, +.Button--pink.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--pink:active, +.Button--pink.Button--pseudoActive { + background-color: var(--pink); + box-shadow: inset 0 0 0 1px var(--pink_bright); + color: var(--white); +} + +/* pink-outline */ + +.Button--pink.Button--variant-outline { + background-color: var(--white); + color: var(--pink_bright); + box-shadow: inset 0 0 0 1px var(--pink_04_a30); +} + +.Button--pink.Button--variant-outline:hover, +.Button--pink.Button--variant-outline.Button--pseudoHover { + background-color: var(--pink_bg_a10); + color: var(--pink_bright); +} + +.Button--pink.Button--variant-outline:focus-visible, +.Button--pink.Button--variant-outline.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--pink.Button--variant-outline:active, +.Button--pink.Button--variant-outline.Button--pseudoActive { + background-color: var(--pink_bg_a10); + box-shadow: inset 0 0 0 1px var(--pink_bright); + color: var(--pink_bright); +} + +/* autoprefixer: ignore next */ +@supports not selector(:focus-visible) { + .Button--pink:focus { + box-shadow: 0 0 0 3px var(--pink_04_a30); + } +} + +/* cherry */ + +.Button--cherry { + background-color: var(--cherry); + color: var(--white); +} + +.Button--cherry:hover, +.Button--cherry.Button--pseudoHover { + background-color: var(--cherry_dark); +} + +.Button--cherry:focus-visible, +.Button--cherry.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--cherry:active, +.Button--cherry.Button--pseudoActive { + background-color: var(--cherry); + box-shadow: inset 0 0 0 1px var(--cherry_dark); +} + +/* cherry-outline */ + +.Button--cherry.Button--variant-outline { + color: var(--cherry); + background-color: transparent; + box-shadow: inset 0 0 0 1px var(--pink_03_a60); +} + +.Button--cherry.Button--variant-outline:hover, +.Button--cherry.Button--variant-outline.Button--pseudoHover { + background-color: var(--pink_bg_a10); +} + +.Button--cherry.Button--variant-outline:focus-visible, +.Button--cherry.Button--variant-outline.Button--pseudoFocus { + box-shadow: 0 0 0 3px var(--pink_04_a30); +} + +.Button--cherry.Button--variant-outline:active, +.Button--cherry.Button--variant-outline.Button--pseudoActive { + background-color: var(--pink_bg_a10); + box-shadow: inset 0 0 0 1px var(--cherry); +} + +/* cherry-outline dark */ + +.Button--appearance-dark.Button--cherry.Button--variant-outline { + color: var(--white); +} + +/* autoprefixer: ignore next */ +@supports not selector(:focus-visible) { + .Button--cherry:focus { + box-shadow: 0 0 0 3px var(--pink_04_a30); + } +} + +/* sizes */ + +.Button--size-s { + height: 40px; + padding: 0 16px; + font-size: 15px; + border-radius: 8px; +} + +.Button--size-m { + height: 48px; + padding: 0 24px; + font-size: 16px; + border-radius: 8px; +} + +.Button--size-l { + height: 64px; + padding: 0 40px; + font-size: 20px; + font-style: normal; + font-weight: 700; + border-radius: 8px; +} + +.Button__prefix--loader { + animation-name: loader_appear; + animation-duration: var(--loader_time); + animation-fill-mode: forwards; + + width: 16px; + margin-right: 8px; +} + +.Button__prefix--removing { + animation-name: loader_disappear; +} + +.Button__prefix--loader svg { + display: block; + + animation-name: loader_rotation; + animation-duration: var(--loader_time); + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +@keyframes loader_appear { + 0% { + width: 0; + margin-right: 0; + opacity: 0; + } + 33% { + opacity: 0; + } + 66% { + width: 16px; + margin-right: 8px; + } + 100% { + opacity: 1; + } +} + +@keyframes loader_disappear { + 100% { + width: 0; + margin-right: 0; + opacity: 0; + } + 66% { + opacity: 0; + } + 33% { + width: 16px; + margin-right: 8px; + } + 0% { + opacity: 1; + } +} + +@keyframes loader_rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/docs/components/common/BlogButton/Button.tsx b/docs/components/common/BlogButton/Button.tsx new file mode 100644 index 0000000000000..c32418f7015b1 --- /dev/null +++ b/docs/components/common/BlogButton/Button.tsx @@ -0,0 +1,129 @@ +import * as React from 'react'; +import { useEffect, DetailedHTMLProps, ButtonHTMLAttributes, AnchorHTMLAttributes } from 'react'; +import Link from 'next/link'; +import classNames from 'classnames/bind'; + +import { useState } from 'react'; + +import styles from './Button.module.css'; + +const cn = classNames.bind(styles); +const loader = ( + + + +); + +export type ButtonColor = 'transparent' | 'pink' | 'purple' | 'cherry' | 'back'; +export type ButtonVariant = 'default' | 'outline' | 'clear'; +export type ButtonSize = 's' | 'm' | 'l'; + +export type ButtonProps = { + size?: ButtonSize; + appearance?: 'dark' | 'light'; + color?: ButtonColor; + variant?: ButtonVariant; + pseudoHover?: boolean; + pseudoFocus?: boolean; + pseudoActive?: boolean; + isLoad?: boolean; +} & Omit, HTMLButtonElement>, 'ref'> & + Omit, HTMLAnchorElement>, 'ref'>; + +export const Button = React.forwardRef( + ( + { + appearance = 'light', + color = 'transparent', + variant = 'default', + type = 'button', + size = 'm', + disabled = false, + pseudoHover = false, + pseudoFocus = false, + pseudoActive = false, + isLoad = false, + className = '', + children, + href = '', + ...rest + }, + ref + ) => { + const loaderAppearAnimationDuration = 700; + + const classNames = cn('Button', `Button--appearance-${appearance}`, className, { + 'Button--pink': color === 'pink', + 'Button--purple': color === 'purple', + 'Button--cherry': color === 'cherry', + 'Button--transparent': color === 'transparent', + 'Button--back': color === 'back', + 'Button--size-s': size === 's', + 'Button--size-m': size === 'm', + 'Button--size-l': size === 'l', + 'Button--variant-outline': variant === 'outline', + 'Button--pseudoHover': pseudoHover, + 'Button--pseudoFocus': pseudoFocus, + 'Button--pseudoActive': pseudoActive, + }); + + const [isLoaderVisible, setIsLoaderVisible] = useState(isLoad); + + useEffect(() => { + if (isLoad === false) { + setTimeout(() => { + setIsLoaderVisible(false); + }, loaderAppearAnimationDuration); + } else { + setIsLoaderVisible(true); + } + }, [isLoad]); + + let prefix; + if (isLoad || isLoaderVisible) { + const prefixClassName = cn('Button__prefix', 'Button__prefix--loader', { + 'Button__prefix--removing': isLoaderVisible !== isLoad && !isLoad, + }); + prefix = {loader}; + } + + if (href) { + if (href.startsWith('/')) { + return ( + + + {children} + + + ); + } + return ( + + {children} + + ); + } + + return ( + + ); + } +); + +export default Button; \ No newline at end of file diff --git a/docs/components/common/BlogButton/index.ts b/docs/components/common/BlogButton/index.ts new file mode 100644 index 0000000000000..3d1f3cc374e70 --- /dev/null +++ b/docs/components/common/BlogButton/index.ts @@ -0,0 +1 @@ +export * from './Button'; \ No newline at end of file diff --git a/docs/components/common/Button/Button.module.scss b/docs/components/common/Button/Button.module.scss new file mode 100644 index 0000000000000..a255bed5fc40b --- /dev/null +++ b/docs/components/common/Button/Button.module.scss @@ -0,0 +1,148 @@ +.ButtonGroup { + display: flex; + margin: 1rem 0; + grid-gap: 0.5rem; +} + +.Button { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 88px; + padding: 0.625rem 1.5rem; + border: none; + font: inherit; + color: inherit; + background-color: transparent; + cursor: pointer; + transition: background-color 0.3s ease-in-out, border 0.3s ease-in-out; + + &[disabled] { + cursor: not-allowed; + } + + span { + font-family: var(--font); + font-size: 14px; + font-weight: 500; + } + + // For icons + svg { + margin-right: 9px; + } + > img { + margin-right: 0.5rem; + } +} + +.primary { + background-color: var(--white); + border: 1px solid var(--dark_05); + border-radius: 0.25rem; + color: var(--dark_01); + + &:hover { + border-color: var(--purple_a12); + color: var(--purple_bright); + } + + &:active { + background-color: var(--purple_bg_a08); + border-color: var(--purple_a12); + color: var(--purple_bright); + } + + &:focus { + box-shadow: 0 0 0 3px var(--purple_03); + border-radius: 4px; + } + + &[disabled] { + background-color: var(--dark_bg); + border-color: var(--dark_05); + color: var(--dark_04); + } +} + +.secondary { + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + color: var(--dark_01); + + &:hover { + color: var(--purple_bright); + } + + &:active { + color: var(--purple_bright); + } + + &:focus { + box-shadow: 0 0 0 3px var(--purple_03); + border-radius: 4px; + } + + &[disabled] { + color: var(--dark_04); + } +} + +.success { + background-color: var(--white); + border: 1px solid var(--dark_05); + border-radius: 0.25rem; + color: var(--dark_01); + + &:hover { + background-color: rgba(233, 249, 242, 0.5); + border-color: rgba(38, 83, 75, 0.1); + } + + &:active { + background-color: #E9F9F2; + border-color: rgba(38, 83, 75, 0.1); + color: #26534B; + } + + &:focus { + box-shadow: 0 0 0 3px var(--purple_03); + border-radius: 4px; + } + + &[disabled] { + background-color: var(--dark_bg); + border-color: var(--dark_05); + color: var(--dark_04); + } +} + +.danger { + background-color: var(--white); + border: 1px solid var(--dark_05); + border-radius: 0.25rem; + color: var(--dark_01); + + &:hover { + background-color: rgba(252, 235, 235, 0.5); + border-color: rgba(131, 20, 20, 0.1); + } + + &:active { + background-color: #FCEBEB; + border-color: rgba(131, 20, 20, 0.1); + color: #831414; + } + + &:focus { + box-shadow: 0 0 0 3px var(--purple_03); + border-radius: 4px; + } + + &[disabled] { + background-color: var(--dark_bg); + border-color: var(--dark_05); + color: var(--dark_04); + } +} diff --git a/docs/components/common/Button/Button.tsx b/docs/components/common/Button/Button.tsx new file mode 100644 index 0000000000000..afc6084dc0a58 --- /dev/null +++ b/docs/components/common/Button/Button.tsx @@ -0,0 +1,54 @@ +import classnames from 'classnames/bind'; +import React from 'react'; +import Image from 'next/image'; + + +import LikeIcon from './like.inline.svg'; +import DislikeIcon from './dislike.inline.svg'; +import * as styles from './Button.module.scss'; + +const cn = classnames.bind(styles); + +export const ButtonGroup = (props) => ( +
+) + +export interface ButtonProps extends React.ComponentProps<'button'> { + variant?: 'primary' | 'secondary' | 'success' | 'danger'; + icon?: React.ReactNode; +} + +export const Button = ({ variant = 'primary', children, icon, ...rest }: ButtonProps) => { + return ( + + ); +}; + +export const LikeButton = (props) => { + return ( + + + + + ); +}; + +interface propsType { + feedback: string; + setFeedbackMessage: (message: string) => void; + clearFeedback: () => void; +} + +export default FeedbackForm; diff --git a/docs/components/common/Footer/Footer.module.css b/docs/components/common/Footer/Footer.module.css new file mode 100644 index 0000000000000..c95b0950487c1 --- /dev/null +++ b/docs/components/common/Footer/Footer.module.css @@ -0,0 +1,163 @@ +.Footer { + padding-top: var(--space-3xl); + padding-bottom: var(--space-3xl); + background-color: var(--white); +} + +.Footer * { + font-family: var(--font-title) !important; +} + +.Footer--borderTop { + box-shadow: inset 0px 1px 0px rgba(192, 192, 234, 0.4); +} + +.Footer__content { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; +} + +.Logo { + margin-bottom: 10px; +} + +.Copyright { + font: var(--p2_font); + color: var(--dark_03); +} + +.Column { + display: flex; + flex-flow: column; +} + +.Column__Title { + font: var(--h5_font); + color: var(--dark_01); + margin-bottom: 12px; +} + +.Column--first, +.Column--second, +.Column--third { + grid-row: 1 / span 2; +} + +.Link { + font: var(--p2_font); + color: var(--dark_03); + text-decoration: none; + transition: color 300ms; + align-self: flex-start; +} + +.Link:not(:last-child) { + margin-bottom: var(--space-2xs); +} + +.Link:hover { + color: var(--purple); +} + +.Status { + display: flex; + justify-content: center; + align-items: center; + gap: var(--space-xs); + background-color: var(--dark_bg); + padding-left: var(--space-xs); + margin-left: calc(-1 * var(--space-xs)); + padding-right: calc(var(--space-xs) + 3px); + border-radius: var(--border-radius-xs); + justify-self: flex-start; + align-self: flex-end; +} + +.Status__dot { + position: relative; + width: 6px; + height: 6px; + border-radius: 50%; + background-color: hsla(122, 74%, 42%, 100%); +} + +.Status__dot::after { + position: absolute; + inset: 0; + content: ""; + display: block; + width: 6px; + height: 6px; + border-radius: 50%; + background-color: hsla(122, 74%, 42%, 100%); + opacity: 0; + transform: scale(1); + animation-name: ping; + animation-duration: 1300ms; + animation-iteration-count: infinite; + animation-timing-function: ease-in-out; +} + +@keyframes ping { + from { + transform: scale(1); + opacity: 0.5; + } + to { + transform: scale(3); + opacity: 0; + } +} + +.ChannelLinks { + display: flex; + gap: 12px; +} + +.ChannelLink { + color: var(--dark_04); + text-decoration: none; + transition: color 300ms; +} + +.ChannelLink > svg { + width: 24px; + height: 24px; +} + +.ChannelLink:hover { + color: var(--purple); +} + +@media (max-width: 979px) { + .Footer { + padding-top: var(--space-4xl); + padding-bottom: var(--space-4xl); + } + + .Footer__content { + grid-template-columns: 1fr 1fr; + row-gap: var(--space-m); + } + + .Column--first, + .Column--second, + .Column--third { + grid-row: auto; + } + + .Column--first { + grid-column: 1 / span 2; + } +} + +@media (max-width: 639px) { + .Footer__content { + grid-template-columns: 1fr; + } + + .Column--first, + .Column--fourth { + grid-column: auto; + } +} diff --git a/docs/components/common/Footer/Footer.tsx b/docs/components/common/Footer/Footer.tsx new file mode 100644 index 0000000000000..40c621b9ef21e --- /dev/null +++ b/docs/components/common/Footer/Footer.tsx @@ -0,0 +1,210 @@ +import type { + AnchorHTMLAttributes, + DetailedHTMLProps, + FC, + PropsWithChildren, +} from "react"; +import Link from "next/link"; + +import classes from "./Footer.module.css"; +import classnames from "classnames/bind"; +import { + SocialIcon, + SocialIconProps, +} from "@/components/common/SocialIcon/SocialIcon"; +import { CubeLogo } from "@/components/common/CubeLogo"; +const cn = classnames.bind(classes); + +const CURRENT_YEAR = new Date().getFullYear(); + +const COMPANY_LINKS = [ + { + label: "About", + link: "https://cube.dev/about", + }, + { + label: "Careers", + link: "https://cube.dev/careers", + }, + { + label: "Terms of Use", + link: "https://cube.dev/terms-of-use", + }, + { + label: "Privacy Policy", + link: "https://cube.dev/privacy-policy", + }, + { + label: "Security Statement", + link: "https://cube.dev/security", + }, + { + label: "List of Subprocessors", + link: "https://cube.dev/subprocessors", + }, +]; + +const RESOURCES_LINKS = [ + { + label: "Docs", + link: "https://cube.dev/docs/", + }, + { + label: "Blog", + link: "https://cube.dev/blog/", + }, + { + label: "Examples", + link: "https://cube.dev/examples", + }, + { + label: "Community", + link: "https://cube.dev/community", + }, + { + label: "Events", + link: "https://cube.dev/events", + }, + { + label: "Customer Stories", + link: "https://cube.dev/case-studies", + }, + { + label: "Cube Partner Network", + link: "https://cube.dev/consulting/cube-partner-network", + }, +]; + +const CHANNEL_LINKS = { + github: { + url: "https://github.com/cube-js/cube.js", + label: "GitHub Repositories", + }, + slack: { + url: "https://slack.cube.dev/", + label: "Slack community", + }, + twitter: { + url: "https://twitter.com/the_cube_dev", + label: "Twitter account", + }, + youtube: { + url: "https://www.youtube.com/channel/UC5jQrtiI85SUs9zj6FhdkfQ", + label: "Youtube channel", + }, + stackoverflow: { + url: "https://stackoverflow.com/questions/tagged/cube.js", + label: "StackOverflow questions", + }, + linkedin: { + url: "https://www.linkedin.com/company/cube-dev/", + label: "LinkedIn Profile", + }, +}; + +interface FooterLinkProps + extends DetailedHTMLProps< + AnchorHTMLAttributes, + HTMLAnchorElement + > { + className?: string; + href: string; +} + +const FooterLink: FC> = ({ + href, + children, + className, + ...props +}) => { + if (href.startsWith("/")) { + return ( + + + {children} + + + ); + } + + return ( + + {children} + + ); +}; + +export interface FooterProps { + className?: string; + border?: "top"; +} + +export const Footer: FC = ({ border, className }) => { + return ( +
+
+
+ + {/* */} + + © {CURRENT_YEAR} Cube Dev, Inc. + +
+ +
+ Resources + {RESOURCES_LINKS.map((link) => ( + + {link.label} + + ))} +
+ +
+ Company + {COMPANY_LINKS.map((link) => ( + + {link.label} + + ))} +
+ +
+ Channels +
+ {Object.keys(CHANNEL_LINKS).map((type: SocialIconProps["type"]) => { + const link = CHANNEL_LINKS[type]; + return ( + + + + ); + })} +
+
+ + + Cube Cloud Status +
+ +
+
+ ); +}; diff --git a/docs/components/common/Footer/index.ts b/docs/components/common/Footer/index.ts new file mode 100644 index 0000000000000..ddcc5a9cd1846 --- /dev/null +++ b/docs/components/common/Footer/index.ts @@ -0,0 +1 @@ +export * from './Footer'; diff --git a/docs/components/common/LogoWithVersion/LogoWithVersion.module.scss b/docs/components/common/LogoWithVersion/LogoWithVersion.module.scss new file mode 100644 index 0000000000000..0c07b5465dac7 --- /dev/null +++ b/docs/components/common/LogoWithVersion/LogoWithVersion.module.scss @@ -0,0 +1,12 @@ +.Logo { + +} + +.Version { + color: var(--dark_03); + font-size: 0.875rem; + padding: 0.25rem 0.5rem; + border-radius: 0.375rem; + background: var(--dark_bg); + margin-left: 0.625rem; +} diff --git a/docs/components/common/LogoWithVersion/LogoWithVersion.tsx b/docs/components/common/LogoWithVersion/LogoWithVersion.tsx new file mode 100644 index 0000000000000..d1cf727dff172 --- /dev/null +++ b/docs/components/common/LogoWithVersion/LogoWithVersion.tsx @@ -0,0 +1,21 @@ +import classNames from 'classnames/bind'; +import { CubeLogo } from "../CubeLogo"; + +import styles from './LogoWithVersion.module.scss'; +import { Anchor } from '@/components/overrides/Anchor/Anchor'; + +const cn = classNames.bind(styles); +const PACKAGE_VERSION = require('../../../../lerna.json').version; + +export const LogoWithVersion = () => { + return ( + <> + + + +
+ {PACKAGE_VERSION} +
+ + ) +}; diff --git a/docs/components/common/Navigation.tsx b/docs/components/common/Navigation.tsx new file mode 100644 index 0000000000000..810475185c680 --- /dev/null +++ b/docs/components/common/Navigation.tsx @@ -0,0 +1,43 @@ +import { Navbar } from "nextra-theme-docs"; + +const Logo = () => { + return ( + + + + + + + + + + ); +}; + +export const Navigation = () => { + return ( +
+ + + +
+ ); +}; diff --git a/docs/components/common/SocialIcon/SocialIcon.module.css b/docs/components/common/SocialIcon/SocialIcon.module.css new file mode 100644 index 0000000000000..9b2783d6eac44 --- /dev/null +++ b/docs/components/common/SocialIcon/SocialIcon.module.css @@ -0,0 +1,16 @@ +.SocialIcon { + --hover_transtion: 300ms; + display: block; +} + +.SocialIcon:hover { + cursor: pointer; +} + +.SocialIcon path { + transition: fill var(--hover_transtion); +} + +.SocialIcon:not(:hover) path { + fill: var(--dark_03_a50); +} diff --git a/docs/components/common/SocialIcon/SocialIcon.tsx b/docs/components/common/SocialIcon/SocialIcon.tsx new file mode 100644 index 0000000000000..4be15e9bd29a8 --- /dev/null +++ b/docs/components/common/SocialIcon/SocialIcon.tsx @@ -0,0 +1,132 @@ +import type { FC } from 'react'; +import styles from './SocialIcon.module.css'; +import classNames from 'classnames/bind'; + +const cn = classNames.bind(styles); + +export interface SocialIconProps { + type: 'github' | 'slack' | 'twitter' | 'youtube' | 'stackoverflow' | 'linkedin' | 'facebook'; +} + +export const SocialIcon: FC = ({ type }) => { + const iconClass = cn('SocialIcon'); + if (type === 'github') { + return ( + + + + ); + } + if (type === 'slack') { + return ( + + + + + + + ); + } + if (type === 'twitter') { + return ( + + + + ); + } + if (type === 'youtube') { + return ( + + + + ); + } + if (type === 'stackoverflow') { + return ( + + + + + ); + } + if (type === 'linkedin') { + return ( + + + + ); + } + if (type === 'facebook') { + return ( + + + + ); + } +}; diff --git a/docs/components/layouts/MainLayout.tsx b/docs/components/layouts/MainLayout.tsx new file mode 100644 index 0000000000000..f6d50b18a9d0b --- /dev/null +++ b/docs/components/layouts/MainLayout.tsx @@ -0,0 +1,18 @@ +import dynamic from 'next/dynamic'; +import { Children } from 'react'; + +const FeedbackBlock = dynamic(() => import('@/components/common/FeedbackBlock/FeedbackBlock').then((r) => r.FeedbackBlock), { + ssr: false +}); + +export const MainLayout = (props) => { + const childrenAsArray = Children.toArray(props.children.props.children); + const [firstChild, ...restChildren] = childrenAsArray; + const childrenWithInjectedFeedback = [ + firstChild, + , + ...restChildren, + ]; + + return (<>{childrenWithInjectedFeedback}); +}; diff --git a/docs/components/mdx/AlertBox/AlertBox.module.css b/docs/components/mdx/AlertBox/AlertBox.module.css new file mode 100644 index 0000000000000..982b92fbbd634 --- /dev/null +++ b/docs/components/mdx/AlertBox/AlertBox.module.css @@ -0,0 +1,55 @@ +.AlertBox__header { + font-weight: 700; + font: var(--h5_font); +} + +.AlertBox__HeaderIcon { + margin-right: 0.5rem; +} + +.AlertBox__content { + font-weight: 400; + font-size: 16px; + line-height: 28px; +} + +.AlertBox__Wrapper { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + + padding: 12px 16px; + border-left: 3px solid; + margin: 24px 0; +} + +.AlertBox__Wrapper--neutral, .AlertBox__Wrapper--neutral p { + background-color: #f6f6f6; + border-left-color: #666666; + color: #333333; +} + +.AlertBox__Wrapper--error, .AlertBox__Wrapper--error p { + background-color: #FCEBEB; + border-left-color: #EF3F2C; + color: #831414; +} + +.AlertBox__Wrapper--info, .AlertBox__Wrapper--info p { + background-color: #EBF4FC; + border-left-color: #3C94E5; + color: #2A4475; +} + +.AlertBox__Wrapper--warning, .AlertBox__Wrapper--warning p { + background-color: #FEF6EF; + border-left-color: #F0A45E; + color: #7A442A; +} + +.AlertBox__Wrapper--default, .AlertBox__Wrapper--default p { + background-color: #E9F9F2; + border-left-color: #27C27C; + color: #26534B; +} diff --git a/docs/components/mdx/AlertBox/AlertBox.tsx b/docs/components/mdx/AlertBox/AlertBox.tsx new file mode 100644 index 0000000000000..d7e5f0f315402 --- /dev/null +++ b/docs/components/mdx/AlertBox/AlertBox.tsx @@ -0,0 +1,90 @@ +import React from "react"; +import classes from "./AlertBox.module.css"; +import classnames from "classnames/bind"; +const cn = classnames.bind(classes); + +export enum AlertBoxTypes { + DANGER = "danger", + INFO = "info", + SUCCESS = "success", + WARNING = "warning", + REFERENCE = "reference" +} + +declare const TypeToEmoji: { + default: string; + error: string; + info: JSX.Element; + warning: string; + neutral: string; +}; +type CalloutType = keyof typeof TypeToEmoji; + +export type AlertBoxProps = { + children: React.ReactNode; + heading?: string; + type: AlertBoxTypes; +}; + +const typeMapping: Record = { + danger: "error", + info: "info", + warning: "warning", + success: "default", + reference: "neutral" +}; + +const iconMapping: Record = { + danger: "🚫", + info: "ℹ️", + warning: "⚠️", + success: "✅", +}; + +export const AlertBox = ({ children, heading, type }: AlertBoxProps) => { + const header = heading ? ( +
+ {iconMapping[type]} + {heading} +
+ ) : null; + + return ( +
+ {header} +
{children}
+
+ ); +}; + +export type AlertBoxSubclass = Omit; + +export type DangerBoxProps = AlertBoxSubclass; +export const DangerBox = (props: DangerBoxProps) => ( + +); + +export type InfoBoxProps = AlertBoxSubclass; +export const InfoBox = (props: InfoBoxProps) => ( + +); + +export type SuccessBoxProps = AlertBoxSubclass; +export const SuccessBox = (props: SuccessBoxProps) => ( + +); + +export type WarningBoxProps = AlertBoxSubclass; +export const WarningBox = (props: WarningBoxProps) => ( + +); + +export type ReferenceBoxProps = AlertBoxSubclass; +export const ReferenceBox = (props: ReferenceBoxProps) => ( + +); diff --git a/docs/components/mdx/Banners/CommunitySupportedDriver.tsx b/docs/components/mdx/Banners/CommunitySupportedDriver.tsx new file mode 100644 index 0000000000000..7199aec567ba6 --- /dev/null +++ b/docs/components/mdx/Banners/CommunitySupportedDriver.tsx @@ -0,0 +1,20 @@ +import { WarningBox } from "@/components/mdx/AlertBox/AlertBox"; +import { Link } from "@/components/overrides/Anchor/Link"; + +export interface CommunitySupportedDriverProps { + dataSource: string; +} + +export const CommunitySupportedDriver = ({ + dataSource, +}: CommunitySupportedDriverProps) => { + return ( + + The driver for {dataSource} is{" "} + + community-supported + {" "} + and is not supported by Cube or the vendor. + + ); +}; diff --git a/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.module.scss b/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.module.scss new file mode 100644 index 0000000000000..addf30f9f8385 --- /dev/null +++ b/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.module.scss @@ -0,0 +1,17 @@ +.CaseStudyPromoBlock__Wrapper { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 0.75rem 1rem; + margin: 1.5rem 0; + gap: 0.25rem; + + /* web/dark_bg */ + + background: var(--dark_bg); + border-radius: 0.5rem; +} + +.CaseStudyPromoBlock__Title {} + +.CaseStudyPromoBlock__Text {} diff --git a/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.tsx b/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.tsx new file mode 100644 index 0000000000000..ea87032c83813 --- /dev/null +++ b/docs/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock.tsx @@ -0,0 +1,27 @@ +import classnames from 'classnames/bind'; + +import * as styles from './CaseStudyPromoBlock.module.scss'; + +const cn = classnames.bind(styles); + +interface CaseStudyPromoBlockProps { + title: React.ReactNode; + children: React.ReactNode; +} + +export const CaseStudyPromoBlock = ({ + title, + children +}) => { + + return ( +
+
+ {title} +
+
+ {children} +
+
+ ); +} diff --git a/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.module.scss b/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.module.scss new file mode 100644 index 0000000000000..c292cae385f5b --- /dev/null +++ b/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.module.scss @@ -0,0 +1,18 @@ +.CloudPromoBlock__Wrapper { + flex-direction: column; + align-items: flex-start; + gap: 0.25rem; + padding: 0.75rem 1rem; + background: linear-gradient(270.09deg, #F6E7FF 0.07%, #FFF2F6 99.94%); + border-radius: 0.5rem; + margin: 1.5rem 0; +} + +.CloudPromoBlock__Logo { + margin-bottom: 0.25rem; +} + +.CloudPromoBlock__Logo > img { + height: 2rem; + width: auto; +} diff --git a/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.tsx b/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.tsx new file mode 100644 index 0000000000000..d3f58e8829057 --- /dev/null +++ b/docs/components/mdx/CloudPromoBlock/CloudPromoBlock.tsx @@ -0,0 +1,23 @@ +import classnames from 'classnames/bind'; +import Image from 'next/image'; + +import * as styles from './CloudPromoBlock.module.scss'; +import cubeCloudIcon from './cube-cloud-icon.svg'; + +const cn = classnames.bind(styles); + +export interface CloudPromoBlockProps { + children: React.ReactNode; + // children: string; +} + +export const CloudPromoBlock = ({children}: CloudPromoBlockProps) => { + return ( +
+
+ Cube Cloud icon +
+
{children}
+
+ ) +}; diff --git a/docs/content/Getting-Started/cube-cloud-logo.svg b/docs/components/mdx/CloudPromoBlock/cube-cloud-icon.svg similarity index 100% rename from docs/content/Getting-Started/cube-cloud-logo.svg rename to docs/components/mdx/CloudPromoBlock/cube-cloud-icon.svg diff --git a/docs/components/mdx/CodeTabs/CodeTabs.module.scss b/docs/components/mdx/CodeTabs/CodeTabs.module.scss new file mode 100644 index 0000000000000..d58b4472bce20 --- /dev/null +++ b/docs/components/mdx/CodeTabs/CodeTabs.module.scss @@ -0,0 +1,83 @@ +.CodeBlock { + //position: relative; + //background-color: var(--dark_bg); + //border-radius: 4px; + //overflow: hidden; + //margin: 24px 0; +} + +.CodeBlock :global(pre) { + //background-color: var(--dark_bg); +} + +.CodeBlock :global(pre > code > .line) { + padding: 0; +} + +.CodeBlock__copyFloating { + position: absolute; + top: 48px; + right: 8px; + border-radius: 4px; + opacity: 0; +} + +.CodeBlock:hover .CodeBlock__copyFloating { + opacity: 1; +} + +.CodeBlock__Tabs { + //background-color: var(--dark_bg); + box-shadow: inset 0px -1px 0px var(--dark_05_a12); + + > div:first-child { + border-top-left-radius: 0.75rem; + //border-top-right-radius: 0.75rem; + } +} + +.CodeBlocks__tabs { + display: flex; + align-items: center; + margin: 0; + padding: 0; + list-style-type: none; + overflow: hidden; + box-shadow: inset 0px -1px 0px var(--gray_02); +} + +.CodeBlocks__tab { + padding: 0 1rem; + /*height: 40px;*/ + display: flex; + align-items: center; + font-weight: 500; + font-size: 1rem; + line-height: 1.75rem; + color: var(--white); + transition: background-color 0.3s, color 0.3s, box-shadow 0.3s; + cursor: pointer; +} + +.CodeBlocks__tab::before { + background-image: none !important; +} + + +.SelectedTab { + /*--pink: hsl(342, 100%, 70%, 1);*/ + /*--pink_bg_a10: hsl(342, 95%, 70%, 0.1);*/ + color: var(--purple_bright); + cursor: default; + background-color: var(--purple_bg_a08); + box-shadow: inset 0px -2.6px 0px var(--purple_bright); + +} + + +.CodeBlocks__tab:hover { + --pink_bright:hsl(342, 95%, 59%, 1); + color: var(--pink_bright); + box-shadow: inset 0px -2.6px 0px hsl(342, 100%, 82%); +} + diff --git a/docs/components/mdx/CodeTabs/CodeTabs.tsx b/docs/components/mdx/CodeTabs/CodeTabs.tsx new file mode 100644 index 0000000000000..705a58ade2eac --- /dev/null +++ b/docs/components/mdx/CodeTabs/CodeTabs.tsx @@ -0,0 +1,163 @@ +import * as React from "react"; +import { useState, useEffect, useMemo, type FC } from "react"; +import { langs } from "./dictionary"; + +import { Pre } from "nextra/components"; + +import classnames from "classnames/bind"; +import classes from "./CodeTabs.module.scss"; +const cn = classnames.bind(classes); + +interface CustomEventMap { + "codetabs.changed": CustomEvent<{ lang: string }>; +} + +declare global { + interface Window { + addEventListener( + type: K, + listener: (this: Document, ev: CustomEventMap[K]) => void + ): void; + removeEventListener( + type: K, + listener: (this: Window, ev: CustomEventMap[K]) => any, + options?: boolean | EventListenerOptions + ): void; + dispatchEvent(ev: CustomEventMap[K]): void; + } +} + +const STORAGE_KEY = "cube-docs.default-code-lang"; + +// If present, the tab with this language should go first +const PREFERRED_LANGS = ['yaml', 'python']; + +export interface CodeTabsProps { + children: Array<{ + props: { + "data-language": string; + children: any; + }; + }>; +} + +export const CodeTabs: FC = ({ children }) => { + const [selectedTab, setSelectedTab] = useState(PREFERRED_LANGS[0]); + const tabs = useMemo( + () => { + let tabs = children.reduce>((dict, tab, i) => { + const result = { + ...dict, + }; + if (result[tab.props['data-language']] === undefined) { + result[tab.props['data-language']] = i; + } + return result; + }, {}); + + // Place the tab with the preferred language on the first position + let tabWithPreferredLangKey = Object.keys(tabs).find(key => PREFERRED_LANGS.includes(key)); + if (tabWithPreferredLangKey !== undefined) { + let tabWithPreferredLangValue = tabs[tabWithPreferredLangKey]; + delete tabs[tabWithPreferredLangKey]; + tabs = { + [tabWithPreferredLangKey]: tabWithPreferredLangValue, + ...tabs + }; + } + + return tabs; + }, + children + ); + + useEffect(() => { + const defaultLang = localStorage.getItem(STORAGE_KEY); + + if (defaultLang && tabs[defaultLang] !== undefined) { + setSelectedTab(defaultLang); + } + else { + const [ lang ] = Object.entries(tabs).find(tab => tab[1] === 0); + setSelectedTab(lang); + } + + const syncHanlder = (e: CustomEvent<{ lang: string }>) => { + const lang = e.detail.lang; + if (tabs[lang] !== undefined) { + setSelectedTab(lang); + } + }; + + const storageHandler = (e: StorageEvent) => { + if (e.key === STORAGE_KEY) { + const lang = e.newValue; + if (lang && tabs[lang] !== undefined) { + setSelectedTab(lang); + } + } + }; + + window.addEventListener("storage", storageHandler); + window.addEventListener("codetabs.changed", syncHanlder); + + return () => { + window.removeEventListener("storage", storageHandler); + window.removeEventListener("codetabs.changed", syncHanlder); + }; + }, []); + + return ( +
+
+ {Object + .entries(tabs) + .map(tab => children.find(child => child.props['data-language'] === tab[0])) + .filter((tab) => tab !== undefined && !!tab.props['data-language']) + .map((tab, i) => { + if (tab === undefined) return; + let lang = tab.props["data-language"]; + if (lang === "js") { + lang = "javascript"; + } + return ( +
{ + if ( + lang !== selectedTab && + (lang === "python" || lang === "javascript" || lang === "yaml") + ) { + localStorage.setItem(STORAGE_KEY, lang); + window.dispatchEvent( + new CustomEvent("codetabs.changed", { + detail: { + lang, + }, + }) + ); + } + setSelectedTab(lang); + }} + > + {langs[lang] || lang} +
+ ); + })} +
+
+        {children && children.find(child => child.props['data-language'] === selectedTab)?.props.children}
+      
+
+ ); +}; diff --git a/docs/components/mdx/CodeTabs/dictionary.ts b/docs/components/mdx/CodeTabs/dictionary.ts new file mode 100644 index 0000000000000..441f64057352c --- /dev/null +++ b/docs/components/mdx/CodeTabs/dictionary.ts @@ -0,0 +1,35 @@ +export const langs: Record = { + js: 'JavaScript', + javascript: 'JavaScript', + actionscript: 'ActionScript', + bash: 'Bash', + c: 'C', + clike: 'C-like', + coffeescript: 'CoffeeScript', + cpp: 'C++', + css: 'CSS', + 'css-extr': 'extra.css', + diff: 'Diff', + git: 'Git', + go: 'Go', + graphql: 'GraphQL', + handlebars: 'Handlebars', + json: 'JSON', + jsx: 'JSX', + less: 'LESS', + makefile: 'Makefile', + markdown: 'Markdown', + markup: 'Markup', + objectivec: 'Objective-C', + ocaml: 'OCaml', + python: 'Python', + reason: 'Reason', + sass: 'Sass', + scss: 'SCSS', + sql: 'SQL', + stylus: 'Stylus', + tsx: 'TSX', + typescript: 'TypeScript', + wasm: 'WebAssembly', + yaml: 'YAML' +} diff --git a/docs/components/mdx/CodeTabs/index.ts b/docs/components/mdx/CodeTabs/index.ts new file mode 100644 index 0000000000000..805d76ab807b2 --- /dev/null +++ b/docs/components/mdx/CodeTabs/index.ts @@ -0,0 +1 @@ +export * from './CodeTabs'; diff --git a/docs/components/mdx/CubeQueryResultSet/index.tsx b/docs/components/mdx/CubeQueryResultSet/index.tsx new file mode 100644 index 0000000000000..f12ef74a6752a --- /dev/null +++ b/docs/components/mdx/CubeQueryResultSet/index.tsx @@ -0,0 +1,63 @@ +import React, { useEffect, useState } from "react"; +import cubejs, { CubejsApi } from "@cubejs-client/core"; + +export const CubeQueryResultSet = (props: propsType) => { + const { api, token, query, queryType = "load" } = props; + const [code, setCode] = useState(""); + const defaultToken = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2Mjc0NjM2MDZ9.1boj2JrVcsxVkbQsZxuOP21VDxNQyHpxrh3go45k9pc"; + + const cubejsApi = cubejs(token || defaultToken, { apiUrl: api }); + + useEffect(() => { + fetchDataFromCube(cubejsApi, query, queryType, setCode); + }, []); + + return ( +
+
+        {code}
+      
+
+ ); +}; + +export default CubeQueryResultSet; + +async function fetchDataFromCube( + cubejsApi: CubejsApi, + query: object, + queryType: string, + setCode: (text: string) => void +) { + try { + if (queryType === "load") { + const resultSet = await cubejsApi.load(query); + const result = resultSet?.rawData(); + if (result) { + const resultCode = result.length === 1 ? result?.[0] : result; + setCode(JSON.stringify(resultCode, null, 2)); + } + } + + if (queryType === "meta") { + const resultSet = await cubejsApi.meta(query); + setCode(JSON.stringify(resultSet, null, 2)); + } + + highlightCode(); + } catch (e) { + console.log(e); + } +} + +function highlightCode(): void { + window.Prism && window.Prism.highlightAll(); +} + +interface propsType { + api: string; + token: string; + query: object; + queryType: string | undefined; +} diff --git a/docs/components/mdx/EventPromoBlock/EventPromoBlock.module.scss b/docs/components/mdx/EventPromoBlock/EventPromoBlock.module.scss new file mode 100644 index 0000000000000..3e43ab8499599 --- /dev/null +++ b/docs/components/mdx/EventPromoBlock/EventPromoBlock.module.scss @@ -0,0 +1,63 @@ +.EventPromoBlock__Wrapper { + display: flex; + flex-direction: row; + align-items: flex-start; + margin: 1.5rem 0; + background: var(--dark_bg); + border-radius: 0.5rem; + font-family: var(--font); +} + +.EventPromoBlock__Image { + flex: 1; + padding: 0.25rem; +} + +.EventPromoBlock__Image > img { + width: auto; + height: 6.75rem; +} + +.EventPromoBlock__Details { + display: flex; + flex-direction: column; + flex: 3; + padding: 1rem; +} + +.EventPromoBlock__Date { + display: flex; + gap: 0.5rem; + font-weight: 500; + font-size: 0.875rem; + line-height: 1.375rem; + color: var(--dark_03); +} + +.EventPromoBlock__Date--Upcoming { + color: hsla(14, 86%, 52%, 1); +} + +.EventPromoBlock__Date--Now { + color: hsla(353, 92%, 47%, 1); +} + +.EventPromoBlock__Title { + font-weight: 600; + font-size: 1rem; + line-height: 1.75rem; + color: var(--dark_01); +} + +.EventPromoBlock__CTA { + font-weight: 400; + font-size: 1rem; + line-height: 1.75rem; + color: var(--purple_bright); + + //> a { + // border-bottom: 1px solid rgba(122, 119, 255, 0.3); + // padding-bottom: 3px; + // border-radius: 0; + //} +} diff --git a/docs/components/mdx/EventPromoBlock/EventPromoBlock.tsx b/docs/components/mdx/EventPromoBlock/EventPromoBlock.tsx new file mode 100644 index 0000000000000..1372e648026a1 --- /dev/null +++ b/docs/components/mdx/EventPromoBlock/EventPromoBlock.tsx @@ -0,0 +1,95 @@ +import classnames from 'classnames/bind'; +import { addDays, format, formatDistanceToNow, isAfter, isWithinInterval } from 'date-fns'; +import Image from 'next/image'; + +import { Link } from '@/components/overrides/Anchor/Link'; +import * as styles from './EventPromoBlock.module.scss'; +import UpcomingIcon from './upcoming.svg'; +import NowIcon from './now.svg'; + +const cn = classnames.bind(styles); + +const EventPromoDate = ({ startsAt, endsAt }) => { + const hasEventOccurred = isAfter(Date.now(), startsAt); + const isEventThisWeek = isWithinInterval(startsAt, { + start: new Date(), + end: addDays(new Date(), 7), + }); + + // If the event has an end date, and is happening now, show "Live". + if (endsAt) { + const isEventHappeningNow = isWithinInterval(new Date(), { + start: startsAt, + end: endsAt, + }); + if (isEventHappeningNow) { + return ( +
+ Now + Live +
+ ); + } + } + + // If the event is happening this week, show "Upcoming". + if (isEventThisWeek) { + return ( +
+ Upcoming + in {formatDistanceToNow(startsAt)} +
+ ); + } + + // If the event has already happened, show "Past Event". + if (hasEventOccurred) { + return ( +
+ Past Event +
+ ); + } + + // If the event is in the future, show the date. + return ( +
+ {format(startsAt, 'MMM d, yyyy')} +
+ ); +}; + +export interface CloudPromoBlockProps { + coverUrl: string; + startsAt: Date; + endsAt?: Date; + title: string; + linkText: string; + linkUrl: string; +} + +export const EventPromoBlock = ({ + coverUrl, + startsAt, + endsAt, + linkText, + linkUrl, + title, +}: CloudPromoBlockProps) => { + return ( +
+
+ {title} +
+
+ +
+ {title} +
+
+ {linkText} +
+
+
+ ); +}; diff --git a/docs/components/mdx/EventPromoBlock/now.svg b/docs/components/mdx/EventPromoBlock/now.svg new file mode 100644 index 0000000000000..1583d3dce3332 --- /dev/null +++ b/docs/components/mdx/EventPromoBlock/now.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/components/mdx/EventPromoBlock/upcoming.svg b/docs/components/mdx/EventPromoBlock/upcoming.svg new file mode 100644 index 0000000000000..8cefc45805763 --- /dev/null +++ b/docs/components/mdx/EventPromoBlock/upcoming.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/components/mdx/GitHubCodeBlock/index.tsx b/docs/components/mdx/GitHubCodeBlock/index.tsx new file mode 100644 index 0000000000000..fc1f5c87e8b6d --- /dev/null +++ b/docs/components/mdx/GitHubCodeBlock/index.tsx @@ -0,0 +1,104 @@ +import React, { useEffect, useState } from "react"; +import parseHref from "@/utils/parseHref"; + +declare global { + interface Window { + Prism: any; + } +} + +export const GitHubCodeBlock = (props: propsType) => { + const { href, titleSuffixCount, part, lang } = props; + const [code, setCode] = useState(""); + const [title, setTitle] = useState(""); + + useEffect(() => { + const { user, repo, branch, filePath, title } = parseHref( + href, + titleSuffixCount + ); + + setTitle(title); + fetchCodeFromGitHub( + `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filePath}`, + setCode, + part + ); + }, []); + + return ( +
+ + {title} + +
+        {code}
+      
+
+ ); +}; + +export default GitHubCodeBlock; + +async function fetchCodeFromGitHub( + url: string, + setCode: (text: string) => void, + part: string | null +) { + try { + const response = await fetch(url); + if (response.ok) { + let code = await response.text(); + + if (!part) { + setCode(code); + } else { + setCode(spliceCodeByPart(code, part)); + } + } + highlightCode(); + } catch (e) { + console.log(e); + } +} + +function highlightCode(): void { + window.Prism && window.Prism.highlightAll(); +} + +function spliceCodeByPart(code: string, value: string): string { + if (!value) { + return code; + } + const start = [ + ``, + `// start part: ${value}`, + `# start part: ${value}`, + ]; + const end = [ + ``, + `// end part: ${value}`, + `# end part: ${value}`, + ]; + + start.forEach((startLine) => { + const startIndex = code.indexOf(startLine); + if (startIndex !== -1) { + end.forEach((endLine) => { + const endIndex = code.indexOf(endLine); + if (endIndex !== -1) { + code = code?.slice(startIndex + startLine.length, endIndex)?.trim(); + } + }); + } + }); + + return code; +} + +interface propsType { + href: string; + titleSuffixCount: number; + part: string | null; + lang: string; +} diff --git a/docs/components/mdx/GitHubFolderLink/index.tsx b/docs/components/mdx/GitHubFolderLink/index.tsx new file mode 100644 index 0000000000000..a47e562e3ab15 --- /dev/null +++ b/docs/components/mdx/GitHubFolderLink/index.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import parseHref from "@/utils/parseHref"; +import GitHubLogo from "@/public/images/github-icon.svg"; + +export const GitHubFolderLink = (props: propsType) => { + const { href } = props; + const { filePath } = parseHref(href, 99); + + return ( + + ); +}; + +export default GitHubFolderLink; + +interface propsType { + href: string; +} diff --git a/docs/components/mdx/Grid/Grid.module.css b/docs/components/mdx/Grid/Grid.module.css new file mode 100644 index 0000000000000..81e6ccc8cfac4 --- /dev/null +++ b/docs/components/mdx/Grid/Grid.module.css @@ -0,0 +1,25 @@ +.Grid { + width: 100%; + display: grid; + grid-row-gap: 1.25rem; + grid-column-gap: 1.25rem; + grid-template-columns: repeat(1, 1fr); + grid-template-rows: auto; + margin: 1.25rem 0; +} + +.Grid--2 { + grid-template-columns: repeat(2, 1fr); +} + +.Grid--3 { + grid-template-columns: repeat(3, 1fr); +} + +@media screen and (max-width: 992px) { + .Grid--2, + .Grid--3 { + grid-template-columns: repeat(1, 1fr); + } +} + diff --git a/docs/components/mdx/Grid/Grid.tsx b/docs/components/mdx/Grid/Grid.tsx new file mode 100644 index 0000000000000..821309f895c35 --- /dev/null +++ b/docs/components/mdx/Grid/Grid.tsx @@ -0,0 +1,31 @@ +import classnames from 'classnames/bind'; +import React from 'react'; +import styles from './Grid.module.css'; + +const cn = classnames.bind(styles); + +export type GridProps = { + children: React.ReactNode; + cols?: number; +}; + +export const GridContext = React.createContext('grid'); + +const defaultProps = { + cols: 3, +}; +export const Grid = ({ + children, + ...restProps +}: GridProps) => { + const normalizedProps = { ...defaultProps, ...restProps }; + const classNames = cn('Grid', `Grid--${normalizedProps.cols}`); + + return ( +
+
+ {children} +
+
+ ); +}; diff --git a/docs/components/mdx/Grid/GridItem.module.css b/docs/components/mdx/Grid/GridItem.module.css new file mode 100644 index 0000000000000..0ac29fdfdd6d0 --- /dev/null +++ b/docs/components/mdx/Grid/GridItem.module.css @@ -0,0 +1,45 @@ +.GridItem__Wrapper { + display: flex; + align-items: center; + justify-content: left; + padding: 1.375rem; + gap: 1rem; + border: 1px solid #E5E5EC; + border-radius: 0.5rem; + box-sizing: border-box; + box-shadow: none; + transition: all .2s ease; + cursor: pointer; +} +@media screen and (min-width: 992px) { + .GridItem__Wrapper { + height: 5.375rem; + } +} + +.GridItem__Wrapper:hover { + background: #F6F6F8; + /*position: relative;*/ + /*top: -3px;*/ + /*box-shadow: 0px 2px 10px rgba(177, 183, 197, 0.2);*/ +} + +.GridItem { + display: flex; +} + +.GridItem__Image { + display: flex; + height: 2.5rem; + align-self: center; +} + +.GridItem__Title { + display: flex; + align-self: center; + margin-left: 0.75rem; + font-size: 1rem; + font-weight: bold; + letter-spacing: 0.02em; + color: var(--dark); +} diff --git a/docs/components/mdx/Grid/GridItem.tsx b/docs/components/mdx/Grid/GridItem.tsx new file mode 100644 index 0000000000000..b2baba05feccf --- /dev/null +++ b/docs/components/mdx/Grid/GridItem.tsx @@ -0,0 +1,29 @@ +import classnames from 'classnames/bind'; +import Link from 'next/link'; +import React from 'react'; +import styles from './GridItem.module.css'; + +const cn = classnames.bind(styles); + +export type GridItemProps = { + imageUrl: string; + title: string; + url: string; +}; + +export const GridItem = ({ + imageUrl, + title, + url, +}: GridItemProps) => ( + +
+ {title} + {title} +
+ +); diff --git a/docs/components/mdx/InlineButton/InlineButton.module.scss b/docs/components/mdx/InlineButton/InlineButton.module.scss new file mode 100644 index 0000000000000..f7c721aac9b3f --- /dev/null +++ b/docs/components/mdx/InlineButton/InlineButton.module.scss @@ -0,0 +1,25 @@ +.Button { + font-weight: 400; + font-size: var(--h5_font-size); + line-height: var(--h6_line-height); + + display: inline-block; + padding: 0 6px; + background: white; + + border-radius: 4px; + margin-right: 4px; + border: 1px solid var(--dark_05); + box-shadow: 2px 2px 0 var(--dark_05); + + &:hover { + &:has(> a) { + border-color: var(--purple_bright); + } + } + + a, + a:hover { + border-bottom: none; + } +} diff --git a/docs/components/mdx/InlineButton/InlineButton.tsx b/docs/components/mdx/InlineButton/InlineButton.tsx new file mode 100644 index 0000000000000..8d1b92a920ec2 --- /dev/null +++ b/docs/components/mdx/InlineButton/InlineButton.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import classes from "./InlineButton.module.scss"; + +export type InlineButtonProps = { + children: string; +}; + +export const InlineButton = ({ children }: InlineButtonProps) => { + return {children}; +}; + +export default InlineButton; diff --git a/docs/components/mdx/LoomVideo/LoomVideo.module.scss b/docs/components/mdx/LoomVideo/LoomVideo.module.scss new file mode 100644 index 0000000000000..e8ad1f79628a1 --- /dev/null +++ b/docs/components/mdx/LoomVideo/LoomVideo.module.scss @@ -0,0 +1,7 @@ +.LoomVideo__Wrapper { + margin: 1.5rem 0; + + > iframe { + border-radius: 6px; + } +} diff --git a/docs/components/mdx/LoomVideo/LoomVideo.tsx b/docs/components/mdx/LoomVideo/LoomVideo.tsx new file mode 100644 index 0000000000000..0ad6886b90973 --- /dev/null +++ b/docs/components/mdx/LoomVideo/LoomVideo.tsx @@ -0,0 +1,25 @@ +import classnames from 'classnames/bind'; + +import * as styles from './LoomVideo.module.scss'; + +const cn = classnames.bind(styles); + +export type LoomVideoProps = { + url: string; +}; + +export const LoomVideo = ({ url }: LoomVideoProps) => { + return ( +
+ +
+ ); +} diff --git a/docs/src/components/ReferenceDocs/ParameterTable.tsx b/docs/components/mdx/ReferenceDocs/ParameterTable.tsx similarity index 100% rename from docs/src/components/ReferenceDocs/ParameterTable.tsx rename to docs/components/mdx/ReferenceDocs/ParameterTable.tsx diff --git a/docs/components/mdx/Screenshot/index.tsx b/docs/components/mdx/Screenshot/index.tsx new file mode 100644 index 0000000000000..3f2c4052eddf1 --- /dev/null +++ b/docs/components/mdx/Screenshot/index.tsx @@ -0,0 +1,56 @@ +import React, { CSSProperties } from 'react'; +// import styles from './styles.module.scss'; + +import classnames from 'classnames/bind'; + +import * as styles from './styles.module.scss'; + +const cn = classnames.bind(styles); + +interface ScreenshotProps { + alt?: string; + src: string; + + /** + * Use CSS `clip-path` to highlight a specific area of the screenshot. + * + * @example inset(20% 64% 72% 20% round 10px) + */ + highlight?: CSSProperties['clipPath']; +} + +const ScreenshotHighlight = ({ highlight, src }: ScreenshotProps) => ( +
+) + +export const Screenshot = (props: ScreenshotProps) => { + return ( +
+ {props.highlight ? () : null} + {props.alt} +
+ ); +}; + +export const Diagram = (props: ScreenshotProps) => ( +
+ {props.highlight ? () : null} + {props.alt} +
+) diff --git a/docs/components/mdx/Screenshot/styles.module.scss b/docs/components/mdx/Screenshot/styles.module.scss new file mode 100644 index 0000000000000..30defe0210c44 --- /dev/null +++ b/docs/components/mdx/Screenshot/styles.module.scss @@ -0,0 +1,33 @@ +.diagram { + position: relative; + width: 100%; + margin: 1.5rem 0; + overflow: hidden; + + > img { + margin: 0; + } +} + +.screenshot { + position: relative; + width: 100%; + border: 1px solid var(--dark_05); + border-radius: 6px; + filter: drop-shadow(0px 0px 24px rgba(15, 15, 35, 0.12)); + margin: 1.5rem 0; + overflow: hidden; + + > img { + margin: 0; + } +} + +.highlight { + width: 100%; + height: 100%; + position: absolute; + background-repeat: no-repeat; + background-size: contain; + z-index: 9999; +} diff --git a/docs/components/mdx/Snippets/SnippetGroup.tsx b/docs/components/mdx/Snippets/SnippetGroup.tsx new file mode 100644 index 0000000000000..f15f3b68c0bd6 --- /dev/null +++ b/docs/components/mdx/Snippets/SnippetGroup.tsx @@ -0,0 +1,8 @@ +import React from "react"; +import styles from "./styles.module.css"; + +export const Snippet = ({ children }) => children; + +export const SnippetGroup = ({ children }) => { + return
{children}
; +}; diff --git a/docs/components/mdx/Snippets/styles.module.css b/docs/components/mdx/Snippets/styles.module.css new file mode 100644 index 0000000000000..da0138625ec3e --- /dev/null +++ b/docs/components/mdx/Snippets/styles.module.css @@ -0,0 +1,4 @@ +.snippetGroup { + display: flex; + gap: 1rem; +} diff --git a/docs/components/mdx/YouTubeVideo/YouTubeVideo.tsx b/docs/components/mdx/YouTubeVideo/YouTubeVideo.tsx new file mode 100644 index 0000000000000..3b93d7c8231f9 --- /dev/null +++ b/docs/components/mdx/YouTubeVideo/YouTubeVideo.tsx @@ -0,0 +1,26 @@ +import classnames from 'classnames/bind'; + +import * as styles from './YoutubeVideo.module.scss'; + +const cn = classnames.bind(styles); + +export type YouTubeVideoProps = { + url: string; +}; + +export const YouTubeVideo = ({ url }: YouTubeVideoProps) => { + return ( +
+ +
+ ); +} diff --git a/docs/components/mdx/YouTubeVideo/YoutubeVideo.module.scss b/docs/components/mdx/YouTubeVideo/YoutubeVideo.module.scss new file mode 100644 index 0000000000000..4f21273ca5b6e --- /dev/null +++ b/docs/components/mdx/YouTubeVideo/YoutubeVideo.module.scss @@ -0,0 +1,7 @@ +.YoutubeVideo__Wrapper { + margin: 1.5rem 0; + + > iframe { + border-radius: 6px; + } +} diff --git a/docs/components/mdx/index.ts b/docs/components/mdx/index.ts new file mode 100644 index 0000000000000..c02cbb53d06e1 --- /dev/null +++ b/docs/components/mdx/index.ts @@ -0,0 +1,71 @@ +import * as Buttons from '@/components/common/Button/Button'; +import { CodeTabs } from "@/components/mdx/CodeTabs"; +import { CubeQueryResultSet } from "@/components/mdx/CubeQueryResultSet"; +import { + DangerBox, + InfoBox, + SuccessBox, + WarningBox, + ReferenceBox +} from "@/components/mdx/AlertBox/AlertBox"; +import { GitHubCodeBlock } from "@/components/mdx/GitHubCodeBlock"; +import { GitHubFolderLink } from "@/components/mdx/GitHubFolderLink"; +import { Grid } from "@/components/mdx/Grid/Grid"; +import { GridItem } from "@/components/mdx/Grid/GridItem"; +import { InlineButton } from "@/components/mdx/InlineButton/InlineButton"; +import { LoomVideo } from "@/components/mdx/LoomVideo/LoomVideo"; +import { ParameterTable } from "@/components/mdx/ReferenceDocs/ParameterTable"; +import { Snippet, SnippetGroup } from "@/components/mdx/Snippets/SnippetGroup"; +import { Diagram, Screenshot } from '@/components/mdx/Screenshot'; +import { YouTubeVideo } from '@/components/mdx/YouTubeVideo/YouTubeVideo'; +import { CaseStudyPromoBlock } from '@/components/mdx/CaseStudyPromoBlock/CaseStudyPromoBlock'; +import { CloudPromoBlock } from '@/components/mdx/CloudPromoBlock/CloudPromoBlock'; +import { EventPromoBlock } from '@/components/mdx/EventPromoBlock/EventPromoBlock'; +import { H1 } from '@/components/overrides/Headings/H1'; +import { Link } from '../overrides/Anchor/Link'; +import { Table } from '@/components/overrides/Table/Table'; +import { Td } from '@/components/overrides/Table/Td'; +import { Th } from '@/components/overrides/Table/Th'; +import { Tr } from '@/components/overrides/Table/Tr'; +import { CommunitySupportedDriver } from '@/components/mdx/Banners/CommunitySupportedDriver'; +import { Code } from '../overrides/Code/Code'; + +export const components = { + ...Buttons, + CaseStudyPromoBlock, + CloudPromoBlock, + EventPromoBlock, + DangerBox, + InfoBox, + SuccessBox, + WarningBox, + ReferenceBox, + LoomVideo, + Grid, + GridItem, + GitHubCodeBlock, + CubeQueryResultSet, + GitHubFolderLink, + ParameterTable, + SnippetGroup, + Snippet, + // h2: ScrollSpyH2, + // h3: ScrollSpyH3, + // h4: MyH4, + CodeTabs, + Btn: InlineButton, + Screenshot, + Diagram, + YouTubeVideo, + + CommunitySupportedDriver, + + // Overrides + h1: H1, + a: Link, + table: Table, + code: Code, + td: Td, + th: Th, + tr: Tr, +}; diff --git a/docs/components/overrides/Anchor/Anchor.tsx b/docs/components/overrides/Anchor/Anchor.tsx new file mode 100644 index 0000000000000..97a260e7e4b5b --- /dev/null +++ b/docs/components/overrides/Anchor/Anchor.tsx @@ -0,0 +1,62 @@ +// eslint-disable-next-line no-restricted-imports -- only in this file we determine either we include as child of based of `newNextLinkBehavior` value +import NextLink from 'next/link' +import next from 'next/package.json' +import { useConfig } from 'nextra-theme-docs'; +import type { ComponentProps, ReactElement } from 'react' +import { forwardRef } from 'react' + +export type AnchorProps = Omit, 'ref'> & { + newWindow?: boolean +} + +const nextVersion = Number(next.version.split('.')[0]) + +export const Anchor = forwardRef(function ( + { href = '', children, newWindow, ...props }, + // ref is used in + forwardedRef +): ReactElement { + const config = useConfig() + // console.log(useConfig()) + + if (newWindow) { + return ( + + {children} + (opens in a new tab) + + ) + } + + if (!href) { + return ( + + {children} + + ) + } + + if (nextVersion > 12 || config.newNextLinkBehavior) { + return ( + + {children} + + ) + } + + return ( + + + {children} + + + ) +}) + +Anchor.displayName = 'Anchor' diff --git a/docs/components/overrides/Anchor/Link.module.scss b/docs/components/overrides/Anchor/Link.module.scss new file mode 100644 index 0000000000000..14bab98a9aafc --- /dev/null +++ b/docs/components/overrides/Anchor/Link.module.scss @@ -0,0 +1,22 @@ +.Link { + color: var(--purple_bright); + border-bottom: 1px solid var(--purple_04_a30); + padding-bottom: 3px; + border-radius: 0; + + &:hover { + border-bottom: 1px solid var(--purple_bright); + } + + &:has(> code) { + border-bottom: none; + + &:hover { + border-bottom: none; + + > code { + border-color: var(--purple_bright); + } + } + } +} diff --git a/docs/components/overrides/Anchor/Link.tsx b/docs/components/overrides/Anchor/Link.tsx new file mode 100644 index 0000000000000..8cf0aa927bf7c --- /dev/null +++ b/docs/components/overrides/Anchor/Link.tsx @@ -0,0 +1,21 @@ +import classnames from 'classnames/bind'; +import { Anchor, AnchorProps } from './Anchor'; + +import styles from './Link.module.scss'; + +const cn = classnames.bind(styles); + +const EXTERNAL_HREF_REGEX = /https?:\/\// + +export const Link = ({ href = '', className, ...props }: AnchorProps) => ( + +) diff --git a/docs/components/overrides/Code/Code.module.scss b/docs/components/overrides/Code/Code.module.scss new file mode 100644 index 0000000000000..2cd0fbbd4e5d3 --- /dev/null +++ b/docs/components/overrides/Code/Code.module.scss @@ -0,0 +1,3 @@ +pre > .Code { + white-space: inherit; +} \ No newline at end of file diff --git a/docs/components/overrides/Code/Code.tsx b/docs/components/overrides/Code/Code.tsx new file mode 100644 index 0000000000000..53ea8625f858b --- /dev/null +++ b/docs/components/overrides/Code/Code.tsx @@ -0,0 +1,30 @@ +import classnames from 'classnames/bind' +import type { ComponentProps, ReactElement } from 'react' + +import * as styles from './Code.module.scss'; + +const cn = classnames.bind(styles); + +export const Code = ({ + children, + className, + ...props +}: ComponentProps<'code'>): ReactElement => { + const hasLineNumbers = 'data-line-numbers' in props + return ( + + {children} + + ) +} diff --git a/docs/components/overrides/Headings/H1.tsx b/docs/components/overrides/Headings/H1.tsx new file mode 100644 index 0000000000000..8ba07e443970b --- /dev/null +++ b/docs/components/overrides/Headings/H1.tsx @@ -0,0 +1,11 @@ +import type { ComponentProps } from 'react'; + +export const H1 = (props: ComponentProps<'h1'>) => { + // console.log({ props }); + return ( +

+ ); +} diff --git a/docs/components/overrides/TOC/TOCTitle.tsx b/docs/components/overrides/TOC/TOCTitle.tsx new file mode 100644 index 0000000000000..27fc24b60c536 --- /dev/null +++ b/docs/components/overrides/TOC/TOCTitle.tsx @@ -0,0 +1,7 @@ +export const TOCTitle = () => { + return ( +
+

TOC

+
+ ); +}; diff --git a/docs/components/overrides/Table/Table.module.scss b/docs/components/overrides/Table/Table.module.scss new file mode 100644 index 0000000000000..6291e7a0db167 --- /dev/null +++ b/docs/components/overrides/Table/Table.module.scss @@ -0,0 +1,8 @@ +.Table { + margin: 1.5rem 0; + + border-collapse: separate; + border-spacing: 0; + border: 1px solid var(--dark_05); + border-radius: 0.5rem; +} diff --git a/docs/components/overrides/Table/Table.tsx b/docs/components/overrides/Table/Table.tsx new file mode 100644 index 0000000000000..f0103d10730df --- /dev/null +++ b/docs/components/overrides/Table/Table.tsx @@ -0,0 +1,18 @@ +import classnames from 'classnames/bind'; + +import type { ComponentProps } from 'react' + +import * as styles from './Table.module.scss'; + +const cn = classnames.bind(styles); + +export const Table = ({ + className = '', + ...props +}: ComponentProps<'table'>) => ( + +) diff --git a/docs/components/overrides/Table/Td.module.scss b/docs/components/overrides/Table/Td.module.scss new file mode 100644 index 0000000000000..75c11d33c3b1b --- /dev/null +++ b/docs/components/overrides/Table/Td.module.scss @@ -0,0 +1,22 @@ +.Td { + border-bottom: 1px solid var(--dark_05); + border-right: 1px solid var(--dark_05); + padding: 0.5rem 1rem; + //border-collapse: collapse; + //border-bottom: none; + + &:last-child { + border-right: none; + } + //+ td { + // border-left: none; + //} + //&:first-of-type { + // border-top-left-radius: 0.5rem; + //} + // +} + +.Td code { + word-break: break-all; +} \ No newline at end of file diff --git a/docs/components/overrides/Table/Td.tsx b/docs/components/overrides/Table/Td.tsx new file mode 100644 index 0000000000000..dfb081276f0fa --- /dev/null +++ b/docs/components/overrides/Table/Td.tsx @@ -0,0 +1,18 @@ +import classnames from 'classnames/bind'; + +import type { ComponentProps } from 'react' + +import * as styles from './Td.module.scss'; + +const cn = classnames.bind(styles); + +export const Td = ({ className = '', ...props }: ComponentProps<'td'>) => ( + +) diff --git a/docs/components/pages/Overview.tsx b/docs/components/pages/Overview.tsx new file mode 100644 index 0000000000000..d7e6e530d2a8b --- /dev/null +++ b/docs/components/pages/Overview.tsx @@ -0,0 +1,11 @@ +import Link from "next/link"; + +export const Overview = () => { + return ( +
+

Custom Docs Overview page

+ + introduction +
+ ); +}; diff --git a/docs/content/API-Reference/GraphQL-API-1.png b/docs/content/API-Reference/GraphQL-API-1.png deleted file mode 100644 index 39436d60fe0af..0000000000000 Binary files a/docs/content/API-Reference/GraphQL-API-1.png and /dev/null differ diff --git a/docs/content/API-Reference/GraphQL-API-2.png b/docs/content/API-Reference/GraphQL-API-2.png deleted file mode 100644 index 3b3a8d2ac31be..0000000000000 Binary files a/docs/content/API-Reference/GraphQL-API-2.png and /dev/null differ diff --git a/docs/content/API-Reference/GraphQL-API.mdx b/docs/content/API-Reference/GraphQL-API.mdx deleted file mode 100644 index 2c8961427cc4b..0000000000000 --- a/docs/content/API-Reference/GraphQL-API.mdx +++ /dev/null @@ -1,305 +0,0 @@ ---- -title: GraphQL API -permalink: /backend/graphql -category: API Reference -menuOrder: 4 ---- - - - -The Cube GraphQL API is currently in Preview, and there may be changes in a -future version. - - - -## Getting started - - - -The Cube GraphQL API does not currently support using variables from a GraphQL -client. Instead inline variables directly in the query. - - - -First, ensure you're running Cube v0.28.58 or later. Then start the project -locally in development mode, and navigate to -`http://localhost:4000/cubejs-api/graphql` in your browser. You should see the -GraphiQL interface: - -
- -
- -If you click the 'Docs' button in the top-right, you can explore the -introspected schema: - -
- -
- -As an example, let's use the `Orders` cube from the example eCommerce database: - -```js -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - measures: { - count: { - type: `count`, - }, - }, - - dimensions: { - status: { - sql: `status`, - type: `string`, - }, - - createdAt: { - sql: `created_at`, - type: `time`, - }, - }, -}); -``` - -A GraphQL query to return the number of orders by status would look something -like this: - -```graphql -{ - cube { - orders { - count - status - createdAt { - day - } - } - } -} -``` - -The equivalent query to the REST API endpoint would look like this: - -```json -{ - "measures": ["Orders.count"], - "dimensions": ["Orders.status", "Orders.createdAt"], - "timeDimensions": [ - { - "dimension": "Orders.createdAt", - "granularity": "day" - } - ] -} -``` - -### <--{"id" : "Getting started"}--> Modifying time dimension granularity - -The granularity for a time dimension can easily be changed by specifying it in -the query: - -```graphql -{ - cube { - orders { - createdAt { - month - } - } - } -} -``` - -[Any supported granularity][ref-schema-ref-preagg-granularity] can be used. If -you prefer to not specify a granularity, then use `value`: - -```graphql -{ - cube { - orders { - createdAt { - value - } - } - } -} -``` - -[ref-schema-ref-preagg-granularity]: - /schema/reference/pre-aggregations#granularity - -### <--{"id" : "Getting started"}--> Specifying filters and ranges - -Filters can be set on the load query or on a specific cube. Specifying the -filter on the load query applies it to all cubes in the query. Filters can be -added to the query as follows: - -``` -query { - cube(limit: 100, offset: 50, timezone: "America/Los_Angeles") { - orders(orderBy: { createdAt: asc, count: desc }, where: {status: {equals: "completed"}}) { - count - status - createdAt - } - } -} -``` - -Some other differences between the JSON query filters and the GraphQL filters to -note: - -- `number` values are used for number types instead of strings -- The `notSet` filter is replaced by `{ set: false }` -- New `in` and `notIn` filters to check for multiple values -- `AND` and `OR` fields for boolean operators - -The GraphQL API supports `@skip` and `@include` directives too: - -``` -query GetOrders($byStatus: Boolean) { - cube(limit: 100, offset: 50, timezone: "America/Los_Angeles") { - orders(orderBy: { createdAt: asc, count: desc }, where: {status: {equals: "completed"}}) { - count - status @include(if: $byStatus) - createdAt - } - } -} -``` - -### <--{"id" : "Getting started"}--> Querying multiple cubes - -Using the same `Orders` cube as before, let's try and get the numbers of -products for each order status too. We can do this by adding the `Products` cube -to our query as follows: - -```graphql -{ - cube { - orders { - status - count - createdAt { - month - } - } - products { - count - } - } -} -``` - -## Reference - -### <--{"id" : "Reference"}--> cube - -``` -query { - cube [([cubeQueryArgs])] { - [([cubeArgs])] { - - } - } -} -``` - -| Key | Schema | Description | -| --------------- | ----------------------------------- | ------------------------------------------ | -| `cubeQueryArgs` | [`CubeQueryArgs`](#cube-query-args) | Options that apply to the entire query | -| `cubeArgs` | [`CubeArgs`](#cube-args) | Options that apply only to a specific cube | - -### <--{"id" : "Reference"}--> CubeQueryArgs - -| Key | Schema | Description | -| ------------ | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| `where` | [`RootWhereInput`](#root-where-input) | Represents a SQL `WHERE` clause | -| `limit` | `Int` | A row limit for your query. The default value is `10000`. The maximum allowed limit is `50000` | -| `offset` | `Int` | The number of initial rows to be skipped for your query. The default value is `0` | -| `timezone` | `String` | The timezone to use for the query. The default value is `UTC` | -| `renewQuery` | `Boolean` | If `renewQuery` is set to `true`, Cube.js will renew all `refreshKey` for queries and query results in the foreground. The default value is `false` | - -### <--{"id" : "Reference"}--> RootWhereInput - -| Key | Schema | Description | -| ------------ | ---------------------------------------- | ----------- | -| `AND` | [`[RootWhereInput!]`](#root-where-input) | | -| `OR` | [`[RootWhereInput!]`](#root-where-input) | | -| `` | [`CubeWhereInput`](#cube-where-input) | | - -### <--{"id" : "Reference"}--> CubeArgs - -| Key | Schema | Description | -| --------- | ------------------------------------- | ----------- | -| `where` | [`CubeWhereInput`](#cube-where-input) | | -| `orderBy` | `CubeOrderByInput` | | - -### <--{"id" : "Reference"}--> CubeWhereInput - -| Key | Schema | Description | -| -------------- | ---------------------------------------- | ----------- | -| `AND` | [`[RootWhereInput!]`](#root-where-input) | | -| `OR` | [`[RootWhereInput!]`](#root-where-input) | | -| `` | [`Filter`](#filter) | | - -### <--{"id" : "Reference"}--> CubeOrderByInput - -| Key | Schema | Description | -| -------------- | ---------------------- | ----------- | -| `` | [`OrderBy`](#order-by) | | - -### <--{"id" : "Reference"}--> Filter - -[`DateTimeFilter`](#date-time-filter) | [`FloatFilter`](#float-time-filter) | -[`StringFilter`](#string-time-filter) - -### <--{"id" : "Reference"}--> DateTimeFilter - -| Key | Schema | Description | -| ---------------- | ---------- | ----------- | -| `equals` | `String` | | -| `notEquals` | `String` | | -| `in` | `[String]` | | -| `notIn` | `[String]` | | -| `inDateRange` | `[String]` | | -| `notInDateRange` | `[String]` | | -| `beforeDate` | `String` | | -| `afterDate` | `String` | | -| `set` | `Boolean` | | - -### <--{"id" : "Reference"}--> FloatFilter - -| Key | Schema | Description | -| ----------- | --------- | ----------- | -| `equals` | `Float` | | -| `notEquals` | `Float` | | -| `in` | `[Float]` | | -| `notIn` | `[Float]` | | -| `set` | `Boolean` | | - -### <--{"id" : "Reference"}--> StringFilter - -| Key | Schema | Description | -| ------------- | ---------- | ----------- | -| `equals` | `String` | | -| `notEquals` | `String` | | -| `in` | `[String]` | | -| `notIn` | `[String]` | | -| `contains` | `String` | | -| `notContains` | `String` | | -| `set` | `Boolean` | | - -### <--{"id" : "Reference"}--> OrderBy - -`asc` | `desc` diff --git a/docs/content/API-Reference/Query-Format.md b/docs/content/API-Reference/Query-Format.md deleted file mode 100644 index 964e192365600..0000000000000 --- a/docs/content/API-Reference/Query-Format.md +++ /dev/null @@ -1,560 +0,0 @@ ---- -title: Query Format -permalink: /query-format -category: API Reference -menuOrder: 2 ---- - -Cube Queries are plain JavaScript objects, describing an analytics query. The -basic elements of a query (query members) are `measures`, `dimensions`, and -`segments`. - -The query member format name is `CUBE_NAME.MEMBER_NAME`, for example the -dimension `email` in the Cube `Users` would have the name `Users.email`. - -In the case of dimension of type `time` granularity could be optionally added to -the name, in the following format `CUBE_NAME.TIME_DIMENSION_NAME.GRANULARITY`, -ex: `Stories.time.month`. - -Supported granularities: `second`, `minute`, `hour`, `day`, `week`, `month`, -`quarter` and `year`. - -The Cube.js client also accepts an array of queries. By default it will be -treated as a Data Blending query type. - -## Query Properties - -A Query has the following properties: - -- `measures`: An array of measures. -- `dimensions`: An array of dimensions. -- `filters`: An array of objects, describing filters. Learn about - [filters format](#filters-format). -- `timeDimensions`: A convenient way to specify a time dimension with a filter. - It is an array of objects in [timeDimension format.](#time-dimensions-format) -- `segments`: An array of segments. A segment is a named filter, created in the - Data Schema. -- `limit`: A row limit for your query. The default value is `10000`. The maximum - allowed limit is `50000`. -- `offset`: The number of initial rows to be skipped for your query. The default - value is `0`. -- `order`: An object, where the keys are measures or dimensions to order by and - their corresponding values are either `asc` or `desc`. The order of the fields - to order on is based on the order of the keys in the object. -- `timezone`: All time based calculations performed within Cube.js are - timezone-aware. This property is applied to all time dimensions during - aggregation and filtering. It isn't applied to the time dimension referenced - in a `dimensions` query property unless granularity or date filter is - specified. Using this property you can set your desired timezone in - [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database) format, e.g.: - `America/Los_Angeles`. The default value is `UTC`. -- `renewQuery`: If `renewQuery` is set to `true`, Cube.js 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`. - > **NOTE**: Cube.js 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 `ungrouped` is set to `true` no `GROUP BY` statement will be - added to the query. Instead, the raw results after filtering and joining will - be returned without grouping. By default `ungrouped` queries require a primary - key as a dimension of every cube involved in the query for security purposes. - In case of `ungrouped` query measures will be rendered as underlying `sql` of - measures without aggregation and time dimensions will be truncated as usual - however not grouped by. - -```js -{ - measures: ['Stories.count'], - dimensions: ['Stories.category'], - filters: [{ - member: 'Stories.isDraft', - operator: 'equals', - values: ['No'] - }], - timeDimensions: [{ - dimension: 'Stories.time', - dateRange: ['2015-01-01', '2015-12-31'], - granularity: 'month' - }], - limit: 100, - offset: 50, - order: { - 'Stories.time': 'asc', - 'Stories.count': 'desc' - }, - timezone: 'America/Los_Angeles' -} -``` - -### <--{"id" : "Query Properties"}--> Default order - -If the `order` property is not specified in the query, Cube.js sorts results by -default using the following rules: - -- The first time dimension with granularity, ascending. If no time dimension - with granularity exists... -- The first measure, descending. If no measure exists... -- The first dimension, ascending. - -### <--{"id" : "Query Properties"}--> Alternative order format - -Also you can control the ordering of the `order` specification, Cube.js support -alternative order format - array of tuples: - -```js -{ - ..., - order: [ - ['Stories.time', 'asc'], - ['Stories.count', 'asc'] - ] - }, - ... -} -``` - -## Filters Format - -A filter is a Javascript object with the following properties: - -- `member`: Dimension or measure to be used in the filter, for example: - `Stories.isDraft`. See below on difference between filtering dimensions vs - filtering measures. -- `operator`: An operator to be used in the filter. Only some operators are - available for measures. For dimensions the available operators depend on the - type of the dimension. Please see the reference below for the full list of - available operators. -- `values`: An array of values for the filter. Values must be of type String. If - you need to pass a date, pass it as a string in `YYYY-MM-DD` format. - -#### Filtering Dimensions vs Filtering Measures - -Filters are applied differently to dimensions and measures. - -When you filter on a dimension, you are restricting the raw data before any -calculations are made. When you filter on a measure, you are restricting the -results after the measure has been calculated. - -## Filters Operators - -Only some operators are available for measures. For dimensions, the available -operators depend on the -[type of the dimension](/schema/reference/types-and-formats#types). - -### <--{"id" : "Filters Operators"}--> equals - -Use it when you need an exact match. It supports multiple values. - -- Applied to measures. -- Dimension types: `string`, `number`, `time`. - -```js -{ - member: "Users.country", - operator: "equals", - values: ["US", "Germany", "Israel"] -} -``` - -### <--{"id" : "Filters Operators"}--> notEquals - -The opposite operator of `equals`. It supports multiple values. - -- Applied to measures. -- Dimension types: `string`, `number`, `time`. - -```js -{ - member: "Users.country", - operator: "notEquals", - values: ["France"] -} -``` - -### <--{"id" : "Filters Operators"}--> contains - -The `contains` filter acts as a wildcard case insensitive `LIKE` operator. In -the majority of SQL backends it uses `ILIKE` operator with values being -surrounded by `%`. It supports multiple values. - -- Dimension types: `string`. - -```js -{ - member: "Posts.title", - operator: "contains", - values: ["serverless", "aws"] -} -``` - -### <--{"id" : "Filters Operators"}--> notContains - -The opposite operator of `contains`. It supports multiple values. - -- Dimension types: `string`. - -```js -{ - member: "Posts.title", - operator: "notContains", - values: ["ruby"] -} -``` - -### <--{"id" : "Filters Operators"}--> startsWith - -The `startsWith` filter acts as a case insensitive `LIKE` operator with a wildcard at the beginning. In -the majority of SQL backends, it uses the `ILIKE` operator with `%` at the start of each value. It supports multiple values. - -- Dimension types: `string`. - -```js -{ - member: "Posts.title", - operator: "startsWith", - values: ["ruby"] -} -``` - -### <--{"id" : "Filters Operators"}--> endsWith - -The `endsWith` filter acts as a case insensitive `LIKE` operator with a wildcard at the end. In -the majority of SQL backends, it uses the `ILIKE` operator with `%` at the end of each value. It supports multiple values. - -- Dimension types: `string`. - -```js -{ - member: "Posts.title", - operator: "endsWith", - values: ["ruby"] -} -``` - -### <--{"id" : "Filters Operators"}--> gt - -The `gt` operator means **greater than** and is used with measures or dimensions -of type `number`. - -- Applied to measures. -- Dimension types: `number`. - -```js -{ - member: "Posts.upvotesCount", - operator: "gt", - values: ["100"] -} -``` - -### <--{"id" : "Filters Operators"}--> gte - -The `gte` operator means **greater than or equal to** and is used with measures -or dimensions of type `number`. - -- Applied to measures. -- Dimension types: `number`. - -```js -{ - member: "Posts.upvotesCount", - operator: "gte", - values: ["100"] -} -``` - -### <--{"id" : "Filters Operators"}--> lt - -The `lt` operator means **less than** and is used with measures or dimensions of -type `number`. - -- Applied to measures. -- Dimension types: `number`. - -```js -{ - member: "Posts.upvotesCount", - operator: "lt", - values: ["10"] -} -``` - -### <--{"id" : "Filters Operators"}--> lte - -The `lte` operator means **less than or equal to** and is used with measures or -dimensions of type `number`. - -- Applied to measures. -- Dimension types: `number`. - -```js -{ - member: "Posts.upvotesCount", - operator: "lte", - values: ["10"] -} -``` - -### <--{"id" : "Filters Operators"}--> set - -Operator `set` checks whether the value of the member **is not** `NULL`. You -don't need to pass `values` for this operator. - -- Applied to measures. -- Dimension types: `number`, `string`, `time`. - -```js -{ - member: "Posts.authorName", - operator: "set" -} -``` - -### <--{"id" : "Filters Operators"}--> notSet - -An opposite to the `set` operator. It checks whether the value of the member -**is** `NULL`. You don't need to pass `values` for this operator. - -- Applied to measures. -- Dimension types: `number`, `string`, `time`. - -```js -{ - member: "Posts.authorName", - operator: "notSet" -} -``` - -### <--{"id" : "Filters Operators"}--> inDateRange - - - -From a pre-aggregation standpoint, `inDateRange` filter is applied as a generic filter. -All pre-aggregation granularity matching rules aren't applied in this case. -It feels like pre-aggregation isn't matched. -However, pre-aggregation is just missing the filtered time dimension in [dimensions][ref-schema-ref-preaggs-dimensions] list. -If you want date range filter to match [timeDimension][ref-schema-ref-preaggs-time-dimension] please use [timeDimensions](#time-dimensions-format) `dateRange` instead. - - - -The operator `inDateRange` is used to filter a time dimension into a specific -date range. The values must be an array of dates with the following format -'YYYY-MM-DD'. If only one date specified the filter would be set exactly to this -date. - -There is a convient way to use date filters with grouping - -[learn more about timeDimensions query property here](#time-dimensions-format) - -- Dimension types: `time`. - -```js -{ - member: "Posts.time", - operator: "inDateRange", - values: ['2015-01-01', '2015-12-31'] -} -``` - -### <--{"id" : "Filters Operators"}--> notInDateRange - - - -From a pre-aggregation standpoint, `notInDateRange` filter is applied as a generic filter. -All pre-aggregation granularity matching rules aren't applied in this case. -It feels like pre-aggregation isn't matched. -However, pre-aggregation is just missing the filtered time dimension in [dimensions][ref-schema-ref-preaggs-dimensions] list. - - - -An opposite operator to `inDateRange`, use it when you want to exclude specific -dates. The values format is the same as for `inDateRange`. - -- Dimension types: `time`. - -```js -{ - member: "Posts.time", - operator: "notInDateRange", - values: ['2015-01-01', '2015-12-31'] -} -``` - -### <--{"id" : "Filters Operators"}--> beforeDate - - - -From a pre-aggregation standpoint, `beforeDate` filter is applied as a generic filter. -All pre-aggregation granularity matching rules aren't applied in this case. -It feels like pre-aggregation isn't matched. -However, pre-aggregation is just missing the filtered time dimension in [dimensions][ref-schema-ref-preaggs-dimensions] list. - - - -Use it when you want to retreive all results before some specific date. The -values should be an array of one element in `YYYY-MM-DD` format. - -- Dimension types: `time`. - -```js -{ - member: "Posts.time", - operator: "beforeDate", - values: ['2015-01-01'] -} -``` - -### <--{"id" : "Filters Operators"}--> afterDate - - - -From a pre-aggregation standpoint, `afterDate` filter is applied as a generic filter. -All pre-aggregation granularity matching rules aren't applied in this case. -It feels like pre-aggregation isn't matched. -However, pre-aggregation is just missing the filtered time dimension in [dimensions][ref-schema-ref-preaggs-dimensions] list. - - - -The same as `beforeDate`, but is used to get all results after a specific date. - -- Dimension types: `time`. - -```js -{ - member: "Posts.time", - operator: "afterDate", - values: ['2015-01-01'] -} -``` - -## Boolean logical operators - -Filters can contain `or` and `and` logical operators. Logical operators have -only one of the following properties: - -- `or` An array with one or more filters or other logical operators -- `and` An array with one or more filters or other logical operators - -```js -{ - or: [ - { - member: 'visitors.source', - operator: 'equals', - values: ['some'], - }, - { - and: [ - { - member: 'visitors.source', - operator: 'equals', - values: ['other'], - }, - { - member: 'visitor_checkins.cardsCount', - operator: 'equals', - values: ['0'], - }, - ], - }, - ]; -} -``` - -> **Note:** You can not put dimensions and measures filters in the same logical -> operator. - -## Time Dimensions Format - -Since grouping and filtering by a time dimension is quite a common case, Cube.js -provides a convenient shortcut to pass a dimension and a filter as a -`timeDimension` property. - -- `dimension`: Time dimension name. -- `dateRange`: An array of dates with the following format `YYYY-MM-DD` or in - `YYYY-MM-DDTHH:mm:ss.SSS` format. Values should always be local and in query - `timezone`. Dates in `YYYY-MM-DD` format are also accepted. Such dates are - padded to the start and end of the day if used in start and end of date range - interval accordingly. If only one date is specified it's equivalent to passing - two of the same dates as a date range. You can also pass a string instead of - array with relative date range, for example: `last quarter`, `last 360 days`, - or `next 2 months`. -- `compareDateRange`: An array of date ranges to compare a measure change over - previous period -- `granularity`: A granularity for a time dimension. It supports the following - values `second`, `minute`, `hour`, `day`, `week`, `month`, `year`. If you pass - `null` to the granularity, Cube.js will only perform filtering by a specified - time dimension, without grouping. - -```js -{ - measures: ['Stories.count'], - timeDimensions: [{ - dimension: 'Stories.time', - dateRange: ['2015-01-01', '2015-12-31'], - granularity: 'month' - }] -} -``` - -You can use compare date range queries when you want to see, for example, how a -metric performed over a period in the past and how it performs now. You can pass -two or more date ranges where each of them is in the same format as a -`dateRange` - -```js -// ... -const resultSet = cubejsApi.load({ - measures: ['Stories.count'], - timeDimensions: [ - { - dimension: 'Stories.time', - compareDateRange: ['this week', ['2020-05-21', '2020-05-28']], - granularity: 'month', - }, - ], -}); -// ... -``` - -You can also set a relative `dateRange`, e.g. `today`, `yesterday`, `tomorrow`, -`last year`, `next month`, or `last 6 months`. - -```js -{ - measures: ['Stories.count'], - timeDimensions: [{ - dimension: 'Stories.time', - dateRange: 'last week', - granularity: 'day' - }] -} -``` - -Be aware that e.g. `Last 7 days` or `Next 2 weeks` do not include the current -date. If you need the current date also you can use `from N days ago to now` or -`from now to N days from now`. - -```js -{ - measures: ['Stories.count'], - timeDimensions: [{ - dimension: 'Stories.time', - dateRange: 'from 6 days ago to now', - granularity: 'day' - }] -} -``` - -[ref-schema-ref-preaggs-refreshkey]: - /schema/reference/pre-aggregations#parameters-refresh-key -[ref-schema-ref-preaggs-refreshkey-every]: - /schema/reference/pre-aggregations#parameters-refresh-key-every -[ref-schema-ref-preaggs-dimensions]: - /schema/reference/pre-aggregations#parameters-dimensions -[ref-schema-ref-preaggs-time-dimension]: - /schema/reference/pre-aggregations#parameters-time-dimension diff --git a/docs/content/API-Reference/REST-API.mdx b/docs/content/API-Reference/REST-API.mdx deleted file mode 100644 index 9272a0a0df2db..0000000000000 --- a/docs/content/API-Reference/REST-API.mdx +++ /dev/null @@ -1,434 +0,0 @@ ---- -title: REST API -permalink: /rest-api -category: API Reference -menuOrder: 1 ---- - -## Prerequisites - -### <--{"id" : "Prerequisites"}--> Base path - -REST API is used to communicate with Cube.js backend. All requests are prefixed -with **basePath** described in -[Backend Server Core](@cubejs-backend-server-core). By default it's -`/cubejs-api`. - -### <--{"id" : "Prerequisites"}--> Authentication - -Cube.js uses API tokens to authorize requests and also for passing additional -security context, which can be used in the -[`queryRewrite`][ref-config-queryrewrite] property in your [`cube.js` -configuration file][ref-config-js]. - -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-js]: /config - -The API Token is passed via the Authorization Header. The token itself is a -[JSON Web Token](https://jwt.io), the [Security section](security) describes how -to generate it. - -In the development environment the token is not required for authorization, but -you can still use it to pass a security context. - -### <--{"id" : "Prerequisites"}--> Example request - -```bash -curl -H "Authorization: EXAMPLE-API-TOKEN" https://example.com/cubejs-api/v1/sql -``` - -### <--{"id" : "Prerequisites"}--> Continue wait - -If the request takes too long to be processed, Cube.js Backend responds with -`{ "error": "Continue wait" }` and 200 status code. This is how the long polling -mechanism in Cube is implemented. Clients should continuously retry the same -query in a loop until they get a successful result. Subsequent calls to the Cube -endpoints are idempotent and don't lead to scheduling new database queries if -not required by `refreshKey`. Also, receiving `Continue wait` doesn't mean the -database query has been canceled, and it's actually still being processed by the -Cube. Database queries that weren't started and are no longer waited by the -client's long polling loop will be marked as orphaned and removed from the -querying queue. - -Possible reasons of **Continue wait**: - -- The query requested is heavy, and it takes some time for the database to - process it. Clients should wait for its completion, continuously sending the - same REST API request. [continueWaitTimeout](config#queue-options) can be - adjusted in order to change the time Cube waits before returning - `Continue wait` message. -- There are many queries requested and Cube.js backend queues them to save - database from overloading. - -### <--{"id" : "Prerequisites"}--> Error Handling - -Cube.js REST API has basic errors and HTTP Error codes for all requests. - -| Status | Error response | Description | -| ------ | ------------------------------ | ---------------------------------------------------------------------------------------------------- | -| 400 | Error message | General error. It may be a database error, timeout, or other issue. Check error message for details. | -| 403 | Authorization header isn't set | You didn't provide an auth token. Provide a valid API Token or disable authorization. | -| 403 | Invalid token | The auth token provided is not valid. It may be expired or have invalid signature. | -| 500 | Error message | Cube.js internal server error. Check error message for details. | - -### <--{"id" : "Prerequisites"}--> Request Span Annotation - -For monitoring tools such as Cube Cloud proper request span annotation should be -provided in `x-request-id` header of a request. Each request id should consist -of two parts: `spanId` and `requestSequenceId` which define `x-request-id` as -whole: `${spanId}-span-${requestSequenceId}`. Values of `x-request-id` header -should be unique for each separate request. `spanId` should define user -interaction span such us `Continue wait` retry cycle and it's value shouldn't -change during one single interaction. - -### <--{"id" : "Prerequisites"}--> Pagination - -Cube supports paginated requests for the `/v1/load` endpoint by including -[`limit` and `offset` parameters][ref-api-ref-query-format] in the query. For -example, the following query will retrieve rows 101-200 from the `Orders` cube: - -```json -{ - "dimensions": ["Orders.status"], - "measures": ["Orders.count"], - "timeDimensions": [ - { - "dimension": "Orders.createdAt", - "dateRange": "last year", - "granularity": "day" - } - ], - "limit": 100, - "offset": 100 -} -``` - -[ref-api-ref-query-format]: /query-format#query-properties - -## API Reference - -### <--{"id" : "API Reference"}--> /v1/load - -Get the data for a query. - -| Parameter | Description | -| --------- | ------------------------------------------ | -| query | URL encoded Cube.js [Query](/query-format) | - -Response - -- `query` - The query passed via params. It can be an array of queries and in - such case it will be treated as a [Data Blending](/recipes/data-blending) - query. -- `data` - Formatted dataset of query results. -- `annotation` - Metadata for query. Contains descriptions for all query items. - - `title` - Human readable title from data schema. - - `shortTitle` - Short title for visualization usage (ex. chart overlay) - - `type` - Data type - -Example request: - -```bash -# Request with http method GET -curl \ - -H "Authorization: EXAMPLE-API-TOKEN" \ - -G \ - --data-urlencode 'query={"measures":["Users.count"]}' \ - http://localhost:4000/cubejs-api/v1/load - -# Request with http method POST -# Use POST to fix problem with query length limits -curl \ - -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: EXAMPLE-API-TOKEN" \ - --data '{"query": {"measures":["Users.count"]}}' \ - http://localhost:4000/cubejs-api/v1/load -``` - -Example response: - -```javascript -{ - query:{ - measures:[ - "Users.count" - ], - filters:[], - timezone:"UTC", - dimensions:[], - timeDimensions:[] - }, - data:[ - { - "Users.count":"700" - } - ], - annotation:{ - measures:{ - "Users.count":{ - title:"Users Count", - shortTitle:"Count", - type:"number" - } - }, - dimensions:{}, - segments:{}, - timeDimensions:{} - } -} -``` - - - -Currently all fetched numericals are returned in the same format as driver -returns it without any additional processing. Most of drivers return numerical -values as strings instead of javascript integer or float to ensure there's no -loss of significance. Client code should take care of parsing such numerical -values. - - - -### <--{"id" : "API Reference"}--> /v1/sql - -Get the SQL Code generated by Cube.js to be executed in the database. - -| Parameter | Description | -| --------- | ----------------------------------------- | -| query | URLencoded Cube.js [Query](/query-format) | - -Response - -- `sql` - JSON Object with the following properties - - `sql` - Formatted SQL query with parameters - - `order` - Order fields and direction used in SQL query - - `cacheKeyQueries` - Key names and TTL of Cube.js data cache - - `preAggregations` - SQL queries used to build pre-aggregation tables - -Example request: - -```bash -curl \ - -H "Authorization: EXAMPLE-API-TOKEN" \ - -G \ - --data-urlencode 'query={"measures":["Users.count"], - "timeDimensions":[{"dimension": "Users.createdAt","granularity":"day","dateRange":["2019-03-01","2019-03-31"]}]}' \ - http://localhost:4000/cubejs-api/v1/sql -``` - -Example response: - -```javascript -{ - sql:{ - sql:[ - "SELECT\n date_trunc('day', (users.created_at::timestamptz AT TIME ZONE 'UTC')) \"users.created_at_date\", count(users.id) \"users.count\"\n FROM\n public.users AS users\n WHERE (users.created_at >= $1::timestamptz AND users.created_at <= $2::timestamptz) GROUP BY 1 ORDER BY 1 ASC LIMIT 10000", - [ - "2019-03-01T00:00:00Z", - "2019-03-31T23:59:59Z" - ] - ], - timeDimensionAlias:"users.created_at_date", - timeDimensionField:"Users.createdAt", - order:[ - { - id:"Users.createdAt", - desc:false - } - ], - cacheKeyQueries:{ - queries:[ - [ - "select max(users.created_at) from public.users AS users", - [] - ] - ], - renewalThreshold:21600 - }, - preAggregations:[] - } -} -``` - -### <--{"id" : "API Reference"}--> /v1/meta - -Get meta-information for cubes defined in data schema - -Response - -- `cubes` - Array of cubes - - `name` - Codename of the cube - - `title` - Human-readable cube name - - `measures` - Array of measures defined within this cube - - `dimensions` - Array of dimensions defined within this cube - - `segments` - Array of segments defined within this cube - - `connectedComponent` - if it has the same value for two cubes, then there is - at least one join path between them. - -Example request: - -```bash -curl \ - -H "Authorization: EXAMPLE-API-TOKEN" \ - -G \ - http://localhost:4000/cubejs-api/v1/meta -``` - -Example response: - -```javascript -{ - cubes: [ - { - name: 'Users', - title: 'Users', - connectedComponent: 1, - measures: [ - { - name: 'Users.count', - title: 'Users Count', - shortTitle: 'Count', - aliasName: 'users.count', - type: 'number', - aggType: 'count', - drillMembers: ['Users.id', 'Users.city', 'Users.createdAt'], - }, - ], - dimensions: [ - { - name: 'Users.city', - title: 'Users City', - type: 'string', - aliasName: 'users.city', - shortTitle: 'City', - suggestFilterValues: true, - }, - ], - segments: [], - }, - ]; -} -``` - -### <--{"id" : "API Reference"}--> /v1/run-scheduled-refresh - -Trigger scheduled refresh run to refresh pre-aggregations. Use it in serverless -deployments. - - - -Single call to this API may be not enough to refresh everything is pending. This -call just populates queue with refresh workload and should be continuously -called until refresh jobs have completed; otherwise refresh jobs will be marked -as orphaned, and they will be removed from the queue. - - - -Learn more about -[scheduled refresh here](/caching/pre-aggregations/getting-started#keeping-pre-aggregations-up-to-date). - -| Parameter | Description | -| --------------- | ---------------------------------------------------------------------------- | -| queryingOptions | Optional URL encoded Cube.js [Query](/query-format) options such as timezone | - -Empty object response if scheduled successfully. - -Example request: - -```bash -curl \ - -H "Authorization: EXAMPLE-API-TOKEN" \ - -G \ - --data-urlencode 'queryingOptions={"timezone":"UTC"}' \ - http://localhost:4000/cubejs-api/v1/run-scheduled-refresh -``` - -### <--{"id" : "API Reference"}--> /readyz - -Returns the ready state of the deployment. - -**Single-tenant:** Ensures the orchestration layer is operational and tests the -connection to the default `dataSource`. - -**Multi-tenant:** Tests connections per-tenant. If no connections exist, it will -report as successful. - -Example request: - -```bash -curl -i http://localhost:4000/readyz -``` - -Successful example response: - -```bash -HTTP/1.1 200 OK -X-Powered-By: Express -Access-Control-Allow-Origin: * -Content-Type: application/json; charset=utf-8 -Content-Length: 19 -ETag: W/"13-MyluqxoYxC0tUxBeZCnbaWYVLhg" -Date: Mon, 18 Jan 2021 15:39:57 GMT -Connection: keep-alive -Keep-Alive: timeout=5 - -{"health":"HEALTH"} -``` - -Failure example response: - -```bash -HTTP/1.1 500 Internal Server Error -X-Powered-By: Express -Access-Control-Allow-Origin: * -Content-Type: application/json; charset=utf-8 -Content-Length: 19 -ETag: W/"13-MyluqxoYxC0tUxBeZCnbaWYVLhg" -Date: Mon, 18 Jan 2021 15:39:57 GMT -Connection: keep-alive -Keep-Alive: timeout=5 - -{"health":"DOWN"} -``` - -### <--{"id" : "API Reference"}--> /livez - -Returns the liveness state of the deployment. This is confirmed by testing any -existing connections to `dataSource`. If no connections exist, it will report as -successful. - -```bash -curl -i http://localhost:4000/livez -``` - -Successful example response: - -```bash -HTTP/1.1 200 OK -X-Powered-By: Express -Access-Control-Allow-Origin: * -Content-Type: application/json; charset=utf-8 -Content-Length: 19 -ETag: W/"13-MyluqxoYxC0tUxBeZCnbaWYVLhg" -Date: Mon, 18 Jan 2021 15:39:57 GMT -Connection: keep-alive -Keep-Alive: timeout=5 - -{"health":"HEALTH"} -``` - -Failure example response: - -```bash -HTTP/1.1 500 Internal Server Error -X-Powered-By: Express -Access-Control-Allow-Origin: * -Content-Type: application/json; charset=utf-8 -Content-Length: 19 -ETag: W/"13-MyluqxoYxC0tUxBeZCnbaWYVLhg" -Date: Mon, 18 Jan 2021 15:39:57 GMT -Connection: keep-alive -Keep-Alive: timeout=5 - -{"health":"DOWN"} -``` diff --git a/docs/content/API-Reference/SQL-API.mdx b/docs/content/API-Reference/SQL-API.mdx deleted file mode 100644 index a367718f37cbb..0000000000000 --- a/docs/content/API-Reference/SQL-API.mdx +++ /dev/null @@ -1,679 +0,0 @@ ---- -title: SQL API -permalink: /backend/sql -category: API Reference -menuOrder: 3 ---- - - - - This is documentation of Cube’s SQL API for the Postgres protocol. - The MySQL protocol used in the first versions of the Cube SQL API is no longer being developed and will be phased out soon. - Please consider migrating to the Postgres protocol. - - - -The Cube SQL API allows querying Cube via Postgres-compatible SQL. It enables the use -of BI applications, Python notebooks, reverse ETL tools, and other downstream tools on top of -Cube. - -### <--{"id" : "SQL API"}--> Supported Tools - -Cube SQL API has been tested with -- psql CLI -- Apache Superset -- Tableau Cloud -- Tableau Desktop with JDBC driver -- Power BI -- Metabase -- Google Data Studio -- Excel through Devart plugin -- Deepnote -- Hex -- Observable -- Streamlit -- Jupyter notebook -- Hightouch - -Please see [this GitHub issue](https://github.com/cube-js/cube.js/issues/3906) for the tools roadmap and to suggest and vote for tools of your interest. - -### <--{"id" : "SQL API"}--> Cube Cloud - -The first step to get started with the SQL API in Cube Cloud is to create a -deployment. You can follow this -[step-by-step guide on creating deployment within Cube Cloud](/cloud/getting-started/create). - -Once the deployment is ready, click **How to connect** link on the Overview page. -It will open a modal with instructions on different ways to connect to Cube. -Navigate to the SQL API tab and enable the SQL API. - -Once it is enabled, you should see a screen like the one below with your -connection credentials. - -
- -
- -Since the Cube SQL API is Postgres-compatible, please make sure to select **Postgres** as -a database type when connecting from BI tools. - -### <--{"id" : "SQL API"}--> Self-hosted Cube - -To enable the SQL API, we first need to add a new environment variable: - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -``` - -If you're running Cube with Docker, remember to add a port mapping to the Cube -service for `CUBEJS_PG_SQL_PORT`. Docker compose example: - -```yaml -services: - cube_api: - ... - ports: - - 5432:5432 # Cube SQL API -``` - -Or running docker from command line: - -```bash -docker run -p 4000:4000 -p 5432:5432 \ - -v ${PWD}:/cube/conf \ - -e CUBEJS_DEV_MODE=true \ - -e CUBEJS_PG_SQL_PORT=5432 \ - cubejs/cube -``` - -Then, set Cube SQL credentials auth: - -``` -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` - -Now, you can start your Cube instance and connect via the `psql` client with -provided credentials: - -```bash -psql -h 127.0.0.1 --port 5432 -U myusername --password -``` - -## Querying Fundamentals - -Under the hood, SQL API uses [Apache Datafusion](https://arrow.apache.org/datafusion/) as its SQL execution engine. -It's responsible for query planning and execution. -As the conversion process from SQL to Cube Query is ambiguous, additional step is done before the query is executed. -This step is called rewriting. -During this step, the query plan is being rewritten in a way a maximum number of Cube Queries can be detected within the given query plan. -Overall, rewriting is a seamless process. -There're some practical considerations that you should keep in mind while querying, though. - -### <--{"id" : "Querying Fundamentals"}--> Cube is a table - -In order to simplify interaction with data tools, every cube is represented as a table. -Measures, dimensions, and segments in this table are columns. -However, not all queries are possible on these tables. -In order to be valid, query against cube table should be: - -1. valid SQL statement and be compilable to the initial query plan by Datafusion; -2. one of the supported query types to the cube so it can be converted to Cube Query. - -Let's discuss some of the supported query types. - -### <--{"id" : "Querying Fundamentals"}--> Aggregated vs Non-aggregated queries - -There're two types of queries supported against cube tables: aggregated and non-aggregated. -Aggregated are those with `GROUP BY` statement, and non-aggregated are those without it. -Cube Queries issued to your database will always be aggregated, and it doesn't matter if you provide `GROUP BY` in a query or not. - -Whenever you use a non-aggregated query you need to provide only column names in SQL: - -``` -SELECT status, count FROM Orders -``` - -The same aggregated query should always aggregate measure columns using a corresponding aggregating function or special `MEASURE()` function: - - - - In cases where measure columns are not aggregated `Projection references non-aggregate values` error will be thrown. - It means there're columns that are neither in `GROUP BY` or aggregated. - It's a standard SQL `GROUP BY` operation consistency check enforced by SQL API as well. - - - -``` -SELECT status, SUM(count) FROM Orders GROUP BY 1 -SELECT status, MEASURE(count) FROM Orders GROUP BY 1 -``` - -### <--{"id" : "Querying Fundamentals"}--> Filtering - -Cube supports most of simple equality operators like `=`, `<>`, `<`, `<=`, `>`, `>=` as well as `IN` and `LIKE` operators. -Cube tries to push down all filters into Cube Query. -In some cases, SQL filters aren't available in Cube and can be done in a post-processing phase. -Time dimension filters will be converted to time dimension date ranges whenever it's possible. - -### <--{"id" : "Querying Fundamentals"}--> Ordering - -Cube tries to push down all `ORDER BY` statements into Cube Query. -If it can't be done ordering part would be done in a post-processing phase. -In case there're more than 50k rows in the result set, incorrect results can be received in this case. -Please use `EXPLAIN` in order to check if it's the case. - -### <--{"id" : "Querying Fundamentals"}--> Limit - -Limit push down is supported by Cube however, a limit over 50k can't be overridden. -In future versions, paging and streaming would be used to avoid this limitation. - -## Examples - -Consider the following schema. - -```js -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - measures: { - count: { - type: `count`, - }, - }, - - dimensions: { - status: { - sql: `status`, - type: `string`, - }, - - created: { - sql: `created_at`, - type: `time`, - }, - }, -}); -``` - -It would be represented as table in SQL API with `count`, `status`, `created` -columns. - -To get the count of orders grouped by status we can run the following query. - -``` -cube=> SELECT count, status FROM Orders; - count | status --------+------------ - 15513 | completed - 14652 | processing - 13829 | shipped -(3 rows) -``` - -Cube will automatically apply the `GROUP BY` clause in case it is missing in the -query. We can also provide the `GROUP BY` statement to control how results are -grouped. In the following example we group orders by created month and also by -status within every month. - -``` -cube=> SELECT MEASURE(count), status, DATE_TRUNC('month', createdAt) date FROM Orders GROUP BY date, status ORDER BY date asc; - measure(Orders.count) | status | date ------------------------+------------+---------------------------- - 31 | shipped | 2016-01-01 00:00:00.000000 - 28 | completed | 2016-01-01 00:00:00.000000 - 28 | processing | 2016-01-01 00:00:00.000000 - 28 | shipped | 2016-02-01 00:00:00.000000 - 18 | processing | 2016-02-01 00:00:00.000000 - 28 | completed | 2016-02-01 00:00:00.000000 - 54 | processing | 2016-03-01 00:00:00.000000 - 57 | completed | 2016-03-01 00:00:00.000000 - 56 | shipped | 2016-03-01 00:00:00.000000 - 54 | shipped | 2016-04-01 00:00:00.000000 - 60 | completed | 2016-04-01 00:00:00.000000 - 43 | processing | 2016-04-01 00:00:00.000000 - 55 | shipped | 2016-05-01 00:00:00.000000 -``` - -### <--{"id" : "Examples"}--> Querying Dimensions - -Querying dimensions is straightforward, simply add any required fields to the -`SELECT` clause. - -```sql -cube=> SELECT status FROM Orders; - status ------------- - completed - processing - shipped -(3 rows) -``` - -### <--{"id" : "Examples"}--> Querying Measures - -Measures can similarly be queried through Cube SQL. - -Because measures are already aggregated in Cube there is no need to apply -aggregate functions to them in SQL API if you don't have a `GROUP BY` statement in query. - -``` -cube=> SELECT count FROM Orders; - count -------- - 43994 -(1 row) -``` - -Some of the BI systems or SQL constraints may require you to apply aggregate functions. To support -this Cube allows aggregate functions on measures as long as they match the type -of the measure. - -`count` measure in our example is of type `count`, It means we can apply -`COUNT()` aggregate function to it. The below query is similiar to the above -one. - -``` -cube=> SELECT COUNT(count) FROM Orders; - COUNT(Orders.count) ---------------------- - 43994 -(1 row) -``` - -There's also universal aggregate function `MEASURE()` that matches any measure type. - -``` -cube=> SELECT MEASURE(count) FROM Orders; - measure(Orders.count) ------------------------ - 43994 -(1 row) -``` - -Let's look at more measures types: - -```javascript -cube('Orders', { - ..., - - measures: { - count: { - type: `count`, - }, - distinctCount: { - sql: `id`, - type: `countDistinct`, - }, - approxDistinctCount: { - sql: `id`, - type: `countDistinctApprox`, - }, - minValue: { - sql: `min_value`, - type: `min` - }, - maxValue: { - sql: `max_value`, - type: `max` - }, - }, -}) -``` - -As we can see, we have a mix of measure types in the above schema. To query -them, we could use the following SQL statements: - -```sql ---- Both the following statements are equivalent -SELECT count FROM Orders -SELECT COUNT(*) FROM Orders - ---- Count distinct, and count distinct approx ---- Both the following statements are equivalent -SELECT distinctCount FROM Orders -SELECT COUNT(DISTINCT distinctCount) FROM Orders - ---- Both the following statements are equivalent -SELECT approxDistinctCount FROM Orders -SELECT COUNT(DISTINCT approxDistinctCount) FROM Orders - ---- Both the following statements are equivalent -SELECT minValue FROM Orders -SELECT MIN(minValue) FROM Orders - ---- Both the following statements are equivalent -SELECT maxValue FROM Orders -SELECT MAX(maxValue) FROM Orders -``` - -### <--{"id" : "Examples"}--> Querying Segments - -Any segments defined in a schema can also be used in Cube SQL queries. Looking -at the schema below, we have one segment `isCompleted`: - -```javascript -cube('Orders', { - ..., - - segments: { - isCompleted: { - sql: `${CUBE}.status = 'completed'`, - }, - }, -}); -``` - -Segments must be used as `boolean` types in Cube SQL queries: - -```sql -WHERE isCompleted = true -``` - -## Custom Authentication - -Cube can be configured with dynamic username & password verification system by -setting a [`checkSqlAuth()`][ref-config-check-sql-auth] function in the -`cube.js` configuration file. This function should verify username and return -object with password and security context. - -If password returned from this function matches provided in connection string -user will be authenticated with provided security context. - -```javascript -module.exports = { - checkSqlAuth: async (req, username) => { - if (username === 'fooUser') { - return { - password: 'mypassword', - securityContext: {}, - }; - } - - throw new Error('Incorrect user name or password'); - }, -}; -``` - -## Security Context (Row-Level Security) - -Cube's SQL API can also use the Security Context for -[Dynamic Schema Creation][ref-dynamic-schemas] or [`queryRewrite`][ref-config-queryrewrite] property in your [`cube.js` -configuration file][ref-config-js]. - -By default, the SQL API uses the current user's Security Context, but this behaviour can be modified so that certain users are allowed to switch. To do this, we must first define which user is allowed to change Security Context: - -First, you need to define what user is allowed to change security context: - -``` -CUBEJS_SQL_SUPER_USER=admin -``` - -If it's not enough for your case, you define your logic for check with `canSwitchSqlUser` property in your [`cube.js` -configuration file][ref-config-js]. - -You can change security context for specific query via virtual filter on: - -```sql -SELECT * FROM Orders WHERE __user = 'anotheruser'; -``` - -## Joins - -SQL API currently does not support `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` and `FULL OUTER JOIN`. -We plan to support these types of joins in future releases. - -SQL API supports `CROSS JOIN` between cubes. -When `CROSS JOIN` is being processed by Cube, it generates proper joining conditions for the underlying data backend. - -For example, the following query joins `Orders` and `Products` tables under the hood by `product_id` in `Orders` and `id` in `Products` exactly the same way as the REST API query does: - -```sql -cube=> SELECT * FROM Orders CROSS JOIN Products LIMIT 5; - count | avgValue | totalValue | number | value | status | createdAt | completedAt | __user | count | name | description | createdAt | __user --------+----------+------------+--------+-------+-----------+----------------------------+----------------------------+--------+-------+---------------------------+------------------------------------+----------------------------+-------- - 1 | 20 | 20 | 40 | 20 | completed | 2020-10-26 00:00:00.000000 | 2020-11-07 00:00:00.000000 | | 1 | Incredible Fresh Chicken | Electronics Generic Fresh Computer | 2020-06-29 00:00:00.000000 | - 1 | 20 | 20 | 14 | 20 | completed | 2021-02-07 00:00:00.000000 | 2021-03-02 00:00:00.000000 | | 1 | Unbranded Wooden Mouse | Outdoors Incredible Rubber Car | 2019-07-16 00:00:00.000000 | - 1 | 20 | 20 | 23 | 20 | completed | 2022-07-23 00:00:00.000000 | 2022-08-11 00:00:00.000000 | | 1 | Handcrafted Plastic Chair | Electronics Sleek Rubber Tuna | 2021-02-27 00:00:00.000000 | - 1 | 20 | 20 | 86 | 20 | completed | 2023-04-19 00:00:00.000000 | 2023-04-25 00:00:00.000000 | | 1 | Practical Metal Chicken | Toys Awesome Frozen Chips | 2020-07-24 00:00:00.000000 | - 1 | 20 | 20 | 27 | 20 | completed | 2019-06-27 00:00:00.000000 | 2019-07-21 00:00:00.000000 | | 1 | Sleek Rubber Chair | Computers Refined Cotton Shirt | 2021-09-26 00:00:00.000000 | -(5 rows) -``` - -In the resulting query plan, you won't see any joins as you can't see those for REST API queries either: - -```sql -cube=> EXPLAIN SELECT * FROM Orders CROSS JOIN Products LIMIT 5; - plan_type | plan ----------------+----------------------------- - logical_plan | CubeScan: request={ + - | "measures": [ + - | "Orders.count", + - | "Orders.avgValue", + - | "Orders.totalValue", + - | "Orders.number", + - | "Products.count" + - | ], + - | "dimensions": [ + - | "Orders.value", + - | "Orders.status", + - | "Orders.createdAt", + - | "Orders.completedAt", + - | "Products.name", + - | "Products.description",+ - | "Products.createdAt" + - | ], + - | "segments": [], + - | "limit": 5 + - | } - physical_plan | CubeScanExecutionPlan + - | -(2 rows) -``` - -This feature allows you to `CROSS JOIN` cubes even with transitive joins only. - -Typically in tools that allow defining custom SQL datasets, you'd use joined tables as a dataset SQL. -For example: - -```sql -SELECT o.count as count, p.name as product_name, p.description as product_description FROM Orders o CROSS JOIN Products p -``` -Please note we use aliasing to avoid name clashing between cube members in a resulting data set. -In this case, wrapped SQL will be properly processed by Cube, pushing down all operations to Cube query: - -```sql -cube=> SELECT product_name, SUM(count) FROM ( - SELECT o.count as count, p.name as product_name, p.description as product_description FROM Orders o CROSS JOIN Products p -) joined -GROUP BY 1 -ORDER BY 2 DESC -LIMIT 5; - product_name | SUM(joined.count) ---------------------------+------------------- - Tasty Plastic Mouse | 121 - Intelligent Cotton Ball | 119 - Ergonomic Steel Tuna | 116 - Intelligent Rubber Pants | 116 - Generic Wooden Gloves | 116 -(5 rows) -``` - -We can see this by introspecting explain plan for this query: - -```sql -cube=> EXPLAIN SELECT product_name, SUM(count) FROM ( - SELECT o.count as count, p.name as product_name, p.description as product_description FROM Orders o CROSS JOIN Products p -) joined -GROUP BY 1 -ORDER BY 2 DESC -LIMIT 5; - plan_type | plan ----------------+----------------------- - logical_plan | CubeScan: request={ + - | "measures": [ + - | "Orders.count" + - | ], + - | "dimensions": [ + - | "Products.name" + - | ], + - | "segments": [], + - | "order": [ + - | [ + - | "Orders.count",+ - | "desc" + - | ] + - | ], + - | "limit": 5 + - | } - physical_plan | CubeScanExecutionPlan+ - | -(2 rows) -``` - -Please note even if `product_description` is in the inner selection, it isn't evaluated in the final query as it isn't used in any way. - -As an alternative to achieve joins it is also possible to define proxy dimension or measure inside the -Cube. - -```js -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - joins: { - Users: { - relationship: `belongsTo`, - sql: `${CUBE}.user_id = ${Users}.id`, - }, - }, - - measures: { - count: { - type: `count`, - }, - }, - - dimensions: { - id: { - sql: `id`, - type: `number`, - primaryKey: true, - }, - - // this is proxy dimension - user_city: { - sql: `${Users.city}`, - type: `string`, - }, - }, -}); - -cube(`Users`, { - sql: `SELECT * FROM public.users`, - - measures: {}, - - dimensions: { - id: { - sql: `id`, - type: `number`, - primaryKey: true, - }, - - city: { - sql: `city`, - type: `string`, - }, - }, -}); -``` - -Now, it is possible to get orders count by users city with the following query. - -``` -cube=> SELECT count, user_city FROM Orders; - count | user_city --------+--------------- - 9524 | New York - 9408 | San Francisco - 6360 | Mountain View - 6262 | Seattle - 4393 | Los Angeles - 3183 | Chicago - 3060 | Austin - 1804 | Palo Alto -(8 rows) -``` - -## Limitations - -### <--{"id" : "Limitations"}--> Projection - -`SELECT` statements only support the following projections: - -**`*` for all dimensions:** - -```sql -SELECT * FROM Orders; -``` - -**A valid expression for a dimension or measure:** - -```sql -SELECT COUNT(*) FROM Orders; -``` - -**A valid expression as an alias:** - -```sql -SELECT COUNT(*) AS order_count FROM Orders; -``` - -### <--{"id" : "Limitations"}--> Selection - -Cube SQL supports most conditional checks for the `WHERE` clause. - -**Comparison operators:** - -```sql -WHERE price > 50 -WHERE price >= 50 AND <= 100 -``` - -**Boolean logic:** - -```sql -WHERE isPaid = true - AND isCompleted = false - OR isReviewed = false -``` - -**`IN` operator:**: - -```sql -WHERE status IN ('completed', 'shipped') -WHERE status NOT IN ('processing') -``` - -**`IS NULL`:** - -```sql -WHERE completedAt IS NULL -WHERE completedAt IS NOT NULL -``` - -**`LIKE`:** - -```sql -WHERE name LIKE 'joe' -WHERE name NOT LIKE 'bloggs' -``` - -[ref-config-check-sql-auth]: /config#check-sql-auth -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-js]: /config -[ref-dynamic-schemas]: /schema/dynamic-schema-creation diff --git a/docs/content/Auth/AWS-Cognito.mdx b/docs/content/Auth/AWS-Cognito.mdx deleted file mode 100644 index c48c6abf7c286..0000000000000 --- a/docs/content/Auth/AWS-Cognito.mdx +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: AWS Cognito Guide -permalink: /security/jwt/aws-cognito -category: Authentication & Authorization -subCategory: Guides -menuOrder: 4 ---- - -## Introduction - -In this guide, you'll learn how to integrate AWS Cognito authentication with a -Cube.js deployment. If you already have a pre-existing Cognito User Pool in AWS -that you'd like to re-use, please skip ahead to -[Configure Cube.js](#configure-cube-js). - -## Create and configure a User Pool - -If you haven't already created a User Pool, please follow [the instructions in -the AWS Cognito documentation][link-aws-cognito-hosted-ui] to create one, along -with enabling the Hosted UI. - -### <--{"id" : "Create and configure a User Pool"}--> Custom claims - -To add custom claims to the JWT, you will need to associate [a Lambda -function][link-aws-lambda] to the [Pre Token Generation event -trigger][link-aws-cognito-pre-token] available on your User Pool. - -First, go to the AWS Lambda Console and create new a Lambda function: - -
- -
- -Add the following code to the Lambda function: - -```javascript -exports.handler = (event, context, callback) => { - event.response = { - claimsOverrideDetails: { - claimsToAddOrOverride: { - 'http://localhost:4000/': JSON.stringify({ - company_id: 'company1', - user_id: event.request.userAttributes.sub, - roles: ['user'], - }), - }, - }, - }; - callback(null, event); -}; -``` - -Then navigate to the Amazon Cognito User Pools Console, select Triggers from the -left sidebar and associate the Lambda function you created previously: - -
- -
- -You can find more examples of [modifying claims in JWTs -here][link-aws-cognito-pretoken-example]. - -## Configure Cube.js - -Now we're ready to configure Cube.js to use AWS Cognito. Go to your Cube.js -project and open the `.env` file and add the following, replacing the values -wrapped in `<>`. - -```dotenv -CUBEJS_JWK_URL=https://cognito-idp..amazonaws.com//.well-known/jwks.json -CUBEJS_JWT_AUDIENCE= -CUBEJS_JWT_ISSUER=https://cognito-idp..amazonaws.com/ -CUBEJS_JWT_ALGS=RS256 -CUBEJS_JWT_CLAIMS_NAMESPACE= -``` - -## Testing with the Developer Playground - -### <--{"id" : "Testing with the Developer Playground"}--> Retrieving a JWT - -Go to the [OpenID Playground from Auth0][link-openid-playground] to and click -Configuration. - -
- -
- -Change the Server Template to Custom, and enter the following values: - -
- -
- -- **Discovery Document URL**: - `https://cognito-idp..amazonaws.com//.well-known/openid-configuration` -- **OIDC Client ID**: Retrieve from App Client settings page in AWS Cognito User - Pool Console -- **OIDC Client Secret**: Retrieve from App Client settings page in AWS Cognito - User Pool Console - -Click 'Use Discovery Document' to auto-fill the remaining values, then click -Save. - - - -If you haven't already, go back to the AWS Cognito App Client's settings and add -`https://openidconnect.net/callback` to the list of allowed callback URLs. - - - -Now click Start; and in a separate tab, go to the App Client's settings page and -click the Launch Hosted UI button. - -
- -
- -If the login is successful, you should be redirected to the OpenID Connect -Playground. Click on the Exchange button to exchange the code for your tokens: - -
- -
- -Click Next, and continue on to the next section and click the Verify button to -verify the JWT signature as well as decode the identity token: - -
- -
- -### <--{"id" : "Testing with the Developer Playground"}--> Set JWT in Developer Playground - -Now open the Developer Playground (at `http://localhost:4000`) and on the Build -page, click Add Security Context. - -
- -
- -Click the Token tab, paste the `id_token` from OpenID Playground and click the -Save button. - -
- -
- -Close the popup and use the Developer Playground to make a request. Any schemas -using the [Security Context][ref-sec-ctx] should now work as expected. - -[link-aws-cognito-hosted-ui]: - https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-integration.html#cognito-user-pools-create-an-app-integration -[link-aws-cognito-pre-token]: - https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html -[link-aws-cognito-pretoken-example]: - https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-token-generation.html#aws-lambda-triggers-pre-token-generation-example-1 -[link-aws-lambda]: https://docs.aws.amazon.com/lambda/latest/dg/welcome.html -[link-openid-playground]: https://openidconnect.net/ -[ref-sec-ctx]: /security/context diff --git a/docs/content/Auth/Auth0-Guide.mdx b/docs/content/Auth/Auth0-Guide.mdx deleted file mode 100644 index 6f075571116c2..0000000000000 --- a/docs/content/Auth/Auth0-Guide.mdx +++ /dev/null @@ -1,254 +0,0 @@ ---- -title: Auth0 Guide -permalink: /security/jwt/auth0 -category: Authentication & Authorization -subCategory: Guides -menuOrder: 3 ---- - -## Introduction - -In this guide, you'll learn how to integrate Auth0 authentication with a Cube.js -deployment. If you already have a pre-existing application on Auth0 that you'd -like to re-use, please skip ahead to [Configure Cube.js][ref-config-auth0]. - -We'll be creating an Auth0 [application][link-auth0-docs-app] and -[API][link-auth0-docs-api], configuring a [rule on Auth0][link-auth0-docs-rules] -to add custom claims to vended JWTs, and finally configuring Cube.js to use -Auth0. - -## Create an application - -First, go to the [Auth0 dashboard][link-auth0-app], and click on the -Applications menu option on the left and then click the Create Application -button. - -
- -
- -In the popup, set the name of your application and select Single Page Web -Applications. - -
- -
- -Next, go to the application's settings and add the appropriate callback URLs for -your application (`http://localhost:4000` for the Developer Playground). - -### <--{"id" : "Create an application"}--> Custom claims - -You can also configure custom claims for your JWT token. Auth0 has two SDKs -available; [Auth0.js][link-auth0-js] and the [Auth0 SPA -SDK][link-auth0-spa-sdk]. We recommend using the SPA SDK wherever possible, [as -per Auth0's own developer advice][gh-auth0-spa-sdk-issue34]. If you're using -`@auth0/auth0-angular` or `@auth0/auth0-react`, then the SPA SDK is -automatically included. - -Open the Auth0 dashboard, click on 'Rules' and add a rule to add any custom -claims to the JWT. - -#### Auth0 SPA SDK - - - -Take note of the value of `namespace` here, you will need it later to [configure -Cube.js][ref-config-auth0]. - - - -```javascript -function (user, context, callback) { - const namespace = "http://localhost:4000/"; - context.accessToken[namespace] = - { - 'company_id': 'company1', - 'user_id': user.user_id, - 'roles': ['user'], - }; - callback(null, user, context); -} -``` - -## Create an API - -If you're using the Auth0 SPA SDK, you'll also need to [create an -API][link-auth0-api]. First, go to the [Auth0 dashboard][link-auth0-app] and -click on the APIs menu option from the left sidebar, then click the Create API -button. - -
- -
- -In the 'New API' popup, set a name for this API and an identifier (e.g. -`cubejs-app`), then click the Create button. - -
- -
- - - -Take note of the Identifier here, as it is used to [set the JWT Audience option -in Cube.js][ref-config-auth0]. - - - -In your application code, configure your API identifier as the audience when -initializing Auth0. If you're using the `@auth0/auth-react` package for your -application front-end, this might look something like this: - -```typescript jsx - {}} - audience="cubejs" -> -``` - -Refer to Auth0's documentation for instructions on configuring -[Angular][link-auth0-angular] or [Vue][link-auth0-vue] applications. - -## Configure Cube.js - -Now we're ready to configure Cube.js to use Auth0. Go to your Cube.js project -and open the `.env` file and add the following, replacing the values wrapped in -`<>`. - -```dotenv -CUBEJS_JWK_URL=https://.auth0.com/.well-known/jwks.json -CUBEJS_JWT_AUDIENCE= -CUBEJS_JWT_ISSUER=https://.auth0.com/ -CUBEJS_JWT_ALGS=RS256 -CUBEJS_JWT_CLAIMS_NAMESPACE= -``` - -## Testing with the Developer Playground - -### <--{"id" : "Testing with the Developer Playground"}--> Retrieving a JWT - -Go to the [OpenID Playground from Auth0][link-openid-playground] to and click -Configuration. - -
- -
- -Enter the following values: - -- **Auth0 domain**: `.auth0.com` -- **OIDC Client ID**: Retrieve from Auth0 Application settings page -- **OIDC Client Secret**: Retrieve from Auth0 Application settings page -- **Audience**: Retrieve from Auth0 API settings - -Click 'Use Auth0 Discovery Document' to auto-fill the remaining values, then -click Save. - -
- -
- - - -If you haven't already, go back to the Auth0 application's settings and add -`https://openidconnect.net/callback` to the list of allowed callback URLs. - - - -Now click Start; if the login is successful, you should see the code, as well as -a button called 'Exchange'. Click on it to exchange the code for your tokens: - -
- -
- -Copy the `access_token` from the response, and use the [JWT.IO -Debugger][link-jwt-io-debug] to decode the token and verify any custom claims -were successfully added. - -### <--{"id" : "Testing with the Developer Playground"}--> Set JWT in Developer Playground - -Now open the Developer Playground (at `http://localhost:4000`) and on the Build -page, click Add Security Context. - -
- -
- -Click the Token tab, paste the JWT from OpenID Playground and click the Save -button. - -
- -
- -Close the popup and use the Developer Playground to make a request. Any schemas -using the [Security Context][ref-sec-ctx] should now work as expected. - -## Example - -To help you get up and running, we have [an example project which is configured -to use Auth0][gh-cubejs-auth0-example]. You can use it as a starting point for -your own Cube.js application. You can also use our [Multi-Tenant Analytics with -Auth0 and Cube.js guide][link-multitenant-auth0-guide] for a more detailed -walkthrough. - -[link-auth0-angular]: https://auth0.com/docs/quickstart/spa/angular/01-login -[link-auth0-vue]: https://auth0.com/docs/quickstart/spa/vuejs/01-login -[link-auth0-docs-app]: https://auth0.com/docs/applications -[link-auth0-docs-api]: https://auth0.com/docs/get-started/set-up-apis -[link-auth0-docs-rules]: https://auth0.com/docs/rules -[gh-auth0-spa-sdk-issue34]: - https://github.com/auth0/auth0-spa-js/issues/34#issuecomment-505420895 -[link-auth0-app]: https://manage.auth0.com/ -[link-auth0-js]: https://auth0.com/docs/libraries/auth0js -[link-auth0-spa-sdk]: https://auth0.com/docs/libraries/auth0-spa-js -[link-auth0-api]: - https://auth0.com/docs/tokens/access-tokens#json-web-token-access-tokens -[link-jwt-io-debug]: https://jwt.io/#debugger-io -[link-openid-playground]: https://openidconnect.net/ -[ref-config-auth0]: #configure-cube-js -[ref-sec-ctx]: /security/context -[gh-cubejs-auth0-example]: - https://github.com/cube-js/cube.js/tree/master/examples/auth0 -[link-multitenant-auth0-guide]: https://multi-tenant-analytics.cube.dev/ diff --git a/docs/content/Auth/Overview.mdx b/docs/content/Auth/Overview.mdx deleted file mode 100644 index 99f28cbd8f944..0000000000000 --- a/docs/content/Auth/Overview.mdx +++ /dev/null @@ -1,277 +0,0 @@ ---- -title: Security Overview -menuTitle: Overview -permalink: /security -category: Authentication & Authorization -menuOrder: 1 ---- - -In Cube.js, authorization (or access control) is based on the **security -context**. The diagram below shows how it works during the request processing in -Cube.js: - -
- -
- -Authentication is handled outside of Cube.js. A typical use case would be: - -1. A web server serves an HTML page containing the Cube.js client, which needs - to communicate securely with the Cube.js API. -2. The web server should generate a JWT with an expiry to achieve this. The - server could include the token in the HTML it serves or provide the token to - the frontend via an XHR request, which is then stored it in local storage or - a cookie. -3. The JavaScript client is initialized using this token, and includes it in - calls to the Cube.js API. -4. The token is received by Cube.js, and verified using any available JWKS (if - configured) -5. Once decoded, the token claims are injected into the [security - context][ref-sec-ctx]. - - - -**In development mode, the token is not required for authorization**, but you -can still use it to [pass a security context][ref-sec-ctx]. - - - -## Generating JSON Web Tokens (JWT) - -Authentication tokens are generated based on your API secret. Cube.js CLI -generates an API Secret when a project is scaffolded and saves this value in the -`.env` file as `CUBEJS_API_SECRET`. - -You can generate two types of tokens: - -- Without security context, which will mean that all users will have the same - data access permissions. -- With security context, which will allow you to implement role-based security - models where users will have different levels of access to data. - - - -It is considered best practice to use an `exp` expiration claim to limit the -lifetime of your public tokens. [Learn more in the JWT docs][link-jwt-docs]. - - - -You can find a library to generate JWTs for your programming language -[here][link-jwt-libs]. - -In Node.js, the following code shows how to generate a token which will expire -in 30 days. We recommend using the `jsonwebtoken` package for this. - -```javascript -const jwt = require('jsonwebtoken'); -const CUBE_API_SECRET = 'secret'; - -const cubejsToken = jwt.sign({}, CUBE_API_SECRET, { expiresIn: '30d' }); -``` - -Then, in a web server or cloud function, create a route which generates and -returns a token. In general, you will want to protect the URL that generates -your token using your own user authentication and authorization: - -```javascript -app.use((req, res, next) => { - if (!req.user) { - res.redirect('/login'); - return; - } - next(); -}); - -app.get('/auth/cubejs-token', (req, res) => { - res.json({ - // Take note: cubejs expects the JWT payload to contain an object! - token: jwt.sign(req.user, process.env.CUBEJS_API_SECRET, { - expiresIn: '1d', - }), - }); -}); -``` - -Then, on the client side, (assuming the user is signed in), fetch a token from -the web server: - -```javascript -let apiTokenPromise; - -const cubejsApi = cubejs( - () => { - if (!apiTokenPromise) { - apiTokenPromise = fetch(`${API_URL}/auth/cubejs-token`) - .then((res) => res.json()) - .then((r) => r.token); - } - return apiTokenPromise; - }, - { - apiUrl: `${API_URL}/cubejs-api/v1`, - } -); -``` - -You can optionally store this token in local storage or in a cookie, so that you -can then use it to query the Cube.js API. - -## Using JSON Web Key Sets (JWKS) - -Cube.js has out-of-the-box support for the following identity providers: - -- [Auth0][ref-jwt-auth0] -- [AWS Cognito][ref-jwt-aws-cognito] - - - -If you don't see your identity provider listed, please let us know with a post -under the [Ideas category on our Discourse forum][link-discourse-ideas]. - - - -[link-discourse-ideas]: https://forum.cube.dev/c/ideas/12 -[ref-jwt-auth0]: /security/jwt/auth0 -[ref-jwt-aws-cognito]: /security/jwt/aws-cognito - -### <--{"id" : "Using JSON Web Key Sets (JWKS)"}--> Configuration - -As mentioned previously, Cube.js supports verifying JWTs using industry-standard -JWKS. The JWKS can be provided either from a URL, or as a JSON object conforming -to [JWK specification RFC 7517 Section 4][link-jwk-ref], encoded as a string. - -#### Using a key as a JSON string - -Add the following to your `cube.js` configuration file: - -```javascript -module.exports = { - jwt: { - key: '', - }, -}; -``` - -Or configure the same using environment variables: - -```dotenv -CUBEJS_JWT_KEY='' -``` - -#### Using a key from a URL - - - -When using a URL to fetch the JWKS, Cube.js will automatically cache the -response, re-use it and update if a key rotation has occurred. - - - -Add the following to your `cube.js` configuration file: - -```javascript -module.exports = { - jwt: { - jwkUrl: '', - }, -}; -``` - -Or configure the same using environment variables: - -```dotenv -CUBEJS_JWK_URL='' -``` - -### <--{"id" : "Using JSON Web Key Sets (JWKS)"}--> Verifying claims - -Cube.js can also verify the audience, subject and issuer claims in JWTs. -Similarly to JWK configuration, these can also be configured in the `cube.js` -configuration file: - -```javascript -module.exports = { - jwt: { - audience: '', - issuer: [''], - subject: '', - }, -}; -``` - -Using environment variables: - -```dotenv -CUBEJS_JWT_AUDIENCE='' -CUBEJS_JWT_ISSUER='' -CUBEJS_JWT_SUBJECT='' -``` - -### <--{"id" : "Using JSON Web Key Sets (JWKS)"}--> Custom claims namespace - -Cube.js can also extract claims defined in custom namespaces. Simply specify the -namespace in your `cube.js` configuration file: - -```javascript -module.exports = { - jwt: { - claimsNamespace: 'my-custom-namespace', - }, -}; -``` - -### <--{"id" : "Using JSON Web Key Sets (JWKS)"}--> Caching - -Cube.js caches JWKS by default when -[`CUBEJS_JWK_URL` or `jwt.jwkUrl` is specified](#configuration). - -- If the response contains a `Cache-Control` header, then Cube.js uses it to - determine cache expiry. -- The keys inside the JWKS are checked for expiry values and used for cache - expiry. -- If an inbound request supplies a JWT referencing a key not found in the cache, - the cache is refreshed. - -## Custom authentication - -Cube.js also allows you to provide your own JWT verification logic by setting a -[`checkAuth()`][ref-config-check-auth] function in the `cube.js` configuration -file. This function is expected to verify a JWT and assigns its' claims to the -security context. - - - -Previous versions of Cube.js allowed setting a `checkAuthMiddleware()` -parameter, which is now deprecated. We advise [migrating to a newer version of -Cube.js][ref-config-migrate-cubejs]. - - - -As an example, if you needed to retrieve user information from an LDAP server, -you might do the following: - -```javascript -module.exports = { - checkAuth: async (req, auth) => { - try { - const userInfo = await getUserFromLDAP(req.get('X-LDAP-User-ID')); - req.securityContext = userInfo; - } catch { - throw new Error('Could not authenticate user from LDAP'); - } - }, -}; -``` - -[link-jwt-docs]: - https://github.com/auth0/node-jsonwebtoken#token-expiration-exp-claim -[link-jwt-libs]: https://jwt.io/#libraries-io -[link-jwk-ref]: https://tools.ietf.org/html/rfc7517#section-4 -[ref-config-check-auth]: /config#check-auth -[ref-config-migrate-cubejs]: - /configuration/overview#migration-from-express-to-docker-template -[ref-sec-ctx]: /security/context diff --git a/docs/content/Auth/Security-Context.mdx b/docs/content/Auth/Security-Context.mdx deleted file mode 100644 index 7100199b3e41e..0000000000000 --- a/docs/content/Auth/Security-Context.mdx +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Security Context -permalink: /security/context -category: Authentication & Authorization -menuOrder: 2 ---- - -Your authentication server issues JWTs to your client application, which, when -sent as part of the request, are verified and decoded by Cube.js to get security -context claims to evaluate access control rules. Inbound JWTs are decoded and -verified using industry-standard [JSON Web Key Sets (JWKS)][link-auth0-jwks]. - -For access control or authorization, Cube.js allows you to define granular -access control rules for every cube in your data schema. Cube.js uses both the -request and security context claims in the JWT token to generate a SQL query, -which includes row-level constraints from the access control rules. - -JWTs sent to Cube.js should be passed in the `Authorization: ` header to -authenticate requests. - -JWTs can also be used to pass additional information about the user, known as a -**security context**. A security context is a verified set of claims about the -current user that the Cube.js server can use to ensure that users only have -access to the data that they are authorized to access. - -It will be accessible as the [`securityContext`][ref-config-sec-ctx] property -inside: - -- The [`queryRewrite`][ref-config-queryrewrite] configuration option in your - Cube configuration file. -- the [`COMPILE_CONTEXT`][ref-cubes-compile-ctx] global, which is used to - support [multi-tenant deployments][link-multitenancy]. - -## Using queryRewrite - -You can use [`queryRewrite`][ref-config-queryrewrite] to amend incoming queries -with filters. For example, let's take the following query: - -```json -{ - "dimensions": ["Orders.status"], - "measures": ["Orders.count", "Orders.total"], - "timeDimensions": [ - { - "dimension": "Orders.createdAt", - "dateRange": ["2015-01-01", "2015-12-31"], - "granularity": "month" - } - ] -} -``` - -We'll also use the following as a JWT payload; `user_id`, `sub` and `iat` will -be injected into the security context: - -```json -{ - "sub": "1234567890", - "iat": 1516239022, - "user_id": 131 -} -``` - - - -Cube.js expects the context to be an object. If you don't provide an object as -the JWT payload, you will receive the following error: - -``` -Cannot create proxy with a non-object as target or handler -``` - - - -To ensure that users making this query only receive their own orders, define -`queryRewrite` in the `cube.js` configuration file: - -```javascript -module.exports = { - queryRewrite: (query, { securityContext }) => { - // Ensure `securityContext` has an `id` property - if (!securityContext.user_id) { - throw new Error('No id found in Security Context!'); - } - - query.filters.push({ - member: 'Orders.userId', - operator: 'equals', - values: [securityContext.user_id], - }); - - return query; - }, -}; -``` - -To test this, we can generate an API token as follows: - -```javascript -const jwt = require('jsonwebtoken'); -const CUBE_API_SECRET = 'secret'; - -const cubejsToken = jwt.sign({ user_id: 42 }, CUBEJS_API_SECRET, { - expiresIn: '30d', -}); -``` - -Using this token, we authorize our request to the Cube.js API by passing it in -the Authorization HTTP header. - -```bash -curl \ - -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1Ijp7ImlkIjo0Mn0sImlhdCI6MTU1NjAyNTM1MiwiZXhwIjoxNTU4NjE3MzUyfQ._8QBL6nip6SkIrFzZzGq2nSF8URhl5BSSSGZYp7IJZ4" \ - -G \ - --data-urlencode 'query={"measures":["Orders.count"]}' \ - http://localhost:4000/cubejs-api/v1/load -``` - -And Cube.js will generate the following SQL: - -```sql -SELECT - count(*) "orders.count" - FROM ( - SELECT * FROM public.orders WHERE user_id = 42 - ) AS orders -LIMIT 10000 -``` - -## Using COMPILE_CONTEXT - -In the example below `user_id`, `company_id`, `sub` and `iat` will be injected -into the security context and will be accessible in both the [Security -Context][ref-schema-sec-ctx] and [`COMPILE_CONTEXT`][ref-cubes-compile-ctx] -global variable in the Cube.js Data Schema. - - - -`COMPILE_CONTEXT` is used by Cube.js at schema compilation time, which allows -changing the underlying dataset completely; the Security Context is only used at -query execution time, which simply filters the dataset with a `WHERE` clause. - - - -```json -{ - "sub": "1234567890", - "iat": 1516239022, - "user_id": 131, - "company_id": 500 -} -``` - -With the same JWT payload as before, we can modify schemas before they are -compiled. The following schema will ensure users only see results for their -`company_id` in a multi-tenant deployment: - -```javascript -const { - securityContext: { company_id }, -} = COMPILE_CONTEXT; - -cube(`Orders`, { - sql: `SELECT * FROM ${company_id}.orders`, - - measures: { - count: { - type: `count`, - }, - }, -}); -``` - -### <--{"id" : "Using COMPILE_CONTEXT"}--> Usage with Pre-Aggregations - -To generate pre-aggregations that rely on `COMPILE_CONTEXT`, [configure -`scheduledRefreshContexts` in your `cube.js` configuration -file][ref-config-sched-refresh]. - -## Testing during development - -During development, it is often useful to be able to edit the security context -to test access control rules. The [Developer -Playground][ref-devtools-playground] allows you to set your own JWTs, or you can -build one from a JSON object. - -[link-auth0-jwks]: - https://auth0.com/docs/tokens/json-web-tokens/json-web-key-sets -[link-multitenancy]: /multitenancy-setup -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-sched-refresh]: /config#scheduled-refresh-contexts -[ref-config-sec-ctx]: /config#security-context -[ref-schema-sec-ctx]: /schema/reference/cube#security-context -[ref-cubes-compile-ctx]: https://cube.dev/docs/cube#compile-context -[ref-devtools-playground]: - /dev-tools/dev-playground#editing-the-security-context diff --git a/docs/content/Auth/auth0-01-new-app-01.png b/docs/content/Auth/auth0-01-new-app-01.png deleted file mode 100755 index 5d837d595ffdd..0000000000000 Binary files a/docs/content/Auth/auth0-01-new-app-01.png and /dev/null differ diff --git a/docs/content/Auth/auth0-01-new-app-02.png b/docs/content/Auth/auth0-01-new-app-02.png deleted file mode 100755 index 0f13cff192f46..0000000000000 Binary files a/docs/content/Auth/auth0-01-new-app-02.png and /dev/null differ diff --git a/docs/content/Auth/auth0-02-new-api-01.png b/docs/content/Auth/auth0-02-new-api-01.png deleted file mode 100755 index a06c2936e510e..0000000000000 Binary files a/docs/content/Auth/auth0-02-new-api-01.png and /dev/null differ diff --git a/docs/content/Auth/auth0-02-new-api-02.png b/docs/content/Auth/auth0-02-new-api-02.png deleted file mode 100755 index f31d30a50e859..0000000000000 Binary files a/docs/content/Auth/auth0-02-new-api-02.png and /dev/null differ diff --git a/docs/content/Auth/auth0-03-get-jwt-01.png b/docs/content/Auth/auth0-03-get-jwt-01.png deleted file mode 100755 index a316d1ac6a2a7..0000000000000 Binary files a/docs/content/Auth/auth0-03-get-jwt-01.png and /dev/null differ diff --git a/docs/content/Auth/auth0-03-get-jwt-02.png b/docs/content/Auth/auth0-03-get-jwt-02.png deleted file mode 100755 index 5124316b5a401..0000000000000 Binary files a/docs/content/Auth/auth0-03-get-jwt-02.png and /dev/null differ diff --git a/docs/content/Auth/auth0-03-get-jwt-03.png b/docs/content/Auth/auth0-03-get-jwt-03.png deleted file mode 100755 index 2dbfd338d740a..0000000000000 Binary files a/docs/content/Auth/auth0-03-get-jwt-03.png and /dev/null differ diff --git a/docs/content/Auth/auth0-04-dev-playground-01.png b/docs/content/Auth/auth0-04-dev-playground-01.png deleted file mode 100755 index a48289946a1b3..0000000000000 Binary files a/docs/content/Auth/auth0-04-dev-playground-01.png and /dev/null differ diff --git a/docs/content/Auth/auth0-04-dev-playground-02.png b/docs/content/Auth/auth0-04-dev-playground-02.png deleted file mode 100755 index ac57f87173623..0000000000000 Binary files a/docs/content/Auth/auth0-04-dev-playground-02.png and /dev/null differ diff --git a/docs/content/Auth/cognito-01-create-lambda-01.png b/docs/content/Auth/cognito-01-create-lambda-01.png deleted file mode 100755 index e7571999d4cf6..0000000000000 Binary files a/docs/content/Auth/cognito-01-create-lambda-01.png and /dev/null differ diff --git a/docs/content/Auth/cognito-01-create-lambda-02.png b/docs/content/Auth/cognito-01-create-lambda-02.png deleted file mode 100755 index a312dca54e274..0000000000000 Binary files a/docs/content/Auth/cognito-01-create-lambda-02.png and /dev/null differ diff --git a/docs/content/Auth/cognito-get-jwt-02.png b/docs/content/Auth/cognito-get-jwt-02.png deleted file mode 100755 index a8a954c6c1520..0000000000000 Binary files a/docs/content/Auth/cognito-get-jwt-02.png and /dev/null differ diff --git a/docs/content/Auth/cognito-get-jwt-03.png b/docs/content/Auth/cognito-get-jwt-03.png deleted file mode 100755 index a6ff2f346b41a..0000000000000 Binary files a/docs/content/Auth/cognito-get-jwt-03.png and /dev/null differ diff --git a/docs/content/Auth/cognito-get-jwt-04.png b/docs/content/Auth/cognito-get-jwt-04.png deleted file mode 100755 index da83d61b73a15..0000000000000 Binary files a/docs/content/Auth/cognito-get-jwt-04.png and /dev/null differ diff --git a/docs/content/Auth/cognito-get-jwt-05.png b/docs/content/Auth/cognito-get-jwt-05.png deleted file mode 100755 index 27bc99aaf22e9..0000000000000 Binary files a/docs/content/Auth/cognito-get-jwt-05.png and /dev/null differ diff --git a/docs/content/Caching/Getting-Started-Pre-Aggregations.md b/docs/content/Caching/Getting-Started-Pre-Aggregations.md deleted file mode 100644 index a730430ac7a56..0000000000000 --- a/docs/content/Caching/Getting-Started-Pre-Aggregations.md +++ /dev/null @@ -1,496 +0,0 @@ ---- -title: Getting Started with Pre-Aggregations -permalink: /caching/pre-aggregations/getting-started -category: Caching -menuOrder: 2 ---- - -Often at the beginning of an analytical application's lifecycle - when there is -a smaller dataset that queries execute over - the application works well and -delivers responses within acceptable thresholds. However, as the size of the -dataset grows, the time-to-response from a user's perspective can often suffer -quite heavily. This is true of both application and purpose-built data -warehousing solutions. - -This leaves us with a chicken-and-egg problem; application databases can deliver -low-latency responses with small-to-large datasets, but struggle with massive -analytical datasets; data warehousing solutions _usually_ make no guarantees -except to deliver a response, which means latency can vary wildly on a -query-to-query basis. - -| Database Type | Low Latency? | Massive Datasets? | -| ------------------------------ | ------------ | ----------------- | -| Application (Postgres/MySQL) | ✅ | ❌ | -| Analytical (BigQuery/Redshift) | ❌ | ✅ | - -Cube.js provides a solution to this problem: pre-aggregations. In layman's -terms, a pre-aggregation is a condensed version of the source data. It specifies -attributes from the source, which Cube.js uses to condense (or crunch) the data. -This simple yet powerful optimization can reduce the size of the dataset by -several orders of magnitude, and ensures subsequent queries can be served by the -same condensed dataset if any matching attributes are found. - -[Pre-aggregations are defined within each cube's data -schema][ref-schema-preaggs], and cubes can have as many pre-aggregations as they -require. The pre-aggregated data [can be stored either alongside the source data -in the same database, in an external database][ref-caching-preaggs-storage] that -is supported by Cube.js, [or in Cube Store, a dedicated pre-aggregation storage -layer][ref-caching-preaggs-cubestore]. - -## Pre-Aggregations without Time Dimension - -To illustrate pre-aggregations with an example, let's use a sample e-commerce -database. We have a schema representing all our `Orders`: - -```javascript -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - measures: { - count: { - type: `count`, - drillMembers: [id, createdAt], - }, - }, - - dimensions: { - status: { - sql: `status`, - type: `string`, - }, - - id: { - sql: `id`, - type: `number`, - primaryKey: true, - }, - - completedAt: { - sql: `completed_at`, - type: `time`, - }, - }, -}); -``` - -Some sample data from this table might look like: - -| **id** | **status** | **completed_at** | -| ------ | ---------- | ----------------------- | -| 1 | completed | 2021-02-15T12:21:11.290 | -| 2 | completed | 2021-02-25T18:15:12.369 | -| 3 | shipped | 2021-03-15T20:40:57.404 | -| 4 | processing | 2021-03-13T10:30:21.360 | -| 5 | completed | 2021-03-10T18:25:32.109 | - -Our first requirement is to populate a dropdown in our front-end application -which shows all possible statuses. The Cube.js query to retrieve this -information might look something like: - -```json -{ - "dimensions": ["Orders.status"] -} -``` - -```javascript -cube(`Orders`, { - // Same content as before, but including the following: - preAggregations: { - orderStatuses: { - dimensions: [status], - }, - }, -}); -``` - -## Pre-Aggregations with Time Dimension - -Using the same schema as before, we are now finding that users frequently query -for the number of orders completed per day, and that this query is performing -poorly. This query might look something like: - -```json -{ - "measures": ["Orders.count"], - "timeDimensions": ["Orders.completedAt"] -} -``` - -In order to improve the performance of this query, we can add another -pre-aggregation definition to the `Orders` schema: - -```javascript -cube(`Orders`, { - // Same content as before, but including the following: - preAggregations: { - ordersByCompletedAt: { - measures: [count], - timeDimension: completedAt, - granularity: `month`, - }, - }, -}); -``` - -Note that we have added a `granularity` property with a value of `month` to this -definition. This allows Cube.js to aggregate the dataset to a single entry for -each month. - -The next time the API receives the same JSON query, Cube.js will build (if it -doesn't already exist) the pre-aggregated dataset, store it in the source -database server and use that dataset for any subsequent queries. A sample of the -data in this pre-aggregated dataset might look like: - -| **completed_at** | **count** | -| ----------------------- | --------- | -| 2021-02-01T00:00:00.000 | 2 | -| 2021-03-01T00:00:00.000 | 3 | - -## Keeping pre-aggregations up-to-date - -Pre-aggregations can become out-of-date or out-of-sync if the original dataset -changes. [Cube.js uses a refresh key to check the freshness of the -data][ref-caching-preaggs-refresh]; if a change in the refresh key is detected, -the pre-aggregations are rebuilt. These refreshes are performed in the -background as a scheduled process, unless configured otherwise. - -## Ensuring pre-aggregations are targeted by queries - -Cube.js selects the best available pre-aggregation based on the incoming queries -it receives via the API. The process for selection is summarized below: - -1. Are all measures of type `count`, `sum`, `min`, `max` or - `countDistinctApprox`? - -2. If yes, then check if - - - The pre-aggregation contains all dimensions, filter dimensions and leaf - measures from the query - - The measures aren't multiplied ([via a `hasMany` - relation][ref-schema-joins-hasmany]) - -3. If no, then check if - - - The query's time dimension granularity is set - - All query filter dimensions are included in query dimensions - - The pre-aggregation defines the **exact** set of dimensions and measures - used in the query - -You can find a complete flowchart [here][self-select-pre-agg]. - -### <--{"id" : "Ensuring pre-aggregations are targeted by queries"}--> Additivity - -So far, we've described pre-aggregations as aggregated versions of your existing -data. However, there are some rules that apply when Cube.js uses the -pre-aggregation. The **additivity** of fields specified in both the query and in -the pre-aggregation determines this. - -So what is additivity? Let's add another cube called `LineItems` to the previous -example to demonstrate. The `LineItems` **belong to** the `Orders` cube, and are -[joined][ref-schema-joins] as such: - -```javascript -cube(`LineItems`, { - sql: `SELECT * FROM public.line_items`, - - joins: { - Orders: { - sql: `${CUBE}.order_id = ${Orders}.id`, - relationship: `belongsTo`, - }, - }, - - measures: { - count: { - type: `count`, - drillMembers: [id, createdAt], - }, - }, - - dimensions: { - id: { - sql: `id`, - type: `number`, - primaryKey: true, - }, - - createdAt: { - sql: `created_at`, - type: `time`, - }, - }, -}); -``` - -Some sample data from the `line_items` table might look like: - -| **id** | **product_id** | **order_id** | **quantity** | **price** | **profit_margin** | **created_at** | -| ------ | -------------- | ------------ | ------------ | --------- | ----------------- | -------------------------- | -| 1 | 31 | 1 | 1 | 275 | 1 | 2021-01-20 00:00:00.000000 | -| 2 | 49 | 2 | 6 | 248 | 0.1 | 2021-01-20 00:00:00.000000 | -| 3 | 89 | 3 | 6 | 197 | 0.35 | 2021-01-21 00:00:00.000000 | -| 4 | 71 | 4 | 8 | 223 | 0.15 | 2021-01-21 00:00:00.000000 | -| 5 | 64 | 5 | 5 | 75 | 0.75 | 2021-01-22 00:00:00.000000 | -| 6 | 62 | 6 | 8 | 75 | 0.65 | 2021-01-22 00:00:00.000000 | - -Looking at the raw data, we can see that if the data were to be aggregated by -`created_at`, then we could simply add together the `quantity` and `price` -fields and still get a correct result: - -| **created_at** | **quantity** | **price** | -| -------------------------- | ------------ | --------- | -| 2021-01-20 00:00:00.000000 | 7 | 523 | -| 2021-01-21 00:00:00.000000 | 14 | 420 | -| 2021-01-22 00:00:00.000000 | 13 | 150 | - -This means that `quantity` and `price` are both **additive measures**, and we -can represent them in the `LineItems` schema as follows: - -```javascript -cube(`LineItems`, { - ..., - measures: { - ..., - quantity: { - sql: `quantity`, - type: `sum`, - }, - price: { - type: `sum`, - sql: `price`, - format: `currency`, - }, - }, - ..., -}); -``` - -Because neither `quantity` and `price` reference any other measures in our -`LineItems` cube, we can also say that they are **additive leaf measures**. Any -query requesting only these two measures can be called a **leaf measure -additive** query. Additive leaf measures can only be of the following -[types][ref-schema-types-measure]: `count`, `sum`, `min`, `max` or -`countDistinctApprox`. - -[ref-schema-types-measure]: /types-and-formats#measures-types - -### <--{"id" : "Ensuring pre-aggregations are targeted by queries"}--> Non-Additivity - -Using the same sample data for `line_items`, there's a `profit_margin` field -which is different for each row. However, despite the value being numerical, it -doesn't actually make sense to add up this value. Let's look at the rows for -`2021-01-20` in the sample data: - -| **id** | **product_id** | **order_id** | **quantity** | **price** | **profit_margin** | **created_at** | -| ------ | -------------- | ------------ | ------------ | --------- | ----------------- | -------------------------- | -| 1 | 31 | 1 | 1 | 275 | 1 | 2021-01-20 00:00:00.000000 | -| 2 | 49 | 2 | 6 | 248 | 0.1 | 2021-01-20 00:00:00.000000 | - -And now let's try and aggregate them: - -| **created_at** | **quantity** | **price** | **profit_margin** | -| -------------------------- | ------------ | --------- | ----------------- | -| 2021-01-20 00:00:00.000000 | 7 | 523 | 1.1 | - -Using the source data, we'll manually calculate the profit margin and see if it -matches the above. We'll use the following formula: - -$$ -x + (x * y) = z -$$ - -Where `x` is the original cost of the item, `y` is the profit margin and `z` is -the price the item was sold for. Let's use the formula to find the original cost -for both items sold on `2021-01-20`. For the row with `id = 1`: - -$$ -x + (x * 1) = 275\\ -2x = 275\\ -x = 275 / 2\\ -x = 137.5 -$$ - -And for the row where `id = 2`: - -$$ -x + (x * 0.1) = 248\\ -1.1x = 248\\ -x = 248 / 1.1\\ -x = 225.454545454545455 -$$ - -Which means the total cost for both items was: - -$$ -225.454545454545455 + 137.5\\ -362.954545454545455 -$$ - -Now that we have the cost of each item, let's use the same formula in reverse to -see if applying a profit margin of `1.1` will give us the same total price -(`523`) as calculated earlier: - -$$ -362.954545454545455 + (362.954545454545455 * 1.1) = z\\ -762.204545454545455 = z\\ -z = 762.204545454545455 -$$ - -We can clearly see that `523` **does not** equal `762.204545454545455`, and we -cannot treat the `profit_margin` column the same as we would any other additive -measure. Armed with the above knowledge, we can add the `profit_margin` field to -our schema **as a [dimension][ref-schema-dims]**: - -```javascript -cube(`LineItems`, { - ..., - dimensions: { - ..., - profitMargin: { - sql: `profit_margin`, - type: `number`, - format: 'percentage', - }, - }, - ..., -}); -``` - -Another approach might be to calculate the profit margin dynamically, and -instead saving the "cost" price. Because the cost price is an additive measure, -we are able to store it in a pre-aggregation: - -```javascript -cube(`LineItems`, { - ..., - measures: { - ..., - cost: { - sql: `${CUBE.price} / (1 + ${CUBE.profitMargin})`, - type: `sum`, - }, - }, - ..., -}); -``` - -Another example of a non-additive measure would be a distinct count of -`product_id`. If we took the distinct count of products sold over a month, and -then tried to sum the distinct count of products for each individual day and -compared them, we would not get the same results. We can add the measure like -this: - -```javascript -cube(`LineItems`, { - ..., - measures: { - ..., - countDistinctProducts: { - sql: `product_id`, - type: `countDistinct`, - }, - }, - ..., -}); -``` - -However the above cannot be used in for a pre-aggregation. We can instead change -the `type` to `countDistinctApprox`, and then use the measure in a -pre-aggregation definition: - -```javascript -cube(`LineItems`, { - ..., - measures: { - ..., - countDistinctProducts: { - sql: `product_id`, - type: `countDistinctApprox`, - }, - }, - preAggregations: { - myRollup: { - ..., - measures: [ CUBE.countDistinctProducts ], - } - }, - ..., -}); -``` - -### <--{"id" : "Ensuring pre-aggregations are targeted by queries"}--> Selecting the pre-aggregation - -To recap what we've learnt so far: - -- **Additive measures** are measures whose values can be added together - -- **Multiplied measures** are measures that define `hasMany` relations - -- **Leaf measures** are measures that do not reference any other measures in - their definition - -- **Calculated measures** are measures that reference other dimensions and - measures in their definition - -- A query is **leaf measure additive** if all of its leaf measures are one of: - `count`, `sum`, `min`, `max` or `countDistinctApprox` - -Cube looks for matching pre-aggregations in the order they are defined in a -cube's schema file. Each defined pre-aggregation is then tested for a match -based on the criteria in the flowchart below: - -
- Pre-Aggregation Selection Flowchart -
- -Some extra considerations for pre-aggregation selection: - -- The query's time dimension and granularity must match the pre-aggregation. - -- The query's time dimension and granularity together act as a dimension. If the - date range isn't aligned with granularity, a common granularity is used. This - common granularity is selected using the [greatest common divisor][wiki-gcd] - across both the query and pre-aggregation. For example, the common granularity - between `hour` and `day` is `hour` because both `hour` and `day` can be - divided by `hour`. - -- The query's granularity's date range must match the start date and end date - from the time dimensions. For example, when using a granularity of `month`, - the values should be the start and end days of the month i.e. - `['2020-01-01T00:00:00.000', '2020-01-31T23:59:59.999']`; when the granularity - is `day`, the values should be the start and end hours of the day i.e. - `['2020-01-01T00:00:00.000', '2020-01-01T23:59:59.999']`. Date ranges are - inclusive, and the minimum granularity is `second`. - -- The order in which pre-aggregations are defined in schemas matter; the first - matching pre-aggregation for a query is the one that is used. Both the - measures and dimensions of any cubes specified in the query are checked to - find a matching `rollup`. - -- `rollup` pre-aggregations **always** have priority over `originalSql`. Thus, - if you have both `originalSql` and `rollup` defined, Cube.js will try to match - `rollup` pre-aggregations before trying to match `originalSql`. You can - instruct Cube.js to use the original SQL pre-aggregations by using - [`useOriginalSqlPreAggregations`][ref-schema-preaggs-origsql]. - -[ref-caching-preaggs-cubestore]: - /caching/using-pre-aggregations#pre-aggregations-storage -[ref-caching-preaggs-refresh]: /caching/using-pre-aggregations#refresh-strategy -[ref-caching-preaggs-storage]: - /caching/using-pre-aggregations#pre-aggregations-storage -[ref-schema-dims]: /schema/reference/dimensions -[ref-schema-joins]: /schema/reference/joins -[ref-schema-joins-hasmany]: /schema/reference/joins#relationship -[ref-schema-preaggs]: /schema/reference/pre-aggregations -[ref-schema-preaggs-origsql]: - /schema/reference/pre-aggregations#type-originalsql -[self-select-pre-agg]: #selecting-the-pre-aggregation -[wiki-gcd]: https://en.wikipedia.org/wiki/Greatest_common_divisor diff --git a/docs/content/Caching/Lambda-Pre-Aggregations.mdx b/docs/content/Caching/Lambda-Pre-Aggregations.mdx deleted file mode 100644 index 3a7b2c7a3c98b..0000000000000 --- a/docs/content/Caching/Lambda-Pre-Aggregations.mdx +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Lambda Pre-Aggregations -permalink: /caching/pre-aggregations/lambda-pre-aggregations -category: Caching -menuOrder: 4 ---- - -Lambda pre-aggregations follow the [Lambda architecture](https://en.wikipedia.org/wiki/Lambda_architecture) design to union real-time and batch data. Cube acts as a serving layer and uses pre-aggregations as a batch layer and source data or other pre-aggregations, usually [streaming][streaming-pre-agg], as a speed layer. - - - -Lambda pre-aggregations only work with Cube Store. - -Additionally, we’re going to remove support for external storages, other than Cube Store, later this year. [Cube Store will replace Redis](https://cube.dev/blog/replacing-redis-with-cube-store) and, therefore will be a required component to run Cube even without pre-aggregations. - - - -## Use cases - -Below we are looking at the most common examples of using lambda pre-aggregations. - -### Batch and source data - -Batch data is coming from pre-aggregation and real-time data is coming from the data source. - -
- Lambda pre-aggregation batch and source diagram -
- -First, you need to create pre-aggregations that will contain your batch data. In the following example, we call it **batch.** Please note, it must have `timeDimension`, and Cube will use it to union batch data with source data. - -You control the batch part of your data with `buildRangeStart` and `buildRangeEnd` properties of pre-aggregation to determine specific window for your batched data. - -Next, you need to create a lambda pre-aggregation. To do that, create pre-aggregation with type `rollupLambda`, specify rollups you would like to use with `rollups` property, and finally set `unionWithSourceData: true` to use source data as a real-time layer. - -Please make sure that the lambda pre-aggregation definition comes first when defining your pre-aggregations. - - -```js -lambda: { - type: `rollupLambda`, - unionWithSourceData: true, - rollups: [Users.batch] -}, -batch: { - measures: [Users.count], - dimensions: [Users.name], - timeDimension: Users.createdAt, - granularity: `day`, - buildRangeStart: { - sql: `SELECT '2020-01-01'` - }, - buildRangeEnd: { - sql: `SELECT '2022-05-30'` - } -} -``` - -### Batch and streaming data - -In this scenario, batch data is comes from one pre-aggregation and real-time data comes from a [streaming pre-aggregation][streaming-pre-agg]. - -
- Lambda pre-aggregation batch and streaming diagram -
- - -You can use lambda pre-aggregations to combine data from multiple pre-aggregation, where one pre-aggregation can have batch data and another streaming. - -```js -batchStreamingLambda: { - type: `rollupLambda`, - rollups: [Users.batch, streaming] -}, -batch: { - type: `rollup`, - measures: [Users.count], - dimensions: [Users.name], - timeDimension: Users.createdAt, - granularity: `day`, - buildRangeStart: { - sql: `SELECT '2020-01-01'` - }, - buildRangeEnd: { - sql: `SELECT '2022-05-30'` - } -}, -streaming: { - type: `rollup`, - measures: [StreamingUsers.count], - dimensions: [StreamingUsers.name], - timeDimension: StreamingUsers.createdAt, - granularity: `day` -} -``` - -[streaming-pre-agg]: /caching/using-pre-aggregations#streaming-pre-aggregations \ No newline at end of file diff --git a/docs/content/Caching/Overview.mdx b/docs/content/Caching/Overview.mdx deleted file mode 100644 index f077928e508cb..0000000000000 --- a/docs/content/Caching/Overview.mdx +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Caching Overview -menuTitle: Overview -permalink: /caching -category: Caching -menuOrder: 1 ---- - -Cube.js provides a two-level caching system. The first level is **in-memory** -cache and is active by default. Currently, [Redis][link-redis] is being used for -in-memory cache and queue management for [clustered Cube -deployments][ref-production-checklist]. Cube Store will [replace -Redis][replace-redis] in late -2022. - -Cube.js [in-memory cache](#in-memory-cache) acts as a buffer for your database -when there's a burst of requests hitting the same data from multiple concurrent -users while [pre-aggregations](#pre-aggregations) are designed to provide the -right balance between time to insight and querying performance. - -To reset the **in-memory** cache in development mode, just restart the server. - -The second level of caching is called **pre-aggregations**, and requires -explicit configuration to activate. - -We do not recommend changing the default **in-memory** caching configuration -unless it is necessary. To speed up query performance, consider using -**pre-aggregations**. - -## Pre-Aggregations - -Pre-aggregations is a layer of the aggregated data built and refreshed by -Cube.js. It can dramatically improve the query performance and provide a higher -concurrency. - - - -To start building pre-aggregations, Cube.js requires write access to the -[pre-aggregations schema][ref-config-preagg-schema] in the source database. -Cube.js first builds pre-aggregations as tables in the source database and then -exports them into the pre-aggregations storage. - - - -Pre-aggregations are defined in the data schema. You can learn more about -defining pre-aggregations in [schema reference][ref-schema-ref-preaggs]. - -```js -cube(`Orders`, { - measures: { - totalAmount: { - sql: `amount`, - type: `sum`, - }, - }, - - dimensions: { - createdAt: { - sql: `created_at`, - type: `time`, - }, - }, - - preAggregations: { - amountByCreated: { - measures: [totalAmount], - timeDimension: createdAt, - granularity: `month`, - }, - }, -}); -``` - -## In-memory Cache - -Cube.js caches the results of executed queries using in-memory cache. The cache -key is a generated SQL statement with any existing query-dependent -pre-aggregations. - -Upon receiving an incoming request, Cube.js first checks the cache using this -key. If nothing is found in the cache, the query is executed in the database and -the result set is returned as well as updating the cache. - -If an existing value is present in the cache and the `refreshKey` value for the -query hasn't changed, the cached value will be returned. Otherwise, an SQL query -will be executed against either the pre-aggregations storage or the source -database to populate the cache with the results and return them. - -### <--{"id" : "In-memory Cache"}--> Refresh Keys - -Cube.js takes great care to prevent unnecessary queries from hitting your -database. The first stage caching system caches query results, but Cube.js needs a way to know if the data powering that query result has changed. If the underlying data isn't any -different, the cached result is valid and can be returned skipping an expensive -query, but if there is a difference, the query needs to be re-run and its result -cached. - -To aid with this, Cube.js defines a `refreshKey` for each cube. [Refresh -keys][ref-schema-ref-cube-refresh-key] are evaluated by Cube.js to assess if the -data needs to be refreshed. - -```js -cube(`Orders`, { - // This refreshKey tells Cube.js to refresh data every 5 minutes - refreshKey: { - every: `5 minute`, - }, - - // With this refreshKey Cube.js will only refresh the data if - // the value of previous MAX(created_at) changed - // By default Cube.js will check this refreshKey every 10 seconds - refreshKey: { - sql: `SELECT MAX(created_at) FROM orders`, - }, -}); -``` - -By default, Cube.js will check and invalidate the cache in the background when -in [development mode][ref-development-mode]. In production environments, we -recommend [running a Refresh Worker as a separate -instance][ref-production-checklist-refresh]. - -We recommend enabling background cache invalidation in a separate Cube.js worker -for production deployments. Please consult the [Production -Checklist][ref-production-checklist] for more information. - -If background refresh is disabled, Cube.js will refresh the cache during query -execution. Since this could lead to delays in responding to end-users, we -recommend always enabling background refresh. - -### <--{"id" : "In-memory Cache"}--> Default Refresh Keys - -The default values for `refreshKey` are - -- `every: '2 minute'` for BigQuery, Athena, Snowflake, and Presto. -- `every: '10 second'` for all other databases. - -+You can use a custom SQL query to check if a refresh is required by changing -the [`refreshKey`][ref-schema-ref-cube-refresh-key] property in a cube's Data -Schema. Often, a `MAX(updated_at_timestamp)` for OLTP data is a viable option, -or examining a metadata table for whatever system is managing the data to see -when it last ran. - -### <--{"id" : "In-memory Cache"}--> Disabling the cache - -There's no straightforward way to disable caching in Cube.js. The reason is that -Cube.js not only stores cached values but also uses the cache as a point of -synchronization and coordination between nodes in a cluster. For the sake of -design simplicity, Cube.js doesn't distinguish client invocations, and all calls -to the data load API are idempotent. This provides excellent reliability and -scalability but has some drawbacks. One of those load data calls can't be traced -to specific clients, and as a consequence, there's no guaranteed way for a -client to initiate a new data loading query or know if the current invocation -wasn't initiated earlier by another client. Only Refresh Key freshness -guarantees are provided in this case. - -For situations like real-time analytics or responding to live user changes to -underlying data, the `refreshKey` query cache can prevent fresh data from -showing up immediately. For these situations, the cache can effectively be -disabled by setting the [`refreshKey.every`][ref-schema-ref-cube-refresh-key] -parameter to something very low, like `1 second`. - -## Inspecting Queries - -To inspect whether the query hits in-memory cache, pre-aggregation, or the -underlying data source, you can use the Playground or [Cube -Cloud][link-cube-cloud]. - -[Developer Playground][ref-dev-playground] can be used to inspect a single -query. To do that, click the "cache" button after executing the query. It will -show you the information about the `refreshKey` for the query and whether the -query uses any pre-aggregations. To inspect multiple queries or list existing -pre-aggregations, you can use [Cube Cloud][link-cube-cloud]. - -To inspect queries in the Cube Cloud, navigate to the "History" page. You can -filter queries by multiple parameters on this page, including whether they hit -the cache, pre-aggregations, or raw data. Additionally, you can click on the -query to see its details, such as time spent in the database, the database -queue's size at the point of query execution, generated SQL, query timeline, and -more. It will also show you the optimal pre-aggregations that could be used for -this query. - -To see existing pre-aggregations, navigate to the "Pre-Aggregations" page in the -Cube Cloud. The table shows all the pre-aggregations, the last refresh -timestamp, and the time spent to build the pre-aggregation. You can also inspect -every pre-aggregation's details: the list of queries it serves and all its -versions. - -[link-cube-cloud]: https://cube.dev/cloud -[link-redis]: https://redis.io -[ref-config-preagg-schema]: /config#pre-aggregations-schema -[ref-dev-playground]: /dev-tools/dev-playground -[ref-development-mode]: /configuration/overview#development-mode -[ref-production-checklist]: /deployment/production-checklist -[ref-production-checklist-refresh]: - /deployment/production-checklist#set-up-refresh-worker -[ref-schema-ref-cube-refresh-key]: /schema/reference/cube#refresh-key -[ref-schema-ref-preaggs]: /schema/reference/pre-aggregations -[replace-redis]: https://cube.dev/blog/replacing-redis-with-cube-store diff --git a/docs/content/Caching/Running-in-Production.mdx b/docs/content/Caching/Running-in-Production.mdx deleted file mode 100644 index 7b4e374c0583a..0000000000000 --- a/docs/content/Caching/Running-in-Production.mdx +++ /dev/null @@ -1,280 +0,0 @@ ---- -title: Running in Production -permalink: /caching/running-in-production -category: Caching -menuOrder: 4 ---- - -Cube.js makes use of two different kinds of cache: - -- Redis, for in-memory storage of query results -- Cube Store for storing pre-aggregations - -In development, Cube.js uses in-memory storage on the server. In production, we -**strongly** recommend running Redis as a separate service. - - - -Cube Store [will replace -Redis][replace-redis] for in-memory cache and queue management in late -2022. - - - -Cube Store is enabled by default when running Cube.js in development mode. In -production, Cube Store **must** run as a separate process. The easiest way to do -this is to use the official Docker images for Cube.js and Cube Store. - - - -Using Windows? We **strongly** recommend using [WSL2 for Windows 10][link-wsl2] -to run the following commands. - - - -You can run Cube Store with Docker with the following command: - -```bash -docker run -p 3030:3030 cubejs/cubestore -``` - - - -Cube Store can further be configured via environment variables. To see a -complete reference, please consult the [Cube Store section of the Environment -Variables reference][ref-config-env]. - - - -Next, run Cube.js and tell it to connect to Cube Store running on `localhost` -(on the default port `3030`): - -```bash -docker run -p 4000:4000 \ - -e CUBEJS_CUBESTORE_HOST=localhost \ - -v ${PWD}:/cube/conf \ - cubejs/cube -``` - -In the command above, we're specifying `CUBEJS_CUBESTORE_HOST` to let Cube.js -know where Cube Store is running. - -You can also use Docker Compose to achieve the same: - -```yaml -version: '2.2' -services: - cubestore: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_REMOTE_DIR=/cube/data - volumes: - - .cubestore:/cube/data - - cube: - image: cubejs/cube:latest - ports: - - 4000:4000 - environment: - - CUBEJS_CUBESTORE_HOST=localhost - depends_on: - - cubestore - links: - - cubestore - volumes: - - ./schema:/cube/conf/schema -``` - -## Architecture - -Deep dive on Cube Store architecture can be found in [this presentation](https://docs.google.com/presentation/d/1oQ-koloag0UcL-bUHOpBXK4txpqiGl41rxhgDVrw7gw/). - -## Scaling - - - -Cube Store _can_ be run in a single instance mode, but this is usually -unsuitable for production deployments. For high concurrency and data throughput, -we **strongly** recommend running Cube Store as a cluster of multiple instances -instead. - - - -Scaling Cube Store for a higher concurrency is relatively simple when running in -cluster mode. Because [the storage layer](#storage) is decoupled from the query -processing engine, you can horizontally scale your Cube Store cluster for as -much concurrency as you require. - -In cluster mode, Cube Store runs two kinds of nodes: - -- a single **router** node handles incoming client connections, manages database - metadata and serves simple queries. -- multiple **worker** nodes which execute SQL queries - -The configuration required for each node can be found in the table below. More -information about these variables can be found [in the Environment Variables -reference][ref-config-env]. - -| Environment Variable | Specify on Router? | Specify on Worker? | -| ----------------------- | ------------------ | ------------------ | -| `CUBESTORE_SERVER_NAME` | Yes | Yes | -| `CUBESTORE_META_PORT` | Yes | - | -| `CUBESTORE_WORKERS` | Yes | Yes | -| `CUBESTORE_WORKER_PORT` | - | Yes | -| `CUBESTORE_META_ADDR` | - | Yes | - -`CUBESTORE_WORKERS` and `CUBESTORE_META_ADDR` variables should be set with stable addresses, which should not change. -You can use stable DNS names and put load balancers in front of your worker and router instances to fulfill stable name requirements in environments where stable IP addresses can't be guaranteed. - - - -To fully take advantage of the worker nodes in the cluster, we **strongly** -recommend using [partitioned pre-aggregations][ref-caching-partitioning]. - - - -A sample Docker Compose stack for the single machine setting this up might look like: - -```yaml -version: '2.2' -services: - cubestore_router: - restart: always - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - - CUBESTORE_META_PORT=9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001,cubestore_worker_2:9001 - - CUBESTORE_REMOTE_DIR=/cube/data - volumes: - - .cubestore:/cube/data - cubestore_worker_1: - restart: always - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_worker_1:9001 - - CUBESTORE_WORKER_PORT=9001 - - CUBESTORE_META_ADDR=cubestore_router:9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001,cubestore_worker_2:9001 - - CUBESTORE_REMOTE_DIR=/cube/data - depends_on: - - cubestore_router - volumes: - - .cubestore:/cube/data - cubestore_worker_2: - restart: always - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_worker_2:9001 - - CUBESTORE_WORKER_PORT=9001 - - CUBESTORE_META_ADDR=cubestore_router:9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001,cubestore_worker_2:9001 - - CUBESTORE_REMOTE_DIR=/cube/data - depends_on: - - cubestore_router - volumes: - - .cubestore:/cube/data - cube: - image: cubejs/cube:latest - ports: - - 4000:4000 - environment: - - CUBEJS_CUBESTORE_HOST=cubestore_router - depends_on: - - cubestore_router - volumes: - - .:/cube/conf -``` - -## Replication and High Availability - -The open-source version of Cube Store doesn't support replicating any of its nodes. -The router node and every worker node should always have only one instance copy if served behind the load balancer or service address. -Replication will lead to undefined behavior of the cluster, including connection errors and data loss. -If any cluster node is down, it'll lead to a complete cluster outage. -If Cube Store replication and high availability are required, please consider using Cube Cloud. - -## Storage - - - -Cube Store can only use one type of remote storage at runtime. - - - -Cube Store makes use of a separate storage layer for storing metadata as well as -for persisting pre-aggregations as Parquet files. Cube Store [can be configured -to use either AWS S3 or Google Cloud Storage][ref-config-env-cloud-storage]. -If desired, local path on the server can also be used in case all Cube Store cluster nodes are co-located on a single machine. - - - -Cube Store requires strong consistency guarantees from underlying distributed storage. -AWS S3, Google Cloud Storage, and Azure Blob Storage (Cube Cloud only) are the only known implementations that provide strong consistency. -Using other implementations in production is discouraged and can lead to consistency and data corruption errors. - - - -A simplified example using AWS S3 might look like: - -```yaml -version: '2.2' -services: - cubestore_router: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - - CUBESTORE_META_PORT=9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001 - - CUBESTORE_S3_BUCKET= - - CUBESTORE_S3_REGION= - - CUBESTORE_AWS_ACCESS_KEY_ID= - - CUBESTORE_AWS_SECRET_ACCESS_KEY= - cubestore_worker_1: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_worker_1:9001 - - CUBESTORE_WORKER_PORT=9001 - - CUBESTORE_META_ADDR=cubestore_router:9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001 - - CUBESTORE_S3_BUCKET= - - CUBESTORE_S3_REGION= - - CUBESTORE_AWS_ACCESS_KEY_ID= - - CUBESTORE_AWS_SECRET_ACCESS_KEY= - depends_on: - - cubestore_router -``` - -### Local Storage - -Separately from remote storage, Cube Store requires local scratch space to warm up partitions by downloading Parquet files before querying them. -By default, this directory should be mounted to `.cubestore/data` dir inside contained and can be configured by [CUBESTORE_DATA_DIR][ref-config-env] environment variable. -It is advised to use local SSDs for this scratch space to maximize querying performance. - -### <--{"id" : "Storage"}--> AWS - -Cube Store can retrieve security credentials from instance metadata -automatically. This means you can skip defining the -`CUBESTORE_AWS_ACCESS_KEY_ID` and `CUBESTORE_AWS_SECRET_ACCESS_KEY` environment -variables. - - - -Cube Store currently does not take the key expiration time returned from -instance metadata into account; instead the refresh duration for the key is -defined by `CUBESTORE_AWS_CREDS_REFRESH_EVERY_MINS`, which is set to `180` by -default. - - - -## Security - -Cube Store currently does not have any in-built authentication mechanisms. For -this reason, we recommend running your Cube Store cluster on a network that only -allows requests from the Cube.js deployment. - -[link-wsl2]: https://docs.microsoft.com/en-us/windows/wsl/install-win10 -[ref-caching-partitioning]: /caching/using-pre-aggregations#partitioning -[ref-config-env]: /reference/environment-variables#cube-store -[ref-config-env-cloud-storage]: /reference/environment-variables#cloud-storage -[replace-redis]: https://cube.dev/blog/replacing-redis-with-cube-store diff --git a/docs/content/Caching/Using-Pre-Aggregations.mdx b/docs/content/Caching/Using-Pre-Aggregations.mdx deleted file mode 100644 index 21054a36b5f96..0000000000000 --- a/docs/content/Caching/Using-Pre-Aggregations.mdx +++ /dev/null @@ -1,534 +0,0 @@ ---- -title: Using Pre-Aggregations -permalink: /caching/using-pre-aggregations -category: Caching -menuOrder: 3 ---- - -Pre-aggregations is a powerful way to speed up your Cube.js queries. There are -many configuration options to consider. Please make sure to also check [the -Pre-Aggregations reference in the data schema section][ref-schema-ref-preaggs]. - -## Refresh Strategy - -Refresh strategy can be customized by setting the -[`refreshKey`][ref-schema-ref-preaggs-refresh-key] property for the -pre-aggregation. - -The default value of [`refreshKey`][ref-schema-ref-preaggs-refresh-key] is -`every: '1 hour'`. It can be redefined either by overriding the default value of -the [`every` property][ref-schema-ref-preaggs-refresh-key-every]: - -```javascript -cube(`Orders`, { - - ..., - - preAggregations: { - amountByCreated: { - type: `rollup`, - measures: [amount], - timeDimension: createdAt, - granularity: `month`, - refreshKey: { - every: `12 hour`, - }, - }, - }, -}); -``` - -Or by providing a [`sql` property][ref-schema-ref-preaggs-refresh-key-sql] -instead, and leaving `every` unchanged from its' default value: - -```javascript -cube(`Orders`, { - - ..., - - preAggregations: { - amountByCreated: { - measures: [amount], - timeDimension: createdAt, - granularity: `month`, - refreshKey: { - // every will default to `10 seconds` here - sql: `SELECT MAX(created_at) FROM orders`, - }, - }, - }, -}); -``` - -Or both `every` and `sql` can be defined together: - -```javascript -cube(`Orders`, { - - ..., - - preAggregations: { - amountByCreated: { - measures: [amount], - timeDimension: createdAt, - granularity: `month`, - refreshKey: { - every: `12 hour`, - sql: `SELECT MAX(created_at) FROM orders`, - }, - }, - }, -}); -``` - -When `every` and `sql` are used together, Cube.js will run the query from the -`sql` property on an interval defined by the `every` property. If the query -returns new results, then the pre-aggregation will be refreshed. - -## Rollup Only Mode - -To make Cube.js _only_ serve requests from pre-aggregations, the -[`CUBEJS_ROLLUP_ONLY` environment variable][ref-config-env-general] can be set -to `true` on an API instance. This will prevent serving data on API requests -from the source database. - - - -When using this configuration in a single node deployment (where the API -instance and [Refresh Worker ][ref-deploy-refresh-wrkr] are configured on the -same host), requests made to the API that cannot be satisfied by a rollup throw -an error. Scheduled refreshes will continue to work in the background. - - - -## Partitioning - -[Partitioning][wiki-partitioning] is an extremely effective optimization for -accelerating pre-aggregations build and refresh time. It effectively "shards" -the data between multiple tables, splitting them by a defined attribute. Cube -can be configured to incrementally refresh only the last set of partitions -through the `updateWindow` property. This leads to faster refresh times due to -unnecessary data not being reloaded, and even reduced cost for some databases -like [BigQuery](/config/databases/google-bigquery) or -[AWS Athena](/config/databases/aws-athena). - -Any `rollup` pre-aggregation can be partitioned by time using the -`partitionGranularity` property in [a pre-aggregation -definition][ref-schema-ref-preaggs]. In the example below, the -`partitionGranularity` is set to `month`, which means Cube will generate -separate tables for each month's worth of data. Once built, it will continue to -refresh on a daily basis the last 3 months of data. - -```typescript -cube(`Orders`, { - sql: `select * from orders`, - - ..., - - preAggregations: { - categoryAndDate: { - measures: [Orders.count, revenue], - dimensions: [category], - timeDimension: createdAt, - granularity: `day`, - partitionGranularity: `month`, - refreshKey: { - every: `1 day`, - incremental: true, - updateWindow: `3 months` - } - }, - }, -}); -``` - -## Using Indexes - -For larger pre-aggregations, performance can be significantly improved by adding -an [index][ref-schema-ref-preaggs-index]. This is done by defining the `indexes` -property for a pre-aggregation: - -```typescript -cube(`Orders`, { - ..., - - preAggregations: { - status: { - measures: [CUBE.count], - dimensions: [CUBE.status, Products.name, ProductCategories.name], - timeDimension: CUBE.createdAt, - granularity: `day`, - indexes: { - statusIndex: { - columns: [CUBE.status, Products.name], - }, - aggregatedIndex: { - columns: [CUBE.status], - type: `aggregate`, - }, - }, - }, - }, -}); -``` - -For example, if the pre-aggregated data looks like: - -| created_at | status | products\_\_name | product_categories\_\_name | count | -| ---------- | ---------- | ---------------- | -------------------------- | ----- | -| 2022-08-01 | completed | Plastic Chair | Furniture | 4 | -| 2022-08-01 | processing | Plastic Chair | Furniture | 11 | -| 2022-08-01 | shipped | Plastic Chair | Furniture | 2 | -| 2022-08-01 | completed | Keyboard | Electronics | 1 | -| 2022-08-01 | processing | Keyboard | Electronics | 3 | -| 2022-08-01 | shipped | Keyboard | Electronics | 7 | - -Then the data within `statusIndex` would look like: - -| status | products\_\_name | created_at | product_categories\_\_name | count | -| ---------- | ---------------- | ---------- | -------------------------- | ----- | -| completed | Plastic Chair | 2022-08-01 | Furniture | 4 | -| processing | Plastic Chair | 2022-08-01 | Furniture | 11 | -| shipped | Plastic Chair | 2022-08-01 | Furniture | 2 | -| completed | Keyboard | 2022-08-01 | Electronics | 1 | -| processing | Keyboard | 2022-08-01 | Electronics | 3 | -| shipped | Keyboard | 2022-08-01 | Electronics | 7 | - -And the data within `aggregatedIndex` would look like: - -| status | count | -| ---------- | ----- | -| completed | 5 | -| processing | 14 | -| shipped | 9 | - -## Inspecting Pre-Aggregations - -Cube Store partially supports the MySQL protocol. This allows you to execute -simple queries using a familiar SQL syntax. You can connect using the MySQL CLI -client, for example: - -```bash -mysql -h --user=cubestore -pcubestore -``` - -To check which pre-aggregations are managed by Cube Store, you could run the -following query: - -```sql -SELECT * FROM information_schema.tables; -+----------------------+-----------------------------------------------+ -| table_schema | table_name | -+----------------------+-----------------------------------------------+ -| dev_pre_aggregations | orders_main20190101_23jnqarg_uiyfxd0f_1gifflf | -| dev_pre_aggregations | orders_main20190301_24ph0a1c_utzntnv_1gifflf | -| dev_pre_aggregations | orders_main20190201_zhrh5kj1_rkmsrffi_1gifflf | -| dev_pre_aggregations | orders_main20191001_mdw2hxku_waxajvwc_1gifflf | -| dev_pre_aggregations | orders_main20190701_izc2tl0h_bxsf1zlb_1gifflf | -+----------------------+-----------------------------------------------+ -5 rows in set (0.01 sec) -``` - -These pre-aggregations are stored as Parquet files under the `.cubestore/` -folder in the project root during development. - -### <--{"id" : "Inspecting Pre-Aggregations"}--> EXPLAIN queries - -Cube Store's MySQL protocol also supports `EXPLAIN` and `EXPLAIN ANALYZE` -queries both of which are useful for determining how much processing a query -will require. - -`EXPLAIN` queries show the logical plan for a query: - -```sql - EXPLAIN SELECT orders__platform, orders__gender, sum(orders__count) FROM dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r - GROUP BY orders__gender, orders__platform; -+-------------------------------------------------------------------------------------------------------------------------------------+ -| logical plan | -+--------------------------------------------------------------------------------------------------------------------------------------+ -| Projection, [dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r.orders__platform, dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r.orders__gender, SUM(dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r.orders__count)] - Aggregate - ClusterSend, indices: [[96]] - Scan dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r, source: CubeTable(index: orders_general_plat_gender_o32v4dvq_vbyemtl2_1h5hs8r:96:[123, 126]), fields: [orders__gender, orders__platform, orders__count] | -+-------------------------------------------------------------------------------------------------------------------------------------+ -``` - -`EXPLAIN ANALYZE` queries show the physical plan for the router and all workers -used for query processing: - -```sql - EXPLAIN ANALYZE SELECT orders__platform, orders__gender, sum(orders__count) FROM dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r - GROUP BY orders__gender, orders__platform - -+-----------+-----------------+--------------------------------------------------------------------------------------------------------------------------+ -| node type | node name | physical plan | -+-----------+-----------------+--------------------------------------------------------------------------------------------------------------------------+ -| router | | Projection, [orders__platform, orders__gender, SUM(dev_pre_aggregations.orders_general_o32v4dvq_vbyemtl2_1h5hs8r.orders__count)@2:SUM(orders__count)] - FinalInplaceAggregate - ClusterSend, partitions: [[123, 126]] | -| worker | 127.0.0.1:10001 | PartialInplaceAggregate - Merge - Scan, index: orders_general_plat_gender_o32v4dvq_vbyemtl2_1h5hs8r:96:[123, 126], fields: [orders__gender, orders__platform, orders__count] - Projection, [orders__gender, orders__platform, orders__count] - ParquetScan, files: /.cubestore/data/126-0qtyakym.parquet | -+-----------+-----------------+--------------------------------------------------------------------------------------------------------------------------+ -``` - -## Pre-Aggregations Storage - -The default pre-aggregations storage in Cube is its own purpose-built storage -layer: Cube Store. - -Alternatively, you can store pre-aggregations **internally** in the source -database. To store a pre-aggregation internally, set `external: false` in -pre-aggregation definition. - -Please note, that [originalSql][ref-original-sql] pre-aggregations are stored -**internally** by default. It is not recommended to store `originalSql` -pre-aggregations in Cube Store. - -## Joins between pre-aggregations - - - -This feature is in Preview and the API may change in a future release. Joining -pre-aggregations **only** works with databases of the same type, support for -joining pre-aggregations from different databases is coming soon. - - - -When making a query that joins data from two different cubes, Cube can use -pre-aggregations instead of running the base SQL queries. To get started, first -ensure both cubes have valid pre-aggregations: - -```javascript -// Orders -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - ..., - - preAggregations: { - ordersRollup: { - measures: [CUBE.count], - dimensions: [CUBE.userId, CUBE.status], - timeDimension: CUBE.createdAt, - granularity: `day`, - }, - }, - - joins: { - Users: { - sql: `${CUBE.userId} = ${Users.id}`, - relationship: `belongsTo` - }, - }, -}); - -// Users -cube(`Users`, { - sql: `SELECT * FROM public.users`, - - ..., - - preAggregations: { - usersRollup: { - dimensions: [CUBE.id, CUBE.name], - }, - }, -}); -``` - -Before we continue, let's add an index to the `ordersRollup` pre-aggregation so -that the `rollupJoin` pre-aggregation can work correctly: - -```javascript -cube(`Orders`, { - ..., - - preAggregations: { - ordersRollup: { - ..., - indexes: { - userIndex: { - columns: [CUBE.userId], - }, - }, - }, - }, -}); -``` - -Now we can add a new pre-aggregation of type `rollupJoin` to the `Orders` cube: - -```javascript -cube(`Orders`, { - ..., - - preAggregations: { - ordersWithUsersRollup: { - type: `rollupJoin`, - measures: [CUBE.count], - dimensions: [Users.name], - timeDimension: CUBE.createdAt, - granularity: `day`, - rollups: [Users.usersRollup, CUBE.ordersRollup], - }, - }, -}); -``` - -With all of the above set up, making a query such as the following will now use -`Orders.ordersRollup` and `Users.usersRollup`, avoiding a database request: - -```json -{ - "dimensions": ["Users.name"], - "timeDimensions": [ - { - "dimension": "Orders.createdAt", - "dateRange": "This month" - } - ], - "order": { - "Orders.count": "desc" - }, - "measures": ["Orders.count"] -} -``` - -## Pre-Aggregation Build Strategies - - - -For ideal performance, pre-aggregations should be built using a dedicated -Refresh Worker. [See here for more details][ref-prod-list-refresh]. - - - -Cube supports three different strategies for building pre-aggregations. To see -which strategies your database supports, please refer to its individual page -from [Connecting to the Database][ref-config-db]. - -### <--{"id" : "Pre-Aggregation Build Strategies"}--> Simple - -When using the simple strategy, Cube will use the source database as a temporary -staging area for writing pre-aggregations to determine column types. The data is -loaded back into memory before writing them to Cube Store (or an external -database). - - - -For larger datasets, we strongly recommend using the [Batching][self-batching] -or [Export Bucket][self-export-bucket] strategies instead. - - - -
- Internal vs External vs External with Cube Store diagram -
- -### <--{"id" : "Pre-Aggregation Build Strategies"}--> Batching - -Batching is a more performant strategy where Cube.js sends compressed CSVs for -Cube Store to ingest. - -
- Internal vs External vs External with Cube Store diagram -
- -The performance scales to the amount of memory available on the Cube.js -instance. Batching is automatically enabled for any databases that can support -it. - -### <--{"id" : "Pre-Aggregation Build Strategies"}--> Export bucket - - - -The export bucket strategy requires permission to execute `CREATE TABLE` -statements in the data source as part of the pre-aggregation build process. - - - -When dealing with larger pre-aggregations (more than 100k rows), performance can -be significantly improved by using an export bucket. This allows the source -database to temporarily materialize the data locally, which is then loaded into -Cube Store in parallel: - -
- Internal vs External vs External with Cube Store diagram -
- -Enabling the export bucket functionality requires extra configuration; please -refer to the database-specific documentation for more details: - -- [AWS Athena][ref-connect-db-athena] -- [AWS Redshift][ref-connect-db-redshift] -- [BigQuery][ref-connect-db-bigquery] -- [Snowflake][ref-connect-db-snowflake] - -When using cloud storage, it is important to correctly configure any data -retention policies to clean up the data in the export bucket as Cube.js does not -currently manage this. For most use-cases, 1 day is sufficient. - -## Streaming pre-aggregations - -Streaming pre-aggregations are different from traditional pre-aggregations in the way they are being updated. Traditional pre-aggregations follow the “pull” model — Cube **pulls updates** from the data source based on some cadence and/or condition. Streaming pre-aggregations follow the “push” model — Cube **subscribes to the updates** from the data source and always keeps pre-aggregation up to date. - -You don’t need to define `refreshKey` for streaming pre-aggregations. Whether pre-aggregation is streaming or not is defined by the data source. - -Currently, Cube supports only one streaming data source - [ksqlDB](/config/databases/ksqldb). All pre-aggregations where data source is ksqlDB are streaming. - -We’re working on supporting streaming pre-aggregations for the following data sources - - -- Materialize -- Flink SQL -- Spark Streaming - -Please [let us know](https://cube.dev/contact) if you are interested in early access to any of these drivers or would like Cube to support any other SQL streaming engine. - -[ref-caching-in-mem-default-refresh-key]: /caching#default-refresh-keys -[ref-config-db]: /config/databases -[ref-config-driverfactory]: /config#driver-factory -[ref-config-env]: /reference/environment-variables#cube-store -[ref-config-env-general]: /config#general -[ref-config-extdriverfactory]: /config#external-driver-factory -[ref-connect-db-athena]: /config/databases/aws-athena -[ref-connect-db-redshift]: /config/databases/aws-redshift -[ref-connect-db-bigquery]: /config/databases/google-bigquery -[ref-connect-db-mysql]: /config/databases/mysql -[ref-connect-db-postgres]: /config/databases/postgres -[ref-connect-db-snowflake]: /config/databases/snowflake -[ref-schema-timedimension]: /types-and-formats#types-time -[ref-schema-ref-preaggs]: /schema/reference/pre-aggregations -[ref-schema-ref-preaggs-index]: /schema/reference/pre-aggregations#indexes -[ref-schema-ref-preaggs-refresh-key]: - /schema/reference/pre-aggregations#refresh-key -[ref-schema-ref-preaggs-refresh-key-every]: - /schema/reference/pre-aggregations#refresh-key-every -[ref-schema-ref-preaggs-refresh-key-sql]: - /schema/reference/pre-aggregations#refresh-key-sql -[ref-deploy-refresh-wrkr]: /deployment/overview#refresh-worker -[ref-schema-ref-preaggs-sched-refresh]: - /schema/reference/pre-aggregations#scheduled-refresh -[ref-prod-list-refresh]: /deployment/production-checklist#set-up-refresh-worker -[ref-original-sql]: - /schema/reference/pre-aggregations#parameters-type-originalsql -[self-batching]: #batching -[self-export-bucket]: #export-bucket -[wiki-partitioning]: https://en.wikipedia.org/wiki/Partition_(database) diff --git a/docs/content/Caching/build-batching.png b/docs/content/Caching/build-batching.png deleted file mode 100755 index d1e28b3b88c95..0000000000000 Binary files a/docs/content/Caching/build-batching.png and /dev/null differ diff --git a/docs/content/Caching/build-export-bucket.png b/docs/content/Caching/build-export-bucket.png deleted file mode 100755 index 7da2425938d20..0000000000000 Binary files a/docs/content/Caching/build-export-bucket.png and /dev/null differ diff --git a/docs/content/Caching/build-regular.png b/docs/content/Caching/build-regular.png deleted file mode 100644 index af4c3a2ef3c67..0000000000000 Binary files a/docs/content/Caching/build-regular.png and /dev/null differ diff --git a/docs/content/Caching/lambda-batch-source.png b/docs/content/Caching/lambda-batch-source.png deleted file mode 100644 index 6259534a4f0dc..0000000000000 Binary files a/docs/content/Caching/lambda-batch-source.png and /dev/null differ diff --git a/docs/content/Caching/lambda-batch-streaming.png b/docs/content/Caching/lambda-batch-streaming.png deleted file mode 100644 index d973cf35b9d00..0000000000000 Binary files a/docs/content/Caching/lambda-batch-streaming.png and /dev/null differ diff --git a/docs/content/Caching/pre-agg-selection-flow.png b/docs/content/Caching/pre-agg-selection-flow.png deleted file mode 100644 index 27fc1b4085a2e..0000000000000 Binary files a/docs/content/Caching/pre-agg-selection-flow.png and /dev/null differ diff --git a/docs/content/Caching/pre-aggregations.png b/docs/content/Caching/pre-aggregations.png deleted file mode 100644 index f05fe49281b47..0000000000000 Binary files a/docs/content/Caching/pre-aggregations.png and /dev/null differ diff --git a/docs/content/Configuration/Config.mdx b/docs/content/Configuration/Config.mdx deleted file mode 100644 index ddf25e1181589..0000000000000 --- a/docs/content/Configuration/Config.mdx +++ /dev/null @@ -1,842 +0,0 @@ ---- -title: Config -permalink: /config -category: Configuration -subCategory: Reference -menuOrder: 3 ---- - -Cube.js can be configured both via environment variables and by providing -configuration options in the `cube.js` file. - -Example of setting a custom logger in the `cube.js` file. - -```javascript -module.exports = { - logger: (msg, params) => { - console.log(`${msg}: ${JSON.stringify(params)}`); - }, -}; -``` - -## Options Reference - -You can provide the following configuration options to Cube.js. - -```typescript -interface CubejsConfiguration { - dbType: string | ((context: RequestContext) => string); - schemaPath: string; - basePath: string; - webSocketsBasePath: string; - logger: (msg: string, params: object) => any; - driverFactory: ( - context: DriverContext - ) => DriverConfig | BaseDriver | Promise | Promise; - contextToAppId: (context: RequestContext) => string; - contextToOrchestratorId: (context: RequestContext) => string; - repositoryFactory: (context: RequestContext) => SchemaFileRepository; - checkAuth: (req: ExpressRequest, authorization: string) => any; - checkSqlAuth: (req: SQLRequest, user: string | null) => any; - canSwitchSqlUser: ( - current: string | null, - user: string - ) => Promise | bool; - queryRewrite: (query: object, context: RequestContext) => object; - preAggregationsSchema: string | ((context: RequestContext) => string); - schemaVersion: (context: RequestContext) => string; - scheduledRefreshTimer: boolean | number; - scheduledRefreshTimeZones: string[]; - scheduledRefreshContexts: () => Promise; - extendContext: (req: ExpressRequest) => any; - compilerCacheSize: number; - maxCompilerCacheKeepAlive: number; - updateCompilerCacheKeepAlive: boolean; - allowUngroupedWithoutPrimaryKey: boolean; - telemetry: boolean; - http: { - cors: { - methods: string | string[]; - origin: string; - allowedHeaders: string | string[]; - exposedHeaders: string | string[]; - credentials: boolean; - maxAge: number; - preflightContinue: boolean; - optionsSuccessStatus: number; - }; - }; - jwt: { - jwkUrl?: ((payload: any) => string) | string; - key?: string; - algorithms?: string[]; - issuer?: string[]; - audience?: string; - subject?: string; - claimsNamespace?: string; - }; - cacheAndQueueDriver: 'memory' | 'redis'; - orchestratorOptions: - | OrchestratorOptions - | ((context: RequestContext) => OrchestratorOptions); - allowJsDuplicatePropsInSchema: boolean; - initApp: (app: ExpressApplication) => void; - processSubscriptionsInterval: number; -} - -interface OrchestratorOptions { - redisPrefix: string; - queryCacheOptions: { - refreshKeyRenewalThreshold: number; - backgroundRenew: boolean; - queueOptions: QueueOptions; - }; - preAggregationsOptions: { - externalRefresh: boolean; - maxPartitions: number; - queueOptions: QueueOptions; - }; -} - -interface QueueOptions { - concurrency: number; - continueWaitTimeout: number; - executionTimeout: number; - orphanedTimeout: number; - heartBeatInterval: number; -} - -interface RequestContext { - securityContext: object; - requestId: string; -} - -interface DriverContext extends RequestContext { - dataSource: string; -} - -interface SchemaFileRepository { - dataSchemaFiles(): Promise; -} - -interface FileContent { - fileName: string; - content: string; -} -``` - -### <--{"id" : "Options Reference"}--> dbType - - - -Since v0.30.30, using `dbType` is discouraged. Instead of using `dbType`, -consider defining [`driverFactory`][self-driver-factory] to return a -`DriverConfig` object instead. - - - -Either `String` or `Function` could be passed. Providing a `Function` allows to -dynamically select a database type depending on the user's context. It is -usually used in [Multitenancy Setup][ref-multitenancy]. - -If no option is passed, Cube.js will lookup for environment variable -`CUBEJS_DB_TYPE` to resolve `dbType`. - -Called only once per [`appId`][self-opts-ctx-to-appid]. - -### <--{"id" : "Options Reference"}--> schemaPath - -Path to schema files. The default value is `/schema`. - -### <--{"id" : "Options Reference"}--> basePath - -[REST API](/rest-api) base path. The default value is `/cubejs-api`. - -### <--{"id" : "Options Reference"}--> webSocketsBasePath - -The base path for the websockets server. By default, the WebSockets server will -run on the root path. - -### <--{"id" : "Options Reference"}--> logger - -A function to setup a custom logger. It accepts the following arguments: - -- `message`: Cube.js Backend event message -- `params`: Parameters of the call - -```javascript -module.exports = { - logger: (msg, params) => { - console.log(`${msg}: ${JSON.stringify(params)}`); - }, -}; -``` - -### <--{"id" : "Options Reference"}--> driverFactory - -Set a custom database driver. The function accepts context object as an argument -to allow dynamically loading database drivers, which is usually used in -[Multitenancy Applications][ref-multitenancy]. - -Called once per [`dataSource`][ref-schema-ref-datasource]. Can return a -`Promise` which resolves to a `DriverConfig`. `DriverConfig` consists of a -`type` field corresponding to database type and options passed to a driver -constructor. - -```javascript -module.exports = { - driverFactory: ({ dataSource }) => ({ - type: 'postgres', - database: dataSource, - }), -}; -``` - -Drivers can also be instantiated directly in case custom driver implementations -are used. - -```javascript -const PostgresDriver = require('@cubejs-backend/postgres-driver'); - -module.exports = { - driverFactory: ({ dataSource }) => - new PostgresDriver({ database: dataSource }), - dbType: ({ dataSource }) => 'postgres', -}; -``` - -### <--{"id" : "Options Reference"}--> contextToAppId - -It is a [Multitenancy Setup][ref-multitenancy] option. - -`contextToAppId` is a function to determine an App ID which is used as caching -key for various in-memory structures like schema compilation results, connection -pool, etc. - -Called on each request. - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.user_id}`, -}; -``` - -### <--{"id" : "Options Reference"}--> contextToOrchestratorId - - - -In versions of Cube.js prior to v0.29, each tenant would have an individual -instance of the Query Orchestrator. - - - -`contextToOrchestratorId` is a function used to determine a caching key for the -Query Orchestrator instance. The Query Orchestrator holds database connections, -execution queues, pre-aggregation table caches. By default, the same instance is -used for **all** tenants; override this property in situations where each tenant -requires their own Query Orchestrator. - -Called on each request. - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.tenantId}`, - contextToOrchestratorId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.tenantId}`, -}; -``` - -### <--{"id" : "Options Reference"}--> repositoryFactory - -This option allows to customize the repository for Cube.js data schema files. It -is a function, which accepts a context object and can dynamically select -repositories with schema files based on -[`SchemaFileRepository`][self-schemafilerepo] contract. Learn more about it in -[Multitenancy guide][ref-multitenancy]. - -Called only once per [`appId`][self-opts-ctx-to-appid]. - -```javascript -const FileRepository = require('@cubejs-backend/server-core/core/FileRepository'); - -// using built-in SchemaFileRepository implementation and supplying the path to schema files -module.exports = { - repositoryFactory: ({ securityContext }) => - new FileRepository(`schema/${securityContext.appId}`), -}; - -// supplying your own SchemaFileRepository implementation to return array of files -module.exports = { - repositoryFactory: ({ securityContext }) => { - return { - dataSchemaFiles: async () => - await Promise.resolve([ - { fileName: 'file.js', content: 'contents of file' }, - ]), - }; - }, -}; -``` - -### <--{"id" : "Options Reference"}--> checkAuth - -Used in both REST and WebSockets API. Can be an `async` function. Default -implementation parses [JSON Web Tokens (JWT)][link-jwt] in `Authorization` -header and sets payload to `req.securityContext` if it's verified. More -information on how to generate these tokens is [here][ref-sec-ctx]. - -You can set `req.securityContext = userContextObj` inside the middleware if you -want to customize [`SECURITY_CONTEXT`][ref-schema-cube-ref-ctx-sec-ctx]. - -Called on each request. - -Also, you can use empty `checkAuth` function to disable built-in security. See -an example below. - -```javascript -module.exports = { - checkAuth: (req, auth) => {}, -}; -``` - -### <--{"id" : "Options Reference"}--> checkSqlAuth - -Used in [SQL API][ref-sql-api], and can be an `async` function. Default -implementation verify username & password from environment variables: -`CUBEJS_SQL_USER`, `CUBEJS_SQL_PASSWORD`, but in [development -mode][ref-development-mode] it ignores validation. - -Called on each request from Cube SQL API. - -For example, you can use `checkSqlAuth` to validate username and password. - -```javascript -module.exports = { - checkSqlAuth: (req, username) => { - if (username === 'fooUser') { - return { - password: 'mypassword', - securityContext: {}, - }; - } - - throw new Error('Incorrect user name or password'); - }, -}; -``` - -### <--{"id" : "Options Reference"}--> canSwitchSqlUser - -Used in [SQL API][ref-sql-api], and can be an `async` function. Default -implementation depends on `CUBEJS_SQL_SUPERUSER` and return `true` when it's -equal to session's user. - -Called on each change request from Cube SQL API. - -For example, you can use `canSwitchSqlUser` to define your custom logic: - -```javascript -module.exports = { - canSwitchSqlUser: async (current, username) => { - if (current === 'admin') { - return true; - } - - if (current === 'service') { - return username !== 'admin'; - } - - return false; - }, -}; -``` - -### <--{"id" : "Options Reference"}--> queryRewrite - - - -In previous versions of Cube.js, this was called `queryTransformer`. - - - -This is a security hook to check your query just before it gets processed. You -can use this very generic API to implement any type of custom security checks -your app needs and transform input query accordingly. - -Called on each request. - -For example, you can use `queryRewrite` to add row level security filter where -needed. - -```javascript -module.exports = { - queryRewrite: (query, { securityContext }) => { - if (securityContext.filterByRegion) { - query.filters.push({ - member: 'Regions.id', - operator: 'equals', - values: [securityContext.regionId], - }); - } - return query; - }, -}; -``` - -### <--{"id" : "Options Reference"}--> preAggregationsSchema - -Schema name to use for storing pre-aggregations. For some drivers like MySQL -it's name for pre-aggregation database as there's no database schema concept -there. Either `String` or `Function` could be passed. Providing a `Function` -allows to dynamically set the pre-aggregation schema name depending on the -user's context. - -Defaults to `dev_pre_aggregations` in [development mode][ref-development-mode] -and `prod_pre_aggregations` in production. - -Can be also set via environment variable `CUBEJS_PRE_AGGREGATIONS_SCHEMA`. - - - -We **strongly** recommend using different pre-aggregation schemas in development -and production environments to avoid pre-aggregation tables clashes. - - - -Called once per [`appId`][self-opts-ctx-to-appid]. - -```javascript -// Static usage -module.exports = { - preAggregationsSchema: `my_pre_aggregations`, -}; - -// Dynamic usage -module.exports = { - preAggregationsSchema: ({ securityContext }) => - `pre_aggregations_${securityContext.tenantId}`, -}; -``` - -### <--{"id" : "Options Reference"}--> schemaVersion - -Schema version can be used to tell Cube.js schema should be recompiled in case -schema code depends on dynamic definitions fetched from some external database -or API. This method is called on each request however `RequestContext` parameter -is reused per application ID as determined by -[`contextToAppId`][self-opts-ctx-to-appid]. If the returned string is different, -the schema will be recompiled. It can be used in both multi-tenant and single -tenant environments. - -```javascript -const tenantIdToDbVersion = {}; - -module.exports = { - schemaVersion: ({ securityContext }) => - tenantIdToDbVersion[securityContext.tenantId], -}; -``` - -### <--{"id" : "Options Reference"}--> scheduledRefreshTimer - - - -This is merely a refresh worker heart beat. It doesn't affect freshness of -pre-aggregations or refresh keys. Setting this value to `30s` doesn't mean -pre-aggregations would be refreshed every 30 seconds but rather checked for -freshness every 30 seconds. Please consult the [`refreshKey` -documentation][ref-pre-aggregations-refresh-key] on how to set refresh intervals -for pre-aggregations. - - - -Cube.js enables background refresh by default using the `CUBEJS_REFRESH_WORKER` -environment variable. - -```javascript -module.exports = { - scheduledRefreshTimer: 60, -}; -``` - -Learn more about [scheduled refreshes here][ref-caching-up-to-date]. - -Best practice is to run `scheduledRefreshTimer` in a separate worker Cube.js -instance. For Serverless deployments, [REST API][ref-rest-api-sched-refresh] -should be used instead. - -You may also need to configure -[`scheduledRefreshTimeZones`][self-opts-sched-refresh-tz] and -[`scheduledRefreshContexts`][self-opts-sched-refresh-ctxs]. - -### <--{"id" : "Options Reference"}--> scheduledRefreshTimeZones - -All time-based calculations performed within Cube.js are timezone-aware. Using -this property you can specify multiple timezones in [TZ Database -Name][link-wiki-tz] format e.g. `America/Los_Angeles`. The default value is -`UTC`. - -```javascript -module.exports = { - // You can define one or multiple timezones based on your requirements - scheduledRefreshTimeZones: ['America/Vancouver', 'America/Toronto'], -}; -``` - -This configuration option can be also set using the -`CUBEJS_SCHEDULED_REFRESH_TIMEZONES` environment variable. You can set a -comma-separated list of timezones to refresh in -`CUBEJS_SCHEDULED_REFRESH_TIMEZONES` environment variable. For example: - -```bash -CUBEJS_SCHEDULED_REFRESH_TIMEZONES=America/Los_Angeles,UTC -``` - -### <--{"id" : "Options Reference"}--> scheduledRefreshContexts - -When trying to configure scheduled refreshes for pre-aggregations that use the -`securityContext` inside `contextToAppId` or `contextToOrchestratorId`, you must -also set up `scheduledRefreshContexts`. This will allow Cube.js to generate the -necessary security contexts prior to running the scheduled refreshes. - - - -Leaving `scheduledRefreshContexts` unconfigured will lead to issues where the -security context will be `undefined`. This is because there is no way for -Cube.js to know how to generate a context without the required input. - - - -```javascript -module.exports = { - // scheduledRefreshContexts should return an array of `securityContext`s - scheduledRefreshContexts: async () => [ - { - securityContext: { - myappid: 'demoappid', - bucket: 'demo', - }, - }, - { - securityContext: { - myappid: 'demoappid2', - bucket: 'demo2', - }, - }, - ], -}; -``` - -### <--{"id" : "Options Reference"}--> extendContext - -Option to extend the `RequestContext` with custom values. This method is called -on each request. Can be async. - -The function should return an object which gets appended to the -[`RequestContext`][self-opts-req-ctx]. Make sure to register your value using -[`contextToAppId`][self-opts-ctx-to-appid] to use cache context for all possible -values that your extendContext object key can have. - - - -`extendContext` is applied only to requests that go through API. It isn't -applied to refresh worker execution. If you're looking for a way to provide -global environment variables for your schema please see [Execution environment -docs][ref-exec-environment-globals]. - - - -```javascript -module.exports = { - contextToAppId: (context) => `CUBEJS_APP_${context.activeOrganization}`, - extendContext: (req) => { - return { activeOrganization: req.headers.activeOrganization }; - }, -}; -``` - -You can use the custom value from extend context in your data schema like this: - -```javascript -const { activeOrganization } = COMPILE_CONTEXT; - -cube(`Users`, { - sql: `SELECT * FROM users where organization_id=${activeOrganization}`, -}); -``` - -### <--{"id" : "Options Reference"}--> compilerCacheSize - -Maximum number of compiled schemas to persist with in-memory cache. Defaults to -250, but optimum value will depend on deployed environment. When the max is -reached, will start dropping the least recently used schemas from the cache. - -### <--{"id" : "Options Reference"}--> maxCompilerCacheKeepAlive - -Maximum length of time in ms to keep compiled schemas in memory. Default keeps -schemas in memory indefinitely. - -### <--{"id" : "Options Reference"}--> updateCompilerCacheKeepAlive - -Providing `updateCompilerCacheKeepAlive: true` keeps frequently used schemas in -memory by reseting their `maxCompilerCacheKeepAlive` every time they are -accessed. - -### <--{"id" : "Options Reference"}--> allowUngroupedWithoutPrimaryKey - -Providing `allowUngroupedWithoutPrimaryKey: true` disables primary key inclusion -check for `ungrouped` queries. - -### <--{"id" : "Options Reference"}--> telemetry - -Cube.js collects high-level anonymous usage statistics for servers started in -development mode. It doesn't track any credentials, schema contents or queries -issued. This statistics is used solely for the purpose of constant cube.js -improvement. - -You can opt out of it any time by setting `telemetry` option to `false` or, -alternatively, by setting `CUBEJS_TELEMETRY` environment variable to `false`. - -```javascript -module.exports = { - telemetry: false, -}; -``` - -### <--{"id" : "Options Reference"}--> http - -#### cors - -CORS settings for the Cube.js REST API can be configured by providing an object -with options [from here][link-express-cors-opts]: - -```javascript -module.exports = { - http: { - cors: { - origin: '*', - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - preflightContinue: false, - optionsSuccessStatus: 204, - maxAge: 86400, - credentials: true, - }, - }, -}; -``` - -### <--{"id" : "Options Reference"}--> jwt - -#### jwkUrl - -The URL from which JSON Web Key Sets (JWKS) can be retrieved. Can also be set -using `CUBEJS_JWK_URL`. - -#### key - -A JSON string that represents a cryptographic key. Similar to `API_SECRET`. Can -also be set using `CUBEJS_JWT_KEY`. - -#### algorithms - -[Any supported algorithm for decoding JWTs][gh-jsonwebtoken-algs]. Can also be -set using `CUBEJS_JWT_ALGS`. - -#### issuer - -An issuer value which will be used to enforce the [`iss` claim from inbound -JWTs][link-jwt-ref-iss]. Can also be set using `CUBEJS_JWT_ISSUER`. - -#### audience - -An audience value which will be used to enforce the [`aud` claim from inbound -JWTs][link-jwt-ref-aud]. Can also be set using `CUBEJS_JWT_AUDIENCE`. - -#### subject - -A subject value which will be used to enforce the [`sub` claim from inbound -JWTs][link-jwt-ref-sub]. Can also be set using `CUBEJS_JWT_SUBJECT`. - -#### claimsNamespace - -A namespace within the decoded JWT under which any custom claims can be found. -Can also be set using `CUBEJS_JWT_CLAIMS_NAMESPACE`. - -### <--{"id" : "Options Reference"}--> cacheAndQueueDriver - -The cache and queue driver to use for the Cube.js deployment. Defaults to -`memory` in development, `redis` in production. - -### <--{"id" : "Options Reference"}--> orchestratorOptions - - - -We **strongly** recommend leaving these options set to the defaults. Changing -these values can result in application instability and/or downtime. - - - -You can pass this object to set advanced options for Cube.js Query Orchestrator. - -| Option | Description | Default Value | -| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | -| redisPrefix | Prefix to be set an all Redis keys | `STANDALONE` | -| rollupOnlyMode | When enabled, an error will be thrown if a query can't be served from a pre-aggregation (rollup) | `false` | -| queryCacheOptions | Query cache options for DB queries | `{}` | -| queryCacheOptions.refreshKeyRenewalThreshold | Time in seconds to cache the result of [`refreshKey`][ref-schema-cube-ref-refresh-key] check | `defined by DB dialect` | -| queryCacheOptions.backgroundRenew | Controls whether to wait in foreground for refreshed query data if `refreshKey` value has been changed. Refresh key queries or pre-aggregations are never awaited in foreground and always processed in background unless cache is empty. If `true` it immediately returns values from cache if available without [refreshKey][ref-schema-cube-ref-refresh-key] check to renew in foreground. | `false` | -| queryCacheOptions.queueOptions | Query queue options for DB queries | `{}` | -| preAggregationsOptions | Query cache options for pre-aggregations | `{}` | -| preAggregationsOptions.maxPartitions | The maximum number of partitions each pre-aggregation in a cube can use. | `10000` | -| preAggregationsOptions.queueOptions | Query queue options for pre-aggregations | `{}` | -| preAggregationsOptions.externalRefresh | When running a separate instance of Cube.js to refresh pre-aggregations in the background, this option can be set on the API instance to prevent it from trying to check for rollup data being current - it won't try to create or refresh them when this option is `true` | `false` | - -To set options for `queryCache` and `preAggregations`, set an object with key -queueOptions. `queryCacheOptions` are used while querying database tables, while -`preAggregationsOptions` settings are used to query pre-aggregated tables. - -```javascript -const queueOptions = { - concurrency: 3, -}; - -module.exports = { - orchestratorOptions: { - queryCacheOptions: { - refreshKeyRenewalThreshold: 30, - backgroundRenew: true, - queueOptions, - }, - preAggregationsOptions: { queueOptions }, - }, -}; -``` - -### <--{"id" : "Options Reference"}--> allowJsDuplicatePropsInSchema - -Boolean to enable or disable a check duplicate property names in all objects of -a schema. The default value is `false`, and it is means the compiler would use -the additional transpiler for check duplicates. - -### <--{"id" : "Options Reference"}--> initApp - - - -This configuration option is likely to change in future versions of Cube - - - -This function allows you to extend the Cube API server with custom Express -middleware. This is especially useful for adding monitoring and observability -solutions. - -```typescript -const myCustomMiddleware = (req, res, next) => { - req.foo = 'bar'; - next(); -}; - -module.exports = { - initApp: (app) => { - app.use(myCustomMiddleware); - }, -}; -``` - -### <--{"id" : "Options Reference"}--> processSubscriptionsInterval - -This property controls how often Websocket client subscriptions are refreshed. -Defaults to `5000`. - -## QueueOptions - -Timeout and interval options' values are in seconds. - -| Option | Description | Default Value | -| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| concurrency | Maximum number of queries to be processed simultaneosly. For drivers with connection pool `CUBEJS_DB_MAX_POOL` should be adjusted accordingly. | `2` | -| continueWaitTimeout | Long polling interval | `5` | -| executionTimeout | Total timeout of single query | `600` | -| orphanedTimeout | Query will be marked for cancellation if not requested during this period. | `120` | -| heartBeatInterval | Worker heartbeat interval. If `4*heartBeatInterval` time passes without reporting, the query gets cancelled. | `30` | - -## RequestContext - -`RequestContext` object is filled by context data on a HTTP request level. - -### <--{"id" : "RequestContext"}--> securityContext - -Defined as `req.securityContext` which should be set by -[`checkAuth`][self-opts-checkauth]. Default implementation of -[`checkAuth`][self-opts-checkauth] uses [JWT Security Token][ref-sec] payload -and sets it to `req.securityContext`. - -## SchemaFileRepository - - - -The default implementation of the `SchemaFileRepository` contract is defined by -the [`FileRepository`][gh-cube-filerepo] class. When using -[`FileRepository`][gh-cube-filerepo], all schema files must be within the same -directory. - - - -[gh-cube-filerepo]: - https://github.com/cube-js/cube.js/blob/master/packages/cubejs-server-core/src/core/FileRepository.ts - -The `SchemaFileRepository` contract defines an async `dataSchemaFiles` function -which returns the files to compile for a schema. Returned by -[repositoryFactory][self-repofactory]. The [`FileRepository`][gh-cube-filerepo] -implementation of the `SchemaFileRepository` contract accepts a -[`schemaPath`][self-schemapath] in its constructor. - -```javascript -class ApiFileRepository { - async dataSchemaFiles() { - const fileContents = await callExternalApiForFileContents(); - return [{ fileName: 'apiFile', content: fileContents }]; - } -} - -module.exports = { - repositoryFactory: ({ securityContext }) => new ApiFileRepository(), -}; -``` - -[gh-jsonwebtoken-algs]: - https://github.com/auth0/node-jsonwebtoken#algorithms-supported -[link-express-cors-opts]: - https://expressjs.com/en/resources/middleware/cors.html#configuration-options -[link-jwt]: https://jwt.io/ -[link-jwt-ref-iss]: https://tools.ietf.org/html/rfc7519#section-4.1.1 -[link-jwt-ref-sub]: https://tools.ietf.org/html/rfc7519#section-4.1.2 -[link-jwt-ref-aud]: https://tools.ietf.org/html/rfc7519#section-4.1.3 -[link-wiki-tz]: https://en.wikipedia.org/wiki/Tz_database -[ref-caching-up-to-date]: /caching#keeping-cache-up-to-date -[ref-development-mode]: /overview#development-mode -[ref-multitenancy]: /multitenancy-setup -[ref-rest-api]: /rest-api -[ref-sql-api]: /backend/sql -[ref-rest-api-sched-refresh]: /rest-api#v-1-run-scheduled-refresh -[ref-pre-aggregations-refresh-key]: - /schema/reference/pre-aggregations#refresh-key -[ref-schema-cube-ref-refresh-key]: /schema/reference/cube#refresh-key -[ref-schema-cube-ref-ctx-sec-ctx]: /schema/reference/cube#security-context -[ref-schema-ref-preaggs-rollup]: /schema/reference/pre-aggregations#type-rollup -[ref-sec]: /security -[ref-sec-ctx]: /security/context -[self-opts-req-ctx]: #request-context -[self-opts-checkauth]: #check-auth -[self-opts-ctx-to-appid]: #context-to-app-id -[self-driver-factory]: #driver-factory -[ref-schema-ref-datasource]: /schema/reference/cube#data-source -[self-opts-sched-refresh-ctxs]: #scheduled-refresh-contexts -[self-opts-sched-refresh-tz]: #scheduled-refresh-time-zones -[self-repofactory]: #repositoryFactory -[self-schemafilerepo]: #schema-file-repository -[self-schemapath]: #schemaPath -[ref-exec-environment-globals]: - /schema/reference/execution-environment#node-js-globals-process-env-console-log-and-others diff --git a/docs/content/Configuration/Connecting-to-Downstream-Tools.mdx b/docs/content/Configuration/Connecting-to-Downstream-Tools.mdx deleted file mode 100644 index 10c14b7301b0a..0000000000000 --- a/docs/content/Configuration/Connecting-to-Downstream-Tools.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Connecting to Visualization Tools -permalink: /config/downstream -category: Configuration -menuOrder: 3 ---- - -Choose a tool to get started with below. - - - If you'd like to connect to a tool which is not yet supported or present on this page, - please file an issue on GitHub. - - -## BI & data exploration tools - - - - - - - - - - - -You can learn more about SQL API on the [reference page](/backend/sql), including how to connect -to other BIs or visualization tools not listed here. - -## Notebooks - - - - - - - - - -## Low-code tools & internal tool builders - - - - - - - - -You can also find relevant step-by-step guides in the blog. - -## Frontend integrations - -Cube provides integration libraries for popular front-end frameworks: - - - - - - - -## APIs references - -All integrations above are powered by the following APIs. If you're a data engineer, please explore the SQL API. If you're an application developer, check out REST and GraphQL APIs. - - - - - - diff --git a/docs/content/Configuration/Connecting-to-the-Database.mdx b/docs/content/Configuration/Connecting-to-the-Database.mdx deleted file mode 100644 index a27acd50e14e5..0000000000000 --- a/docs/content/Configuration/Connecting-to-the-Database.mdx +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Connecting to Data Sources -permalink: /config/databases -category: Configuration -menuOrder: 2 -redirect_from: - - /connecting-to-the-database ---- - -Choose a data store to get started with below. - - - If you'd like to connect to a data store which is not yet listed on this page, - please file an issue on GitHub. - You can also contribute a driver, see this step-by-step guide. - - -## Data Warehouses - - - - - - - - - - -## Query Engines - - - - - - - -## Transactional Databases - - - - - - - - - -## Time Series Databases - - - - - -## Streaming - - - - - - -## NoSQL & Other Data Sources - - - - - - -## Multiple Databases - -Cube.js supports connection to multiple databases out-of-the-box. Please refer -to the [multitenancy guide][link-multitenancy] to learn more. - -[link-multitenancy]: /multitenancy-setup - -## Driver Support - -Most of the drivers for data sources are supported either directly by the Cube team -or by their vendors. The rest are community-supported and will be highlighted -as such in their respective pages. - -You're more than welcome to contribute new drivers as well as new features and patches -to [existing drivers](https://github.com/cube-js/cube.js/tree/master/packages). -Please check the [contribution guidelines](https://github.com/cube-js/cube.js/blob/master/CONTRIBUTING.md#implementing-driver) -and join the `#contributors` channel in our [Slack community](https://slack.cube.dev). \ No newline at end of file diff --git a/docs/content/Configuration/Databases/AWS-Athena.mdx b/docs/content/Configuration/Databases/AWS-Athena.mdx deleted file mode 100644 index 9570e8269870d..0000000000000 --- a/docs/content/Configuration/Databases/AWS-Athena.mdx +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: AWS Athena -permalink: /config/databases/aws-athena ---- - -## Prerequisites - -- [A set of IAM credentials][aws-docs-athena-access] which allow access to [AWS - Athena][aws-athena] -- [The AWS region][aws-docs-regions] -- [The S3 bucket][aws-s3] on AWS to [store query results][aws-docs-athena-query] - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=athena -CUBEJS_AWS_KEY=AKIA************ -CUBEJS_AWS_SECRET=**************************************** -CUBEJS_AWS_REGION=us-east-1 -CUBEJS_AWS_S3_OUTPUT_LOCATION=s3://my-athena-output-bucket -CUBEJS_AWS_ATHENA_WORKGROUP=primary -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------ | :------: | -| `CUBEJS_AWS_KEY` | The AWS Access Key ID to use for database connections | A valid AWS Access Key ID | ✅ | -| `CUBEJS_AWS_SECRET` | The AWS Secret Access Key to use for database connections | A valid AWS Secret Access Key | ✅ | -| `CUBEJS_AWS_REGION` | The AWS region of the Cube.js deployment | [A valid AWS region][aws-docs-regions] | ✅ | -| `CUBEJS_AWS_S3_OUTPUT_LOCATION` | The S3 path to store query results made by the Cube.js deployment | A valid S3 path | ❌ | -| `CUBEJS_AWS_ATHENA_WORKGROUP` | The name of the workgroup in which the query is being started | [A valid Athena Workgroup][aws-athena-workgroup] | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `5` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can be -used in pre-aggregations when using AWS Athena as a source database. To learn -more about AWS Athena's support for approximate aggregate functions, [click -here][aws-athena-docs-approx-agg-fns]. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ❌ | ✅ | -| Export Bucket | ❌ | ❌ | - -By default, AWS Athena uses a [batching][self-preaggs-batching] strategy to -build pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for AWS Athena. - -### Export Bucket - - - -AWS Athena **only** supports using AWS S3 for export buckets. - - - -#### AWS S3 - -For [improved pre-aggregation performance with large -datasets][ref-caching-large-preaggs], enable export bucket functionality by -configuring Cube.js with the following environment variables: - - - -Ensure the AWS credentials are correctly configured in IAM to allow reads and -writes to the export bucket in S3. - - - -```dotenv -CUBEJS_DB_EXPORT_BUCKET_TYPE=s3 -CUBEJS_DB_EXPORT_BUCKET=my.bucket.on.s3 -CUBEJS_DB_EXPORT_BUCKET_AWS_KEY= -CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET= -CUBEJS_DB_EXPORT_BUCKET_AWS_REGION= -``` - -## SSL - -Cube.js does not require any additional configuration to enable SSL as AWS -Athena connections are made over HTTPS. - -[aws-athena]: https://aws.amazon.com/athena -[aws-athena-workgroup]: - https://docs.aws.amazon.com/athena/latest/ug/workgroups-benefits.html -[aws-s3]: https://aws.amazon.com/s3/ -[aws-docs-athena-access]: - https://docs.aws.amazon.com/athena/latest/ug/security-iam-athena.html -[aws-docs-athena-query]: - https://docs.aws.amazon.com/athena/latest/ug/querying.html -[aws-docs-regions]: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions -[aws-athena-docs-approx-agg-fns]: - https://prestodb.io/docs/0.217/functions/aggregate.html#approximate-aggregate-functions -[ref-caching-large-preaggs]: /caching/using-pre-aggregations#export-bucket -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching diff --git a/docs/content/Configuration/Databases/AWS-Redshift.mdx b/docs/content/Configuration/Databases/AWS-Redshift.mdx deleted file mode 100644 index 9bf144c1f783e..0000000000000 --- a/docs/content/Configuration/Databases/AWS-Redshift.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: AWS Redshift -permalink: /config/databases/aws-redshift ---- - -## Prerequisites - - - -If the cluster is configured within a [VPC][aws-vpc], then Cube.js **must** have -a network route to the cluster. - - - -- The [hostname][aws-redshift-docs-connection-string] for the [AWS - Redshift][aws-redshift] cluster -- The [username/password][aws-redshift-docs-users] for the [AWS - Redshift][aws-redshift] cluster -- The name of the database to use within the [AWS Redshift][aws-redshift] - cluster - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=redshift -CUBEJS_DB_HOST=my-redshift-cluster.cfbs3dkw1io8.eu-west-1.redshift.amazonaws.com -CUBEJS_DB_NAME=my_redshift_database -CUBEJS_DB_USER=redshift_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `4` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `16` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using AWS Redshift as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ❌ | ✅ | -| Export Bucket | ❌ | ❌ | - -By default, AWS Redshift uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for AWS Redshift. - -### Export bucket - - - -AWS Redshift **only** supports using AWS S3 for export buckets. - - - -#### AWS S3 - -For [improved pre-aggregation performance with large -datasets][ref-caching-large-preaggs], enable export bucket functionality by -configuring Cube.js with the following environment variables: - - - -Ensure the AWS credentials are correctly configured in IAM to allow reads and -writes to the export bucket in S3. - - - -```dotenv -CUBEJS_DB_EXPORT_BUCKET_TYPE=s3 -CUBEJS_DB_EXPORT_BUCKET=my.bucket.on.s3 -CUBEJS_DB_EXPORT_BUCKET_AWS_KEY= -CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET= -CUBEJS_DB_EXPORT_BUCKET_AWS_REGION= -``` - -## SSL - -To enable SSL-encrypted connections between Cube.js and AWS Redshift, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -[aws-redshift-docs-connection-string]: - https://docs.aws.amazon.com/redshift/latest/mgmt/configuring-connections.html#connecting-drivers -[aws-redshift-docs-users]: - https://docs.aws.amazon.com/redshift/latest/dg/r_Users.html -[aws-redshift]: https://aws.amazon.com/redshift/ -[aws-vpc]: https://aws.amazon.com/vpc/ -[ref-caching-large-preaggs]: /caching/using-pre-aggregations#export-bucket -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching diff --git a/docs/content/Configuration/Databases/ClickHouse.mdx b/docs/content/Configuration/Databases/ClickHouse.mdx deleted file mode 100644 index 960ad1266f239..0000000000000 --- a/docs/content/Configuration/Databases/ClickHouse.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: ClickHouse -permalink: /config/databases/clickhouse ---- - -## Prerequisites - -- The hostname for the [ClickHouse][clickhouse] database server -- The [username/password][clickhouse-docs-users] for the - [ClickHouse][clickhouse] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=clickhouse -CUBEJS_DB_HOST=my.clickhouse.host -CUBEJS_DB_NAME=my_clickhouse_database -CUBEJS_DB_USER=clickhouse_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ------------------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_CLICKHOUSE_READONLY` | Whether the ClickHouse user has read-only access or not | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `5` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `20` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using ClickHouse as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ✅ | ✅ | -| Export Bucket | - | - | - -By default, ClickHouse uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for ClickHouse. - -### Export Bucket - -ClickHouse does not support export buckets. - -## SSL - -To enable SSL-encrypted connections between Cube.js and ClickHouse, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -## Additional Configuration - -You can connect to a ClickHouse database when your user's permissions are -[restricted][clickhouse-readonly] to read-only, by setting -`CUBEJS_DB_CLICKHOUSE_READONLY` to `true`. - -[clickhouse]: https://clickhouse.tech/ -[clickhouse-docs-users]: - https://clickhouse.tech/docs/en/operations/settings/settings-users/ -[clickhouse-readonly]: - https://clickhouse.tech/docs/en/operations/settings/permissions-for-queries/#settings_readonly -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching diff --git a/docs/content/Configuration/Databases/Databricks-JDBC.mdx b/docs/content/Configuration/Databases/Databricks-JDBC.mdx deleted file mode 100644 index 2f87e69b9917a..0000000000000 --- a/docs/content/Configuration/Databases/Databricks-JDBC.mdx +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: Databricks JDBC -permalink: /config/databases/databricks/jdbc ---- - -## Prerequisites - -- [A JDK installation][gh-cubejs-jdbc-install] -- The [JDBC URL][databricks-docs-jdbc-url] for the [Databricks][databricks] - cluster - -## Setup - -### Manual - -Add the following to a `.env` file in your Cube project: - -```dotenv -CUBEJS_DB_TYPE=databricks-jdbc -# CUBEJS_DB_NAME is optional -CUBEJS_DB_NAME=default -# You can find this inside the cluster's configuration -CUBEJS_DB_DATABRICKS_URL=jdbc:spark://dbc-XXXXXXX-XXXX.cloud.databricks.com:443/default;transportMode=http;ssl=1;httpPath=sql/protocolv1/o/XXXXX/XXXXX;AuthMech=3;UID=token -# You can specify the personal access token separately from `CUBEJS_DB_DATABRICKS_URL` by doing this: -CUBEJS_DB_DATABRICKS_TOKEN=XXXXX -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ------------------------------------ | ----------------------------------------------------------------------------------------------- | --------------------- | :------: | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_DATABRICKS_URL` | The URL for a JDBC connection | A valid JDBC URL | ✅ | -| `CUBEJS_DB_DATABRICKS_ACCEPT_POLICY` | Whether or not to accept the license terms for the Databricks JDBC driver | `true`, `false` | ✅ | -| `CUBEJS_DB_DATABRICKS_TOKEN` | The [personal access token][databricks-docs-pat] used to authenticate the Databricks connection | A valid token | ✅ | -| `CUBEJS_DB_EXPORT_BUCKET_MOUNT_DIR` | The path for the [Databricks DBFS mount][databricks-docs-dbfs] | A valid mount path | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using Databricks as a data source. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Simple | ❌ | ✅ | -| Export Bucket | ❌ | ❌ | - -By default, Databricks JDBC uses a [simple][self-preaggs-simple] strategy to -build pre-aggregations. - -### Simple - -No extra configuration is required to configure simple pre-aggregation builds -for Databricks. - -### Export Bucket - -Databricks supports using both [AWS S3][aws-s3] and [Azure Blob -Storage][azure-bs] for export bucket functionality. - -#### AWS S3 - -To use AWS S3 as an export bucket, first complete [the Databricks guide on -mounting S3 buckets to Databricks DBFS][databricks-docs-dbfs-s3]. - - - -Ensure the AWS credentials are correctly configured in IAM to allow reads and -writes to the export bucket in S3. - - - -```dotenv -CUBEJS_DB_EXPORT_BUCKET_TYPE=s3 -CUBEJS_DB_EXPORT_BUCKET=s3://my.bucket.on.s3 -CUBEJS_DB_EXPORT_BUCKET_AWS_KEY= -CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET= -CUBEJS_DB_EXPORT_BUCKET_AWS_REGION= -``` - -#### Azure Blob Storage - -To use Azure Blob Storage as an export bucket, follow [the Databricks guide on -mounting Azure Blob Storage to Databricks DBFS][databricks-docs-dbfs-azure]. - -[Retrieve the storage account access key][azure-bs-docs-get-key] from your Azure -account and use as follows: - -```dotenv -CUBEJS_DB_EXPORT_BUCKET_TYPE=azure -CUBEJS_DB_EXPORT_BUCKET=wasbs://my-bucket@my-account.blob.core.windows.net -CUBEJS_DB_EXPORT_BUCKET_AZURE_KEY= -``` - -## SSL/TLS - -Cube does not require any additional configuration to enable SSL/TLS for -Databricks JDBC connections. - -## Additional Configuration - -### Cube Cloud - -To accurately show partition sizes in the Cube Cloud APM, [an export -bucket][self-preaggs-export-bucket] **must be** configured. - -[aws-s3]: https://aws.amazon.com/s3/ -[azure-bs]: https://azure.microsoft.com/en-gb/services/storage/blobs/ -[azure-bs-docs-get-key]: - https://docs.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&tabs=azure-portal#view-account-access-keys -[databricks]: https://databricks.com/ -[databricks-docs-dbfs]: - https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs -[databricks-docs-dbfs-azure]: - https://docs.databricks.com/data/data-sources/azure/azure-storage.html#mount-azure-blob-storage-containers-to-dbfs -[databricks-docs-dbfs-s3]: - https://docs.databricks.com/data/data-sources/aws/amazon-s3.html#access-s3-buckets-through-dbfs -[databricks-docs-jdbc-url]: - https://docs.databricks.com/integrations/bi/jdbc-odbc-bi.html#get-server-hostname-port-http-path-and-jdbc-url -[databricks-docs-pat]: - https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management -[gh-cubejs-jdbc-install]: - https://github.com/cube-js/cube.js/blob/master/packages/cubejs-jdbc-driver/README.md#java-installation -[ref-caching-large-preaggs]: /caching/using-pre-aggregations#export-bucket -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-simple]: #simple -[self-preaggs-export-bucket]: #export-bucket diff --git a/docs/content/Configuration/Databases/Druid.mdx b/docs/content/Configuration/Databases/Druid.mdx deleted file mode 100644 index 4fe8e639da9a7..0000000000000 --- a/docs/content/Configuration/Databases/Druid.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Druid -permalink: /config/databases/druid ---- - - - The driver for Druid is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## Prerequisites - -- The URL for the [Druid][druid] database -- The username/password for the [Druid][druid] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=druid -CUBEJS_DB_URL=https://my.druid.host:8082 -CUBEJS_DB_USER=druid -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------------ | :------: | -| `CUBEJS_DB_URL` | The URL for a database | A valid database URL for Druid | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## SSL - -Cube.js does not require any additional configuration to enable SSL as Druid -connections are made over HTTPS. - -[druid]: https://druid.apache.org/ diff --git a/docs/content/Configuration/Databases/Elasticsearch.mdx b/docs/content/Configuration/Databases/Elasticsearch.mdx deleted file mode 100644 index 91798c11dbb96..0000000000000 --- a/docs/content/Configuration/Databases/Elasticsearch.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Elasticsearch -permalink: /config/databases/elasticsearch ---- - - - The driver for Elasticsearch is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## 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 - -### <--{"id" : "Setup"}--> Manual - -For a self-hosted Elasticsearch instance, add the following to a `.env` file in -your Cube.js project: - -```bash -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.js project: - -```bash -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_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## SSL - -Cube.js 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/Configuration/Databases/Firebolt.mdx b/docs/content/Configuration/Databases/Firebolt.mdx deleted file mode 100644 index 0163e7e20687f..0000000000000 --- a/docs/content/Configuration/Databases/Firebolt.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Firebolt -permalink: /config/databases/firebolt ---- - -## Prerequisites - -- The username/password for your [Firebolt][firebolt] account - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube project: - -```bash -CUBEJS_DB_NAME=firebolt_database -CUBEJS_DB_USER=firebolt_user@customer.com -CUBEJS_DB_PASS=********** -CUBEJS_FIREBOLT_ACCOUNT=cube -CUBEJS_FIREBOLT_ENGINE_NAME=engine_name -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ------------------------------ | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | :------: | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_FIREBOLT_ACCOUNT` | Account name | An account name | - | -| `CUBEJS_FIREBOLT_ENGINE_NAME` | Engine name to connect to | A valid engine name | ✅ | -| `CUBEJS_FIREBOLT_API_ENDPOINT` | Firebolt API endpoint. Used for authentication | `api.dev.firebolt.io`, `api.staging.firebolt.io`, `api.app.firebolt.io` | - | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `5` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `20` | A valid number | ❌ | - -[firebolt]: https://www.firebolt.io/ diff --git a/docs/content/Configuration/Databases/Google-BigQuery.mdx b/docs/content/Configuration/Databases/Google-BigQuery.mdx deleted file mode 100644 index 49254202f9cf8..0000000000000 --- a/docs/content/Configuration/Databases/Google-BigQuery.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Google BigQuery -permalink: /config/databases/google-bigquery ---- - -## Prerequisites - - - -In order to connect Google BigQuery to Cube.js, you need to provide service -account credentials. Cube.js requires the service account to have **BigQuery -Data Viewer** and **BigQuery Job User** roles enabled. You can learn more about -acquiring Google BigQuery credentials [here][bq-docs-getting-started]. - - - -- [The Google Cloud Project ID][google-cloud-docs-projects] for the - [BigQuery][bq] project -- [A set of Google Cloud service credentials][google-support-create-svc-account] - [which allow access][bq-docs-getting-started] to the [BigQuery][bq] project -- [The Google Cloud region][bq-docs-regional-locations] for the [BigQuery][bq] - project - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=bigquery -CUBEJS_DB_BQ_PROJECT_ID=my-bigquery-project-12345 -CUBEJS_DB_BQ_KEY_FILE=/path/to/my/keyfile.json -``` - -You could also encode the key file using Base64 and set the result to -`CUBEJS_DB_BQ_CREDENTIALS`: - -```dotenv -CUBEJS_DB_BQ_CREDENTIALS=$(cat /path/to/my/keyfile.json | base64) -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ------------------------------ | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | :------: | -| `CUBEJS_DB_BQ_PROJECT_ID` | The Google BigQuery project ID to connect to | A valid Google BigQuery Project ID | ✅ | -| `CUBEJS_DB_BQ_KEY_FILE` | The path to a JSON key file for connecting to Google BigQuery | A valid Google BigQuery JSON key file | ✅ | -| `CUBEJS_DB_BQ_CREDENTIALS` | A Base64 encoded JSON key file for connecting to Google BigQuery | A valid Google BigQuery JSON key file encoded as a Base64 string | ❌ | -| `CUBEJS_DB_BQ_LOCATION` | The Google BigQuery dataset location to connect to | [A valid Google BigQuery regional location][bq-docs-regional-locations] | ❌ | -| `CUBEJS_DB_EXPORT_BUCKET` | The name of a bucket in cloud storage | A valid bucket name from cloud storage | ❌ | -| `CUBEJS_DB_EXPORT_BUCKET_TYPE` | The cloud provider where the bucket is hosted | `gcp` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `10` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `40` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can be -used in pre-aggregations when using Google BigQuery as a source database. To -learn more about Google BigQuery's support for approximate aggregate functions, -[click here][bq-docs-approx-agg-fns]. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ❌ | ✅ | -| Export Bucket | ❌ | ❌ | - -By default, Google BigQuery uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for Google BigQuery. - -### Export bucket - - - -BigQuery only supports using Google Cloud Storage for export buckets. - - - -#### Google Cloud Storage - -For [improved pre-aggregation performance with large -datasets][ref-caching-large-preaggs], enable export bucket functionality by -configuring Cube.js with the following environment variables: - - - -When using an export bucket, remember to assign the **BigQuery Data Editor** and -**Storage Object Admin** role to your BigQuery service account. - - - -```dotenv -CUBEJS_DB_EXPORT_BUCKET=export_data_58148478376 -CUBEJS_DB_EXPORT_BUCKET_TYPE=gcp -``` - -## SSL - -Cube.js does not require any additional configuration to enable SSL as Google -BigQuery connections are made over HTTPS. - -[bq]: https://cloud.google.com/bigquery -[bq-docs-getting-started]: - https://cloud.google.com/docs/authentication/getting-started -[bq-docs-credentials]: - https://console.cloud.google.com/apis/credentials/serviceaccountkey -[bq-docs-regional-locations]: - https://cloud.google.com/bigquery/docs/locations#regional-locations -[bq-docs-approx-agg-fns]: - https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions -[google-cloud-docs-projects]: - https://cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin -[google-support-create-svc-account]: - https://support.google.com/a/answer/7378726?hl=en -[ref-caching-large-preaggs]: /caching/using-pre-aggregations#export-bucket -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-env-var]: /reference/environment-variables#database-connection -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching diff --git a/docs/content/Configuration/Databases/Hive.mdx b/docs/content/Configuration/Databases/Hive.mdx deleted file mode 100644 index 86e4b450ede72..0000000000000 --- a/docs/content/Configuration/Databases/Hive.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Hive/SparkSQL -permalink: /config/databases/hive-sparksql ---- - - - The driver for Hive/SparkSQL is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## Prerequisites - -- The hostname for the [Hive][hive] database server -- The username/password for the [Hive][hive] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=hive -CUBEJS_DB_HOST=my.hive.host -CUBEJS_DB_NAME=my_hive_database -CUBEJS_DB_USER=hive_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -[hive]: https://hive.apache.org/ diff --git a/docs/content/Configuration/Databases/MS-SQL.mdx b/docs/content/Configuration/Databases/MS-SQL.mdx deleted file mode 100644 index dfd5a395e04a9..0000000000000 --- a/docs/content/Configuration/Databases/MS-SQL.mdx +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: MS SQL -permalink: /config/databases/mssql ---- - -## Prerequisites - -- The hostname for the [MS SQL][mssql] database server -- The username/password for the [MS SQL][mssql] database server -- The name of the database to use within the [MS SQL][mssql] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=mssql -CUBEJS_DB_HOST=my.mssql.host -CUBEJS_DB_NAME=my_mssql_database -CUBEJS_DB_USER=mssql_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_DOMAIN` | A domain name within the database to connect to | A valid domain name within a MSSQL database | ❌ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using MSSQL as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Simple | ✅ | ✅ | -| Batching | - | - | -| Export Bucket | - | - | - -By default, MSSQL uses a [simple][self-preaggs-simple] strategy to build -pre-aggregations. - -### Simple - -No extra configuration is required to configure simple pre-aggregation builds -for MSSQL. - -### Batching - -MSSQL does not support batching. - -### Export Bucket - -MSSQL does not support export buckets. - -## SSL - -To enable SSL-encrypted connections between Cube.js and MS SQL, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -## Additional Configuration - -### <--{"id" : "Additional Configuration"}--> Windows Authentication - -To connect to a MSSQL database using Windows Authentication (also sometimes -known as `trustedConnection`), instantiate the driver with -`trustedConnection: true` in your `cube.js` configuration file: - -```javascript -const MssqlDriver = require('@cubejs-backend/mssql-driver'); -module.exports = { - driverFactory: ({ dataSource }) => - new MssqlDriver({ database: dataSource, trustedConnection: true }), -}; -``` - -[mssql]: https://www.microsoft.com/en-gb/sql-server/sql-server-2019 -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-simple]: #simple diff --git a/docs/content/Configuration/Databases/Materialize.mdx b/docs/content/Configuration/Databases/Materialize.mdx deleted file mode 100644 index a8b97a036a92d..0000000000000 --- a/docs/content/Configuration/Databases/Materialize.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Materialize -permalink: /config/databases/materialize ---- - -## Prerequisites - -- The hostname for the [Materialize][materialize] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=materialize -CUBEJS_DB_HOST=my.materialize.host -CUBEJS_DB_PORT=6875 -CUBEJS_DB_NAME=materialize -CUBEJS_DB_USER=materialize -CUBEJS_DB_PASS=materialize -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ✅ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## SSL - -To enable SSL-encrypted connections between Cube.js and Materialize, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -[materialize]: https://materialize.com/docs/ diff --git a/docs/content/Configuration/Databases/MongoDB.mdx b/docs/content/Configuration/Databases/MongoDB.mdx deleted file mode 100644 index d1050222ab88b..0000000000000 --- a/docs/content/Configuration/Databases/MongoDB.mdx +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: MongoDB -permalink: /config/databases/mongodb ---- - - - The driver for MongoDB is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## Prerequisites - - - -To use Cube.js with MongoDB you need to install the [MongoDB Connector for -BI][mongobi-download]. [Learn more about setup for MongoDB -here][cube-blog-mongodb]. - - - -- [MongoDB Connector for BI][mongobi-download] -- The hostname for the [MongoDB][mongodb] database server -- The username/password for the [MongoDB][mongodb] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=mongobi -CUBEJS_DB_HOST=my.mongobi.host # mongo BI connector host, if using from local, should be either `localhost` or `127.0.0.1` -CUBEJS_DB_PORT=3307 # default port of mongo BI connector service -CUBEJS_DB_NAME=my_mongodb_database -CUBEJS_DB_USER=mongodb_server_user -CUBEJS_DB_PASS=mongodb_server_password -``` - -If you are connecting to a local MongoBI Connector, which is pointing to a local -MongoDB instance, If MongoBI Connector and MongoDB are both running locally, -then the above should work. To connect to a remote MongoDB instance, first -configure `mongosqld` appropriately. See [here for an example config -file][mongobi-with-remote-db]. - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using MongoDB as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ✅ | ✅ | -| Export Bucket | - | - | - -By default, MongoDB uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for MongoDB. - -### Export Bucket - -MongoDB does not support export buckets. - -## SSL - -To enable SSL-encrypted connections between Cube.js and MongoDB, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -## Additional Configuration - -### <--{"id" : "Additional Configuratio"}--> MongoDB Atlas - -Use `CUBEJS_DB_SSL=true` to enable SSL as MongoDB Atlas requires it. All other -SSL-related environment variables can be left unset. - -[mongodb]: https://www.mongodb.com/ -[mongobi-with-remote-db]: - https://docs.mongodb.com/bi-connector/current/reference/mongosqld/#example-configuration-file -[cube-blog-mongodb]: - https://cube.dev/blog/building-mongodb-dashboard-using-node.js -[mongobi-download]: https://www.mongodb.com/download-center/bi-connector -[nodejs-docs-tls-ciphers]: - https://nodejs.org/docs/latest/api/tls.html#tls_modifying_the_default_tls_cipher_suite -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching diff --git a/docs/content/Configuration/Databases/MySQL.mdx b/docs/content/Configuration/Databases/MySQL.mdx deleted file mode 100644 index c9ee1a15153d9..0000000000000 --- a/docs/content/Configuration/Databases/MySQL.mdx +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: MySQL -permalink: /config/databases/mysql ---- - -## Prerequisites - -- The hostname for the [MySQL][mysql] database server -- The username/password for the [MySQL][mysql] database server -- The name of the database to use within the [MySQL][mysql] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=mysql -CUBEJS_DB_HOST=my.mysql.host -CUBEJS_DB_NAME=my_mysql_database -CUBEJS_DB_USER=mysql_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using MySQL as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ✅ | ✅ | -| Export Bucket | - | - | - -By default, MySQL uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for MySQL. - -### Export Bucket - -MySQL does not support export buckets. - -## SSL - -To enable SSL-encrypted connections between Cube.js and MySQL, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -## Additional Configuration - -### <--{"id" : "Additional Configuration"}--> Local/Docker - -To connect to a local MySQL database using a Unix socket, use -`CUBEJS_DB_SOCKET_PATH`. When doing so, `CUBEJS_DB_HOST` will be ignored. - -You can connect to an SSL-enabled MySQL database by setting `CUBEJS_DB_SSL` to -`true`. All other SSL-related environment variables can be left unset. See [the -SSL section][self-ssl] above for more details. - -[mysql]: https://www.mysql.com/ -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching -[self-ssl]: #ssl diff --git a/docs/content/Configuration/Databases/Oracle.mdx b/docs/content/Configuration/Databases/Oracle.mdx deleted file mode 100644 index 07253c9434cfc..0000000000000 --- a/docs/content/Configuration/Databases/Oracle.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Oracle -permalink: /config/databases/oracle ---- - - - The driver for Oracle is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## Prerequisites - -- The hostname for the [Oracle][oracle] database server -- The username/password for the [Oracle][oracle] database server -- The name of the database to use within the [Oracle][oracle] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=oracle -CUBEJS_DB_HOST=my.oracle.host -CUBEJS_DB_NAME=my_oracle_database -CUBEJS_DB_USER=oracle_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## SSL - -To enable SSL-encrypted connections between Cube.js and Oracle, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -[oracle]: https://www.oracle.com/uk/index.html -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database diff --git a/docs/content/Configuration/Databases/Postgres.mdx b/docs/content/Configuration/Databases/Postgres.mdx deleted file mode 100644 index 023363445a48f..0000000000000 --- a/docs/content/Configuration/Databases/Postgres.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Postgres -permalink: /config/databases/postgres ---- - -## Prerequisites - -- The hostname for the [Postgres][postgres] database server -- The username/password for the [Postgres][postgres] database server -- The name of the database to use within the [Postgres][postgres] database - server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=postgres -CUBEJS_DB_HOST=my.postgres.host -CUBEJS_DB_NAME=my_postgres_database -CUBEJS_DB_USER=postgres_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can -not be used in pre-aggregations when using Postgres as a source database. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ✅ | ✅ | -| Export Bucket | - | - | - -By default, Postgres uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for Postgres. - -### Export Bucket - -Postgres does not support export buckets. - -## SSL - -To enable SSL-encrypted connections between Cube.js and Postgres, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -## Additional Configuration - -### <--{"id" : "Additional Configuration"}--> AWS RDS - -Use `CUBEJS_DB_SSL=true` to enable SSL if you have SSL enabled for your RDS -cluster. Download the new certificate [here][aws-rds-pem], and provide the -contents of the downloaded file to `CUBEJS_DB_SSL_CA`. All other SSL-related -environment variables can be left unset. See [the SSL section][self-ssl] for -more details. More info on AWS RDS SSL can be found [here][aws-docs-rds-ssl]. - -### <--{"id" : "Additional Configuration"}--> Google Cloud SQL - -You can connect to an SSL-enabled MySQL database by setting `CUBEJS_DB_SSL` to -`true`. You may also need to set `CUBEJS_DB_SSL_SERVERNAME`, depending on how -you are [connecting to Cloud SQL][gcp-docs-sql-connect]. - -### <--{"id" : "Additional Configuration"}--> Heroku - -Unless you're using a Private or Shield Heroku Postgres database, Heroku -Postgres does not currently support verifiable certificates. [Here is the -description of the issue from Heroku][heroku-postgres-issue]. - -As a workaround, you can set `rejectUnauthorized` option to `false` in the -Cube.js Postgres driver: - -```js -const PostgresDriver = require('@cubejs-backend/postgres-driver'); -module.exports = { - driverFactory: () => - new PostgresDriver({ - ssl: { - rejectUnauthorized: false, - }, - }), -}; -``` - -[aws-docs-rds-ssl]: - https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html -[aws-rds-pem]: https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem -[gcp-docs-sql-connect]: - https://cloud.google.com/sql/docs/postgres/connect-functions#connecting_to -[heroku-postgres-issue]: - https://help.heroku.com/3DELT3RK/why-can-t-my-third-party-utility-connect-to-heroku-postgres-with-ssl -[postgres]: https://www.postgresql.org/ -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching -[self-ssl]: #ssl diff --git a/docs/content/Configuration/Databases/Presto.mdx b/docs/content/Configuration/Databases/Presto.mdx deleted file mode 100644 index b5bbb89c2f336..0000000000000 --- a/docs/content/Configuration/Databases/Presto.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Presto -permalink: /config/databases/presto -redirect_from: - - /config/databases/prestodb ---- - -## Prerequisites - -- The hostname for the [Presto][presto] database server -- The username/password for the [Presto][presto] database server -- The name of the database to use within the [Presto][presto] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube project: - -```bash -CUBEJS_DB_TYPE=prestodb -CUBEJS_DB_HOST=my.presto.host -CUBEJS_DB_NAME=my_presto_database -CUBEJS_DB_USER=presto_user -CUBEJS_DB_PASS=********** -CUBEJS_DB_CATALOG=my_presto_catalog -CUBEJS_DB_SCHEMA=my_presto_schema -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ❌ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_CATALOG` | The catalog within the database to connect to | A valid catalog name within a Presto database | ✅ | -| `CUBEJS_DB_SCHEMA` | The schema within the database to connect to | A valid schema name within a Presto database | ✅ | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube | `true`, `false` | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can be -used in pre-aggregations when using Presto as a source database. To learn more -about Presto support for approximate aggregate functions, [click -here][presto-docs-approx-agg-fns]. - -## SSL - -To enable SSL-encrypted connections between Cube and Presto, set the -`CUBEJS_DB_SSL` environment variable to `true`. For more information on how to -configure custom certificates, please check out [Enable SSL Connections to the -Database][ref-recipe-enable-ssl]. - -[presto]: https://prestodb.io/ -[presto-docs-approx-agg-fns]: - https://prestodb.io/docs/current/functions/aggregate.html -[ref-recipe-enable-ssl]: /recipes/enable-ssl-connections-to-database -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx diff --git a/docs/content/Configuration/Databases/QuestDB.mdx b/docs/content/Configuration/Databases/QuestDB.mdx deleted file mode 100644 index 75568212ebbc3..0000000000000 --- a/docs/content/Configuration/Databases/QuestDB.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: QuestDB -permalink: /config/databases/questdb ---- - -## Prerequisites - -- The hostname for the [QuestDB][questdb] database server - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=questdb -CUBEJS_DB_HOST=my.questdb.host -CUBEJS_DB_PORT=8812 -CUBEJS_DB_NAME=qdb -CUBEJS_DB_USER=admin -CUBEJS_DB_PASS=quest -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_HOST` | The host URL for a database | A valid database host URL | ✅ | -| `CUBEJS_DB_PORT` | The port for the database connection | A valid port number | ✅ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -[questdb]: https://questdb.io/ diff --git a/docs/content/Configuration/Databases/SQLite.mdx b/docs/content/Configuration/Databases/SQLite.mdx deleted file mode 100644 index 9e859aa81f0fe..0000000000000 --- a/docs/content/Configuration/Databases/SQLite.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: SQLite -permalink: /config/databases/sqlite ---- - - - The driver for SQLite is{' '} - community-supported and is not - supported by Cube or the vendor. - - -## Prerequisites - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=sqlite -CUBEJS_DB_NAME=my_sqlite_database -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | --------------------- | :------: | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `2` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ | - -## SSL - -SQLite does not support SSL connections. diff --git a/docs/content/Configuration/Databases/Snowflake.mdx b/docs/content/Configuration/Databases/Snowflake.mdx deleted file mode 100644 index b9507dfcef630..0000000000000 --- a/docs/content/Configuration/Databases/Snowflake.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Snowflake -permalink: /config/databases/snowflake ---- - -## Prerequisites - -- [The account ID][dbt-docs-snowflake-account] for [Snowflake][snowflake] -- The warehouse name in the [Snowflake][snowflake] account -- [The region][snowflake-docs-regions] for the [Snowflake][snowflake] warehouse -- The username/password for the [Snowflake][snowflake] account - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=snowflake -CUBEJS_DB_SNOWFLAKE_ACCOUNT=XXXXXXXXX.us-east-1 -CUBEJS_DB_SNOWFLAKE_REGION=us-east-1 -CUBEJS_DB_SNOWFLAKE_WAREHOUSE=MY_SNOWFLAKE_WAREHOUSE -CUBEJS_DB_NAME=my_snowflake_database -CUBEJS_DB_USER=snowflake_user -CUBEJS_DB_PASS=********** -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | :------: | -| `CUBEJS_DB_SNOWFLAKE_ACCOUNT` | The Snowflake account ID to use when connecting to the database | [A valid Snowflake account ID][dbt-docs-snowflake-account] | ✅ | -| `CUBEJS_DB_SNOWFLAKE_REGION` | The Snowflake region to use when connecting to the database | [A valid Snowflake region][snowflake-docs-regions] | ✅ | -| `CUBEJS_DB_SNOWFLAKE_WAREHOUSE` | The Snowflake warehouse to use when connecting to the database | A valid Snowflake warehouse for the account | ✅ | -| `CUBEJS_DB_SNOWFLAKE_ROLE` | The Snowflake role to use when connecting to the database | A valid Snowflake role for the account | ❌ | -| `CUBEJS_DB_SNOWFLAKE_CLIENT_SESSION_KEEP_ALIVE` | If `true`, [keep the Snowflake connection alive indefinitely][snowflake-docs-connection-options] | `true`, `false` | ❌ | -| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password | ✅ | -| `CUBEJS_DB_SNOWFLAKE_AUTHENTICATOR` | The type of authenticator to use with Snowflake. Use `SNOWFLAKE` with username/password, or `SNOWFLAKE_JWT` with key pairs. Defaults to `SNOWFLAKE` | `SNOWFLAKE`, `SNOWFLAKE_JWT` | ❌ | -| `CUBEJS_DB_SNOWFLAKE_PRIVATE_KEY_PATH` | The path to the private RSA key folder | A valid path to the private RSA key | ❌ | -| `CUBEJS_DB_SNOWFLAKE_PRIVATE_KEY_PASS` | The password for the private RSA key. Only required for encrypted keys | A valid password for the encrypted private RSA key | ❌ | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each queue has to the database. Default is `5` | A valid number | ❌ | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `20` | A valid number | ❌ | - -## Pre-Aggregation Feature Support - -### countDistinctApprox - -Measures of type -[`countDistinctApprox`][ref-schema-ref-types-formats-countdistinctapprox] can be -used in pre-aggregations when using Snowflake as a source database. To learn -more about Snowflake's support for approximate aggregate functions, [click -here][snowflake-docs-approx-agg-fns]. - -## Pre-Aggregation Build Strategies - - - -To learn more about pre-aggregation build strategies, [head -here][ref-caching-using-preaggs-build-strats]. - - - -| Feature | Works with read-only mode? | Is default? | -| ------------- | :------------------------: | :---------: | -| Batching | ❌ | ✅ | -| Export Bucket | ❌ | ❌ | - -By default, Snowflake uses [batching][self-preaggs-batching] to build -pre-aggregations. - -### Batching - -No extra configuration is required to configure batching for Snowflake. - -### Export Bucket - -Snowflake supports using both [AWS S3][aws-s3] and [Google Cloud -Storage][google-cloud-storage] for export bucket functionality. - -#### AWS S3 - - - -Ensure the AWS credentials are correctly configured in IAM to allow reads and -writes to the export bucket in S3. - - - -```dotenv -CUBEJS_DB_EXPORT_BUCKET_TYPE=s3 -CUBEJS_DB_EXPORT_BUCKET=my.bucket.on.s3 -CUBEJS_DB_EXPORT_BUCKET_AWS_KEY= -CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET= -CUBEJS_DB_EXPORT_BUCKET_AWS_REGION= -``` - -#### Google Cloud Storage - - - -When using an export bucket, remember to assign the **Storage Object Admin** -role to your BigQuery credentials (`CUBEJS_DB_EXPORT_GCS_CREDENTIALS`). - - - -Before configuring Cube.js, an [integration must be created and configured in -Snowflake][snowflake-docs-gcs-integration]. Take note of the integration name -(`gcs_int` from the example link) as you'll need it to configure Cube.js. - -Once the Snowflake integration is set up, configure Cube.js using the following: - -```dotenv -CUBEJS_DB_EXPORT_BUCKET=snowflake-export-bucket -CUBEJS_DB_EXPORT_BUCKET_TYPE=gcp -CUBEJS_DB_EXPORT_GCS_CREDENTIALS= -CUBEJS_DB_EXPORT_INTEGRATION=gcs_int -``` - -## SSL - -Cube.js does not require any additional configuration to enable SSL as Snowflake -connections are made over HTTPS. - -[aws-s3]: https://aws.amazon.com/s3/ -[dbt-docs-snowflake-account]: - https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile#account -[google-cloud-storage]: https://cloud.google.com/storage -[ref-caching-using-preaggs-build-strats]: - /caching/using-pre-aggregations#pre-aggregation-build-strategies -[ref-env-var]: /reference/environment-variables#database-connection -[ref-schema-ref-types-formats-countdistinctapprox]: - /schema/reference/types-and-formats#count-distinct-approx -[self-preaggs-batching]: #batching -[snowflake]: https://www.snowflake.com/ -[snowflake-docs-connection-options]: - https://docs.snowflake.com/en/user-guide/nodejs-driver-use.html#additional-connection-options -[snowflake-docs-gcs-integration]: - https://docs.snowflake.com/en/user-guide/data-load-gcs-config.html -[snowflake-docs-regions]: - https://docs.snowflake.com/en/user-guide/intro-regions.html -[snowflake-docs-approx-agg-fns]: - https://docs.snowflake.com/en/sql-reference/functions/approx_count_distinct.html diff --git a/docs/content/Configuration/Databases/elasticsearch.svg b/docs/content/Configuration/Databases/elasticsearch.svg deleted file mode 100644 index b95507cd54b28..0000000000000 --- a/docs/content/Configuration/Databases/elasticsearch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/content/Configuration/Databases/ksqlDB.mdx b/docs/content/Configuration/Databases/ksqlDB.mdx deleted file mode 100644 index 420c7f5f21c69..0000000000000 --- a/docs/content/Configuration/Databases/ksqlDB.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: ksqlDB -permalink: /config/databases/ksqldb ---- - - -ksqlDB driver is in preview. Please contact us if you need help running it in production. - - -## Prerequisites - -- Hostname for the ksqlDB server -- Username and password to connect to ksqlDB server - -If you are using Confluent Cloud, you need to generate API key and use **key as username** and **secret as password**. - -## Setup - -### <--{"id" : "Setup"}--> Manual - -Add the following to a `.env` file in your Cube.js project: - -```bash -CUBEJS_DB_TYPE=ksql -CUBEJS_DB_URL=https://xxxxxx-xxxxx.us-west4.gcp.confluent.cloud:443 -CUBEJS_DB_USER=username -CUBEJS_DB_PASS=password -``` - -## Environment Variables - -| Environment Variable | Description | Possible Values | Required | -| -------------------- | ----------------------------------------------------------------------------------- | ------------------------- | :------: | -| `CUBEJS_DB_URL` | The host URL for ksqlDB with port | A valid database host URL | ✅ | -| `CUBEJS_DB_USER` | The username used to connect to the ksqlDB. API key for Confluent Cloud. | A valid port number | ✅ | -| `CUBEJS_DB_PASS` | The password used to connect to the ksqlDB. API secret for Confluent Cloud. | A valid database name | ✅ | - -## Pre-Aggregations Support - -ksqlDB supports only [streaming pre-aggregations](/caching/using-pre-aggregations#streaming-pre-aggregations). diff --git a/docs/content/Configuration/Databases/sqlite.svg b/docs/content/Configuration/Databases/sqlite.svg deleted file mode 100644 index c70ab889b87f8..0000000000000 --- a/docs/content/Configuration/Databases/sqlite.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/docs/content/Configuration/Downstream/Appsmith.mdx b/docs/content/Configuration/Downstream/Appsmith.mdx deleted file mode 100644 index 2fed5b5769b2e..0000000000000 --- a/docs/content/Configuration/Downstream/Appsmith.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Connecting to Appsmith -permalink: /config/downstream/appsmith ---- - -[Appsmith](https://www.appsmith.com) is an open-source framework for building internal tools. You can connect a Cube deployment to Appsmith using Cube’s [REST API](https://cube.dev/docs/rest-api). - -Here's a short video guide on how to connect Appsmith to Cube. - - - -## Use REST API in Cube - -> Don't have a Cube project yet? [Learn how to get started here](https://cube.dev/docs/cloud/getting-started). - -### <--{"id" : "Use REST API in Cube"}--> Cube Cloud - -Click the “How to connect” link on the Overview page, navigate to the REST API tab. You should see the screen below with your connection credentials (the REST API URL and the authorization token): - -
- -
- -### <--{"id" : "Use REST API in Cube"}--> Self-hosted Cube - -For a Cube instance publicly available at a specific `HOST`, the REST API URL would be `HOST/cubejs-api/v1`. Please refer to the [REST API page](https://cube.dev/docs/rest-api) for details. - -You will also need to generate a JSON Web Token that would be used to authenticate requests to Cube. - -Please check the [Security page](https://cube.dev/docs/security#generating-json-web-tokens-jwt) to learn how to generate a token. We suggest generating a long-lived JWT that won't expire soon. - -## Create a new Data Source in Appsmith - -Copy and paste the REST API URL and the Authorization token to create a new data source in Appsmith. - -
- -
- -## Create a POST request in Appsmith - -Get your Cube query in the JSON [query format](https://cube.dev/docs/query-format) ready. You can copy it from Cube’s Playground or compose manually: - -
- -
- -Create a POST request, paste the JSON query in the **Body**. Make sure to add a `query` parameter for your JSON query. - -Because you saved the data source as `HOST/cubejs-api/v1`, don't forget to add a `/load` endpoint to the end of the data source API. - -Next, hit Run. - -
- -
- -## Display the Data in Appsmith - -You have many options to display the data in Appsmith. For instance, you can display the data in a table widget. Also, you can create a chart widget and map the values to *x* and *y* coordinates accordingly, give a *title* and *names* to the *axis*. - -
- -
diff --git a/docs/content/Configuration/Downstream/Bubble.mdx b/docs/content/Configuration/Downstream/Bubble.mdx deleted file mode 100644 index eeab8a5b6ac1e..0000000000000 --- a/docs/content/Configuration/Downstream/Bubble.mdx +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Connecting to Bubble -permalink: /config/downstream/bubble ---- - -[Bubble](https://bubble.io/) is one of the oldest and most comprehensive low-code app-building platforms on the market. -You can connect a Cube deployment to Bubble using Cube’s [REST API](https://cube.dev/docs/rest-api). - -Here's a short video guide on how to connect Bubble to Cube. - - - -## Use REST API in Cube - -> Don't have a Cube project yet? [Learn how to get started here](https://cube.dev/docs/cloud/getting-started). - -### <--{"id" : "Use REST API in Cube"}--> Cube Cloud - -Click the "How to connect" link on the Overview page, navigate to the REST API tab. You will see your connection credentials, the REST API URL and the authorization token: - -
- -
- -### <--{"id" : "Use REST API in Cube"}--> Self-hosted Cube - -For a Cube instance publicly available at a specific `HOST`, the REST API URL would be `HOST/cubejs-api/v1`. Please refer to the [REST API page](https://cube.dev/docs/rest-api) for details. - -You will also need to generate a JSON Web Token that would be used to authenticate requests to Cube. - -Please check the [Security page](https://cube.dev/docs/security#generating-json-web-tokens-jwt) to learn how to generate a token. We suggest generating a long-lived JWT that won't expire soon. - -## Add an API connector plugin to your Bubble app - -Navigate to the plugins. Select and install the API connector plugin. - -## Create a new API in Bubble - -Click "Add another API". - -
- -
- -Next, set the "Authentication" as "Private key in header", and copy and paste Cube's Authorization token. -Additionally, make sure to add a shared header for all calls by setting `content-type` to `application/json`. - -
- -
- -## Create a POST request in Bubble - -Click "Add another call". - -Copy and paste the Cube REST API, including the `/load` path, in the API field. Make sure to select "Use as: Action", and use the `JSON` "data type" and "body type". - -
- -
- -Get your Cube query in the JSON [query format](https://cube.dev/docs/query-format) ready. You can copy it from Cube’s Playground or compose manually: - -
- -
- -Paste the JSON query in the **Body**. Make sure to add a `query` parameter for your JSON query. - -
- -
- -Next, hit "Initialize / Reinitialize call". - -## Create a workflow in Bubble - -First, add a "Page is loaded" event. Add an action that uses the API connector plugin. Next, add another action to set the state of an element. Select the index element, and create a new custom state. In this example I named the custom state `OrdersByMonth` and selected the `data` field of the API response. Make sure to toggle the "This state is a list" checkbox as well. While setting the state's value you will need to select "Result of step 1" and the `data` field. - -
- -
- -## Display the data in Bubble - -Bubble has an amazing feature where you can drag and drop UI components into the design dashboard. - -Once you added a chart, you configure the data points. More specifically, the series categories and series data. For the series categories and series data you need to select the `index` and `OrdersByMonth` state followed by the data point you want to use in order to populate the chart. - -
- -
- -Once you open the "Preview" you'll see your nicely rendered charts. - -
- -
diff --git a/docs/content/Configuration/Downstream/Budibase.mdx b/docs/content/Configuration/Downstream/Budibase.mdx deleted file mode 100644 index f9490cb02670b..0000000000000 --- a/docs/content/Configuration/Downstream/Budibase.mdx +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Connecting to Budibase -permalink: /config/downstream/budibase ---- - -Budibase is a low-code app-building platform that helps developers create responsive web applications with access methods to databases, APIs, and much more. You can connect a Cube deployment to Budibase using Cube's [REST API](https://cube.dev/docs/rest-api). - -Here's a short video guide on how to connect Budibase to Cube. - - - -## Use REST API in Cube - -> Don't have a Cube project yet? [Learn how to get started here](https://cube.dev/docs/cloud/getting-started). - -### <--{"id" : "Use REST API in Cube"}--> Cube Cloud - -Click the "How to connect" link on the Overview page, navigate to the REST API tab. You will see your connection credentials, the REST API URL and the authorization token: - -
- -
- -### <--{"id" : "Use REST API in Cube"}--> Self-hosted Cube - -For a Cube instance publicly available at a specific `HOST`, the REST API URL would be `HOST/cubejs-api/v1`. Please refer to the [REST API page](https://cube.dev/docs/rest-api) for details. - -You will also need to generate a JSON Web Token that would be used to authenticate requests to Cube. - -Please check the [Security page](https://cube.dev/docs/security#generating-json-web-tokens-jwt) to learn how to generate a token. We suggest generating a long-lived JWT that won't expire soon. - -## Create a new data source in Budibase - -Create a new "REST API" data source in Budibase. - -
- -
- -Next, add a "Authorization" header for the REST API. Copy and paste Cube's Authorization token. - -
- -
- -## Add a query in Budibase - -Click "+ Add Query". - -Copy and paste the Cube REST API, including the `/load` path, in the API field. Make sure to select "POST" as the request. - -
- -
- -Get your Cube query in the JSON [query format](https://cube.dev/docs/query-format) ready. You can copy it from Cube's Playground or compose manually: - -
- -
- -Paste the JSON query in the **Body** as "raw(JSON)". Make sure to add a `query` parameter for your JSON query. - -
- -
- -Edit the **Transform** to return the data of the request. - -``` -return data.data -``` - -
- -
- -You can also give the query a name. In this sample it's called `OrdersByMonth`. - -Lastly, click the "save" button and hit "send" to test the API and get a response back. - -## Create a data provider in Budibase - -Move to the **Design** section and open the **Components**. - -First, add a Data Provider. Select the query from above. In this sample it's called `OrdersByMonth`. - -
- -
- -## Display the data in Budibase - -Add a chart into the data provider. Next, configure the data provider for the chart. Make sure it's set to the data provider you just created. - -Then, you set the "label column" and "data columns". In this sample you can set `Orders.createdAt` as the label column and `Orders.count` as the data columns. - -
- -
- -You'll see a nicely rendered chart show up. - -
- -
diff --git a/docs/content/Configuration/Downstream/Deepnote.mdx b/docs/content/Configuration/Downstream/Deepnote.mdx deleted file mode 100644 index e98a194b21495..0000000000000 --- a/docs/content/Configuration/Downstream/Deepnote.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Connecting to Deepnote -permalink: /config/downstream/deepnote ---- - -You can connect to Cube from Deepnote, a new kind of data notebook that's built for collaboration and is Jupyter compatible, using the [Cube SQL API][ref-sql-api]. - -Here's a short video guide on how to connect Deepnote to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started -here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **Deploy SQL API** and then the **How to connect your BI tool** link on the Overview page of your Cube deployment. -Navigate to the **BIs and Visualization Tools** tab. You should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Deepnote -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` -## Connecting from Deepnote - -Deepnote connects to Cube as to a Postgres database. - -
- -
- -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -You can write SQL in Deepnote that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. - -
- -
- -You can also create a visualization of the executed SQL query. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Hex.mdx b/docs/content/Configuration/Downstream/Hex.mdx deleted file mode 100644 index 1a3ef5868bbf3..0000000000000 --- a/docs/content/Configuration/Downstream/Hex.mdx +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Connecting to Hex -permalink: /config/downstream/hex ---- - -You can connect to Cube from Hex, a collaborative data platform, using the [Cube SQL -API][ref-sql-api]. - -Here's a short video guide on how to connect Hex to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started -here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **How to connect your BI tool** link on the Overview page, navigate to the SQL API tab -and enable it. Once enabled, you should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Hex -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` -## Connecting from Hex - -Hex connects to Cube as to a Postgres database. - -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -You can write SQL in Hex that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. - -
- -
- -You can also create a visualization of the executed SQL query. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Jupyter.mdx b/docs/content/Configuration/Downstream/Jupyter.mdx deleted file mode 100644 index 9d3b3cc1d979f..0000000000000 --- a/docs/content/Configuration/Downstream/Jupyter.mdx +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: Connecting to Jupyter -permalink: /config/downstream/jupyter ---- - -You can connect to Cube from Jupyter using the [Cube SQL API][ref-sql-api]. The Jupyter Notebook is a web application for creating and sharing computational documents. - -Here's a short video guide on how to connect Jupyter to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **Deploy SQL API** and then the **How to connect your BI tool** link on the Overview page of your Cube deployment. -Navigate to the **BIs and Visualization Tools** tab. You should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Jupyter -later. - -```bash -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` -## Connecting from Jupyter - -Jupyter connects to Cube as to a Postgres database. - -Make sure to install the `sqlalchemy` and `pandas` modules. - -```bash -pip install sqlalchemy -pip install pandas -``` - -Then you can use `sqlalchemy.create_engine` to connect to Cube's SQL API. - -```python -import sqlalchemy -import pandas - -engine = sqlalchemy.create_engine( - sqlalchemy.engine.url.URL( - drivername="postgresql", - username="cube", - password="9943f670fd019692f58d66b64e375213", - host="thirsty-raccoon.sql.aws-eu-central-1.cubecloudapp.dev", - port="5432", - database="db@thirsty-raccoon", - ), - echo_pool=True, -) -print("connecting with engine " + str(engine)) -connection = engine.connect() - -# ... -``` - -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -You can write SQL in Jupyter that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. - -```python -# ... - -query = "SELECT SUM(count), status FROM orders GROUP BY status;" -df = pandas.read_sql_query(query, connection) -``` - -In your Jupyter notebook it'll look like this. - -
- -
- -You can also create a visualization of the executed SQL query. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Metabase.mdx b/docs/content/Configuration/Downstream/Metabase.mdx deleted file mode 100644 index 846069b36e2b6..0000000000000 --- a/docs/content/Configuration/Downstream/Metabase.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Connecting to Metabase -permalink: /config/downstream/metabase ---- - -You can connect to Cube from Metabase by using the [Cube SQL API][ref-sql-api]. Metabase is the easy, open-source way to help everyone in your company work with data like an analyst. - -Here's a short video guide on how to connect Metabase to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **Deploy SQL API** and then the **How to connect your BI tool** link on the Overview page of your Cube deployment. -Navigate to the **BIs and Visualization Tools** tab. You should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Metabase -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` -## Connecting from Metabase - -Metabase connects to Cube as to a Postgres database. - -
- -
- -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -
- -
- -You can write SQL in Metabase that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. You can also create a visualization of the executed SQL query. - -
- -
- -If you prefer using the UI interface to "Ask a question", you can do that as well. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Observable.mdx b/docs/content/Configuration/Downstream/Observable.mdx deleted file mode 100644 index 9d588a7521355..0000000000000 --- a/docs/content/Configuration/Downstream/Observable.mdx +++ /dev/null @@ -1,214 +0,0 @@ ---- -title: Connecting to Observable -permalink: /config/downstream/observable ---- - -You can connect to Cube from Observable, a new kind of collaborative data notebook that's built to uncover new insights, answer more questions, and make better decisions, using the [Cube SQL API][ref-sql-api] or [Cube REST API][ref-rest-api]. - -Here's a short video guide on how to connect Observable to Cube. - - - -## Use SQL API in Cube - - - -Don't have a Cube project yet? [Learn how to get started here][ref-getting-started]. - - - -### <--{"id" : "Use SQL API in Cube"}--> Cube Cloud - - -Click **Deploy SQL API** and then the **How to connect your BI tool** link on the Overview page of your Cube deployment. -Navigate to the **BIs and Visualization Tools** tab. You should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Use SQL API in Cube"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Observable -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` - -## Connecting Cube SQL API from Observable - -Observable connects to Cube as to a Postgres database. - -
- -
- -### <--{"id" : "Connecting Cube SQL API from Observable"}--> Querying data with SQL API - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -Make sure to add a database to your notebook, and select **Database query** when adding a new block. - -
- -
- -You can write SQL in Observable that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. - -
- -
- -You can also create a visualization of the executed SQL query. - -
- -
- -## Use REST API in Cube - -> Don't have a Cube project yet? [Learn how to get started here](https://cube.dev/docs/cloud/getting-started). - -### <--{"id" : "Use REST API in Cube"}--> Cube Cloud - -Click the "How to connect" link on the Overview page, navigate to the REST API tab. You will see your connection credentials, the REST API URL and the authorization token: - -
- -
- -### <--{"id" : "Use REST API in Cube"}--> Self-hosted Cube - -For a Cube instance publicly available at a specific `HOST`, the REST API URL would be `HOST/cubejs-api/v1`. Please refer to the [REST API page](https://cube.dev/docs/rest-api) for details. - -You will also need to generate a JSON Web Token that would be used to authenticate requests to Cube. - -Please check the [Security page](https://cube.dev/docs/security#generating-json-web-tokens-jwt) to learn how to generate a token. We suggest generating a long-lived JWT that won't expire soon. - -## Connecting Cube REST API from Observable - -Observable connects to Cube through the REST API. - -### <--{"id" : "Connecting Cube REST API from Observable"}--> Querying data with REST API - -First, add two generic **JavaScript** cells: - -
- -
- -Next, copy Cube's REST API URL and the Authorization token and paste them into their respective cells. - -```js -cubeRestApi = 'https://thirsty-raccoon.aws-eu-central-1.cubecloudapp.dev/cubejs-api/v1/load' -``` - -Because the Cube REST API has the format of `HOST/cubejs-api/v1`, don't forget to add the `/load` endpoint to the end of the data source API. - -```js -cubeRestApiJwtToken = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NTgzMzM3OTZ9.gUOoDgo_RJka_ZANdwSw3v8GkM4ZzH9LjxrxKxkGAk0' -``` - -Also make sure to add the token next to the Bearer part of the Authorization header. - -Get your Cube query in the JSON [query format](https://cube.dev/docs/query-format) ready. You can copy it from Cube's Playground or compose manually: - -
- -
- -Paste the JSON query in another JavaScript cell as an object literal and give it a name, I chose `jsonBody` for simplicity. Make sure to add a `query` parameter for your JSON query. - -```js -jsonQuery = ({ - "query": { - "measures": [ - "Orders.count" - ], - "timeDimensions": [ - { - "dimension": "Orders.createdAt", - "granularity": "month" - } - ], - "order": { - "Orders.createdAt": "asc" - } - } -}); -``` - -Next, create another JavaScript cell with a POST request. Paste this POST request in the cell. Don't forget to put the `jsonBody` object inside the `JSON.stringify` call. - -```js -orders_over_time = fetch(cubeRestApi, { - method: 'POST', - headers: { - 'Authorization': cubeRestApiJwtToken, - 'Content-Type': 'application/json' - }, - body: JSON.stringify(jsonQuery), -}).then(response => response.json()).then(json => json.data) -``` - -Next, click the play button on the top right of the cell. - -
- -
- -You can also create a visualization of the executed REST API request. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql -[ref-rest-api]: /backend/rest-api diff --git a/docs/content/Configuration/Downstream/PowerBI.md b/docs/content/Configuration/Downstream/PowerBI.md deleted file mode 100644 index fe0973ffdd9f0..0000000000000 --- a/docs/content/Configuration/Downstream/PowerBI.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Connecting from Power BI -permalink: /config/downstream/powerbi ---- - - - -Power BI support is in preview, not all features and requests may work at this -point. - - - -You can connect to Cube from Power BI, interactive data visualization software product developed by Microsoft, using the [Cube SQL -API][ref-sql-api]. - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started -here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **How to connect your BI tool** link on the Overview page, navigate to the SQL API tab -and enable it. Once enabled, you should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from PowerBI -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` - -## Connecting from Power BI - -Power BI connects to Cube as to a Postgres database. - -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - - -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Retool.mdx b/docs/content/Configuration/Downstream/Retool.mdx deleted file mode 100644 index 28936ff3f0498..0000000000000 --- a/docs/content/Configuration/Downstream/Retool.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Connecting to Retool -permalink: /config/downstream/retool ---- - -[Retool](https://retool.com/) is the fast way to build internal tools. It lets you visually design apps that interface with any database or API. You can connect a Cube deployment to Retool using Cube’s [REST API](https://cube.dev/docs/rest-api). - -Here's a short video guide on how to connect Retool to Cube. - - - -## Use REST API in Cube - -> Don't have a Cube project yet? [Learn how to get started here](https://cube.dev/docs/cloud/getting-started). - -### <--{"id" : "Use REST API in Cube"}--> Cube Cloud - -Click the "How to connect" link on the Overview page, navigate to the REST API tab. You will see your connection credentials, the REST API URL and the authorization token: - -
- -
- -### <--{"id" : "Use REST API in Cube"}--> Self-hosted Cube - -For a Cube instance publicly available at a specific `HOST`, the REST API URL would be `HOST/cubejs-api/v1`. Please refer to the [REST API page](https://cube.dev/docs/rest-api) for details. - -You will also need to generate a JSON Web Token that would be used to authenticate requests to Cube. - -Please check the [Security page](https://cube.dev/docs/security#generating-json-web-tokens-jwt) to learn how to generate a token. We suggest generating a long-lived JWT that won't expire soon. - -## Create a new resource in Retool - -Create a new "REST API" resource in Retool. - -
- -
- -Next, copy and paste Cube's REST API URL and the Authorization token. - -
- -
- -## Create a POST request in Retool - -Get your Cube query in the JSON [query format](https://cube.dev/docs/query-format) ready. You can copy it from Cube’s Playground or compose manually: - -
- -
- -Create a POST request, paste the JSON query in the **Body**. Make sure to add a `query` parameter for your JSON query. - -Because the Cube REST API has the format of `HOST/cubejs-api/v1`, don't forget to add the `/load` endpoint to the end of the data source API. - -Next, hit Run. - -
- -
- -## Display the data in Retool - -Retool has an amazing feature where you can drag and drop UI components into the dashboard. You can use this to add a tables, bar charts, and much more. - -Because the name of the Retool query in the example is `OrdersByMonth`, using the data binding curly brackets will populate the charts with data from the REST API. - -``` -{{ OrdersByMonth.data.data }} -``` - -Reference the name of the query in your Retool charts. - -
- -
- -Get nicely rendered charts. - -
- -
diff --git a/docs/content/Configuration/Downstream/Streamlit.mdx b/docs/content/Configuration/Downstream/Streamlit.mdx deleted file mode 100644 index 91037b77a4547..0000000000000 --- a/docs/content/Configuration/Downstream/Streamlit.mdx +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Connecting to Streamlit -permalink: /config/downstream/streamlit ---- - -You can connect to Cube from Streamlit using the [Cube SQL API][ref-sql-api]. Streamlit turns data scripts into shareable web apps in minutes. - -Here's a short video guide on how to connect Streamlit to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **Deploy SQL API** and then the **How to connect your BI tool** link on the Overview page of your Cube deployment. -Navigate to the **BIs and Visualization Tools** tab. You should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Streamlit -later. - -```bash -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` -## Connecting from Jupyter - -Jupyter connects to Cube as to a Postgres database. - -Make sure to install the `streamlit`, `sqlalchemy` and `pandas` modules. - -```bash -pip install streamlit -pip install sqlalchemy -pip install pandas -``` - -Then you can use `sqlalchemy.create_engine` to connect to Cube's SQL API. - -```python -import streamlit -import sqlalchemy -import pandas - -engine = sqlalchemy.create_engine( - sqlalchemy.engine.url.URL( - drivername="postgresql", - username="cube", - password="9943f670fd019692f58d66b64e375213", - host="thirsty-raccoon.sql.aws-eu-central-1.cubecloudapp.dev", - port="5432", - database="db@thirsty-raccoon", - ), - echo_pool=True, -) -print("connecting with engine " + str(engine)) -connection = engine.connect() - -# ... -``` - -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -You can write SQL in Streamlit that will be executed in Cube. Learn more about Cube SQL -syntax on the [reference page][ref-sql-api]. - -```python -# ... - -with streamlit.echo(): - query = "select sum(count) as orders_count, status from orders group by status;" -df = pandas.read_sql_query(query, connection) -streamlit.dataframe(df) -``` - -In your Streamlit notebook it'll look like this. You can create a visualization of the executed SQL query by using `streamlit.dataframe(df)`. - -
- -
- -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql diff --git a/docs/content/Configuration/Downstream/Superset.mdx b/docs/content/Configuration/Downstream/Superset.mdx deleted file mode 100644 index 3b8df70ad3f16..0000000000000 --- a/docs/content/Configuration/Downstream/Superset.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Connecting to Superset/Preset -permalink: /config/downstream/superset -redirect_from: - - /recipes/using-apache-superset-with-cube-sql ---- - -You can connect a Cube project to [Apache Superset][superset] using the Cube SQL -API. [Apache Superset][superset] is an open-source data exploration and -visualization platform, commonly used to visualize business metrics and -performance. - -Here's a short video guide on how to connect Apache Superset to Cube. - - - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started -here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **How to connect your BI tool** link on the Overview page, navigate to the -SQL API tab and enable it. Once enabled, you should see the screen like the one -below with your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Superset -later. - -```bash -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` - -### <--{"id" : "Enable Cube SQL API"}--> Connecting from Superset - -Apache Superset connects to Cube as to a Postgres database. - -In Apache Superset, go to **Data > Databases**, then click **+ Database** to add -a new database: - -
- Apache Superset: databases page -
- -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions -are columns. - -Let's use the following Cube data schema: - -```js -cube(`Orders`, { - sql: `SELECT * FROM public.orders`, - - measures: { - count: { - type: `count`, - }, - }, - - dimensions: { - status: { - sql: `status`, - type: `string`, - }, - - created: { - sql: `created_at`, - type: `time`, - }, - }, -}); -``` - -Using the SQL API, `Orders` will be exposed as a table. In Superset, we can -create datasets based on tables. Let's create one from `Orders` table: - -
- Apache Superset: SQL Editor page with successful query -
- -Now, we can explore this dataset. Let's create a new chart of type line with -**Orders** dataset. - -
- Apache Superset: SQL Editor page with successful query -
- -We can select the `COUNT(*)` as a metric and `createdAt` as the time column with -a time grain of `month`. - -The `COUNT(*)` aggregate function is being mapped to a measure of type -[count](/schema/reference/types-and-formats#measures-types-count) in Cube's -**Orders** schema file. - -## Additional Configuration - -### <--{"id" : "Additional Configuration"}--> Pre-Aggregations - -To allow queries from Superset to match pre-aggregations in Cube, [the -`allowNonStrictDateRangeMatch` property][ref-schema-ref-preagg-allownonstrict] -must be set to `true` in the pre-aggregation definition. This is because -Superset uses loose date ranges when generating SQL queries. - -[ref-cube-getting-started-docker]: https://cube.dev/docs/getting-started/docker -[ref-getting-started]: /cloud/getting-started -[ref-schema-ref-preagg-allownonstrict]: - /schema/reference/pre-aggregations#allow-non-strict-date-range-match -[superset]: https://superset.apache.org/ -[superset-docs-installation-docker]: - https://superset.apache.org/docs/installation/installing-superset-using-docker-compose diff --git a/docs/content/Configuration/Downstream/Tableau.mdx b/docs/content/Configuration/Downstream/Tableau.mdx deleted file mode 100644 index 0ce5f74974d57..0000000000000 --- a/docs/content/Configuration/Downstream/Tableau.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Connecting from Tableau -permalink: /config/downstream/tableau ---- - -You can connect to Cube from Tableau, a visual analytics platform, using the [Cube SQL -API][ref-sql-api]. - -## Enable Cube SQL API - - - -Don't have a Cube project yet? [Learn how to get started here][ref-getting-started]. - - - -### <--{"id" : "Enable Cube SQL API"}--> Cube Cloud - -Click **How to connect your BI tool** link on the Overview page, navigate to the SQL API tab -and enable it. Once enabled, you should see the screen like the one below with -your connection credentials: - -
- -
- -### <--{"id" : "Enable Cube SQL API"}--> Self-hosted Cube - -You need to set the following environment variables to enable the Cube SQL API. -These credentials will be required to connect to Cube from Tableau -later. - -```dotenv -CUBEJS_PG_SQL_PORT=5432 -CUBEJS_SQL_USER=myusername -CUBEJS_SQL_PASSWORD=mypassword -``` - -## Connecting from Tableau - -Tableau connects to Cube as to a Postgres database. - -In Tableau, select PostgreSQL connector and enter credentials from the above -step. - -![adding Cube to Tableau as a SQL data source][ref-connecting-from-tableau] - -## Querying data - -Your cubes will be exposed as tables, where both your measures and dimensions are columns. - -![Cube data in Tableau][ref-querying-from-tableau] - -[ref-getting-started]: /cloud/getting-started -[ref-sql-api]: /backend/sql - -[ref-connecting-from-tableau]: https://cubedev-blog-images.s3.us-east-2.amazonaws.com/dc025b24-674f-4f32-ac44-421d546ee676.GIF -[ref-querying-from-tableau]: https://cubedev-blog-images.s3.us-east-2.amazonaws.com/ea73a998-e2ce-4814-863e-425b4d35860c.gif diff --git a/docs/content/Configuration/Downstream/apache-superset-1.png b/docs/content/Configuration/Downstream/apache-superset-1.png deleted file mode 100755 index 4433fdb021fe7..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-1.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/apache-superset-2.png b/docs/content/Configuration/Downstream/apache-superset-2.png deleted file mode 100755 index 5d234e13c4565..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-2.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/apache-superset-3.png b/docs/content/Configuration/Downstream/apache-superset-3.png deleted file mode 100644 index a28010fb4de5b..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-3.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/apache-superset-4.png b/docs/content/Configuration/Downstream/apache-superset-4.png deleted file mode 100755 index c6ab3418e4669..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-4.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/apache-superset-5.png b/docs/content/Configuration/Downstream/apache-superset-5.png deleted file mode 100755 index d629760277c37..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-5.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/apache-superset-6.png b/docs/content/Configuration/Downstream/apache-superset-6.png deleted file mode 100755 index f8a71c4d16b46..0000000000000 Binary files a/docs/content/Configuration/Downstream/apache-superset-6.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/appsmith-1.png b/docs/content/Configuration/Downstream/appsmith-1.png deleted file mode 100644 index 80bfc02b440e3..0000000000000 Binary files a/docs/content/Configuration/Downstream/appsmith-1.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/appsmith-2.png b/docs/content/Configuration/Downstream/appsmith-2.png deleted file mode 100644 index 48936eff25646..0000000000000 Binary files a/docs/content/Configuration/Downstream/appsmith-2.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/appsmith-3.png b/docs/content/Configuration/Downstream/appsmith-3.png deleted file mode 100644 index 24b8e96700b5e..0000000000000 Binary files a/docs/content/Configuration/Downstream/appsmith-3.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/appsmith-4.png b/docs/content/Configuration/Downstream/appsmith-4.png deleted file mode 100644 index 1f7791203cc43..0000000000000 Binary files a/docs/content/Configuration/Downstream/appsmith-4.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/appsmith-5.png b/docs/content/Configuration/Downstream/appsmith-5.png deleted file mode 100644 index daa26b941ca68..0000000000000 Binary files a/docs/content/Configuration/Downstream/appsmith-5.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/hex-1.png b/docs/content/Configuration/Downstream/hex-1.png deleted file mode 100644 index fab5c6359e90f..0000000000000 Binary files a/docs/content/Configuration/Downstream/hex-1.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/hex-2.png b/docs/content/Configuration/Downstream/hex-2.png deleted file mode 100644 index 872bad2be781a..0000000000000 Binary files a/docs/content/Configuration/Downstream/hex-2.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/hex.png b/docs/content/Configuration/Downstream/hex.png deleted file mode 100644 index b12433f565ca6..0000000000000 Binary files a/docs/content/Configuration/Downstream/hex.png and /dev/null differ diff --git a/docs/content/Configuration/Downstream/streamlit.png b/docs/content/Configuration/Downstream/streamlit.png deleted file mode 100644 index bc68e563ef815..0000000000000 Binary files a/docs/content/Configuration/Downstream/streamlit.png and /dev/null differ diff --git a/docs/content/Configuration/Environment-Variables-Reference.md b/docs/content/Configuration/Environment-Variables-Reference.md deleted file mode 100644 index feba017fe89fc..0000000000000 --- a/docs/content/Configuration/Environment-Variables-Reference.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Environment Variables -permalink: /reference/environment-variables -category: Configuration -subCategory: Reference -menuOrder: 4 ---- - -Cube.js defines a number of environment variables that can be used to change -behavior. Some of these variables can also be set via [configuration -options][link-config]. - -[link-config]: /config - -## General - -| Environment variable | Description | Possible Values | -| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -| `CUBEJS_CACHE_AND_QUEUE_DRIVER` | The cache and queue driver to use for the Cube.js deployment. Defaults to `redis` | `redis`, `memory` | -| `CUBEJS_DEV_MODE` | If `true`, enables development mode. Defaults to `false` | `true`, `false` | -| `CUBEJS_API_SECRET` | The secret key used to sign and verify JWTs. Generated on project scaffold | A valid string | -| `CUBEJS_APP` | An application ID used to uniquely identify the Cube.js deployment. Can be different for multitenant setups. Defaults to `cubejs` | A valid string | -| `CUBEJS_BUILD_PRE_AGGREGATIONS` | If `true`, this instance of Cube will build pre-aggregations, even if it is an API instance. Defaults to `false` | `true`, `false` | -| `CUBEJS_REFRESH_WORKER` | If `true`, this instance of Cube.js will **only** refresh pre-aggregations. Defaults to `false` | `true`, `false` | -| `CUBEJS_ROLLUP_ONLY` | If `true`, this instance of Cube.js will **only** query rollup pre-aggregations. Defaults to `false` | `true`, `false` | -| `CUBEJS_SCHEDULED_REFRESH_TIMEZONES` | A comma-separated [list of timezones to schedule refreshes for][ref-config-sched-refresh-timer]. | [A valid timezone from the tz database][link-tz-database] | -| `CUBEJS_SCHEDULED_REFRESH_CONCURRENCY` | How many pre-aggregations refresh worker will build in parallel. Please note changing this param doesn't change queue concurrency and it should be adjusted accordingly | A valid number of concurrent refresh processes | -| `CUBEJS_PRE_AGGREGATIONS_SCHEMA` | The [schema name][ref-config-preagg-schema-name] to use for storing pre-aggregations. Defaults to `dev_pre_aggregations`/`prod_pre_aggregations` for development/production mode | A valid string | -| `CUBEJS_SCHEMA_PATH` | The path where Cube.js loads schemas from. Defaults to `schema` | A valid folder containing Cube.js schemas | -| `CUBEJS_TELEMETRY` | If `true`, then send telemetry to CubeJS. Defaults to `true` | `true`, `false` | -| `CUBEJS_WEB_SOCKETS` | If `true`, then use WebSocket for data fetching. Defaults to `true` | `true`, `false` | -| `PORT` | The port for a Cube.js deployment to listen to API connections on. Defaults to `4000` | A valid port number | -| `CUBEJS_LOG_LEVEL` | The logging level for Cube.js. Defaults to `warn` | `error`, `info`, `trace`, `warn` | -| `DEBUG_LOG` | If `true`, enables debug logging. Defaults to `false` | `true`, `false` | -| `CUBEJS_CONCURRENCY` | The number of concurrent connections each query queue has to the database. Defaults are database-dependent, check database page for more details | A valid number | -| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Defaults are database-dependent, check database page for more details | A valid number | -| `CUBEJS_DB_QUERY_TIMEOUT` | The timeout value for any queries made to the database by Cube. The value can be a number in seconds or a duration string. Defaults to `10m` | `5000`, `1s`, `1m`, `1h` | -| `CUBEJS_REDIS_URL` | The host URL for a Redis server | A valid Redis host URL | -| `CUBEJS_REDIS_PASSWORD` | The password used to connect to the Redis server | A valid Redis password | -| `CUBEJS_REDIS_TLS` | If `true`, then the connection to the Redis server is protected by TLS authentication. Defaults to `false` | `true`, `false` | -| `CUBEJS_REDIS_POOL_MAX` | The maximum number of connections to keep active in the Redis connection pool for a single `appId` (tenant). Must be higher than `CUBEJS_REDIS_POOL_MIN`. Defaults to `1000` | A valid number of connections. | -| `CUBEJS_REDIS_POOL_MIN` | The minimum number of connections to keep active in the Redis connection pool for a single `appId` (tenant). Must be lower than `CUBEJS_REDIS_POOL_MAX`. Defaults to `2` | A valid number of connections | -| `CUBEJS_REDIS_USE_IOREDIS` | Use [`ioredis`][gh-ioredis] instead of[ `redis`][gh-node-redis]. Defaults to `false` | `true`, `false` | -| `CUBEJS_JWK_URL` | A valid URL to a JSON Web Key Sets (JWKS) | `https://.auth0.com/.well-known/jwks.json` | -| `CUBEJS_JWT_KEY` | The secret key used to sign and verify JWTs. Similar to `CUBEJS_API_SECRET` | A valid string | -| `CUBEJS_JWT_AUDIENCE` | An audience value which will be used to enforce the [`aud` claim from inbound JWTs][link-jwt-ref-aud] | `https://myapp.com` | -| `CUBEJS_JWT_ISSUER` | An issuer value which will be used to enforce the [`iss` claim from inbound JWTs][link-jwt-ref-iss] | `https://.auth0.com/` | -| `CUBEJS_JWT_SUBJECT` | A subject value which will be used to enforce the [`sub` claim from inbound JWTs][link-jwt-ref-sub] | `person@example.com` | -| `CUBEJS_JWT_ALGS` | [Any supported algorithm for decoding JWTs][gh-jsonwebtoken-algs] | `HS256`, `RS256` | -| `CUBEJS_JWT_CLAIMS_NAMESPACE` | A namespace within the decoded JWT under which any custom claims can be found | `https://myapp.com` | -| `CUBEJS_CUBESTORE_HOST` | The hostname of the Cube Store deployment | A valid hostname | -| `CUBEJS_CUBESTORE_PORT` | The port of the Cube Store deployment | A valid port number | -| `CUBEJS_MAX_PARTITIONS_PER_CUBE` | The maximum number of partitions each pre-aggregation in a cube can use. Defaults to `10000` | A valid number | -| `CUBEJS_TOPIC_NAME` | The name of the Amazon SNS or Google Cloud Pub/Sub topic (defaults to `-process` if undefined, and finally `cubejs-process`) | A valid topic name | -| `CUBEJS_GH_API_TOKEN` | A Github Personal Token to avoid Github API rate limit at downloading cubestore | It can be a personal access token, an OAuth token, an installation access token or a JSON Web Token for GitHub App authentication | - -[ref-config-sched-refresh-timer]: /config#scheduled-refresh-timer -[ref-config-preagg-schema-name]: /config#pre-aggregations-schema -[gh-ioredis]: https://github.com/luin/ioredis -[gh-node-redis]: https://github.com/NodeRedis/node-redis -[link-tz-database]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -[link-jwt-ref-iss]: https://tools.ietf.org/html/rfc7519#section-4.1.1 -[link-jwt-ref-sub]: https://tools.ietf.org/html/rfc7519#section-4.1.2 -[link-jwt-ref-aud]: https://tools.ietf.org/html/rfc7519#section-4.1.3 -[gh-jsonwebtoken-algs]: - https://github.com/auth0/node-jsonwebtoken#algorithms-supported -[link-jwk-ref]: https://tools.ietf.org/html/rfc7517#section-4 -[link-preaggregations-storage]: - /caching/using-pre-aggregations#pre-aggregations-storage - -## Database Connection - -To see a complete list of environment variables for your specific database, -please use the [database connection guide][link-connecting-to-db]. - -[link-connecting-to-db]: /config/databases - -## Export Bucket - -| Environment variable | Description | Possible Values | -| -------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | -| `CUBEJS_DB_EXPORT_BUCKET` | The name of a bucket in cloud storage | `exports-20210505` | -| `CUBEJS_DB_EXPORT_BUCKET_TYPE` | The cloud provider where the bucket is hosted | `gcp`, `s3` | -| `CUBEJS_DB_EXPORT_BUCKET_AWS_KEY` | The AWS Access Key ID to use for the export bucket | A valid AWS Access Key ID | -| `CUBEJS_DB_EXPORT_BUCKET_AWS_SECRET` | The AWS Secret Access Key to use for the export bucket | A valid AWS Secret Access Key | -| `CUBEJS_DB_EXPORT_BUCKET_AWS_REGION` | The AWS region of the export bucket | [A valid AWS region][link-aws-regions] | -| `CUBEJS_DB_EXPORT_BUCKET_REDSHIFT_ARN` | ARN of iam_role with permission to write to the provided `bucket` | A valid ARN to an IAM Role associated to the target Redshift DB | -| `CUBEJS_DB_EXPORT_GCS_CREDENTIALS` | A Base64 encoded JSON key file for connecting to Google Cloud | A valid Google Cloud JSON key file encoded as a Base64 string | -| `CUBEJS_DB_EXPORT_INTEGRATION` | The name of the integration used in the database. Only required when using Snowflake and GCS | A valid string matching the name of the integration in Snowflake | - -## SQL API - -| Environment variable | Description | Possible Values | -| ----------------------- | ---------------------------------------------------------------------- | ------------------- | -| `CUBEJS_SQL_USER` | Required username to access SQL API | A valid string | -| `CUBEJS_SQL_PASSWORD` | Required password to access SQL API | A valid string | -| `CUBEJS_SQL_PORT` | The port to listen to MySQL compatibility connections on. | A valid port number | -| `CUBEJS_PG_SQL_PORT` | The port to listen to PostgreSQL compatibility connections on. | A valid port number | -| `CUBEJS_SQL_SUPER_USER` | A name of specific user who will be allowed to change security context | A valid string | - -## Cube Store - -| Environment variable | Description | Possible Values | -| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -| `CUBESTORE_BIND_ADDR` | The address/port pair for Cube Store's MySQL-compatible interface. Defaults to `0.0.0.0:3306` | A valid address/port pair | -| `CUBESTORE_DATA_DIR` | A path on the local filesystem to store a local replica of the data. Must be unique on each node and different from `CUBESTORE_REMOTE_DIR`. Defaults to `.cubestore/data` | A valid path on the local filesystem with read/write access | -| `CUBESTORE_HTTP_BIND_ADDR` | The address/port pair for Cube Store's HTTP interface. Defaults to `0.0.0.0:3030` | A valid address/port pair | -| `CUBESTORE_HTTP_PORT` | The port for Cube Store to listen to HTTP connections on. Ignored when `CUBESTORE_HTTP_BIND_ADDR` is set. Defaults to `3030` | A valid port number | -| `CUBESTORE_JOB_RUNNERS` | The number of parallel tasks that process non-interactive jobs like data insertion, compaction etc. Defaults to `4` | A valid number | -| `CUBESTORE_LOG_LEVEL` | The logging level for Cube Store. Defaults to `error` | `error`, `warn`, `info`, `debug`, `trace` | -| `CUBESTORE_META_ADDR` | The address/port pair for the **router** node in the cluster | A valid address/port pair | -| `CUBESTORE_META_PORT` | The port for the **router** node to listen for connections on. Ignored when `CUBESTORE_META_ADDR` is set. | A valid port number | -| `CUBESTORE_NO_UPLOAD` | If `true`, prevents uploading serialized pre-aggregations to cloud storage | `true`, `false` | -| `CUBESTORE_PORT` | The port for Cube Store to listen to connections on. Ignored when `CUBESTORE_BIND_ADDR` is set. Defaults to `3306` | A valid port number | -| `CUBESTORE_QUERY_TIMEOUT` | The timeout for SQL queries in seconds. Defaults to `120` | A number in seconds | -| `CUBESTORE_REMOTE_DIR` | A path on the local filesystem to store metadata and datasets from all nodes as if it were remote storage. Not required if using GCS/S3. Not recommended for production usage | A valid path on the local filesystem with read/write access | -| `CUBESTORE_SELECT_WORKERS` | The number of Cube Store sub-processes that handle `SELECT` queries. Defaults to `4` | A valid number | -| `CUBESTORE_SERVER_NAME` | The full name and port number of the Cube Store server. Must be unique for each instance in cluster mode. Defaults to `localhost` | A valid address/port pair | -| `CUBESTORE_WAL_SPLIT_THRESHOLD` | The maximum number of rows to keep in a single chunk of data right after insertion. Defaults to `262144` | A valid number | -| `CUBESTORE_WORKER_PORT` | The port for Cube Store workers to listen to connections on. When set, the node will start as a **worker** in the cluster | A valid port number | -| `CUBESTORE_WORKERS` | A comma-separated list of address/port pairs; for example `worker-1:3123,localhost:3124,123.124.125.128:3123` | A comma-separated list of address/port pairs | - -### <--{"id" : "Cube Store"}--> Cloud Storage - -| Environment variable | Description | Possible Values | -| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --- | -| `CUBESTORE_AWS_ACCESS_KEY_ID` | The Access Key ID for AWS. Required when using AWS S3 | [A valid AWS Access Key ID][link-aws-creds] | -| `CUBESTORE_AWS_SECRET_ACCESS_KEY` | The Secret Access Key for AWS. Required when using AWS S3 | [A valid AWS Secret Access Key][link-aws-creds] | -| `CUBESTORE_AWS_CREDS_REFRESH_EVERY_MINS` | The number of minutes after which Cube Store should refresh AWS credentials. Required when using an AWS instance role. Default is `180` | A valid number in minutes | -| `CUBESTORE_S3_BUCKET` | The name of a bucket in AWS S3. Required when using AWS S3 | A valid bucket name in the AWS account | -| `CUBESTORE_S3_REGION` | The region of a bucket in AWS S3. Required when using AWS S3 | [A valid AWS region][link-aws-regions] | -| `CUBESTORE_S3_SUB_PATH` | The path in a AWS S3 bucket to store pre-aggregations. Optional | - | -| `CUBESTORE_GCP_CREDENTIALS` | A Base64 encoded JSON key file for connecting to Google Cloud. Required when using Google Cloud Storage | [A valid Google BigQuery JSON key file encoded as a Base64 string][link-gcp-creds-json] | -| `CUBESTORE_GCP_KEY_FILE` | The path to a JSON key file for connecting to Google Cloud. Required when using Google Cloud Storage | [A valid Google Cloud JSON key file][link-gcp-creds-json] | -| `CUBESTORE_GCS_BUCKET` | The name of a bucket in GCS. Required when using GCS | A valid bucket name in the Google Cloud account | -| `CUBESTORE_GCS_SUB_PATH` | The path in a GCS bucket to store pre-aggregations. Optional | - | -| `CUBESTORE_MINIO_ACCESS_KEY_ID` | The Access Key ID for minIO. Required when using minIO | A valid minIO Access Key ID | -| `CUBESTORE_MINIO_SECRET_ACCESS_KEY` | The Secret Access Key for minIO. Required when using minIO | A valid minIO Secret Access Key | | -| `CUBESTORE_MINIO_BUCKET` | The name of the bucket that you want to use minIO. Required when using minIO | A valid bucket name in the AWS account | -| `CUBESTORE_MINIO_REGION` | The region of a bucket in S3 that you want to use minIO. Optional when using minIO | A valid S3 region name, an empty string if not present | -| `CUBESTORE_MINIO_SERVER_ENDPOINT` | The minIO server endpoint. Required when using minIO | A valid minIO endpoint e.g. `http://localhost:9000` | -| `CUBESTORE_MINIO_CREDS_REFRESH_EVERY_MINS` | The number of minutes after which Cube Store should refresh minIO credentials. Default is `180` | A valid number in minutes | - -[link-aws-creds]: - https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys -[link-aws-regions]: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions -[link-aws-athena-workgroup]: - https://docs.aws.amazon.com/athena/latest/ug/workgroups-benefits.html -[link-elastic-api-keys]: - https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key -[link-gcp-creds-json]: - https://cloud.google.com/iam/docs/creating-managing-service-account-keys -[link-cubejs-databases]: /connecting-to-the-database -[link-nodejs-tls-options]: - https://nodejs.org/docs/latest/api/tls.html#tls_tls_createsecurecontext_options -[link-nodejs-tls-connect-opts]: - https://nodejs.org/docs/latest/api/tls.html#tls_tls_connect_options_callback -[link-nodejs-tls-ciphers]: - https://nodejs.org/docs/latest/api/tls.html#tls_modifying_the_default_tls_cipher_suite -[link-hive-cdh-versions]: - https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_cdh_6_download.html -[link-hive-thrift-versions]: https://github.com/apache/thrift/releases -[link-hive-versions]: https://hive.apache.org/downloads.html -[link-snowflake-account]: - https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile#account -[link-snowflake-regions]: - https://docs.snowflake.com/en/user-guide/intro-regions.html -[link-snowflake-connection-options]: - https://docs.snowflake.com/en/user-guide/nodejs-driver-use.html#additional-connection-options diff --git a/docs/content/Configuration/Extending-Cubejs.mdx b/docs/content/Configuration/Extending-Cubejs.mdx deleted file mode 100644 index 9cf9836a8c3b5..0000000000000 --- a/docs/content/Configuration/Extending-Cubejs.mdx +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Extending Cube -permalink: /configuration/extending-cubejs -category: Configuration -menuOrder: 5 ---- - -For some advanced use-cases like instrumentation, or custom authentication, Cube -can be extended by installing third-party Node.js packages and using them in the -[`cube.js` configuration file][ref-config]. - -## Examples - -### Sending Express metrics to Prometheus - -```typescript -const prometheusMiddleware = require('express-prometheus-middleware'); - -module.exports = { - initApp: (app) => { - app.use( - prometheusMiddleware({ - metricsPath: '/metrics', - collectDefaultMetrics: true, - requestDurationBuckets: [0.1, 0.5, 1, 1.5], - requestLengthBuckets: [512, 1024, 5120, 10240, 51200, 102400], - responseLengthBuckets: [512, 1024, 5120, 10240, 51200, 102400], - }) - ); - }, -}; -``` - -### Sending Cube logs to Loggly - -The example below shows how to use the Node.js Loggly client to collect and send -logs from Cube. - -First, you'd need to install the third-party library with [NPM][link-npm]. In -our example, we're going to use [winston-loggly-bulk][link-loggly-client] to -collect and send logs to Loggly. You can install it with the following command: - -```bash -$ npm install --save winston-loggly-bulk -``` - - - -When installing custom Node.js packages for Cube running in Docker container, -make sure you mount the project _including_ the `node_modules` subfolder: - -```bash -$ docker run -d \ - -v ~/my-cubejs-project:/cube/conf - cubejs/cube -``` - -If you need to use third-party Node.js packages with native extensions, you'll -need to [build your own Docker image][ref-deployment-docker-extend]. - - - -Now we can require and use `winston-loggly-bulk` library inside `cube.js`: - -```javascript -const winston = require('winston'); -const { loggly } = require('winston-loggly-bulk'); - -winston.add( - new loggly({ - token: 'LOGGLY-TOKEN', - subdomain: 'your-subdomain', - tags: ['winston-nodejs'], - json: true, - }) -); - -module.exports = { - logger: (msg, params) => { - console.log(`${msg}: ${json.stringify(params)}`); - winston.log('info', msg, params); - }, -}; -``` - -## Using CubejsServer and CubejsServerCore - -You can directly use `@cubejs-backend/server-core` or `@cubejs-backend/server` -Node.js packages to run Cube. - - - -We do not recommend embedding Cube into existing Express application to share -the runtime. Cube should be scaled very differently vs. other parts of Express, -and embedding Cube **is not** the right approach in the long term, especially -for larger deployments. - - - -You can create an `index.js` file with the following content. - -```javascript -const CubejsServer = require('@cubejs-backend/server'); - -const server = new CubejsServer(); - -server.listen().then(({ version, port }) => { - console.log(`🚀 Cube server (${version}) is listening on ${port}`); -}); -``` - -Then start Cube as a regular Node.js application: - -```bash -node index.js -``` - -[link-npm]: https://www.npmjs.com/ -[link-loggly-client]: https://github.com/loggly/winston-loggly-bulk -[ref-config]: /config -[ref-deployment-docker-extend]: - /deployment/platforms/docker#extend-the-docker-image diff --git a/docs/content/Configuration/Multitenancy-Setup.mdx b/docs/content/Configuration/Multitenancy-Setup.mdx deleted file mode 100644 index 1cf17661ba6b5..0000000000000 --- a/docs/content/Configuration/Multitenancy-Setup.mdx +++ /dev/null @@ -1,367 +0,0 @@ ---- -title: Multitenancy -permalink: /multitenancy-setup -category: Configuration -menuOrder: 4 ---- - -Cube supports multitenancy out of the box, both on database and data schema -levels. Multiple drivers are also supported, meaning that you can have one -customer’s data in MongoDB and others in Postgres with one Cube instance. - -There are 6 [configuration options][ref-config-opts] you can leverage to make -your multitenancy setup. You can use all of them or just a couple, depending on -your specific case. The options are: - -- `contextToAppId` -- `contextToOrchestratorId` -- `driverFactory` -- `repositoryFactory` -- `preAggregationsSchema` -- `queryRewrite` - -All of the above options are functions, which you provide to Cube in the -[`cube.js` configuration file][ref-config]. The functions accept one argument - -a context object, which has a [`securityContext`][ref-config-security-ctx] -property where you can provide all the necessary data to identify a user e.g., -organization, app, etc. By default, the -[`securityContext`][ref-config-security-ctx] is defined by [Cube API -Token][ref-security]. - -There are several multitenancy setup scenarios that can be achieved by using -combinations of these configuration options. - -### <--{"id" : "Multitenancy"}--> Multitenancy vs Multiple Data Sources - -In cases where your Cube schema is spread across multiple different databases -you may consider using the [`dataSource` cube property][ref-cube-datasource] -instead of multitenancy. Multitenancy is designed for cases where you need to -serve different datasets for multiple users, or tenants which aren't related to -each other. - -On the other hand, multiple data sources can be used for scenarios where users -need to access the same data but from different databases. The multitenancy and -multiple data sources features aren't mutually exclusive and can be used -together. - - - -A `default` data source **must** exist and be configured. It is used to resolve -target query data source for now. This behavior **will** be changed in future -releases. - - - -A simple configuration with two data sources might look like: - -**cube.js:** - -```javascript -module.exports = { - driverFactory: ({ dataSource } = {}) => { - if (dataSource === 'db1') { - return { - type: 'postgres', - database: process.env.DB1_NAME, - host: process.env.DB1_HOST, - user: process.env.DB1_USER, - password: process.env.DB1_PASS, - port: process.env.DB1_PORT, - }; - } else { - return { - type: 'postgres', - database: process.env.DB2_NAME, - host: process.env.DB2_HOST, - user: process.env.DB2_USER, - password: process.env.DB2_PASS, - port: process.env.DB2_PORT, - }; - } - }, -}; -``` - -A more advanced example that uses multiple [data sources][ref-config-db] could -look like: - -**cube.js:** - -```javascript -module.exports = { - driverFactory: ({ dataSource } = {}) => { - if (dataSource === 'web') { - return { - type: 'athena', - database: dataSource, - ..., - }; - } else if (dataSource === 'googleAnalytics') { - return { - type: 'bigquery', - ..., - }; - } else if (dataSource === 'financials') { - return { - type: 'postgres', - database: 'financials', - host: 'financials-db.acme.com', - user: process.env.FINANCIALS_DB_USER, - password: process.env.FINANCIALS_DB_PASS, - }; - } else { - return { - type: 'postgres', - ..., - }; - } - }, -}; -``` - -### <--{"id" : "Multitenancy"}--> queryRewrite vs Multitenant Compile Context - -As a rule of thumb, the [`queryRewrite`][ref-config-query-rewrite] should be -used in scenarios when you want to define row-level security within the same -database for different users of such database. For example, to separate access -of two e-commerce administrators who work on different product categories within -the same e-commerce store, you could configure your project as follows: - -```javascript -// cube.js configuration file -module.exports = { - queryRewrite: (query, { securityContext }) => { - if (securityContext.categoryId) { - query.filters.push({ - member: 'Products.categoryId', - operator: 'equals', - values: [securityContext.categoryId], - }); - } - return query; - }, -}; - -// Products cube -cube(`Products`, { - sql: `select * from products`, -}); -``` - -On the other hand, multi-tenant [`COMPILE_CONTEXT`][ref-cube-security-ctx] -should be used when users need access to different databases. For example, if -you provide SaaS ecommerce hosting and each of your customers have a separate -database, then each e-commerce store should be modeled as a separate tenant. - -```javascript -const { - securityContext: { userId }, -} = COMPILE_CONTEXT; - -cube(`Products`, { - sql: `select * from ${userId}.products`, -}); -``` - -## Same DB Instance with per Tenant Row Level Security - -Per tenant row-level security can be achieved by configuring -[`queryRewrite`][ref-config-query-rewrite], which adds a tenant identifier -filter to the original query. It uses the -[`securityContext`][ref-config-security-ctx] to determine which tenant is -requesting data. This way, every tenant starts to see their own data. However, -resources such as query queue and pre-aggregations are shared between all -tenants. - -**cube.js:** - -```javascript -module.exports = { - queryRewrite: (query, { securityContext }) => { - const user = securityContext; - if (user.id) { - query.filters.push({ - member: 'Users.id', - operator: 'equals', - values: [user.id], - }); - } - return query; - }, -}; -``` - -## Multiple DB Instances with Same Schema - -Let's consider an example where we store data for different users in different -databases, but on the same Postgres host. The database name format is -`my_app__`, so `my_app_1_2` is a valid database name. - -To make it work with Cube, first we need to pass the `appId` and `userId` as -context to every query. We should first ensure our JWTs contain those properties -so we can access them through the [security context][ref-config-security-ctx]. - -```javascript -const jwt = require('jsonwebtoken'); -const CUBE_API_SECRET = 'secret'; - -const cubejsToken = jwt.sign({ appId: '1', userId: '2' }, CUBE_API_SECRET, { - expiresIn: '30d', -}); -``` - -Now, we can access them through the [`securityContext`][ref-config-security-ctx] -property inside the context object. Let's use -[`contextToAppId`][ref-config-ctx-to-appid] and -[`contextToOrchestratorId`][ref-config-ctx-to-orch-id] to create a dynamic Cube -App ID and Orchestrator ID for every combination of `appId` and `userId`, as -well as defining [`driverFactory`][ref-config-driverfactory] to dynamically -select the database, based on the `appId` and `userId`: - - - -The App ID (the result of [`contextToAppId`][ref-config-ctx-to-appid]) is used -as a caching key for various in-memory structures like schema compilation -results, connection pool. The Orchestrator ID (the result of -[`contextToOrchestratorId`][ref-config-ctx-to-orch-id]) is used as a caching key -for database connections, execution queues and pre-aggregation table caches. Not -declaring these properties will result in unexpected caching issues such as -schema or data of one tenant being used for another. - - - -**cube.js:** - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.appId}_${securityContext.userId}`, - contextToOrchestratorId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.appId}_${securityContext.userId}`, - driverFactory: ({ securityContext }) => ({ - type: 'postgres', - database: `my_app_${securityContext.appId}_${securityContext.userId}`, - }), -}; -``` - -## Same DB Instance with per Tenant Pre-Aggregations - -To support per-tenant pre-aggregation of data within the same database instance, -you should configure the [`preAggregationsSchema`][ref-config-preagg-schema] -option in your `cube.js` configuration file. You should use also -[`securityContext`][ref-config-security-ctx] to determine which tenant is -requesting data. - -**cube.js:** - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.userId}`, - preAggregationsSchema: ({ securityContext }) => - `pre_aggregations_${securityContext.userId}`, -}; -``` - -## Multiple Schema and Drivers - -What if for application with ID 3, the data is stored not in Postgres, but in -MongoDB? - -We can instruct Cube to connect to MongoDB in that case, instead of Postgres. To -do this, we'll use the [`driverFactory`][ref-config-driverfactory] option to -dynamically set database type. We will also need to modify our -[`securityContext`][ref-config-security-ctx] to determine which tenant is -requesting data. Finally, we want to have separate data schemas for every -application. We can use the [`repositoryFactory`][ref-config-repofactory] option -to dynamically set a repository with schema files depending on the `appId`: - -**cube.js:** - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.appId}_${securityContext.userId}`, - contextToOrchestratorId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.appId}_${securityContext.userId}`, - driverFactory: ({ securityContext }) => { - if (securityContext.appId === 3) { - return { - type: 'mongobi', - database: `my_app_${securityContext.appId}_${securityContext.userId}`, - port: 3307, - }; - } else { - return { - type: 'postgres', - database: `my_app_${securityContext.appId}_${securityContext.userId}`, - }; - } - }, - repositoryFactory: ({ securityContext }) => - new FileRepository(`schema/${securityContext.appId}`), -}; -``` - -## Serverless Deployment - -If you are deploying Cube to AWS Lambda with the [Serverless -template][ref-deployment-sls], you need to use `AWSHandlers` from the -[`@cubejs-backend/serverless-aws`][npm-cubejs-sls-aws] package. - -Add the following code to your `cube.js` file for the serverless multitenancy -setup. - -**cube.js:** - -```javascript -const AWSHandlers = require('@cubejs-backend/serverless-aws'); - -module.exports = new AWSHandlers({ - contextToAppId: ({ securityContext }) => - `CUBEJS_APP_${securityContext.appId}`, - driverFactory: ({ securityContext }) => ({ - type: 'postgres', - database: `my_app_${securityContext.appId}`, - }), -}); -``` - -## Scheduled Refreshes for Pre-Aggregations - -If you need scheduled refreshes for your pre-aggregations in a multi-tenant -deployment, ensure you have configured -[`scheduledRefreshContexts`][ref-config-refresh-ctx] correctly. You may also -need to configure [`scheduledRefreshTimeZones`][ref-config-refresh-tz]. - - - -Leaving [`scheduledRefreshContexts`][ref-config-refresh-ctx] unconfigured will -lead to issues where the security context will be `undefined`. This is because -there is no way for Cube to know how to generate a context without the required -input. - - - -## Connecting to Redis - -When configured for multitenancy, Cube uses a separate connection pool for each -configured tenant. This means that the `CUBEJS_REDIS_POOL_MIN` and -`CUBEJS_REDIS_POOL_MAX` environment variables specify the minimum and maximum -number of Redis connections **per-tenant**. - -[npm-cubejs-sls-aws]https://www.npmjs.com/package/@cubejs-backend/serverless-aws -[ref-config] /config [ref-config-opts] /config#options-reference [ref-config-db] -/config/databases [ref-config-driverfactory] /config#driver-factory -[ref-config-repofactory] /config#repository-factory [ref-config-preagg-schema] -/config#pre-aggregations-schema [ref-config-ctx-to-appid] -/config#context-to-app-id [ref-config-ctx-to-orch-id] -/config#context-to-orchestrator-id [ref-config-query-rewrite] -/config#query-rewrite [ref-config-refresh-ctx] -/config#scheduled-refresh-contexts [ref-config-refresh-tz] -/config#scheduled-refresh-time-zones [ref-config-security-ctx] -/config#security-context [ref-deployment-sls] /deployment/serverless/aws -[ref-security] /security [ref-cube-datasource] -/schema/reference/cube#data-source [ref-cube-security-ctx] -/schema/reference/cube#security-context diff --git a/docs/content/Configuration/Overview.mdx b/docs/content/Configuration/Overview.mdx deleted file mode 100644 index 21717a04e7c69..0000000000000 --- a/docs/content/Configuration/Overview.mdx +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Configuration Overview -menuTitle: Overview -permalink: /configuration/overview -category: Configuration -menuOrder: 1 ---- - -Cube.js is designed to work with different configuration sources. There are two -ways you can set configuration options; via [a configuration file][link-config], -commonly known as the `cube.js` file, and [environment -variables][link-env-vars]. - - - -When using Docker, ensure that the `cube.js` configuration file and your -`schema/` folder are mounted to `/cube/conf` within the Docker container. - - - -## Configuration Precedence - -In Cube.js, values specified in `cube.js` take precedence over environment -variables. - -## Development Mode - -Cube.js can be run in an insecure, development mode by setting the -`CUBEJS_DEV_MODE` environment variable to `true`. Putting Cube.js in development -mode does the following: - -- Disables authentication checks -- Enables Cube Store in single instance mode -- Enables background refresh for in-memory cache and [scheduled - pre-aggregations][link-scheduled-refresh] -- Allows another log level to be set (`trace`) -- Enables [Developer Playground][link-dev-playground] on `http://localhost:4000` -- Uses `memory` instead of `redis` as the default cache/queue engine -- Logs incorrect/invalid configuration for `externalRefresh` /`waitForRenew` - instead of throwing errors - -## Configuring CORS - -The Cube.js REST API supports Cross-Origin Resource Sharing (CORS) for all API -requests. By default, the middleware allows requests from any origin (`*`). To -change the allowed domain, you can do the following: - -```javascript -module.exports = { - http: { - cors: { - origin: 'https://myapp.com', - }, - }, -}; -``` - -Please consult the Configuration Reference [for more -options][link-config-cors-opts]. - -## Concurrency and pooling - - - -All Cube database drivers come with presets for concurrency and pooling that -work out-of-the-box. The following information is included as a reference. - - - -For increased performance, Cube uses multiple concurrent connections to -configured data sources. The `CUBEJS_CONCURRENCY` environment variable controls -concurrency settings for query queues and the refresh scheduler as well as the -maximum concurrent connections. For databases that support connection pooling, -the maximum number of concurrent connections to the database can also be set by -using the `CUBEJS_DB_MAX_POOL` environment variable; if changing this from the -default, you must ensure that the new value is greater than the number of -concurrent connections used by Cube's query queues and refresh scheduler. - -## Migrating from Express to Docker - -Since [`v0.23`][link-v-023-release], Cube.js CLI uses the `docker` template -instead of `express` as a default for project creation, and it is the -recommended route for production. To migrate you should move all Cube.js -dependencies in `package.json` to `devDependencies` and leave dependencies that -you use to configure Cube.js in `dependencies`. - -For example, your existing `package.json` might look something like: - -```json -{ - "name": "cubejs-app", - "version": "0.0.1", - "private": true, - "scripts": { - "dev": "node index.js" - }, - "dependencies": { - "@cubejs-backend/postgres-driver": "^0.20.0", - "@cubejs-backend/server": "^0.20.0" - } -} -``` - -It should become: - -```json -{ - "name": "cubejs-app", - "version": "0.0.1", - "private": true, - "scripts": { - "dev": "./node_modules/.bin/cubejs-server server" - }, - "dependencies": {}, - "devDependencies": { - "@cubejs-backend/postgres-driver": "^0.23.6", - "@cubejs-backend/server": "^0.23.7" - } -} -``` - -You should also rename your `index.js` file to `cube.js` and replace the -`CubejsServer.create()` call with export of configuration using -`module.exports`. - -For an `index.js` like the following: - -```javascript -const CubejsServer = require('@cubejs-backend/server'); - -const server = new CubejsServer({ - logger: (msg, params) => { - console.log(`${msg}: ${JSON.stringify(params)}`); - }, -}); - -server - .listen() - .then(({ version, port }) => { - console.log(`🚀 Cube.js server (${version}) is listening on ${port}`); - }) - .catch((e) => { - console.error('Fatal error during server start: '); - console.error(e.stack || e); - }); -``` - -It should be renamed to `cube.js` and its' contents should look like: - -```javascript -module.exports = { - logger: (msg, params) => { - console.log(`${msg}: ${JSON.stringify(params)}`); - }, -}; -``` - -Finally, add a `docker-compose.yml` file alongside the `cube.js` configuration -file: - -```yaml -version: '2.2' - -services: - cube: - image: cubejs/cube:latest - ports: - - 4000:4000 - env_file: .env - volumes: - - .:/cube/conf -``` - -[link-config]: /config -[link-config-cors-opts]: /config#http -[link-dev-playground]: /dev-tools/dev-playground -[link-env-vars]: /reference/environment-variables -[link-scheduled-refresh]: /schema/reference/pre-aggregations#scheduled-refresh -[link-v-023-release]: https://github.com/cube-js/cube.js/releases/tag/v0.23.0 diff --git a/docs/content/Configuration/Reference/@cubejs-backend-server-core.md b/docs/content/Configuration/Reference/@cubejs-backend-server-core.md deleted file mode 100644 index 58161a76740a2..0000000000000 --- a/docs/content/Configuration/Reference/@cubejs-backend-server-core.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: cubejs-backend-server-core -permalink: /config/reference/@cubejs-backend-server-core -category: Configuration -subCategory: Reference -menuOrder: 6 -redirect_from: - - /@cubejs-backend-server-core ---- - -This package provides wiring of all essential Cube.js components and is used by -[@cubejs-backend/server][ref-config-ref-backend-server]. - -## API Reference - -### <--{"id" : "API Reference"}--> CubejsServerCore.create(options) - -`CubejsServerCore.create` is an entry point for a Cube.js server application. It -creates an instance of `CubejsServerCore`, which could be embedded for example -into Express application. - -```javascript -const { CubejsServerCore } = require('@cubejs-backend/server-core'); -const express = require('express'); -const path = require('path'); - -const expressApp = express(); - -const dbType = 'mysql'; -const options = { - dbType, - logger: (msg, params) => { - console.log(`${msg}: ${JSON.stringify(params)}`); - }, - schemaPath: path.join('assets', 'schema'), -}; - -const core = CubejsServerCore.create(options); -core.initApp(expressApp); -``` - -`CubejsServerCore.create` method accepts an object with the [Cube.js -configuration options][ref-config]. - -### <--{"id" : "API Reference"}--> CubejsServerCore.version() - -`CubejsServerCore.version` is a method that returns the semantic package version -of `@cubejs-backend/server`. - -[ref-config-ref-backend-server]: /config/reference/@cubejs-backend-server -[ref-config]: /config diff --git a/docs/content/Configuration/Reference/@cubejs-backend-server.md b/docs/content/Configuration/Reference/@cubejs-backend-server.md deleted file mode 100644 index 8bdbfb59c8ee9..0000000000000 --- a/docs/content/Configuration/Reference/@cubejs-backend-server.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: cubejs-backend-server -permalink: /config/reference/@cubejs-backend-server -category: Configuration -subCategory: Reference -menuOrder: 7 -redirect_from: - - /@cubejs-backend-server ---- - -`@cubejs-backend/server` is a web server for the -[@cubejs-backend/server-core][ref-config-ref-backend-server-core]. There are -also multiple options to run Cube.js Backend Server [in -production][ref-deployment]. - -## API Reference - -### <--{"id" : "API Reference"}--> CubejsServer.create(options) - -Creates an instance of `CubejsServer`. - -You can set server port using `PORT` environment variable. Default port is -`4000`. - -#### Example - -```javascript -const CubejsServer = require('@cubejs-backend/server'); - -const server = new CubejsServer(); - -server.listen().then(({ version, port }) => { - console.log(`🚀 Cube.js server (${version}) is listening on ${port}`); -}); -``` - -#### Options Reference - -The options for `CubejsServer` include the `CubejsServerCore` -[options][ref-config-ref-backend-server-core-opts] plus the following additional -ones specific to `CubejsServer`: - -```typescript -type CubejsServerOptions = { - webSockets?: boolean; - initApp?(app: express.Application): void | Promise; -}; -``` - -##### webSockets - -Boolean to enable or disable [web sockets][ref-frontend-real-time-ws] on the -backend. Can also be enabled using the `CUBEJS_WEB_SOCKETS` environment -variable. - -##### initApp - -A function to setup the instance of Express. It accepts the following argument: - -- `app`: the instance of Express - -This method is invoked prior to any routes having been added. Since routes can't -be overridden, this allows customization / overriding of the routes and other -aspects of the Express application early in its lifecycle. - -An example usage is customizing the base route `/` in production mode to return -a 404: - -`initApp.ts` - -```typescript -import type { Application, Request, Response } from 'express'; - -export function initApp(app: Application) { - app.get('/', (req: Request, res: Response) => { - res.sendStatus(404); - }); -} -``` - -`index.ts` - -```typescript -import { initApp } from './initApp'; - -const options = {}; - -// ... - -if (process.env.NODE_ENV === 'production') { - options.initApp = initApp; -} - -const server = new CubejsServer(options); -``` - -### <--{"id" : "API Reference"}--> CubejsServer.version() - -`CubejsServer.version` is a method that returns the semantic package version of -`@cubejs-backend/server`. - -```javascript -const CubejsServer = require('@cubejs-backend/server'); - -console.log(CubejsServer.version()); -``` - -### <--{"id" : "API Reference"}--> this.listen(options) - -Instantiates the Express.js App to listen to the specified `PORT`. Returns a -promise that resolves with the following members: - -- `port {number}` The port at which CubejsServer is listening for insecure - connections for redirection to HTTPS, as specified by the environment variable - `PORT`. Defaults to 4000. -- `app {Express.Application}` The express App powering CubejsServer -- `server {http.Server}` The `http` Server instance. If TLS is enabled, returns - a `https.Server` instance instead. -- `version {string}` The semantic package version of `@cubejs-backend/server` - -### <--{"id" : "API Reference"}--> this.testConnections() - -Tests all existing open connections in the application. - -### <--{"id" : "API Reference"}--> this.close() - -Shuts down the server and closes any open db connections. - -[ref-config-ref-backend-server-core]: - /config/reference/@cubejs-backend-server-core -[ref-config-ref-backend-server-core-opts]: - /config/reference/@cubejs-backend-server-core#options-reference -[ref-deployment]: /deployment/overview -[ref-frontend-real-time-ws]: /real-time-data-fetch#web-sockets diff --git a/docs/content/Cube-Cloud/Cloud-Runtime.mdx b/docs/content/Cube-Cloud/Cloud-Runtime.mdx deleted file mode 100644 index 600d9baa5d7b5..0000000000000 --- a/docs/content/Cube-Cloud/Cloud-Runtime.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Cloud Runtime -permalink: /cloud/cloud-runtime -category: Cloud Runtime -menuOrder: 2 ---- - -Cloud Runtime extends Cube Core with several components that -substantially improve reliability, performance, and security: - -* __Performance:__ Cube Store in-memory caching, Cube Store autoscaling, autoscaling for multi-tenancy. - -* __Security:__ Cube Store encryption at rest, SQL API connection via SSL, secured access to Cube Playground, security audits and updates to Docker images. - -* __Reliability:__ Cube Store replication for high availability, distributed file storage failovers and consistency checking. - -* __Integrations:__ Optimized Databricks driver, optimized Elasticsearch driver, support for Azure blob storage in Cube Store, and integration with monitoring solutions. - - -Cloud Runtime powers Cube Cloud. Cube Cloud is available as [managed -service](https://cubecloud.dev/auth/signup) and -through "bring your own cloud" model. [Please contact -us](https://cube.dev/contact) if you'd like to install -Cube Cloud within your AWS, GCP, or Azure account. diff --git a/docs/content/Cube-Cloud/Configuration/Access Control.mdx b/docs/content/Cube-Cloud/Configuration/Access Control.mdx deleted file mode 100644 index 4ad4a11752eb3..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/Access Control.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Access Control -permalink: /cloud/access-control/ -category: Configuration -menuOrder: 6 ---- - - - -Role-based access control is only available on the Enterprise plan. - - - -Cube Cloud allows account administrators to define roles with specific -permissions for resources and then apply those roles to users in their account. - -## List all roles - -To see a list of roles in your account, first go to the Team settings page by -clicking on your avatar in the top right corner, then clicking on the "Team" -button. - -On the Team settings page, click the "Roles" tab to see all the roles in your -account: - -
- Cube Cloud Team Roles tab -
- -## Create a role - -To create a new role, click the "Add Role" button. Enter a name and optional -description for the role, then click "Add Policy" and select either "Deployment" -or "Global" for this policy's scope. - -Deployment policies apply to deployment-level functionality, such as the -Playground and Schema Editor. Global policies apply to account-level -functionality, such as Alerts and Billing. Once the policy scope has been -selected, you can restrict which actions this role can perform by selecting -"Specific" and using the dropdown to select specific actions. - -
- Cube Cloud Team Roles tab -
- -When you are finished, click "Create Role" to create the role. - -## Assigning roles to users - -Roles are assigned to new users when inviting them: - -
- Cube Cloud Team Roles tab -
- -Existing users' roles can be modified from the "Members" tab on the Team page: - -
- Cube Cloud Team Roles tab -
diff --git a/docs/content/Cube-Cloud/Configuration/Connecting-to-Databases.mdx b/docs/content/Cube-Cloud/Configuration/Connecting-to-Databases.mdx deleted file mode 100644 index 05d615fa7d0b7..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/Connecting-to-Databases.mdx +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Connecting to the Database -permalink: /cloud/configuration/connecting-to-the-database -category: Configuration -menuOrder: 1 -redirect_from: - - /cloud/configuration/connecting-to-databases ---- - -You can connect all Cube.js supported databases to your Cube Cloud deployment. - -
- Cube Cloud Supported Databases Screen -
- -Below you can find guides on how to use Cube Cloud with specific database -vendors. - -- [AWS Athena](#aws-athena) -- [AWS Redshift](#aws-redshift) -- [BigQuery](#big-query) -- [Snowflake](#snowflake) - -## Guides - -### <--{"id" : "Guides"}--> AWS Athena - -The following fields are required when creating an AWS Athena connection: - -| Field | Description | Examples | -| ------------------------- | ----------------------------------------------------------------- | ------------------------------------------ | -| **AWS Access Key ID** | The AWS Access Key ID to use for database connections | `AKIAXXXXXXXXXXXXXXXX` | -| **AWS Secret Access Key** | The AWS Secret Access Key to use for database connections | `asd+/Ead123456asc23ASD2Acsf23/1A3fAc56af` | -| **AWS Region** | The AWS region of the Cube.js deployment | `us-east-1` | -| **S3 Output Location** | The S3 path to store query results made by the Cube.js deployment | `s3://my-output-bucket/outputs/` | - -
- Cube Cloud AWS Athena Configuration Screen -
- -### <--{"id" : "Guides"}--> AWS Redshift - - - -Ensure that the database can be accessed over the public Internet. If you'd -prefer to keep the database on a private network, -[contact us for VPC peering solutions](#connecting-to-a-database-not-exposed-over-the-internet). - - - -The following fields are required when creating an AWS Redshift connection: - -| Field | Description | Examples | -| ------------ | -------------------------------------------- | -------------------------------------------------------------- | -| **Hostname** | The host URL for the AWS Redshift cluster | `examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com` | -| **Port** | The port for the AWS Redshift cluster | `5439` | -| **Database** | The name of the database to connect to | `public` | -| **Username** | The username used to connect to the database | `redshift` | -| **Password** | The password used to connect to the database | `MY_SUPER_SECRET_PASSWORD` | - -
- Cube Cloud AWS Redshift Configuration Screen -
- -### <--{"id" : "Guides"}--> BigQuery - -The following fields are required when creating a BigQuery connection: - -| Field | Description | Examples | -| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | -| **Service Account JSON file** | A JSON key file for connecting to Google BigQuery | A valid Google BigQuery JSON key file | -| **Project ID** | The Google BigQuery project ID to connect to | `my-bigquery-project` | -| **Encoded Key File** | A Base64 encoded JSON key file for connecting to Google BigQuery. Required if Service Account JSON file is not provided | A valid Google BigQuery JSON key file encoded as a Base64 string | - -
- Cube Cloud BigQuery Configuration Screen -
- -### <--{"id" : "Guides"}--> Snowflake - -The following fields are required when creating a Snowflake connection: - -| Field | Description | Examples | -| ------------- | --------------------------------------------------------------- | -------------------------- | -| **Username** | The username used to connect to the database | `cube` | -| **Password** | The password used to connect to the database | `MY_SUPER_SECRET_PASSWORD` | -| **Database** | The name of the database to connect to | `MY_SNOWFLAKE_DB` | -| **Account** | The Snowflake account ID to use when connecting to the database | `qna90001` | -| **Region** | The Snowflake region to use when connecting to the database | `us-east-1` | -| **Warehouse** | The Snowflake warehouse to use when connecting to the database | `MY_WAREHOUSE` | -| **Role** | The Snowflake role to use when connecting to the database | `PUBLIC` | - -
- Cube Cloud Snowflake Configuration Screen -
- -## Connecting to multiple databases - -If you are connecting to multiple databases, set up the first database -connection during the deployment creation wizard. First, make sure you have the -correct configuration in your `cube.js` file according to your -[multitenancy setup](/multitenancy-setup). Next, configure the corresponding -environment variables on the **Settings - Env Vars page**. - -## Connecting via SSL - -When setting up a new deployment, simply select the SSL checkbox when entering -database credentials: - -
- Cube Cloud Database Connection Screen -
- -### <--{"id" : "Connecting via SSL"}--> Custom SSL certificates - -To use custom SSL certificates between Cube Cloud and your database server, go -to the **Env vars** tab in **Settings**: - - - -Depending on how SSL is configured on your database server, you may need to -specify additional environment variables, please check the [Environment -Variables reference][ref-config-env-vars] for more information. - - - -
- Cube Cloud Database Connection Screen -
- -Add the following environment variables: - -| Environment Variable | Description | Example | -| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | -| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube.js | `true`, `false` | -| `CUBEJS_DB_SSL_CA` | The contents of a CA bundle in PEM format, or a path to one. For more information, check the `options.ca` property for TLS Secure Contexts [in the Node.js documentation][link-nodejs-tls-options] | A valid CA bundle or a path to one | -| `CUBEJS_DB_SSL_CERT` | The contents of an SSL certificate in PEM format, or a path to one. For more information, check the `options.cert` property for TLS Secure Contexts [in the Node.js documentation][link-nodejs-tls-options] | A valid SSL certificate or a path to one | -| `CUBEJS_DB_SSL_KEY` | The contents of a private key in PEM format, or a path to one. For more information, check the `options.key` property for TLS Secure Contexts [in the Node.js documentation][link-nodejs-tls-options] | A valid SSL private key or a path to one | - -## Allowing connections from Cube Cloud IP - -In some cases you'd need to allow connections from your Cube Cloud deployment IP -address to your database. You can copy the IP address from either the Database -Setup step in deployment creation, or from the Env Vars tab in your deployment -Settings page. - -## Connecting to a database not exposed over the internet - -[Contact us](mailto:support@cube.dev) for VPC peering and on-premise solutions. - -[link-aws-regions]: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions -[link-nodejs-tls-options]: - https://nodejs.org/docs/latest/api/tls.html#tls_tls_createsecurecontext_options -[link-snowflake-account]: - https://docs.getdbt.com/reference/warehouse-profiles/snowflake-profile#account -[link-snowflake-regions]: - https://docs.snowflake.com/en/user-guide/intro-regions.html -[ref-config-env-vars]: /reference/environment-variables#database-connection diff --git a/docs/content/Cube-Cloud/Configuration/Custom-Domains.mdx b/docs/content/Cube-Cloud/Configuration/Custom-Domains.mdx deleted file mode 100644 index 8af335b89f02c..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/Custom-Domains.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Custom Domains -permalink: /cloud/configuration/custom-domains -category: Configuration -menuOrder: 5 ---- - - - -DNS changes can sometimes take up to 15 minutes to propagate, please wait at -least 15 minutes and/or try using another DNS provider to verify the `CNAME` -record correctly before raising a new Support ticket. - - - -To set up a custom domain, go to your deployment's settings page. Under the -**Custom Domain** section, type in your custom domain and click **Add**: - -
- -
- -After doing this, copy the provided domain and add the following `CNAME` records -to your DNS provider: - -| Name | Value | -| ------------- | ------------------------------------------- | -| `YOUR_DOMAIN` | The copied value from Cube Cloud's settings | - -Using the example subdomain from the screenshot, a `CNAME` record for `acme.dev` -would look like: - -| Name | Value | -| ---------- | ----------------------------------------------------- | -| `insights` | `colossal-crowville.gcp-us-central1.cubecloudapp.dev` | diff --git a/docs/content/Cube-Cloud/Configuration/Deployment-Env-Vars.md b/docs/content/Cube-Cloud/Configuration/Deployment-Env-Vars.md deleted file mode 100644 index 996c5343925a7..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/Deployment-Env-Vars.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Environment Variables -permalink: /cloud/configuration/env-vars -category: Configuration -menuOrder: 3 ---- - -You can set [Cube.js environment variables](/reference/environment-variables) -and other custom environment variables on the **Settings - Env Vars** page. - -
- Cube Cloud Environment Variables Screen -
diff --git a/docs/content/Cube-Cloud/Configuration/Deployment-Types.md b/docs/content/Cube-Cloud/Configuration/Deployment-Types.md deleted file mode 100644 index 2b45b02892e32..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/Deployment-Types.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Deployment Types -permalink: /cloud/configuration/deployment-types -category: Configuration -menuOrder: 2 ---- - -Cube Cloud deployment type determines the features, scalability, and -availability of your deployment. - -## Single Instance Deployments - -Single Instance deployments are designed for development use-cases only. -If not used for over an hour, it'll take additional time to process the first request. -Refresh Worker is active only when a Single Instance serves the workload. - -## Cluster Deployments - -Cluster deployments are designed for production workload. Cluster deployment -includes the following components: - -- Cube API instances -- Cube Refresh Workers -- Redis for Cache and Queue diff --git a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-AWS.mdx b/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-AWS.mdx deleted file mode 100644 index 0d78ba81d2b5a..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-AWS.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Connecting with a VPC on AWS -permalink: /cloud/configuration/connecting-with-a-vpc/aws ---- - -## Prerequisites - -To allow Cube Cloud to connect to a VPC on AWS, the following information is -required: - -- **AWS Account ID:** The AWS account ID of the VPC owner. This can be found in - the top-right corner of [the AWS Console][aws-console]. -- **AWS Region:** [The AWS region][aws-docs-regions] that the VPC resides in. - Ensure that the region is available in [Supported Regions](#supported-regions) - to see if Cube Cloud VPC connectivity is available in your region. -- **AWS VPC ID:** The ID of the VPC that Cube Cloud will connect to, for example - `vpc-0099aazz` -- **AWS VPC CIDR:** The CIDR block of the VPC that Cube Cloud will connect to, - for example `10.0.0.0/16` - -## Setup - -### VPC Peering Request - -After receiving the information above, Cube Cloud will send a [VPC peering -request][aws-docs-vpc-peering] that must be accepted. This can be done either -through the [AWS Web Console][aws-console] or through an infrastructure-as-code -tool. - -To accept the VPC peering request through the AWS Web Console, follow [the -instructions here][aws-docs-vpc-peering-accept] with the following amendments: - -- On Step 4, verify the peering request is from Cube Cloud by checking that the - AWS account ID, region and VPC IDs match those provided by Support. -- On Step 5, ensure **Modify my route tables now** is selected so that the - necessary routes are created. -- After Step 5, the security group for any databases within the VPC - [may require updating](#updating-security-groups) to allow traffic from Cube - Cloud. - -### Updating security groups - -Often the initial VPC setup will not allow traffic from Cube Cloud; this is -usually because [the security group][aws-docs-vpc-security-group] for the -database will need to allow access from the Cube Cloud CIDR block. - -This can be achieved by adding a new security group rule: - -- **Protocol:** TCP -- **Port Range:** The database port, usually `3306` for MySQL or `5432` for - Postgres. -- **Source/Destination:** The Cube Cloud CIDR block for the AWS region. - -## Supported Regions - -- `ca-central-1` -- `eu-central-1` -- `eu-west-1` -- `us-east-1` -- `us-east-2` -- `us-west-2` - -[aws-console]: https://console.aws.amazon.com/ -[aws-docs-regions]: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions -[aws-docs-vpc-peering-accept]: - https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html#accept-vpc-peering-connection -[aws-docs-vpc-peering]: - https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html -[aws-docs-vpc-security-group]: - https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SecurityGroupRules diff --git a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-Azure.mdx b/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-Azure.mdx deleted file mode 100644 index c2b15a43a4a58..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-Azure.mdx +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Connecting with a VPC on Azure -permalink: /cloud/configuration/connecting-with-a-vpc/azure ---- - -## Prerequisites - -To allow Cube Cloud to connect to a Virtual Network on Azure, the following -information is required: - -- **Virtual Network Name:** This can be found in the Virtual Networks section of - the [Azure Portal][azure-console]. -- **Tenant ID:** This can be found under Azure Active Directory > Properties > - Tenant ID in the [Azure Portal][azure-console]. - -## Setup - -Unfortunately Azure cross-tenant peering suppose that you grant peering role to -the user id/service principal to the peering party Below the list of steps that -would register Cube Cloud tenant at your organization and grant peering access -to Cube Cloud service principal - -### Add Cube tenant to your organization - -First the Cube Cloud tenant must be added to your organization. To do this, -open the [Azure Portal][azure-console] and go to Azure Active Directory > External -Identities > Cross-tenant access settings > Organizational Settings > Add -Organization. - -For Tenant ID, enter `197e5263-87f4-4ce1-96c4-351b0c0c714a`. Make sure that -B2B Collaboration > Inbound Access > Applications is set (or inherited) so -that it `Allows access` - -### Register Cube Cloud service principal at your organization - -`Cube Cloud service principal` - -info: -Client ID: `0c5d0d4b-6cee-402e-9a08-e5b79f199481` -Name: `cube-dedicated-infra-sp` - -Using browser tab where account that has rights to register -`Enterprise applications` is logged in open the following url: -https://login.microsoftonline.com/**Tenant -ID\*\*/oauth2/authorize?client_id=0c5d0d4b-6cee-402e-9a08-e5b79f199481&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com%2F -Select `Consent on behalf of your organization` And click `Accept` - -### Grant peering permissions to Cube Cloud service principal on your `Virtual Network` - -As `peering role` you can use built-in `Network contributor` or custom role that -has the following permissions: - -- Microsoft.Network/virtualNetworks/virtualNetworkPeerings/write -- Microsoft.Network/virtualNetworks/peer/action -- Microsoft.ClassicNetwork/virtualNetworks/peer/action -- Microsoft.Network/virtualNetworks/virtualNetworkPeerings/read -- Microsoft.Network/virtualNetworks/virtualNetworkPeerings/delete - -On the [Azure Portal][azure-console], go to `Virtual networks` > **Virtual -Network Name** > `Access Control (IAM)` > `Add` > `Add role assignment` Role = -`peering role` Members: `cube-dedicated-infra-sp` - -### Firewall - -Make sure that your firewall rules allow inbound and outbound traffic - -## Information required by Cube Cloud support - -When you are reaching out Cube Cloud support please provide following -information: - -- **Virtual Network ID:** You can find it at `Virtual Networks` > **Virtual - Network Name** > `Overview` > `JSON view` > `Resource ID` on [Azure - Portal][azure-console]. -- **Virtual Network Address Spaces:** You can find it at `Virtual Networks` > - **Virtual Network Name** > `Overview` > `JSON view` > `properties` > - `addressSpace` on [Azure Portal][azure-console]. -- **Tenant ID:** You can find it in `Azure Active Directory` > `Properties` > - `Tenant ID` section of [Azure Portal][azure-console]. - -## Supported Regions - -We support all general purpose regions - -[azure-console]: https://portal.azure.com diff --git a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-GCP.mdx b/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-GCP.mdx deleted file mode 100644 index e279c6e4d1a76..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC-GCP.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Connecting with a VPC on Google Cloud -permalink: /cloud/configuration/connecting-with-a-vpc/gcp ---- - -## Prerequisites - -- [Google Cloud Project ID][gcp-docs-projects] -- Google Cloud VPC Network Name - -## Setup - -### VPC Peering - -After receiving the information above, create a [VPC peering -request][gcp-docs-vpc-peering], either through the [GCP Web -Console][gcp-console] or an infrastructure-as-code tool. To send a VPC peering -request through the Google Cloud Console, follow [the instructions -here][gcp-docs-create-vpc-peering], with the following amendments: - -- In Step 6, use the project name `XXXXX` and network name(s) provided by Cube - Cloud. -- In Step 7, ensure **Import custom routes** and **Export custom routes** are - selected so that the necessary routes are created. - -## Supported Regions - -- `northeast1` -- `europe-west-2` -- `europe-west-3` -- `us-central-1` - -## Notes - -### Cloud SQL - -Google Cloud SQL databases [can only be peered to a VPC within the same GCP -project][gcp-docs-vpc-peering-restrictions]. To work around this limitation, we -recommend that customers provision a micro VM in their Google Cloud account to -run the [Cloud SQL Auth Proxy][gcp-cloudsql-auth-proxy]. - -[gcp-cloudsql-auth-proxy]: - https://cloud.google.com/sql/docs/mysql/connect-admin-proxy -[gcp-docs-vpc-peering-restrictions]: - https://cloud.google.com/vpc/docs/vpc-peering#restrictions -[gcp-console]: https://console.cloud.google.com/ -[gcp-docs-create-vpc-peering]: - https://cloud.google.com/vpc/docs/using-vpc-peering#creating_a_peering_configuration -[gcp-docs-projects]: - https://cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin -[gcp-docs-vpc-peering]: https://cloud.google.com/vpc/docs/vpc-peering diff --git a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC.mdx b/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC.mdx deleted file mode 100644 index 905f6ff9c68f5..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/Connecting-with-a-VPC.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Connecting with a VPC -permalink: /cloud/configuration/connecting-with-a-vpc -category: Configuration -menuOrder: 4 ---- - - - -To enable VPC support for your account, please [contact Sales][cube-contact]. - - - -For improved stability and security, Cube Cloud also supports connecting to one -or more VPCs in your AWS or Google Cloud accounts. A Cube Cloud VPC connection -improves stability through dedicated infrastructure for a deployment, and -improves security by preventing your database traffic from being routed through -the public Internet. - - - - - - - -[cube-contact]: https://cube.dev/contact/ diff --git a/docs/content/Cube-Cloud/Configuration/VPC/aws.svg b/docs/content/Cube-Cloud/Configuration/VPC/aws.svg deleted file mode 100644 index 4715937ff046d..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/aws.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - diff --git a/docs/content/Cube-Cloud/Configuration/VPC/azure.svg b/docs/content/Cube-Cloud/Configuration/VPC/azure.svg deleted file mode 100644 index ff5dfa5c1119a..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/azure.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/content/Cube-Cloud/Configuration/VPC/gcp.svg b/docs/content/Cube-Cloud/Configuration/VPC/gcp.svg deleted file mode 100644 index 81b7d245478a1..0000000000000 --- a/docs/content/Cube-Cloud/Configuration/VPC/gcp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/content/Cube-Cloud/Configuration/connect-db-athena.png b/docs/content/Cube-Cloud/Configuration/connect-db-athena.png deleted file mode 100644 index ebd82f58f634f..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/connect-db-athena.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Configuration/connect-db-bigquery.png b/docs/content/Cube-Cloud/Configuration/connect-db-bigquery.png deleted file mode 100755 index 72db6adec5681..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/connect-db-bigquery.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Configuration/connect-db-redshift.png b/docs/content/Cube-Cloud/Configuration/connect-db-redshift.png deleted file mode 100644 index 3d14114c3ef5b..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/connect-db-redshift.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Configuration/connect-db-snowflake.png b/docs/content/Cube-Cloud/Configuration/connect-db-snowflake.png deleted file mode 100644 index 7a75750c02376..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/connect-db-snowflake.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Configuration/ssl-custom.png b/docs/content/Cube-Cloud/Configuration/ssl-custom.png deleted file mode 100755 index d8b25b33d63fa..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/ssl-custom.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Configuration/ssl-wizard.png b/docs/content/Cube-Cloud/Configuration/ssl-wizard.png deleted file mode 100755 index 77b340c335aae..0000000000000 Binary files a/docs/content/Cube-Cloud/Configuration/ssl-wizard.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Cube-Cloud-Hybrid.md b/docs/content/Cube-Cloud/Cube-Cloud-Hybrid.md deleted file mode 100644 index 2edb63f983054..0000000000000 --- a/docs/content/Cube-Cloud/Cube-Cloud-Hybrid.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Cube Cloud Hybrid Installation -permalink: /cube-cloud-hybrid -category: Cube Cloud -menuOrder: 1 ---- - -Cube Cloud can be installed as a hybrid cloud option. -In this case Cube Cloud acts as a Kubernetes operator. -In this case it doesn't have access to your VPC or database and manages your deployment only by means of Kubernetes API. -Below are instructions for popular cloud providers. - -## AWS - -First step of Cube Cloud installation is to create AWS EKS cluster: - -1. Please see https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html on how to create cluster. -If you choose to use AWS Management Console UI path please ensure you use same credentials to authorize in AWS Management Console and your AWS CLI. -2. While creating cluster please ensure you use the same VPC and security groups that your database use. -3. Please refer to https://docs.aws.amazon.com/eks/latest/userguide/worker_node_IAM_role.html if you have problems with setting up worker node roles. -4. Install `kubectl` if you don't have one: https://kubernetes.io/docs/tasks/tools/install-kubectl/. -5. Setup `kubectl` using https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html. -6. Go to Cube Cloud deployment Overview page and copy `kubectl apply -f ...` installation command. -7. Run just copied `kubectl apply -f ...` in your command line. -8. After all required Kubernetes services started up you should see your deployment status at the Cube Cloud deployment Overview page. diff --git a/docs/content/Cube-Cloud/Deploys.mdx b/docs/content/Cube-Cloud/Deploys.mdx deleted file mode 100644 index aa5e7106d41bd..0000000000000 --- a/docs/content/Cube-Cloud/Deploys.mdx +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Deploys -permalink: /cloud/deploys -category: Deploys -menuOrder: 1 ---- - -This guide covers features and tools you can use to deploy your Cube.js project -to Cube Cloud. - -## Deploy with Git - -Continuous deployment works by connecting a Git repository to a Cube Cloud -deployment and keeping the two in sync. - -First, go to **Settings > Build & Deploy** to make sure your deployment is -configured to deploy with Git. Then click **Generate Git credentials** to obtain -Git credentials: - -
- -
- -The instructions to set up Cube Cloud as a Git remote are also available on the -same screen: - -```bash -$ git config credential.helper store -$ git remote add cubecloud -$ git push cubecloud master -``` - -## Deploy with GitHub - -First, ensure your deployment is configured to deploy with Git. Then connect -your GitHub repository to your deployment by clicking the **Connect to GitHub** -button, and selecting your repository. - -
- -
- -Cube Cloud will automatically deploy from the specified production branch -(**master** by default). - -## Deploy with CLI - -You can use the CLI to set up continuous deployment for a Git repository. You -can also use the CLI to manually deploy changes without continuous deployment. - -### <--{"id" : "Deploy with CLI"}--> Manual Deploys - -You can deploy your Cube.js project manually. This method uploads data schema -and configuration files directly from your local project directory. - -You can obtain Cube Cloud deploy token from your deployment **Settings** page. - -```bash -$ npx cubejs-cli deploy --token TOKEN -``` - -### <--{"id" : "Deploy with CLI"}--> Continuous Deployment - -You can use Cube.js CLI with your continuous integration tool. - - - -You can use the `CUBE_CLOUD_DEPLOY_AUTH` environment variable to pass the Cube -Cloud deploy token to Cube.js CLI. - - - -Below is an example configuration for GitHub Actions: - -```bash -name: My Cube.js App -on: - push: - paths: - - '**' - branches: - - 'master' -jobs: - deploy: - name: Deploy My Cube.js App - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Use Node.js 14.x - uses: actions/setup-node@v1 - with: - node-version: 14.x - - name: Deploy to Cube Cloud - run: npx cubejs-cli deploy - env: - CUBE_CLOUD_DEPLOY_AUTH: ${{ secrets.CUBE_CLOUD_DEPLOY_AUTH }} -``` diff --git a/docs/content/Cube-Cloud/Developer-Tools/Alerts.mdx b/docs/content/Cube-Cloud/Developer-Tools/Alerts.mdx deleted file mode 100644 index 446752ea6a5bb..0000000000000 --- a/docs/content/Cube-Cloud/Developer-Tools/Alerts.mdx +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Alerts in Cube Cloud -menuTitle: Alerts -permalink: /cloud/dev-tools/alerts -category: Developer Tools -menuOrder: 3 ---- - -Cube Cloud lets you set up alerts so you can be notified when there are issues -with any of the deployments in your account. - -Alert conditions are checked **once per minute** for configured -[alert types](#alert-types) and [deployments](#deployments). If an alert -condition is triggered, an email notification will be sent to configured -[recipients](#recipients). - -Cube Cloud only sends an outage email **once** per configured alert; when the -issue resolves, a resolution email is also sent. - - - -This feature is not available on the free plan. -See [pricing plans](https://cube.dev/pricing/) for details. - - - -## Alert Types - -Cube Cloud has three different types of alerts: - -- **API outages.** These are triggered if the deployment's API becomes - unavailable by monitoring the [`/livez` endpoint][ref-rest-api-livez]. -- **Database timeouts.** These are triggered if either the APIs or - the database are taking longer than expected to respond. -- **Pre-aggregation build failures.** These are triggered if any pre-aggregation - fails to build. - -## How to Configure - - - -Only **admin** users can configure alerts in Cube Cloud. - - - -To set up alerts in Cube Cloud, click your username in the top-right for the -menu, then click **Alerts**: - -
- Finding the Alerts menu in Cube Cloud -
- -You should now see the Alerts page. The example screenshot below shows no alerts -configured for this deployment: - -
- The Cube Cloud account's Alerts Page -
- -Click the **New Alert** button to bring up a dialog where you can configure the -alert: - -
- Creating a new Alert on Cube Cloud -
- -### Deployments - -By default, alerts are configured for all deployments in your account. You can -configure alerts for specific deployments by clicking **Specific** instead of -**All** and then checking the specific deployments you want to monitor: - -
- Selecting deployments for an alert on Cube Cloud -
- -### Recipients - -When creating a new alert, by default, all users will receive email alerts for -any issues. You can also specify particular users who should receive alerts by -toggling the **Specific users** option and selecting them: - -
- Setting receipients for an alert on Cube Cloud -
- -Optionally, you can also add additional email addresses that should receive -email notifications by entering the email address in the **Custom email** -field: - -
- Setting an custom email for an alert on Cube Cloud -
- -[ref-rest-api-livez]: /rest-api#api-reference-livez diff --git a/docs/content/Cube-Cloud/Developer-Tools/Cube-IDE.mdx b/docs/content/Cube-Cloud/Developer-Tools/Cube-IDE.mdx deleted file mode 100644 index 95c8ed8475af1..0000000000000 --- a/docs/content/Cube-Cloud/Developer-Tools/Cube-IDE.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Cube IDE in Cube Cloud -menuTitle: Cube IDE -permalink: /cloud/dev-tools/cube-ide -category: Developer Tools -menuOrder: 1 -redirect_from: - - /cloud/cube-ide ---- - -With the Cube IDE, you can write and test and your Cube.js data schemas from -your browser. Cube Cloud can create branch-based development API instances to -quickly test changes in the data schema in your frontend applications before -pushing them into production. - - - -## Development Mode - -In development mode, you can safely make changes to your project without -affecting production deployment. Development mode uses a separate Git branch and -allows testing your changes in Playground or via a separate API endpoint -specific to this branch. This development API hot-reloads your schema changes, -allowing you to quickly test API changes from your applications. - -To enter development mode, navigate to the **Schema** page and click **Enter -Development Mode**. - -
- -
- -When development mode is active, a grey bar will be visible at the top of the -screen. It provides several useful controls and indicators: - -- The name of the current development Git branch -- The status of the development API. After any changes to the project, the API - will hot-reload, and the API status will indicate when it's ready. -- 'Copy API URL' will copy the API URL to the clipboard for the current - development branch. - -You can exit development mode by clicking **Exit** button in the grey banner. - -
- -
diff --git a/docs/content/Cube-Cloud/Developer-Tools/Developer-Playground.md b/docs/content/Cube-Cloud/Developer-Tools/Developer-Playground.md deleted file mode 100644 index 4d2c3ef8db412..0000000000000 --- a/docs/content/Cube-Cloud/Developer-Tools/Developer-Playground.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Developer Playground in Cube Cloud -menuTitle: Developer Playground -permalink: /cloud/dev-tools/dev-playground -category: Developer Tools -menuOrder: 2 ---- - -The Cube Cloud Developer Playground is mostly similar to the one available in -Cube.js with the notable difference of being able to query the Development Mode -API. - -## Development Mode - -After making changes to the schema through the [Cube IDE][ref-devtools-ide], the -API will restart and its status will be visible in the Playground: - -
- Playground during API restart -
- -[ref-devtools-ide]: /cloud/dev-tools/cube-ide diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-1.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-1.png deleted file mode 100755 index d3f336fe9e64a..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-1.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-2.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-2.png deleted file mode 100755 index 6b12c504a9331..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-2.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-3.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-3.png deleted file mode 100755 index 5f3c5b5b305a3..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-3.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-4.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-4.png deleted file mode 100755 index 61a492d47963f..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-4.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-5.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-5.png deleted file mode 100755 index 66099701bff44..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-5.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/alerts-6.png b/docs/content/Cube-Cloud/Developer-Tools/alerts-6.png deleted file mode 100755 index 2b3eb80e53da3..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/alerts-6.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Developer-Tools/playground-restart.png b/docs/content/Cube-Cloud/Developer-Tools/playground-restart.png deleted file mode 100644 index 4963f3e88cff5..0000000000000 Binary files a/docs/content/Cube-Cloud/Developer-Tools/playground-restart.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/Getting-Started/Create-new.mdx b/docs/content/Cube-Cloud/Getting-Started/Create-new.mdx deleted file mode 100644 index 0ca8915760713..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Create-new.mdx +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: 'Getting Started with Cube Cloud: Create a project' -permalink: /cloud/getting-started/create ---- - -This guide walks you through setting up Cube Cloud and connecting your Cube -project to your database. - -## Step 1: Create an account - -Navigate to [cubecloud.dev](https://cubecloud.dev/), and create a new Cube Cloud -account. - -## Step 2: Create a new Deployment - -Click the `Create Deployment` button. This is the first step in the deployment -creation. Give it a name and select the cloud provider and region of your -choice. - -
- Cube Cloud Create Deployment Screen -
- -## Step 3: Set up the Cube project from scratch - -Next up, the second step in creating a Cube App from scratch in Cube Cloud is to -click the `+ create` button. - -
- Cube Cloud Upload Project Screen -
- -## Step 4: Connect your Database - -Enter your credentials to connect to your database. Check the [connecting to -databases][link-connecting-to-databases] guide for more details. - - - -Want to use a sample database instead? We also have a sample database where you -can try out Cube Cloud: - -
- -| Field | Value | -| -------- | ------------------ | -| Host | `demo-db.cube.dev` | -| Port | `5432` | -| Database | `ecom` | -| Username | `cube` | -| Password | `12345` | - -
- -
- Cube Cloud Setup Database Screen -
- -In the UI it'll look exactly like the image below. - -
- Cube Cloud Setup Database Screen -
- -If you run into issues here, make sure to allow the Cube Cloud IPs to access -your database. This means you need to enable these IPs in your firewall. If you -are using AWS, this would mean adding a security group with allowed IPs. - -## Step 5: Generate the Data Schema - -Step four in this case consists of generating a data schema. Start by selecting -the database tables to generate the data schema from, then hit `generate`. - -
- Cube Cloud Setup Database Screen -
- -Cube Cloud will generate the data schema and spin up your Cube deployment. With -this, you're done. You've created a Cube deployment, configured a database -connection, and generated a data schema! - -
- Cube Cloud Setup Database Screen -
- -You're ready for the last step, running queries in the Playground. - -## Step 6: Try out Cube Cloud - -Now you can navigate to Playground to try out your queries or connect your -application to Cube Cloud API. - -
- Cube Cloud Playground -
- -[link-connecting-to-databases]: /cloud/configuration/connecting-to-databases diff --git a/docs/content/Cube-Cloud/Getting-Started/Import-Bitbucket-repository-via-SSH.mdx b/docs/content/Cube-Cloud/Getting-Started/Import-Bitbucket-repository-via-SSH.mdx deleted file mode 100644 index a35d614e336be..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Import-Bitbucket-repository-via-SSH.mdx +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: 'Getting Started with Cube Cloud: Import Bitbucket repository via SSH' -permalink: /cloud/getting-started/ssh/bitbucket ---- - -This guide walks you through creating a new deployment on Cube Cloud from a -[Bitbucket][bitbucket] repository via SSH. - -## Step 1: Create an account - -Navigate to [cubecloud.dev](https://cubecloud.dev/), and create a new Cube Cloud -account. - -## Step 2: Create a new Deployment - -Click the `Create Deployment` button. This is the first step in the deployment -creation. Give it a name and select the cloud provider and region of your -choice. - -
- Cube Cloud Create Deployment Screen -
- -## Step 3: Import Git repository - -Next up, the second step in creating a Cube App from scratch in Cube Cloud is to -click the `Import Git repository via SSH` button. - -
- Cube Cloud Upload Project Screen -
- -Now go to your Bitbucket repository and on the `Clone` dialog, switch to `SSH` -and copy the URL: - -
- Getting the repository's SSH URL from Bitbucket -
- -Back in Cube Cloud, paste the URL and click `Generate SSH key`: - -
- Getting SSH key from Cube Cloud -
- -Now copy the SSH key and go back to Bitbucket and into the repository's -settings. Click `Access keys` from the navigation, then click the `Add key` -button. Give the key a label (`Cube Cloud`, for example) and paste the SSH key -in the relevant field: - -
- Add Cube Cloud deploy key to Bitbucket -
- -Click `Add SSH key` to save, then go back to Cube Cloud and click `Connect`. -After a connection is successfully established, you should see the next screen: - -
- Getting webhook URL from Cube Cloud -
- -Copy the `Cube Cloud Git Webhook URL` and go to your Bitbucket repository's -settings and click `Webhooks` from the navigation. Click `Add webhook`, then add -a title (`Cube Cloud`, for example). Paste the URL into the correct field, -ensure the `Repository > Push` trigger is checked and click `Save`. - -
- Add Cube Cloud webhook to Bitbucket -
- -Back in Cube Cloud, click `Connect` to test the webhook. - -## Step 4: Connect your Database - -Enter your credentials to connect to your database. Check the [connecting to -databases][link-connecting-to-databases] guide for more details. - - - -Want to use a sample database instead? We also have a sample database where you -can try out Cube Cloud: - -
- -| Field | Value | -| -------- | ------------------ | -| Host | `demo-db.cube.dev` | -| Port | `5432` | -| Database | `ecom` | -| Username | `cube` | -| Password | `12345` | - -
- -
- Cube Cloud Setup Database Screen -
- -In the UI it'll look exactly like the image below. - -
- Cube Cloud Setup Database Screen -
- -If you run into issues here, make sure to allow the Cube Cloud IPs to access -your database. This means you need to enable these IPs in your firewall. If you -are using AWS, this would mean adding a security group with allowed IPs. - -## Step 5: Generate the Data Schema - -Step five in this case consists of generating a data schema. Start by selecting -the database tables to generate the data schema from, then hit `generate`. - -
- Cube Cloud Setup Database Screen -
- -Cube Cloud will generate the data schema and spin up your Cube deployment. With -this, you're done. You've created a Cube deployment, configured a database -connection, and generated a data schema! - -
- Cube Cloud Setup Database Screen -
- -You're ready for the last step, running queries in the Playground. - -## Step 6: Try out Cube Cloud - -Now you can navigate to Playground to try out your queries or connect your -application to the Cube Cloud API. - -
- Cube Cloud Playground -
- -[bitbucket]: https://bitbucket.org/ -[link-connecting-to-databases]: /cloud/configuration/connecting-to-databases diff --git a/docs/content/Cube-Cloud/Getting-Started/Import-Git-repository-via-SSH.mdx b/docs/content/Cube-Cloud/Getting-Started/Import-Git-repository-via-SSH.mdx deleted file mode 100644 index cb6b2c00bf67f..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Import-Git-repository-via-SSH.mdx +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: 'Getting Started with Cube Cloud: Import Git repository via SSH' -permalink: /cloud/getting-started/ssh/git ---- - -This guide walks you through creating a new deployment on Cube Cloud from a Git -repository via SSH. - -## Step 1: Create an account - -Navigate to [cubecloud.dev](https://cubecloud.dev/), and create a new Cube Cloud -account. - -## Step 2: Create a new Deployment - -Click the `Create Deployment` button. This is the first step in the deployment -creation. Give it a name and select the cloud provider and region of your -choice. - -
- Cube Cloud Create Deployment Screen -
- -## Step 3: Import Git repository - -Next up, the second step in creating a Cube App from scratch in Cube Cloud is to -click the `Import Git repository via SSH` button. - -
- Cube Cloud Upload Project Screen -
- -Enter the SSH URL of your Git repository, and click `Generate SSH key`: - -
- Getting SSH key from Cube Cloud -
- -Copy the SSH key and add it to your hosted Git repository. Back in Cube Cloud, -click `Connect`. After a connection is successfully established, you should see -the next screen: - -
- Getting webhook URL from Cube Cloud -
- -Copy the `Cube Cloud Git Webhook URL` and add it your hosted Git repository's -webhooks. Ensure that the Git repository can push events which should trigger a -build on Cube Cloud. Back in Cube Cloud, click `Connect` to test the webhook. - -## Step 4: Connect your Database - -Enter your credentials to connect to your database. Check the [connecting to -databases][link-connecting-to-databases] guide for more details. - - - -Want to use a sample database instead? We also have a sample database where you -can try out Cube Cloud: - -
- -| Field | Value | -| -------- | ------------------ | -| Host | `demo-db.cube.dev` | -| Port | `5432` | -| Database | `ecom` | -| Username | `cube` | -| Password | `12345` | - -
- -
- Cube Cloud Setup Database Screen -
- -In the UI it'll look exactly like the image below. - -
- Cube Cloud Setup Database Screen -
- -If you run into issues here, make sure to allow the Cube Cloud IPs to access -your database. This means you need to enable these IPs in your firewall. If you -are using AWS, this would mean adding a security group with allowed IPs. - -## Step 5: Generate the Data Schema - -Step five in this case consists of generating a data schema. Start by selecting -the database tables to generate the data schema from, then hit `generate`. - -
- Cube Cloud Setup Database Screen -
- -Cube Cloud will generate the data schema and spin up your Cube deployment. With -this, you're done. You've created a Cube deployment, configured a database -connection, and generated a data schema! - -
- Cube Cloud Setup Database Screen -
- -You're ready for the last step, running queries in the Playground. - -## Step 6: Try out Cube Cloud - -Now you can navigate to Playground to try out your queries or connect your -application to the Cube Cloud API. - -
- Cube Cloud Playground -
- -[link-connecting-to-databases]: /cloud/configuration/connecting-to-databases diff --git a/docs/content/Cube-Cloud/Getting-Started/Import-GitLab-repository-via-SSH.mdx b/docs/content/Cube-Cloud/Getting-Started/Import-GitLab-repository-via-SSH.mdx deleted file mode 100644 index 11dac9191e976..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Import-GitLab-repository-via-SSH.mdx +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: 'Getting Started with Cube Cloud: Import GitLab repository via SSH' -permalink: /cloud/getting-started/ssh/gitlab ---- - -This guide walks you through creating a new deployment on Cube Cloud from a -[GitLab][gitlab] repository via SSH. - -## Step 1: Create an account - -Navigate to [cubecloud.dev](https://cubecloud.dev/), and create a new Cube Cloud -account. - -## Step 2: Create a new Deployment - -Click the `Create Deployment` button. This is the first step in the deployment -creation. Give it a name and select the cloud provider and region of your -choice. - -
- Cube Cloud Create Deployment Screen -
- -## Step 3: Import Git repository - -Next up, the second step in creating a Cube App from scratch in Cube Cloud is to -click the `Import Git repository via SSH` button. - -
- Cube Cloud Upload Project Screen -
- -Now go to your GitLab repository and from the `Clone` dropdown menu, copy the -`Clone with SSH` URL: - -
- Getting the repository's SSH URL from GitLab -
- -Back in Cube Cloud, paste the URL and click `Generate SSH key`: - -
- Getting SSH key from Cube Cloud -
- -Now copy the SSH key and go back to GitLab and paste it into the repository's -settings. Find the `Deploy keys` section and click `Expand`. Give the key a -title (`Cube Cloud`, for example) and paste the SSH key in the relevant field: - -
- Add Cube Cloud deploy key to GitLab -
- -Ensure `Grant write permissions to this key` is checked, then click `Add key`. -Go back to Cube Cloud and click `Connect`. After a connection is successfully -established, you should see the next screen: - -
- Getting webhook URL from Cube Cloud -
- -Copy the `Cube Cloud Git Webhook URL` and go to your GitLab project's `Webhooks` -settings. Paste the URL into the correct field, ensure the `Push events` trigger -is checked and click `Add webhook`. - -
- Add Cube Cloud webhook to GitLab -
- -Back in Cube Cloud, click `Connect` to test the webhook. - -## Step 4: Connect your Database - -Enter your credentials to connect to your database. Check the [connecting to -databases][link-connecting-to-databases] guide for more details. - - - -Want to use a sample database instead? We also have a sample database where you -can try out Cube Cloud: - -
- -| Field | Value | -| -------- | ------------------ | -| Host | `demo-db.cube.dev` | -| Port | `5432` | -| Database | `ecom` | -| Username | `cube` | -| Password | `12345` | - -
- -
- Cube Cloud Setup Database Screen -
- -In the UI it'll look exactly like the image below. - -
- Cube Cloud Setup Database Screen -
- -If you run into issues here, make sure to allow the Cube Cloud IPs to access -your database. This means you need to enable these IPs in your firewall. If you -are using AWS, this would mean adding a security group with allowed IPs. - -## Step 5: Generate the Data Schema - -Step five in this case consists of generating a data schema. Start by selecting -the database tables to generate the data schema from, then hit `generate`. - -
- Generating schemas for a new Cube Cloud deployment -
- -Cube Cloud will generate the data schema and spin up your Cube deployment. With -this, you're done. You've created a Cube deployment, configured a database -connection, and generated a data schema! - -
- Cube Cloud Playground -
- -You're ready for the last step, running queries in the Playground. - -## Step 6: Try out Cube Cloud - -Now you can navigate to Playground to try out your queries or connect your -application to the Cube Cloud API. - -
- Cube Cloud Playground -
- -[gitlab]: https://gitlab.com/ -[link-connecting-to-databases]: /cloud/configuration/connecting-to-databases diff --git a/docs/content/Cube-Cloud/Getting-Started/Overview.mdx b/docs/content/Cube-Cloud/Getting-Started/Overview.mdx deleted file mode 100644 index 066231b5e3a7c..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Overview.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Getting Started with Cube Cloud -menuTitle: Getting Started -permalink: /cloud/getting-started -category: Cube Cloud Getting Started -menuOrder: 1 -redirect_from: - - /cloud/quickstart ---- - -## Console - - - - - - -## SSH - - - - - - diff --git a/docs/content/Cube-Cloud/Getting-Started/Upload-with-CLI.mdx b/docs/content/Cube-Cloud/Getting-Started/Upload-with-CLI.mdx deleted file mode 100644 index 99102b361578b..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/Upload-with-CLI.mdx +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: 'Getting Started with Cube Cloud: Upload with CLI' -permalink: /cloud/getting-started/cli ---- - -This guide walks you through setting up Cube Cloud and connecting to your -database. - - - -## Step 1: Create Deployment - -Click Create Deployment. Then give it a name and select the cloud provider and -region of your choice. - -
- Cube Cloud Create Deployment Screen -
- -## Step 2: Upload your Cube.js project - -The next step is to upload your existing Cube.js project to the Cube Cloud. - -You can do it by running the following command from terminal in your Cube.js -project directory. - -```bash -npx cubejs-cli deploy --token -``` - -
- Cube Cloud Upload Project Screen -
- -## Step 3: Connect your Database - -Enter your credentials to connect to your database. Check the [connecting to -databases][ref-cloud-connecting-to-databases] guide for more details. - - - -Want to use a sample database instead? We also have a sample database where you -can try out Cube Cloud: - -
- -| Field | Value | -| -------- | ------------------ | -| Host | `demo-db.cube.dev` | -| Port | `5432` | -| Database | `ecom` | -| Username | `cube` | -| Password | `12345` | - -
- -
- Cube Cloud Setup Database Screen -
- -## Step 4: Try out Cube Cloud - -Now you can navigate to [the Playground][ref-cloud-playground] to try out your -queries or connect your application to Cube Cloud API. - -
- Cube Cloud Playground -
- -[ref-cloud-connecting-to-databases]: - /cloud/configuration/connecting-to-databases -[ref-cloud-playground]: /cloud/dev-tools/dev-playground diff --git a/docs/content/Cube-Cloud/Getting-Started/bitbucket.svg b/docs/content/Cube-Cloud/Getting-Started/bitbucket.svg deleted file mode 100644 index 4aae0c7471f4a..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/bitbucket.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/docs/content/Cube-Cloud/Getting-Started/create-new.svg b/docs/content/Cube-Cloud/Getting-Started/create-new.svg deleted file mode 100644 index db9557a5668d0..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/create-new.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/docs/content/Cube-Cloud/Getting-Started/git.svg b/docs/content/Cube-Cloud/Getting-Started/git.svg deleted file mode 100644 index d86fcc4f653e2..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/git.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/content/Cube-Cloud/Getting-Started/gitlab.svg b/docs/content/Cube-Cloud/Getting-Started/gitlab.svg deleted file mode 100644 index 830a3d34586d7..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/gitlab.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/content/Cube-Cloud/Getting-Started/upload-with-cli.svg b/docs/content/Cube-Cloud/Getting-Started/upload-with-cli.svg deleted file mode 100644 index f677dd42d1236..0000000000000 --- a/docs/content/Cube-Cloud/Getting-Started/upload-with-cli.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/docs/content/Cube-Cloud/Index.mdx b/docs/content/Cube-Cloud/Index.mdx deleted file mode 100644 index 75d4acf2d83c7..0000000000000 --- a/docs/content/Cube-Cloud/Index.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Cube Cloud -permalink: /cloud -category: Overview -menuOrder: 1 ---- - -[Cube Cloud][link-cube-cloud] offers hosted Cube.js service with extra features -for reliability and performance. It includes all the core features of Cube.js, -while taking care of infrastructure concerns such as the number of instances, -memory, high-availability, pre-aggregations management, caching, scalability, -real-time monitoring and tracing. - -[Get Started with Cube Cloud](/cloud/quickstart) - -## Develop Cube.js projects - -You can use Cube Cloud IDE to develop and run Cube.js applications. By -connecting your GitHub account, you can keep your data schema under version -control. - - - -## Run and Scale Cube.js applications - -Cube Cloud provides on-demand scalable infrastructure and pre-aggregations -storage. Cube Cloud runs hundreds of [Cube Store][ref-cubestore] instances to -ingest and query pre-aggregations with low latency and high concurrency. It is -available to all users on the Standard plan and higher. - -## Live preview your feature branches - -Cube Cloud can spin up Cube.js API instances to test changes to the data schema -in feature branches. You can use branch-based development API URLs in your -frontend application to test changes before shipping them to production. - -## Inspect Cube.js queries - -You can trace and inspect your Cube.js queries to find performance flaws and -apply optimizations. Cube Cloud also provides tips and suggestions on what -pre-aggregation should be used. - -[link-cube-cloud]: https://cube.dev/cloud -[ref-cubestore]: /caching/using-pre-aggregations#pre-aggregations-storage diff --git a/docs/content/Cube-Cloud/Inspecting-Queries.md b/docs/content/Cube-Cloud/Inspecting-Queries.md deleted file mode 100644 index 877600b3a6683..0000000000000 --- a/docs/content/Cube-Cloud/Inspecting-Queries.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Inspecting Queries -permalink: /cloud/inspecting-queries -category: Inspecting Queries -menuOrder: 1 ---- - -You can inspect your Cube.js queries in Cube Cloud. - -
- -
- -## Find slow queries - -You can use filters to find slow and not pre-aggregated queries. - -
- -
- -## Pre-aggregation suggestions - -Cube Cloud provides useful tips for pre-aggregation strategies and recommends -you the best pre-aggregation for the specific query. -Click on the any query on the **Queries** page and navigate to the **Pre-Aggregations** -tab inside the query details page. - -
- -
diff --git a/docs/content/Cube-Cloud/Release-Notes/12-2021.mdx b/docs/content/Cube-Cloud/Release-Notes/12-2021.mdx deleted file mode 100644 index b0c89ebedbccd..0000000000000 --- a/docs/content/Cube-Cloud/Release-Notes/12-2021.mdx +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Release Notes -permalink: /cloud/release-notes/12-2021 -category: Release Notes -menuOrder: 1 ---- - -Following Cube Cloud becoming generally available in October 2021, we've been -hard at work making improvements across the board. Let's have a quick run -through them: - -## Database Connections - -Cube Cloud now supports configuring your own specified SSL certificates when -connecting to databases. When creating a new deployment, check the 'SSL' box, -and paste the relevant SSL certificates: - -![SSL configuration options on Set Up a Database Connection screen|496x500](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/336591951b312cdf38c5cd6a5883e0b1b86057a8.png) - -## Git integration - -We've made it really easy to quickly add more Git branches to your Cube Cloud -deployment and switch between them, just click the branch name in the status -bar: - -![Branch switcher|685x500](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/68dd08d82e696646f8eb94c109cdeeec623272e9.png) - -Speaking of Git branches, you can now easily add and remove branches with the -same switcher; click 'Add Branch' and enter a name for the new branch in the -popup: - -![Create a new branch|690x431](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/f3a2e6f328ea207599cc784f1051a10b1d47ffa8.png) - -These branches are shared; meaning everyone on your Cube Cloud team can see and -edit them. This makes them super useful for out-of-band experiments where you -can quickly test things in Cube Cloud without having to go through a CI/CD -process. - -To round things off, you can also delete unused branches too; first make sure -you are already on the branch, then open the switcher and click 'Remove Branch': - -![Delete a branch|685x500](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/93b46895de0cf8c1dfac85640438c4d30a56e767.png) - -## GitHub integration - -When connecting your GitHub repo to Cube Cloud, you can now choose a default -branch for deployments: - -![Integrate with GitHub repository|690x440](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/2673d0d9e21fcdbc1ae9ec5658badcdc17e4eb24.png) - -## Developer Mode - -We've seen a round of improvements to the Cube Cloud Developer Mode experience. -When you're in Developer Mode, the status bar is now purple so you always know -when it's active: - -![Development Mode now shows a purple status bar|690x431](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/e7e2349db8994cecce4979466d270280a85214dd.png) - -If you've been editing a schema and navigate away, we warn you if there are any -unsaved changes: - -![Unsaved changes warning modal|690x431](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/2f1f9c64ef6a6a6b66092bc38332f0c8bbced378.png) - -And last but not least, we've added a new 'Generate Schema' button to the Schema -page. Clicking this will let you re-generate schemas from your source database, -or alternatively add rollups to existing schemas: - -![Generate rollups or schema modal|690x428](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/ae01322061fa45357275939c10927d5339cd723b.png) - -## Query Tracing - -When inspecting queries in the Queries tab, you can now also see whether or not -the query used a pre-aggregation: - -![Query showing pre-aggregation lightning mark|674x500](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/c953bbe2684339bc36fafaa1efb39202e18f85b2.jpeg) - -If you click a query from the list, we now provide more relevant information, -like if the query built a pre-aggregation or not: - -![Query request details|690x428](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/7160cd06f0888494f4409744ca472e0efb7a0449.png) - -## SQL API - -Following the release of the SQL API in Cube, we're happy to announce that you -can also use it in Cube Cloud. You can enable it by clicking 'Deploy SQL API' -from the Overview page, then click the 'How to connect your BI tool'. You should -then see something similar to the following: - -![SQL API details modal|690x428](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/8501d40a2062967723b4de78af6e6b496f60be0b.png) - -You can read more about the Cube SQL API -[in the documentation](https://cube.dev/docs/backend/sql), and we even have -[a recipe that shows you how to connect the SQL API to Apache Superset](https://cube.dev/docs/recipes/using-apache-superset-with-cube-sql). - -## GraphQL API - -In parallel to the SQL API, we also are excited to announce a new GraphQL API. -You can copy its’ URL from the Overview page, just under the SQL API: - -![GraphQL API|690x310](https://aws1.discourse-cdn.com/standard11/uploads/cube1/original/1X/85dd23cf30bdd78b3ca5f4bd04ec925ab674c70b.png) - -More information can be found -[in the documentation](https://cube.dev/docs/backend/graphql); we hope you enjoy -using it as much as we are 🤓 - -## Other Notable Improvements - -- When a deployment is connected to a Git monorepo, only commits to the Cube - project folder will trigger a rebuild on Cube Cloud. -- When switching from `stable` track to `latest`, Cube Cloud will now - automatically restart the deployment. -- `COMPILE_CONTEXT` now works correctly in Developer Mode. -- Automatically switch to Developer Mode after adding a rollup using the Rollup Designer. - -That's all for this release, stay tuned for the release notes next time 😀 diff --git a/docs/content/Cube-Cloud/cube-ide.png b/docs/content/Cube-Cloud/cube-ide.png deleted file mode 100644 index 3e4bf50f58be5..0000000000000 Binary files a/docs/content/Cube-Cloud/cube-ide.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/deploy-with-git-creds.png b/docs/content/Cube-Cloud/deploy-with-git-creds.png deleted file mode 100644 index 0d7f78552c51a..0000000000000 Binary files a/docs/content/Cube-Cloud/deploy-with-git-creds.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/deploy-with-github.png b/docs/content/Cube-Cloud/deploy-with-github.png deleted file mode 100755 index a87fb69c8e63e..0000000000000 Binary files a/docs/content/Cube-Cloud/deploy-with-github.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/dev-mode-bar.png b/docs/content/Cube-Cloud/dev-mode-bar.png deleted file mode 100644 index aa783e9aed688..0000000000000 Binary files a/docs/content/Cube-Cloud/dev-mode-bar.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/enter-dev-mode.png b/docs/content/Cube-Cloud/enter-dev-mode.png deleted file mode 100644 index 25ced97c0dd7c..0000000000000 Binary files a/docs/content/Cube-Cloud/enter-dev-mode.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/getting-started-2.png b/docs/content/Cube-Cloud/getting-started-2.png deleted file mode 100644 index 3241e2cad3dd6..0000000000000 Binary files a/docs/content/Cube-Cloud/getting-started-2.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/getting-started-4.png b/docs/content/Cube-Cloud/getting-started-4.png deleted file mode 100644 index 18b91f9e87345..0000000000000 Binary files a/docs/content/Cube-Cloud/getting-started-4.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/inspect-queries-1.png b/docs/content/Cube-Cloud/inspect-queries-1.png deleted file mode 100644 index 277a2e7a90b64..0000000000000 Binary files a/docs/content/Cube-Cloud/inspect-queries-1.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/inspect-queries-2.png b/docs/content/Cube-Cloud/inspect-queries-2.png deleted file mode 100644 index 0165e59f2a894..0000000000000 Binary files a/docs/content/Cube-Cloud/inspect-queries-2.png and /dev/null differ diff --git a/docs/content/Cube-Cloud/inspect-queries.png b/docs/content/Cube-Cloud/inspect-queries.png deleted file mode 100644 index 75e45466eab08..0000000000000 Binary files a/docs/content/Cube-Cloud/inspect-queries.png and /dev/null differ diff --git a/docs/content/Cube.js-Introduction.md b/docs/content/Cube.js-Introduction.md deleted file mode 100644 index 0ca465f5c1b7c..0000000000000 --- a/docs/content/Cube.js-Introduction.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Introduction -permalink: /introduction -category: Cube.js Introduction -redirect_from: - - /cubejs-introduction ---- - -**Cube is the headless business intelligence platform.** It helps data engineers and application developers access data from modern data stores, organize it into consistent definitions, and deliver it to every application. - - - -Cube was designed to work with all SQL-enabled data sources, including cloud data warehouses like Snowflake or Google BigQuery, query engines like Presto or Amazon Athena, and application databases like Postgres. Cube has a built-in caching engine to provide sub-second latency and high concurrency for API requests. - -With Cube, you can build a data model, manage access control and caching, and expose your data to every application via REST, GraphQL, and SQL APIs. -Cube is headless, API-first, and decoupled from visualizations. You can use any charting library to build custom UI, or connect existing dashboarding and reporting tools to Cube. - -## Why Cube? - -If you are building a data application—such as a business intelligence tool or a customer-facing analytics feature—you’ll probably face the following problems: - -1. __SQL code organization.__ Sooner or later, modeling even a dozen metrics with a dozen dimensions using pure SQL queries becomes a maintenance nightmare, which leads to building a modeling framework. -2. __Performance.__ Most of the time and effort in modern analytics software development is spent providing adequate time to insight. In a world where every company’s data is big data, writing just SQL queries to get insight isn’t enough anymore. -3. __Access Control.__ It is important to secure and govern access to data for all downstream data consuming applications. - -Cube has the necessary infrastructure and features to implement efficient data modeling, access control, and performance optimizations so that every application can access consistent data via REST, SQL, and GraphQL APIs. Achieve insights from raw data within minutes, and get an API with sub-second response times on up to a trillion data points. - -
- -
- -## Architecture - -**Cube acts as a data access layer**, translating API requests into SQL, managing caching, queuing, and database connection. - -The Cube accepts queries via REST, GraphQL or SQL interfaces. Based on the data model and an incoming query, Cube generates -a SQL query and executes it in your database. Cube fully manages query orchestration, database connections, as well as caching and access control layers. The result is then sent back to the client. - -
- -
- -[ref-query-format]: https://cube.dev/docs/query-format diff --git a/docs/content/Deployment/Overview.mdx b/docs/content/Deployment/Overview.mdx deleted file mode 100644 index c09620c8d6a14..0000000000000 --- a/docs/content/Deployment/Overview.mdx +++ /dev/null @@ -1,360 +0,0 @@ ---- -title: Deployment Overview -menuTitle: Overview -permalink: /deployment/overview -category: Deployment -menuOrder: 1 -redirect_from: - - /deployment - - /deployment/guide ---- - -This section contains a general overview of deploying Cube.js cluster in -production. You can find platform-specific guides for: - -- [Cube Cloud][ref-deploy-cubecloud] -- [Docker][ref-deploy-docker] -- [Kubernetes][ref-deploy-k8s] - -If you are moving Cube.js to production, check out the [Production -Checklist][ref-deploy-prod-list]. - -As shown in the diagram below, a typical production Cube.js cluster consists of -one or multiple API instances, a Refresh Worker, Redis and a Cube Store cluster. - -
- Deployment Overview -
- -**API Instances** process incoming API requests and query either Cube Store for -pre-aggregated data or connected database(s) for raw data. The **Refresh -Worker** builds and refreshes pre-aggregations in the background. **Cube Store** -ingests pre-aggregations built by Refresh Worker and responds to queries from -API instances. - - **Redis** is used to manage the queue and query-level cache. Please note, we -are planning to [replace Redis with Cube Store][replace-redis] for in-memory cache and queue management in late -2022. - -API instances and Refresh Worker can be configured via [environment -variables][ref-config-env] or [cube.js configuration file][ref-config-js]. They -also need access to the data schema files. - -Cube Store cluster can be configured via environment variables. - -Below you can find an example Docker Compose configuration for a Cube.js -cluster: - -```yaml -version: '2.2' - -services: - cube_api: - image: cubejs/cube - ports: - - 4000:4000 - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-k8s-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - - CUBEJS_CUBESTORE_HOST=cubestore_router - - - CUBEJS_REDIS_URL=redis://redis:6379 - - - CUBEJS_API_SECRET=secret - volumes: - - .:/cube/conf - depends_on: - - cubestore_worker_1 - - cubestore_worker_2 - - cube_refresh_worker - - redis - - cube_refresh_worker: - image: cubejs/cube - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-k8s-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - - CUBEJS_CUBESTORE_HOST=cubestore_router - - - CUBEJS_REDIS_URL=redis://redis:6379 - - - CUBEJS_API_SECRET=secret - - - CUBEJS_REFRESH_WORKER=true - volumes: - - .:/cube/conf - - cubestore_router: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_PORT=9999 - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - - cubestore_worker_1: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_1:10001 - - CUBESTORE_WORKER_PORT=10001 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - depends_on: - - cubestore_router - - cubestore_worker_2: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_2:10002 - - CUBESTORE_WORKER_PORT=10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - depends_on: - - cubestore_router - - redis: - image: bitnami/redis:latest - environment: - - ALLOW_EMPTY_PASSWORD=yes - logging: - driver: none -``` - -## API Instance - -API instances process incoming API requests and query either Cube Store -for pre-aggregated data or connected data sources for raw data. It is possible to -horizontally scale API instances and use a load balancer to balance incoming -requests between multiple API instances. - -The [Cube Docker image][dh-cubejs] is used for API Instance. - -API instance needs to be configured via environment variables, cube.js file and -has access to the data schema files. - -## Refresh Worker - -A Refresh Worker updates pre-aggregations and the in-memory cache in the -background. They also keep the refresh keys up-to-date for all defined schemas -and pre-aggregations. - -[Cube.js Docker image][dh-cubejs] can be used for creating Refresh Workers; to -make the service act as a Refresh Worker, `CUBEJS_REFRESH_WORKER=true` should be -set in the environment variables. - -## Cube Store - -Cube Store is the purpose-built pre-aggregations storage for Cube.js. - -Cube Store uses a distributed query engine architecture. In every Cube Store -cluster: - -- a one or many router nodes handle incoming connections, manages database - metadata, builds query plans, and orchestrates their execution -- multiple worker nodes ingest warmed up data and execute queries in parallel -- a local or cloud-based blob storage keeps pre-aggregated data in columnar - format - -![](https://cubedev-blog-images.s3.us-east-2.amazonaws.com/db0e1aeb-3101-4280-b4a4-902e21bcd9a0.png) - -More information on Cube Store architecture can be found in [this presentation](https://docs.google.com/presentation/d/1oQ-koloag0UcL-bUHOpBXK4txpqiGl41rxhgDVrw7gw/). - -By default, Cube Store listens on the port `3030` for queries coming from -Cube.js. The port could be changed by setting `CUBESTORE_HTTP_PORT` environment -variable. In a case of using custom port, please make sure to change -`CUBEJS_CUBESTORE_PORT` environment variable for Cube.js API Instances and -Refresh Worker. - -### <--{"id" : "Cube Store"}--> Scaling - -Although Cube Store _can_ be run in single-instance mode, this is often -unsuitable for production deployments. For high concurrency and data throughput, -we **strongly** recommend running Cube Store as a cluster of multiple instances -instead. Because the storage layer is decoupled from the query processing -engine, you can horizontally scale your Cube Store cluster for as much -concurrency as you require. - -Cube Store has two "kinds" of nodes: - -- The **router** node handles incoming client connections, manages database - metadata and serves simple queries -- Multiple **worker** nodes which execute SQL queries received from Cube.js - -Both the router and worker use the [Cube Store Docker image][dh-cubestore]. The -following environment variables should be used to manage the roles: - -| Environment Variable | Specify on Router? | Specify on Worker? | -| ----------------------- | ------------------ | ------------------ | -| `CUBESTORE_SERVER_NAME` | Yes | Yes | -| `CUBESTORE_META_PORT` | Yes | - | -| `CUBESTORE_WORKERS` | Yes | Yes | -| `CUBESTORE_WORKER_PORT` | - | Yes | -| `CUBESTORE_META_ADDR` | - | Yes | - -A sample Docker Compose stack setting Cube Store cluster up might look like: - -```yaml -version: '2.2' - -services: - cubestore_router: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_PORT=9999 - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - depends_on: - - cubestore_worker_1 - - cubestore_worker_2 - - cubestore_worker_1: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_1:10001 - - CUBESTORE_WORKER_PORT=10001 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - - cubestore_worker_2: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_2:10002 - - CUBESTORE_WORKER_PORT=10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data -``` - -### <--{"id" : "Cube Store"}--> Storage - -Cube Store makes use of a separate storage layer for storing metadata as well as -for persisting pre-aggregations as Parquet files. Cube Store can use both AWS S3 -and Google Cloud, or if desired, a local path on the server if all nodes of a cluster run on a single machine. - -A simplified example using AWS S3 might look like: - -```yaml -version: '2.2' -services: - cubestore_router: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - - CUBESTORE_META_PORT=9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001 - - CUBESTORE_S3_BUCKET= - - CUBESTORE_S3_REGION= - - CUBESTORE_AWS_ACCESS_KEY_ID= - - CUBESTORE_AWS_SECRET_ACCESS_KEY= - cubestore_worker_1: - image: cubejs/cubestore:latest - environment: - - CUBESTORE_SERVER_NAME=cubestore_worker_1:9001 - - CUBESTORE_WORKER_PORT=9001 - - CUBESTORE_META_ADDR=cubestore_router:9999 - - CUBESTORE_WORKERS=cubestore_worker_1:9001 - - CUBESTORE_S3_BUCKET= - - CUBESTORE_S3_REGION= - - CUBESTORE_AWS_ACCESS_KEY_ID= - - CUBESTORE_AWS_SECRET_ACCESS_KEY= - depends_on: - - cubestore_router -``` - -## Redis - - - -Cube Store [will replace -Redis][replace-redis] for in-memory cache and queue management in late -2022. - - - -Cube.js uses Redis, an in-memory data structure store, for query caching and -queue. - -Set the `CUBEJS_REDIS_URL` environment variable to allow Cube.js API Instances -and Refresh Worker to connect to Redis. If your Redis instance also has a -password, please set it via the `CUBEJS_REDIS_PASSWORD` environment variable. -Set the `CUBEJS_REDIS_TLS` environment variable to true if you want to enable -SSL-secured connections. Ensure your Redis cluster allows at least 15 concurrent -connections. - -### <--{"id" : "Redis"}--> Redis Sentinel - -Cube.js supports Redis Sentinel via `CUBEJS_REDIS_USE_IOREDIS=true` environment -variable. Then set `CUBEJS_REDIS_URL` to the -`redis+sentinel://localhost:26379,otherhost:26479/mymaster/5` to allow Cube.js -to connect to the Redis Sentinel. - -Cube.js server instances used by same tenant environments should have same Redis -instances. Otherwise they will have different query queues which can lead to -incorrect pre-aggregation states and intermittent data access errors. - -### <--{"id" : "Redis"}--> Redis Pool - -If `CUBEJS_REDIS_URL` is provided Cube.js, will create a Redis connection pool -with a minimum of 2 and maximum of 1000 concurrent connections, by default. The -`CUBEJS_REDIS_POOL_MIN` and `CUBEJS_REDIS_POOL_MAX` environment variables can be -used to tweak pool size limits. To disable connection pooling, and instead -create connections on-demand, you can set `CUBEJS_REDIS_POOL_MAX` to 0. - -If your maximum concurrent connections limit is too low, you may see -`TimeoutError: ResourceRequest timed out` errors. As a rule of a thumb, you need -to have `Queue Size * Number of tenants` concurrent connections to ensure the -best performance possible. If you use clustered deployments, please make sure -you have enough connections for all Cube.js server instances. A lower number of -connections still can work, however Redis becomes a performance bottleneck in -this case. - -### <--{"id" : "Redis"}--> Running without Redis - -If you want to run Cube.js in production without Redis, you can use -`CUBEJS_CACHE_AND_QUEUE_DRIVER` environment variable to `memory`. - - - -Clustered deployments can't be run without Redis as it is used to -manage the query queue. - - - -[dh-cubejs]: https://hub.docker.com/r/cubejs/cube -[dh-cubestore]: https://hub.docker.com/r/cubejs/cubestore -[ref-deploy-prod-list]: /deployment/production-checklist -[ref-deploy-cubecloud]: /deployment/platforms/cube-cloud -[ref-deploy-docker]: /deployment/platforms/docker -[ref-deploy-k8s]: /deployment/platforms/kubernetes -[ref-deploy-sls-aws]: /deployment/platforms/serverless/aws -[ref-deploy-sls-gcp]: /deployment/platforms/serverless/google-cloud -[ref-config-env]: /reference/environment-variables -[ref-config-js]: /config -[replace-redis]: https://cube.dev/blog/replacing-redis-with-cube-store diff --git a/docs/content/Deployment/Platform-Cube-Cloud.mdx b/docs/content/Deployment/Platform-Cube-Cloud.mdx deleted file mode 100644 index be962e7d7ac8b..0000000000000 --- a/docs/content/Deployment/Platform-Cube-Cloud.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Deploy to Cube Cloud -menuTitle: Cube Cloud -permalink: /deployment/platforms/cube-cloud -category: Deployment -subCategory: Platforms -menuOrder: 1 ---- - -This guide walks you through deploying Cube with [Cube Cloud][link-cube-cloud], -a purpose-built platform to run Cube applications in production. It is made by -the creators of Cube and incorporates all the best practices of running and -scaling Cube applications. - - - -Are you moving from a self-hosted installation to Cube Cloud? [Click -here][blog-migrate-to-cube-cloud] to learn more. - - - -
- -
- -## Prerequisites - -- A Cube Cloud account - -## Configuration - -Learn more about [deployment with Cube Cloud here][ref-cubecloud-getstart]. - -[blog-migrate-to-cube-cloud]: - https://cube.dev/blog/migrating-from-self-hosted-to-cube-cloud/ -[link-cube-cloud]: https://cubecloud.dev -[link-cube-cloud-waitlist]: https://cube.dev/cloud -[ref-cubecloud-getstart]: /cloud/getting-started diff --git a/docs/content/Deployment/Platform-Docker.mdx b/docs/content/Deployment/Platform-Docker.mdx deleted file mode 100644 index 502618a64d9ec..0000000000000 --- a/docs/content/Deployment/Platform-Docker.mdx +++ /dev/null @@ -1,370 +0,0 @@ ---- -title: Deploy to Docker -menuTitle: Docker -permalink: /deployment/platforms/docker -category: Deployment -subCategory: Platforms -menuOrder: 2 ---- - -This guide walks you through deploying Cube.js with Docker. - - - -This is an example of a production-ready deployment, but real-world deployments -can vary significantly depending on desired performance and scale. - - - -## Prerequisites - -- [Docker Desktop][link-docker-app] - -## Configuration - -Create a Docker Compose stack by creating a `docker-compose.yml`. A -production-ready stack would at minimum consist of: - -- One or more Cube.js API instance -- A Cube.js Refresh Worker -- A Cube Store Router node -- One or more Cube Store Worker nodes -- A Redis instance - -An example stack using BigQuery as a data source is provided below: - - - -Using macOS or Windows? Use `CUBEJS_DB_HOST=host.docker.internal` instead of -`localhost` if your database is on the same machine. - - - -```yaml -version: '2.2' - -services: - cube_api: - restart: always - image: cubejs/cube:v%CURRENT_VERSION - ports: - - 4000:4000 - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-bq-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - CUBEJS_CUBESTORE_HOST=cubestore_router - - CUBEJS_REDIS_URL=redis://redis:6379 - - CUBEJS_API_SECRET=secret - volumes: - - .:/cube/conf - depends_on: - - cubestore_worker_1 - - cubestore_worker_2 - - cube_refresh_worker - - redis - - cube_refresh_worker: - restart: always - image: cubejs/cube:v%CURRENT_VERSION - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-bq-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - CUBEJS_CUBESTORE_HOST=cubestore_router - - CUBEJS_REDIS_URL=redis://redis:6379 - - CUBEJS_API_SECRET=secret - - CUBEJS_REFRESH_WORKER=true - volumes: - - .:/cube/conf - - cubestore_router: - restart: always - image: cubejs/cubestore:v%CURRENT_VERSION - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_PORT=9999 - - CUBESTORE_SERVER_NAME=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - - cubestore_worker_1: - restart: always - image: cubejs/cubestore:v%CURRENT_VERSION - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_1:10001 - - CUBESTORE_WORKER_PORT=10001 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - depends_on: - - cubestore_router - - cubestore_worker_2: - restart: always - image: cubejs/cubestore:v%CURRENT_VERSION - environment: - - CUBESTORE_WORKERS=cubestore_worker_1:10001,cubestore_worker_2:10002 - - CUBESTORE_SERVER_NAME=cubestore_worker_2:10002 - - CUBESTORE_WORKER_PORT=10002 - - CUBESTORE_REMOTE_DIR=/cube/data - - CUBESTORE_META_ADDR=cubestore_router:9999 - volumes: - - .cubestore:/cube/data - depends_on: - - cubestore_router - - redis: - image: bitnami/redis:latest - environment: - - ALLOW_EMPTY_PASSWORD=yes - logging: - driver: none -``` - -## Set up reverse proxy - -In production, the Cube.js API should be served over an HTTPS connection to -ensure security of the data in-transit. We recommend using a reverse proxy; as -an example, let's use [NGINX][link-nginx]. - - - -You can also use a reverse proxy to enable HTTP 2.0 and GZIP compression - - - -First we'll create a new server configuration file called `nginx/cube.conf`: - -``` -server { - listen 443 ssl; - server_name cube.my-domain.com; - - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_ecdh_curve secp384r1; - # Replace the ciphers with the appropriate values - ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384 OLD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 OLD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"; - ssl_prefer_server_ciphers on; - ssl_certificate /etc/ssl/private/cert.pem; - ssl_certificate_key /etc/ssl/private/key.pem; - ssl_session_timeout 10m; - ssl_session_cache shared:SSL:10m; - ssl_session_tickets off; - ssl_stapling on; - ssl_stapling_verify on; - - location / { - proxy_pass http://cube:4000/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } -} -``` - -Then we'll add a new service to our Docker Compose stack: - -```yaml -services: - ... - nginx: - image: nginx - ports: - - 443:443 - volumes: - - ./nginx:/etc/nginx/conf.d - - ./ssl:/etc/ssl/private -``` - -Don't forget to create a `ssl` directory with the `cert.pem` and `key.pem` files -inside so the Nginx service can find them. - -For automatically provisioning SSL certificates with LetsEncrypt, [this blog -post][medium-letsencrypt-nginx] may be useful. - -## Security - -### <--{"id" : "Security"}--> Use JSON Web Tokens - -Cube.js can be configured to use industry-standard JSON Web Key Sets for -securing its API and limiting access to data. To do this, we'll define the -relevant options on our Cube.js API instance: - - - -If you're using [`queryRewrite`][ref-config-queryrewrite] for access control, -then you must also configure -[`scheduledRefreshContexts`][ref-config-sched-ref-ctx] so the refresh workers -can correctly create pre-aggregations. - - - -```yaml -services: - cube_api: - image: cubejs/cube:v%CURRENT_VERSION - ports: - - 4000:4000 - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-bq-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - CUBEJS_CUBESTORE_HOST=cubestore_router - - CUBEJS_REDIS_URL=redis://redis:6379 - - CUBEJS_API_SECRET=secret - - CUBEJS_JWK_URL=https://cognito-idp..amazonaws.com//.well-known/jwks.json - - CUBEJS_JWT_AUDIENCE= - - CUBEJS_JWT_ISSUER=https://cognito-idp..amazonaws.com/ - - CUBEJS_JWT_ALGS=RS256 - - CUBEJS_JWT_CLAIMS_NAMESPACE= - volumes: - - .:/cube/conf - depends_on: - - cubestore_worker_1 - - cubestore_worker_2 - - cube_refresh_worker - - redis -``` - -### <--{"id" : "Security"}--> Securing Cube Store - -All Cube Store nodes (both router and workers) should only be accessible to -Cube.js API instances and refresh workers. To do this with Docker Compose, we -simply need to make sure that none of the Cube Store services have any exposed -ports. - -## Monitoring - -All Cube.js logs can be found by through the Docker Compose CLI: - -```bash -$ docker-compose ps - - Name Command State Ports ---------------------------------------------------------------------------------------------------------------------------------- -cluster_cube_1 docker-entrypoint.sh cubej ... Up 0.0.0.0:4000->4000/tcp,:::4000->4000/tcp -cluster_cubestore_router_1 ./cubestored Up 3030/tcp, 3306/tcp -cluster_cubestore_worker_1_1 ./cubestored Up 3306/tcp, 9001/tcp -cluster_cubestore_worker_2_1 ./cubestored Up 3306/tcp, 9001/tcp - -$ docker-compose logs - -cubestore_router_1 | 2021-06-02 15:03:20,915 INFO [cubestore::metastore] Creating metastore from scratch in /cube/.cubestore/data/metastore -cubestore_router_1 | 2021-06-02 15:03:20,950 INFO [cubestore::cluster] Meta store port open on 0.0.0.0:9999 -cubestore_router_1 | 2021-06-02 15:03:20,951 INFO [cubestore::mysql] MySQL port open on 0.0.0.0:3306 -cubestore_router_1 | 2021-06-02 15:03:20,952 INFO [cubestore::http] Http Server is listening on 0.0.0.0:3030 -cube_1 | 🚀 Cube.js server (%CURRENT_VERSION) is listening on 4000 -cubestore_worker_2_1 | 2021-06-02 15:03:24,945 INFO [cubestore::cluster] Worker port open on 0.0.0.0:9001 -cubestore_worker_1_1 | 2021-06-02 15:03:24,830 INFO [cubestore::cluster] Worker port open on 0.0.0.0:9001 -``` - -## Update to the latest version - -Find the latest stable release version (currently `v%CURRENT_VERSION`) [from -Docker Hub][link-cubejs-docker]. Then update your `docker-compose.yml` to use -the tag: - -```yaml -version: '2.2' - -services: - cube_api: - image: cubejs/cube:v%CURRENT_VERSION - ports: - - 4000:4000 - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-bq-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - CUBEJS_CUBESTORE_HOST=cubestore_router - - CUBEJS_REDIS_URL=redis://redis:6379 - - CUBEJS_API_SECRET=secret - volumes: - - .:/cube/conf - depends_on: - - cubestore_router - - cube_refresh_worker - - redis -``` - -## Extend the Docker image - -If you need to use npm packages with native extensions inside [the `cube.js` -configuration file][ref-config-js], you'll need to build your own Docker image. -You can do this by first creating a `Dockerfile` and a corresponding -`.dockerignore`: - -```bash -touch Dockerfile -touch .dockerignore -``` - -Add this to the `Dockerfile`: - -```dockerfile -FROM cubejs/cube:latest - -COPY . . -RUN npm install -``` - -And this to the `.dockerignore`: - -```bash -node_modules -npm-debug.log -schema -cube.js -.env -``` - -Then start the build process by running the following command: - -```bash -docker build -t /cubejs-custom-build . -``` - -Finally, update your `docker-compose.yml` to use your newly-built image: - -```bash -version: '2.2' - -services: - cube_api: - image: /cubejs-custom-build - ports: - - 4000:4000 - environment: - - CUBEJS_DB_TYPE=bigquery - - CUBEJS_DB_BQ_PROJECT_ID=cubejs-bq-cluster - - CUBEJS_DB_BQ_CREDENTIALS= - - CUBEJS_DB_EXPORT_BUCKET=cubestore - - CUBEJS_CUBESTORE_HOST=cubestore_router - - CUBEJS_REDIS_URL=redis://redis:6379 - - CUBEJS_API_SECRET=secret - volumes: - - .:/cube/conf - # Prevent dev dependencies leaking - - .empty:/cube/conf/node_modules/@cubejs-backend/ - depends_on: - - cubestore_router - - cube_refresh_worker - - redis -``` - -[medium-letsencrypt-nginx]: - https://pentacent.medium.com/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71 -[link-cubejs-docker]: https://hub.docker.com/r/cubejs/cube -[link-docker-app]: https://www.docker.com/products/docker-app -[link-nginx]: https://www.nginx.com/ -[ref-config-js]: /config -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-sched-ref-ctx]: /config#scheduled-refresh-contexts diff --git a/docs/content/Deployment/Platform-Kubernetes.mdx b/docs/content/Deployment/Platform-Kubernetes.mdx deleted file mode 100644 index e0d38ae8a8723..0000000000000 --- a/docs/content/Deployment/Platform-Kubernetes.mdx +++ /dev/null @@ -1,268 +0,0 @@ ---- -title: Deploy to Kubernetes -menuTitle: Kubernetes -permalink: /deployment/platforms/kubernetes -category: Deployment -subCategory: Platforms -menuOrder: 3 ---- - -This guide walks you through deploying Cube.js with [Kubernetes][k8s]. This -particular deployment makes use of a `hostPath` volume to mount schema files -into the containers. - - - -This is an example of a production-ready deployment, but real-world deployments -can vary significantly depending on desired performance and scale. For an -example of deploying with [Helm][helm-k8s] or plain [Kubernetes][k8s], check out -the respective examples [here][gh-cubejs-examples-k8s-helm] and -[here][gh-cube-examples-k8s]. - - - -## Prerequisites - -- [Kubernetes][k8s] - -## Configuration - -### <--{"id" : "Configuration"}--> Create Cube.js API instance and Refresh Worker - -To deploy Cube.js, we will use [`Deployment`][k8s-docs-deployment]s and -[Service][k8s-docs-service]s. We'll start by creating a Redis deployment in a -file called `redis-deployment.yaml`: - - - -And a corresponding service for the Redis deployment in a file named -`redis-service.yaml`: - - - -Next, create a file called `cube-api-deployment.yaml` with the following -contents: - - - -The exact set of `CUBEJS_DB_*` environment variables depends on your database; -please reference [Connecting to the Database page][ref-config-db] for specific -configuration instructions. - -We'll also create a corresponding service for this deployment in a file called -`cube-api-service.yaml`: - - - -Now that we've configured our Cube.js API, let's also set up a deployment for a -Refresh Worker in `cube-refresh-worker-deployment.yaml`: - - - -### <--{"id" : "Configuration"}--> Create Cube Store Router and Worker nodes - -With our Cube.js API and Refresh Worker set up, we can now begin setting up Cube -Store. We will make two [`StatefulSet`][k8s-docs-statefulset]s with -corresponding [Service][k8s-docs-service]s; one for the router node and one for -the worker nodes. - -Create a new file called `cubestore-router-statefulset.yaml`: - - - -And a corresponding service declaration in a file called -`cubestore-router-service.yaml`: - - - -With the router set up, let's move onto setting up our worker nodes. Let's -create a new file called `cubestore-workers-statefulset.yaml`: - - - -Next, create its corresponding service in `cubestore-workers-service.yaml`. By -specifying `clusterIP: None`, you create a [headless -service][k8s-docs-headless-svc]. For this use case, a headless service is the -better solution. - - - -## Set up reverse proxy - -In production, the Cube.js API should be served over an HTTPS connection to -ensure security of the data in-transit. We recommend using a reverse proxy; as -an example, let's assume we're running the Kubernetes cluster on a cloud -provider such as AWS or GCP. We'll also assume we already have the SSL -certificate and key available on our local filesystem. - - - -You can also use a reverse proxy to enable HTTP 2.0 and GZIP compression - - - -First, we'll run the following to create a secret in Kubernetes: - -```bash -kubectl create secret tls --key --cert -``` - -Next, we'll create a new ingress rule in a file called `ingress.yml`: - - - - - -For more advanced configuration, or for platforms where ingress is manually -managed, please refer to the Kubernetes documentation for [Ingress -Controllers][k8s-docs-ingress-controllers]. You can also find an [example of an -Ingress Controller here][gh-cubejs-examples-k8s-ingress-ctrl]. - - - -## Security - -### <--{"id" : "Security"}--> Use JSON Web Tokens - -Cube.js can be configured to use industry-standard JSON Web Key Sets for -securing its API and limiting access to data. To do this, we'll define the -relevant options on our Cube.js API instance and Refresh Worker deployments: - - - -If you're using [`queryRewrite`][ref-config-queryrewrite] for access control, -then you must also configure -[`scheduledRefreshContexts`][ref-config-sched-ref-ctx] so the refresh workers -can correctly create pre-aggregations. - - - -```yaml -apiVersion: apps/v1 -kind: Deployment -... -spec: - template: - ... - spec: - containers: - - env: - ... - - name: CUBEJS_JWK_URL - value: https://cognito-idp..amazonaws.com//.well-known/jwks.json - - name: CUBEJS_JWT_AUDIENCE - value: - - name: CUBEJS_JWT_ISSUER - value: https://cognito-idp..amazonaws.com/ - - name: CUBEJS_JWT_ALGS - value: RS256 - - name: CUBEJS_JWT_CLAIMS_NAMESPACE - value: -``` - -### <--{"id" : "Security"}--> Securing Cube Store - -All Cube Store nodes, both router and workers, should only be accessible to -Cube.js API instances and refresh workers. To do this with Kubernetes, we need -to make sure that none of the Cube Store services are exposed in our Ingress -configuration. The Cube Store services should only be accessible from other -services within the cluster. - -## Monitoring - -All Cube.js logs can be found through the Kubernetes CLI: - -```bash -kubectl logs -``` - -## Update to the latest version - -Specify the tag for the Docker image available from [Docker -Hub][dockerhub-cubejs] (currently `v%CURRENT_VERSION`). Then update your -`cube-api-deployment.yaml` and `cube-refresh-deployment.yaml` to use the new -tag: - -```yaml -apiVersion: apps/v1 -kind: Deployment -... -spec: - ... - template: - ... - spec: - containers: - - name: cube-api - image: cubejs/cube:v%CURRENT_VERSION -``` - -Similarly, for `cubestore-router-statefulset.yaml` and -`cubestore-workers-statefulset.yaml`: - -```yaml -apiVersion: apps/v1 -kind: StatefulSet -... -spec: - ... - template: - ... - spec: - containers: - - name: cube-api - image: cubejs/cubestore:v%CURRENT_VERSION -``` - -[dockerhub-cubejs]: https://hub.docker.com/r/cubejs/cube -[gh-cube-examples-k8s]: - https://github.com/cube-js/cube.js/tree/master/examples/kubernetes -[gh-cubejs-examples-k8s-helm]: - https://github.com/cube-js/cube.js/tree/master/examples/helm-charts -[gh-cubejs-examples-k8s-ingress-ctrl]: - https://github.com/cube-js/cube.js/blob/master/examples/kubernetes/prod/ingress-controller.yaml -[helm-k8s]: https://helm.sh/ -[k8s-docs-deployment]: - https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ -[k8s-docs-headless-svc]: - https://kubernetes.io/docs/concepts/services-networking/service/#headless-services -[k8s-docs-ingress-controllers]: - https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/ -[k8s-docs-service]: - https://kubernetes.io/docs/concepts/services-networking/service/ -[k8s-docs-statefulset]: - https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ -[k8s]: https://kubernetes.io/ -[ref-config-db]: /config/databases -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-sched-ref-ctx]: /config#options-reference-scheduled-refresh-contexts diff --git a/docs/content/Deployment/Platform-Serverless-AWS.mdx b/docs/content/Deployment/Platform-Serverless-AWS.mdx deleted file mode 100644 index f04a5a1273a6f..0000000000000 --- a/docs/content/Deployment/Platform-Serverless-AWS.mdx +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Deploy to Serverless Framework on AWS -menuTitle: Serverless Framework on AWS -permalink: /deployment/platforms/serverless/aws -category: Deployment -subCategory: Platforms -menuOrder: 4 ---- - -This guide walks you through deploying Cube.js with the [Serverless -Framework][link-sls] on [AWS][link-aws]. - - - -WARNING! - -We do not recommend deploying Cube with AWS Lambda, AWS Fargate and -Google Cloud Functions. This guide will be removed soon. Additionally, please -note that Cube Store [will replace Redis for in-memory caching and queue management in -late 2022](https://cube.dev/blog/replacing-redis-with-cube-store) and will be a -required component to run clustered Cube deployments. - - - -## Prerequisites - -- An AWS account -- An [Elasticache Redis][aws-redis] cluster URL for caching and queuing -- A separate Cube Store deployment for pre-aggregations -- Node.js 12+ -- Serverless Framework - -## Configuration - -Create a Serverless Framework project by creating a `serverless.yml`. A -production-ready stack would at minimum consist of: - -- A [Lambda function][aws-lambda] for a Cube.js API instance -- A [Lambda function][aws-lambda] for a Cube.js Refresh Worker - -The `serverless.yml` for an example project is provided below: - -```yaml -service: hello-cube-sls - -provider: - name: aws - runtime: nodejs12.x - iamRoleStatements: - - Effect: 'Allow' - Action: - - 'sns:*' - Resource: '*' - environment: - CUBEJS_DB_TYPE: - CUBEJS_DB_HOST: - CUBEJS_DB_NAME: - CUBEJS_DB_USER: - CUBEJS_DB_PASS: - CUBEJS_DB_PORT: - CUBEJS_REDIS_URL: - CUBEJS_API_SECRET: - CUBEJS_APP: '${self:service.name}-${self:provider.stage}' - NODE_ENV: production - AWS_ACCOUNT_ID: - Fn::Join: - - '' - - - Ref: 'AWS::AccountId' - -functions: - cubejs: - handler: index.api - timeout: 30 - events: - - http: - path: / - method: GET - - http: - path: /{proxy+} - method: ANY - cors: - origin: '*' - headers: - - Content-Type - - Authorization - - X-Request-Id - - X-Amz-Date - - X-Amz-Security-Token - - X-Api-Key - cubejsProcess: - handler: index.process - timeout: 630 - events: - - sns: '${self:service.name}-${self:provider.stage}-process' - -plugins: - - serverless-express -``` - -### <--{"id" : "Configuration"}--> Refresh Worker - - - -Running a refresh worker using Serverless requires a _slightly_ different setup -than Docker. You must continuously call the endpoint once every 60 seconds to -keep the pre-aggregation creation queries in the queue. Failing to do this will -prevent pre-aggregations from being built. - - - -To begin the scheduled refresh, first call the -[`/v1/run-scheduled-refresh`][ref-restapi-sched-refresh] endpoint. The endpoint -will return `{ "finished": false }` whilst the pre-aggregations are being built; -once they are successfully built, the response will change to: - -```json -{ - "finished": true -} -``` - -### <--{"id" : "Configuration"}--> Cube Store - -Unfortunately, Cube Store currently cannot be run using serverless platforms; we -recommend using [Cube Cloud][link-cube-cloud] which provides a similar -"serverless" experience instead. If you prefer self-hosting, you can use a PaaS -such as [AWS ECS][aws-ecs] or [AWS EKS][aws-eks]. More instructions can be found -in the [Running in Production page under Caching][ref-caching-prod]. - -## Security - -### <--{"id" : "Security"}--> Networking - -To run Cube.js within a VPC, add a `vpc` property to the `serverless.yml`: - -```yaml -provider: - ... - vpc: - securityGroupIds: - - sg-12345678901234567 # Add your DB and Redis security groups here - subnetIds: - # Add any subnets with access to your DB, Redis and the Internet - - subnet-12345678901234567 -``` - -### <--{"id" : "Security"}--> Use JSON Web Tokens - -Cube.js can be configured to use industry-standard JSON Web Key Sets for -securing its API and limiting access to data. To do this, we'll define the -relevant options on our Cube.js API instance: - - - -If you're using [`queryRewrite`][ref-config-queryrewrite] for access control, -then you must also configure -[`scheduledRefreshContexts`][ref-config-sched-ref-ctx] so the refresh workers -can correctly create pre-aggregations. - - - -```yaml -provider: - ... - environment: - ... - CUBEJS_JWK_URL: https://cognito-idp..amazonaws.com//.well-known/jwks.json - CUBEJS_JWT_AUDIENCE: - CUBEJS_JWT_ISSUER: https://cognito-idp..amazonaws.com/ - CUBEJS_JWT_ALGS: RS256 - CUBEJS_JWT_CLAIMS_NAMESPACE: -... -``` - -## Monitoring - -All Cube.js logs can be found in the [AWS CloudWatch][aws-cloudwatch] log group -for the Serverless project. - -## Update to the latest version - -Find the latest stable release version (currently `v%CURRENT_VERSION`) [from -npm][link-cubejs-sls-npm]. Then update your `package.json` to use the version: - -```json -{ - "dependencies": { - "@cubejs-backend/serverless-aws": "%CURRENT_VERSION", - "@cubejs-backend/serverless": "%CURRENT_VERSION" - } -} -``` - -[aws-cloudwatch]: https://aws.amazon.com/cloudwatch/ -[aws-ec2]: https://aws.amazon.com/ec2/ -[aws-ecs]: https://aws.amazon.com/ecs/ -[aws-eks]: https://aws.amazon.com/eks/ -[aws-lambda]: https://aws.amazon.com/lambda/ -[aws-redis]: https://aws.amazon.com/elasticache/redis/ -[link-aws]: https://aws.amazon.com/ -[link-sls]: https://www.serverless.com/ -[link-cube-cloud]: https://cubecloud.dev -[link-cubejs-sls-npm]: https://www.npmjs.com/package/@cubejs-backend/serverless -[link-docker-app]: https://www.docker.com/products/docker-app -[ref-caching-prod]: /caching/running-in-production -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-sched-ref-ctx]: /config#scheduled-refresh-contexts -[ref-restapi-sched-refresh]: /rest-api#v-1-run-scheduled-refresh diff --git a/docs/content/Deployment/Platform-Serverless-Google.mdx b/docs/content/Deployment/Platform-Serverless-Google.mdx deleted file mode 100644 index 490e953267f36..0000000000000 --- a/docs/content/Deployment/Platform-Serverless-Google.mdx +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: Deploy to Serverless Framework on GCP -menuTitle: Serverless Framework on GCP -permalink: /deployment/platforms/serverless/google-cloud -category: Deployment -subCategory: Platforms -menuOrder: 5 ---- - -This guide walks you through deploying Cube.js with the [Serverless -Framework][link-sls] on [Google Cloud][link-google-cloud]. - - - -WARNING! - -We do not recommend deploying Cube with AWS Lambda, AWS Fargate and -Google Cloud Functions. This guide will be removed soon. Additionally, please -note that Cube Store [will replace Redis for in-memory caching and queue management in -late 2022](https://cube.dev/blog/replacing-redis-with-cube-store) and will be a -required component to run clustered Cube deployments. - - - -## Prerequisites - -- A Google Cloud account -- A [Memorystore][gcp-redis] cluster URL for caching and queuing -- A separate Cube Store deployment for pre-aggregations -- Node.js 12+ -- Serverless Framework - -## Configuration - -Create a Serverless Framework project by creating a `serverless.yml`. A -production-ready stack would at minimum consist of: - -- A [Cloud Function][gcp-cloud-funcs] for a Cube.js API instance -- A [Cloud Function][gcp-cloud-funcs] for a Cube.js Refresh Worker - -The `serverless.yml` for an example project is provided below: - -```yaml -service: hello-cube-sls # NOTE: Don't put the word "google" in here - -provider: - name: google - stage: dev - runtime: nodejs12 - region: us-central1 - project: - # The GCF credentials can be a little tricky to set up. Luckily we've documented this for you here: - # https://serverless.com/framework/docs/providers/google/guide/credentials/ - # - # the path to the credentials file needs to be absolute - credentials: - environment: - CUBEJS_DB_TYPE: postgres - CUBEJS_DB_HOST: - CUBEJS_DB_NAME: - CUBEJS_DB_USER: - CUBEJS_DB_PASS: - CUBEJS_DB_PORT: - CUBEJS_REDIS_URL: - CUBEJS_API_SECRET: - CUBEJS_APP: '${self:service.name}-${self:provider.stage}' - CUBEJS_SERVERLESS_PLATFORM: '${self:provider.name}' - -plugins: - - serverless-google-cloudfunctions - - serverless-express - -# needs more granular excluding in production as only the serverless provider npm -# package should be excluded (and not the whole node_modules directory) -package: - exclude: - - node_modules/** - - .gitignore - - .git/** - -functions: - cubejs: - handler: api - events: - - http: ANY - cubejsProcess: - handler: process - events: - - event: - eventType: providers/cloud.pubsub/eventTypes/topic.publish - resource: 'projects/${self:provider.project}/topics/${self:service.name}-${self:provider.stage}-process' -``` - -### <--{"id" : "Configuration"}--> Refresh Worker - - - -Running a refresh worker using Serverless requires a _slightly_ different setup -than Docker. You must continuously call the endpoint once every 60 seconds to -keep the pre-aggregation creation queries in the queue. Failing to do this will -prevent pre-aggregations from being built. - - - -To begin the scheduled refresh, first call the -[`/v1/run-scheduled-refresh`][ref-restapi-sched-refresh] endpoint. The endpoint -will return `{ "finished": false }` whilst the pre-aggregations are being built; -once they are successfully built, the response will change to: - -```json -{ - "finished": true -} -``` - -### <--{"id" : "Configuration"}--> Cube Store - -Unfortunately, Cube Store currently cannot be run using serverless platforms; we -recommend using [Cube Cloud][link-cube-cloud] which provides a similar -"serverless" experience instead. If you prefer self-hosting, you can use a PaaS -such as [Compute Engine][gcp-compute] or [Google Kubernetes Engine][gcp-k8s]. -More instructions can be found in the [Running in Production page under -Caching][ref-caching-prod]. - -## Security - -### <--{"id" : "Security"}--> Networking - -To run Cube.js within a VPC, add a `vpc` property to the function definition in -`serverless.yml`: - -```yaml -functions: - cubejs: - ... - vpc: 'projects//locations//connectors/' - cubejsProcess: - ... - vpc: 'projects//locations//connectors/' -``` - -### <--{"id" : "Security"}--> Use JSON Web Tokens - -Cube.js can be configured to use industry-standard JSON Web Key Sets for -securing its API and limiting access to data. To do this, we'll define the -relevant options on our Cube.js API instance: - - - -If you're using [`queryRewrite`][ref-config-queryrewrite] for access control, -then you must also configure -[`scheduledRefreshContexts`][ref-config-sched-ref-ctx] so the refresh workers -can correctly create pre-aggregations. - - - -```yaml -provider: - ... - environment: - ... - CUBEJS_JWK_URL: https://cognito-idp..amazonaws.com//.well-known/jwks.json - CUBEJS_JWT_AUDIENCE: - CUBEJS_JWT_ISSUER: https://cognito-idp..amazonaws.com/ - CUBEJS_JWT_ALGS: RS256 - CUBEJS_JWT_CLAIMS_NAMESPACE: -... -``` - -### <--{"id" : "Security"}--> Cube Store - -All Cube Store nodes (both router and workers) should only be accessible to -Cube.js API instances and refresh workers. - -## Monitoring - -All Cube.js logs can be found in the [Google Cloud Console for Cloud -Functions][gcp-cloud-funcs-logs]. - -[gcp-cloud-funcs-logs]: - https://console.cloud.google.com/project/_/logs?service=cloudfunctions.googleapis.com - -## Update to the latest version - -Find the latest stable release version (currently `v%CURRENT_VERSION`) [from -npm][link-cubejs-sls-npm]. Then update your `package.json` to use the version: - -```json -{ - "dependencies": { - "@cubejs-backend/serverless-google": "%CURRENT_VERSION", - "@cubejs-backend/serverless": "%CURRENT_VERSION" - } -} -``` - -[gcp-cloud-funcs]: https://cloud.google.com/functions/ -[gcp-compute]: https://cloud.google.com/compute/ -[gcp-k8s]: https://cloud.google.com/kubernetes-engine/ -[gcp-redis]: https://cloud.google.com/memorystore/ -[link-google-cloud]: https://cloud.google.com/ -[link-sls]: https://www.serverless.com/ -[link-cube-cloud]: https://cubecloud.dev -[link-cubejs-sls-npm]: https://www.npmjs.com/package/@cubejs-backend/serverless -[link-docker-app]: https://www.docker.com/products/docker-app -[ref-caching-prod]: /caching/running-in-production -[ref-config-queryrewrite]: /config#query-rewrite -[ref-config-sched-ref-ctx]: /config#scheduled-refresh-contexts -[ref-restapi-sched-refresh]: /rest-api#v-1-run-scheduled-refresh diff --git a/docs/content/Deployment/Production-Checklist.mdx b/docs/content/Deployment/Production-Checklist.mdx deleted file mode 100644 index e4adc88f82867..0000000000000 --- a/docs/content/Deployment/Production-Checklist.mdx +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Production Checklist -permalink: /deployment/production-checklist -category: Deployment -menuOrder: 2 ---- - - - -Thinking of migrating to the cloud instead? [Click -here][blog-migrate-to-cube-cloud] to learn more about migrating a self-hosted -installation to [Cube Cloud][link-cube-cloud]. - - - -This is a checklist for configuring and securing Cube.js for a production -deployment. - -## Disable Development Mode - -When running Cube.js in production environments, make sure development mode is -disabled both on API Instances and Refresh Worker. Running Cube.js in -development mode in a production environment can lead to security -vulnerabilities. You can read more on the differences between [production and -development mode here][link-cubejs-dev-vs-prod]. - - - -Development mode is disabled by default. - - - -```bash -# Set this to false or leave unset to disable development mode -CUBEJS_DEV_MODE=false -``` - -## Set up Refresh Worker - -To refresh in-memory cache and [pre-aggregations][ref-schema-ref-preaggs] in the -background, we recommend running a separate Cube.js Refresh Worker instance. -This allows your Cube.js API Instance to continue to serve requests with high -availability. - -```bash -# Set to true so a Cube.js instance acts as a refresh worker -CUBEJS_REFRESH_WORKER=true -``` - -## Set up Cube Store - -Cube Store is the purpose-built pre-aggregations storage for Cube.js. Follow the -[instructions here][ref-caching-cubestore] to set it up. - -Depending on your database, Cube.js may need to "stage" pre-aggregations inside -your database first before ingesting them into Cube Store. In this case, Cube.js -will require write access to the `prod_pre_aggregations` schema inside your -database. The schema name can be modified by the -`CUBEJS_PRE_AGGREGATIONS_SCHEMA` environment variable; see the [Environment -Variables][ref-env-vars-general] page for more details. - - - -You may consider enabling an export bucket which allows Cube.js to build large -pre-aggregations in a much faster manner. It is currently supported for -BigQuery, Redshift and Snowflake. Check [the relevant documentation for your -configured database][ref-config-connect-db] to set it up. - - - -## Set up Redis - - - -Cube Store [will replace -Redis][replace-redis] for in-memory cache and queue management in late -2022. - - - -Cube.js requires [Redis](https://redis.io/), an in-memory data structure store, -to run in production. - -It uses Redis for query caching and queue. Set the `CUBEJS_REDIS_URL` -environment variable to allow Cube.js to connect to Redis. If your Redis -instance also has a password, please set it via the `CUBEJS_REDIS_PASSWORD` -environment variable. Set the `CUBEJS_REDIS_TLS` environment variable to `true` -if you want to enable SSL-secured connections. Ensure your Redis cluster allows -at least 15 concurrent connections. - -### <--{"id" : "Set up Redis"}--> Redis Sentinel - -Redis provides functionality for high availability through -[`Redis Sentinel`][link-redis-sentinel]. - -For Redis Sentinel support, the npm package [`ioredis`][gh-ioredis] needs to be -used instead of[`redis`][gh-node-redis]. This is done by setting the -`CUBEJS_REDIS_USE_IOREDIS` environment variable to `true`. Then set -`CUBEJS_REDIS_URL` to the -`redis+sentinel://localhost:26379,otherhost:26479/mymaster/5` to allow Cube.js -to connect to the Redis Sentinel. - - - -Cube.js server instances used by same tenant environments should have same Redis -instances. Otherwise they will have different query queues which can lead to -incorrect pre-aggregation states and intermittent data access errors. - - - -### <--{"id" : "Set up Redis"}--> Redis Pool - -If `CUBEJS_REDIS_URL` is provided Cube.js, will create a Redis connection pool -with a minimum of 2 and maximum of 1000 concurrent connections, by default. The -`CUBEJS_REDIS_POOL_MIN` and `CUBEJS_REDIS_POOL_MAX` environment variables can be -used to tweak pool size limits. To disable connection pooling, and instead -create connections on-demand, you can set `CUBEJS_REDIS_POOL_MAX` to 0. - -If your maximum concurrent connections limit is too low, you may see -`TimeoutError: ResourceRequest timed out` errors. As a rule of a thumb, you need -to have `Queue Size * Number of tenants` concurrent connections to ensure the -best performance possible. If you use clustered deployments, please make sure -you have enough connections for all Cube.js server instances. A lower number of -connections still can work, however Redis becomes a performance bottleneck in -this case. - -### <--{"id" : "Set up Redis"}--> Running without Redis - -If you want to run Cube.js in production without Redis, you can use -`CUBEJS_CACHE_AND_QUEUE_DRIVER` environment variable to `memory`. - - - -Serverless and clustered deployments can't be run without Redis as it is used to -manage the query queue. - - - -## Secure the deployment - -If you're using JWTs, you can configure Cube.js to correctly decode them and -inject their contents into the [Security Context][ref-sec-ctx]. Add your -authentication provider's configuration under [the `jwt` property of your -`cube.js` configuration file][ref-config-jwt], or use [the corresponding -environment variables (`CUBEJS_JWK_URL`, -`CUBEJS_JWT_*`)][ref-config-env-vars-general]. - -## Set up health checks - -Cube.js provides [Kubernetes-API compatible][link-k8s-healthcheck-api] health -check (or probe) endpoints that indicate the status of the deployment. Configure -your monitoring service of choice to use the [`/readyz`][ref-api-readyz] and -[`/livez`][ref-api-livez] API endpoints so you can check on the Cube.js -deployment's health and be alerted to any issues. - -[blog-migrate-to-cube-cloud]: - https://cube.dev/blog/migrating-from-self-hosted-to-cube-cloud/ -[gh-ioredis]: https://github.com/luin/ioredis -[gh-node-redis]: https://github.com/NodeRedis/node-redis -[link-caddy]: https://caddyserver.com/ -[link-cube-cloud]: https://cubecloud.dev -[link-cubejs-dev-vs-prod]: /configuration/overview#development-mode -[link-k8s-healthcheck-api]: - https://kubernetes.io/docs/reference/using-api/health-checks/ -[link-kong]: https://konghq.com/kong/ -[link-nginx]: https://www.nginx.com/ -[link-nginx-docs]: https://nginx.org/en/docs/http/configuring_https_servers.html -[link-redis-sentinel]: https://redis.io/topics/sentinel -[ref-config-connect-db]: /connecting-to-the-database -[ref-caching-cubestore]: /caching/running-in-production -[ref-env-vars-general]: /reference/environment-variables#general -[ref-schema-ref-preaggs]: /schema/reference/pre-aggregations -[ref-api-scheduled-refresh]: /rest-api#v-1-run-scheduled-refresh -[ref-sec-ctx]: /security/context -[ref-config-jwt]: /config#jwt -[ref-config-env-vars-general]: /reference/environment-variables#general -[ref-api-readyz]: /rest-api#readyz -[ref-api-livez]: /rest-api#livez -[replace-redis]: https://cube.dev/blog/replacing-redis-with-cube-store diff --git a/docs/content/Deployment/deployment-overview.png b/docs/content/Deployment/deployment-overview.png deleted file mode 100644 index b807b9f64d3ba..0000000000000 Binary files a/docs/content/Deployment/deployment-overview.png and /dev/null differ diff --git a/docs/content/Deployment/how-cube-cloud-works.png b/docs/content/Deployment/how-cube-cloud-works.png deleted file mode 100644 index 3e21f0ecd8d4d..0000000000000 Binary files a/docs/content/Deployment/how-cube-cloud-works.png and /dev/null differ diff --git a/docs/content/Developer-Tools/CLI-Reference.mdx b/docs/content/Developer-Tools/CLI-Reference.mdx deleted file mode 100644 index e1a644edd1cc0..0000000000000 --- a/docs/content/Developer-Tools/CLI-Reference.mdx +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: CLI Command Reference -permalink: /reference -category: Developer Tools -menuOrder: 2 ---- - -## create - -The `create` command generates barebones Cube.js app. - -### <--{"id" : "create"}--> Usage - -```bash -$ cubejs create APP-NAME -d DB-TYPE [-t TEMPLATE] -``` - -### <--{"id" : "create"}--> Flags - -| Parameter | Description | Values | -| --------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| `-d, --db-type ` | Preconfigure Cube.js app for selected database. | `postgres`, `mysql`, `athena`, `mongobi`, `bigquery`, `redshift`, `mssql`, `clickhouse`, `snowflake`, `presto`, `druid` | -| `-t, --template
+) diff --git a/docs/components/overrides/Table/Th.module.scss b/docs/components/overrides/Table/Th.module.scss new file mode 100644 index 0000000000000..7290fd429e682 --- /dev/null +++ b/docs/components/overrides/Table/Th.module.scss @@ -0,0 +1,22 @@ +.Th { + background: var(--dark_bg); + border-bottom: 1px solid var(--dark_05); + border-right: 1px solid var(--dark_05); + padding: 0.25rem 1rem; + + font-size: 1rem; + line-height: 1.75rem; + font-weight: 700; + + &:last-child { + border-right: none; + } + + //&:first-of-type { + // border-top-left-radius: 0.5rem; + //} + // + //&:last-of-type { + // border-top-right-radius: 0.5rem; + //} +} diff --git a/docs/components/overrides/Table/Th.tsx b/docs/components/overrides/Table/Th.tsx new file mode 100644 index 0000000000000..89511ebf24239 --- /dev/null +++ b/docs/components/overrides/Table/Th.tsx @@ -0,0 +1,18 @@ +import classnames from 'classnames/bind'; + +import type { ComponentProps } from 'react' + +import styles from './Th.module.scss'; + +const cn = classnames.bind(styles); + +export const Th = ({ className = '', ...props }: ComponentProps<'th'>) => ( + +) diff --git a/docs/components/overrides/Table/Tr.module.scss b/docs/components/overrides/Table/Tr.module.scss new file mode 100644 index 0000000000000..297156b631470 --- /dev/null +++ b/docs/components/overrides/Table/Tr.module.scss @@ -0,0 +1,28 @@ +.Tr { + //border: 1px solid var(--dark_05); + //border-radius: 0.5rem; + + //&:last-child td { + // border-bottom: none; + //} + + &:last-of-type th:first-of-type { + border-top-left-radius: 0.5rem; + } + + &:last-of-type th:last-of-type { + border-top-right-radius: 0.5rem; + } + + &:last-of-type td { + border-bottom: none; + } + + &:last-of-type td:first-of-type { + border-bottom-left-radius: 0.5rem; + } + + &:last-of-type td:last-of-type { + border-bottom-right-radius: 0.5rem; + } +} diff --git a/docs/components/overrides/Table/Tr.tsx b/docs/components/overrides/Table/Tr.tsx new file mode 100644 index 0000000000000..e4471be308851 --- /dev/null +++ b/docs/components/overrides/Table/Tr.tsx @@ -0,0 +1,19 @@ +import classnames from 'classnames/bind'; + +import type { ComponentProps } from 'react' + +import * as styles from './Tr.module.scss'; + +const cn = classnames.bind(styles); + +export const Tr = ({ className = '', ...props }: ComponentProps<'tr'>) => ( +