diff --git a/.evergreen/functions.yml b/.evergreen/functions.yml index b4dc14846d3..bb69785b943 100644 --- a/.evergreen/functions.yml +++ b/.evergreen/functions.yml @@ -683,11 +683,8 @@ functions: env: <<: *compass-env DEBUG: ${debug|} - COMPASS_E2E_ATLAS_CLOUD_SANDBOX_CLOUD_CONFIG: 'qa' COMPASS_E2E_ATLAS_CLOUD_SANDBOX_USERNAME: ${e2e_tests_compass_web_atlas_username} COMPASS_E2E_ATLAS_CLOUD_SANDBOX_PASSWORD: ${e2e_tests_compass_web_atlas_password} - COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_USERNAME: ${e2e_tests_compass_web_atlas_db_username} - COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_PASSWORD: ${e2e_tests_compass_web_atlas_password} MCLI_PUBLIC_API_KEY: ${e2e_tests_mcli_public_api_key} MCLI_PRIVATE_API_KEY: ${e2e_tests_mcli_private_api_key} MCLI_ORG_ID: ${e2e_tests_mcli_org_id} diff --git a/.evergreen/start-atlas-cloud-cluster.sh b/.evergreen/start-atlas-cloud-cluster.sh index 63e87471639..5c38b3d1f14 100644 --- a/.evergreen/start-atlas-cloud-cluster.sh +++ b/.evergreen/start-atlas-cloud-cluster.sh @@ -1,10 +1,65 @@ #!/bin/bash +RUN_ID="$(date +"%s")-$(git rev-parse --short HEAD)" +DELETE_AFTER="$(date -u -Iseconds -d '+2 hours' 2>/dev/null || date -u -Iseconds -v '+2H')" + +# This script helps to automatically provision Atlas cluster for running the e2e +# tests against. In CI this will always create a new cluster and delete it when +# the test run is finished. You can also use this script locally to run e2e +# tests against a "logged in" Atlas Cloud experience in compass-web sandbox. +# +# While the provisioning of clusters is automated, you should be aware that it +# requires some extra environmental variables to be available when you are +# running it. If you want to be able to run these e2e tests locally, following +# steps are required: +# +# - Create a test Atlas user on one of the testing environments (-dev / -qa). +# You can only use your work emails with a subaddress to create those (e.g, +# jane.doe+for-testing@mongodb.com). +# +# - Setup a new org and project. Save the org id and project id for later. +# +# - Add test payment details within the organization (Billing) to be able to +# create clusters. +# +# - Create a new API key (Access Manager > Project Access > Create Application > +# API Key) for the project you created and save the public and private keys. +# +# - (Optional) Deploy a cluster with a required configuration through Atlas +# Cloud UI. If you skip the step, the script will deploy a default cluster for +# you. +# +# - Make sure that you have the following environmental variables provided to +# the script below: +# +# MCLI_OPS_MANAGER_URL API base url matching the environment you used to +# create your user (https://cloud{-dev,-qa}.mongodb.com/) +# MCLI_PUBLIC_API_KEY Public API key +# MCLI_PRIVATE_API_KEY Private API key +# MCLI_ORG_ID Org ID +# MCLI_PROJECT_ID Project ID +# +# COMPASS_E2E_ATLAS_CLOUD_SANDBOX_USERNAME Cloud user you created +# COMPASS_E2E_ATLAS_CLOUD_SANDBOX_PASSWORD Cloud user password +# +# - Source the script followed by running the tests to make sure that some +# variables exported from this script are available for the test env: +# +# (ATLAS_CLOUD_TEST_CLUSTER_NAME="TestCluster" source .evergreen/start-atlas-cloud-cluster.sh \ +# && npm run -w compass-e2e-tests test web -- --test-atlas-cloud-sandbox --test-filter="atlas-cloud/**/*") + +_ATLAS_CLOUD_TEST_CLUSTER_NAME=${ATLAS_CLOUD_TEST_CLUSTER_NAME:-""} + # Atlas limits the naming to something like /^[\w\d-]{,23}$/ (and will auto # truncate if it's too long) so we're very limited in terms of how unique this # name can be. Hopefully the epoch + part of git hash is enough for these to not # overlap when tests are running -ATLAS_CLOUD_TEST_CLUSTER_NAME="e2e-$(date +"%s")-$(git rev-parse HEAD)" +DEFAULT_ATLAS_CLOUD_TEST_CLUSTER_NAME="e2e-$RUN_ID" + +ATLAS_CLUSTER_NAME="${_ATLAS_CLOUD_TEST_CLUSTER_NAME:-$DEFAULT_ATLAS_CLOUD_TEST_CLUSTER_NAME}" + +ATLAS_TEST_DB_USERNAME="testuser-$RUN_ID" +ATLAS_TEST_DB_PASSWORD="$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')" function atlascli() { docker run \ @@ -17,23 +72,60 @@ function atlascli() { } cleanup() { - echo "Scheduling Atlas deployment \`$ATLAS_CLOUD_TEST_CLUSTER_NAME\` for deletion..." - atlascli clusters delete $ATLAS_CLOUD_TEST_CLUSTER_NAME --force + # Assuming that we want to preserve the cluster if the name was provided + # outside of script. Helpful when trying to run the tests locally, you can + # automatically create a cluster with a custom name for the first time, but + # then re-use it when running the tests again. Don't forget to clean it up + # after you're done! + if [ -z "$_ATLAS_CLOUD_TEST_CLUSTER_NAME" ]; then + echo "Scheduling Atlas deployment \`$ATLAS_CLUSTER_NAME\` for deletion..." + atlascli clusters delete $ATLAS_CLUSTER_NAME --force + else + echo "Custom cluster name provided ($_ATLAS_CLOUD_TEST_CLUSTER_NAME), skipping cluster cleanup" + fi + echo "Deleting Atlas db user \`$ATLAS_TEST_DB_USERNAME\`..." + atlascli dbusers delete $ATLAS_TEST_DB_USERNAME --force } trap cleanup EXIT -echo "Creating Atlas deployment \`$ATLAS_CLOUD_TEST_CLUSTER_NAME\` to test against..." -atlascli clusters create $ATLAS_CLOUD_TEST_CLUSTER_NAME \ +echo "Allowing access from current ip..." +atlascli accessList create \ + --currentIp \ + --deleteAfter "$DELETE_AFTER" + +echo "Creating Atlas db user \`$ATLAS_TEST_DB_USERNAME\`..." +atlascli dbusers create atlasAdmin \ + --username "$ATLAS_TEST_DB_USERNAME" \ + --password "$ATLAS_TEST_DB_PASSWORD" \ + --deleteAfter "$DELETE_AFTER" # so that it's autoremoved if cleaning up failed for some reason + +export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_USERNAME="$ATLAS_TEST_DB_USERNAME" +export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DBUSER_PASSWORD="$ATLAS_TEST_DB_PASSWORD" + +echo "Creating Atlas deployment \`$ATLAS_CLUSTER_NAME\` to test against..." +(atlascli clusters create $ATLAS_CLUSTER_NAME \ --provider AWS \ --region US_EAST_1 \ - --tier M10 + --tier M10 \ + --type GEOSHARDED || true) # can error if custom name was provided, will fail on next step if it's not expected failure echo "Waiting for the deployment to be provisioned..." -atlascli clusters watch "$ATLAS_CLOUD_TEST_CLUSTER_NAME" +atlascli clusters watch $ATLAS_CLUSTER_NAME echo "Getting connection string for provisioned cluster..." -ATLAS_CLOUD_TEST_CLUSTER_CONNECTION_STRING_JSON="$(atlascli clusters connectionStrings describe $ATLAS_CLOUD_TEST_CLUSTER_NAME -o json)" +CONNECTION_STRINGS_JSON="$(atlascli clusters connectionStrings describe $ATLAS_CLUSTER_NAME -o json)" + +export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_CLOUD_CONFIG=$( + if [[ "$MCLI_OPS_MANAGER_URL" =~ "-dev" ]]; then + echo "dev" + elif [[ "$MCLI_OPS_MANAGER_URL" =~ "-qa" ]]; then + echo "qa" + else + echo "prod" + fi +) +echo "Cloud config: $COMPASS_E2E_ATLAS_CLOUD_SANDBOX_CLOUD_CONFIG" -export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DEFAULT_CONNECTIONS="{\"$ATLAS_CLOUD_TEST_CLUSTER_NAME\": $ATLAS_CLOUD_TEST_CLUSTER_CONNECTION_STRING_JSON}" +export COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DEFAULT_CONNECTIONS="{\"$ATLAS_CLUSTER_NAME\": $CONNECTION_STRINGS_JSON}" echo "Cluster connections: $COMPASS_E2E_ATLAS_CLOUD_SANDBOX_DEFAULT_CONNECTIONS" diff --git a/.github/workflows/check-pr-title.yml b/.github/workflows/check-pr-title.yml index 3d7b5a61987..28a8d5e72e6 100644 --- a/.github/workflows/check-pr-title.yml +++ b/.github/workflows/check-pr-title.yml @@ -19,6 +19,6 @@ jobs: # Skip the JIRA ticket check for PRs opened by bots if: ${{ !contains(github.event.pull_request.user.login, '[bot]') }} with: - regex: '[A-Z]{4,10}-[0-9]{1,5}$' + regex: '[A-Z]{4,10}-[0-9]{1,10}$' error-hint: 'Invalid PR title. Make sure it ends with a JIRA ticket - i.e. COMPASS-1234 or add the no-title-validation label' ignore-labels: 'no-title-validation' diff --git a/AUTHORS b/AUTHORS index 761597a732d..8ce2627f986 100644 --- a/AUTHORS +++ b/AUTHORS @@ -94,3 +94,4 @@ Kræn Hansen Ruchitha Rajaghatta <77162985+ruchitharajaghatta@users.noreply.github.com> syn-zhu <167124917+syn-zhu@users.noreply.github.com> Nikola Irinchev +djechlin-mongodb <132293929+djechlin-mongodb@users.noreply.github.com> diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 17d5cc02d80..d806e59ec5c 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -1,5 +1,5 @@ The following third-party software is used by and included in **Mongodb Compass**. -This document was automatically generated on Tue Oct 29 2024. +This document was automatically generated on Mon Nov 18 2024. ## List of dependencies @@ -96,7 +96,6 @@ Package|Version|License **[@lezer/javascript](#6f8d761b240b610d6ad180799f8b36219b20649cbce80bd3cb7e669082e92ef3)**|1.3.2|MIT **[@lezer/json](#7869bdb7c09e2ae1e28909eb504f475477cc5ed0750dc8ccee42886961975253)**|1.0.0|MIT **[@lezer/lr](#1443872b0ea87b0af4967c9026094e634c83118fb811349742ca05bde397412b)**|1.4.1|MIT -**[@lg-tools/test-harnesses](#d9d520c615bec249e9215664d5dbb781e77d0e048253f0f1de362a8bb6212d6e)**|0.1.2|Apache-2.0 **[@lukeed/uuid](#82700fba068def47ea9842f28d700a387f59da805f74a6ed10a5eb7eece4cdab)**|2.0.1|MIT **[@nicolo-ribaudo/semver-v6](#0db933ddbe9acfd097ee5ee08e4afb1f4f7a64ef9712f95fef7958494c8e02cd)**|6.3.3|ISC **[@react-aria/interactions](#638eaf69f422aa3fbe2277f9e95b6b87e64569742134491d2653e9fc05c8f58a)**|3.9.1|Apache-2.0 @@ -144,7 +143,6 @@ Package|Version|License **[@smithy/util-utf8](#c0da7acc7121c0e4e76c58d92e290275318534cfce16949c7b916cfa0301c3b9)**|3.0.0|Apache-2.0 **[@tanstack/react-table](#3472fd929bf691e34b02f3f62232cafe55163b92e3c51afc884780ba2413e67f)**|8.14.0|MIT **[@tanstack/table-core](#8a18d3df915b2b72a0c8a845e2a930504b08cb745c8e0b5537de30793b71c967)**|8.14.0|MIT -**[@testing-library/dom](#15e0d0db2fcc307557d106b8a27b182d980d667836b8d8cbb6edb67a0aab34ee)**|9.3.1|MIT **[@tootallnate/quickjs-emscripten](#dda6dbabe98503ac1af20979be1778d7a1c8f355b85377124a909567193c2cd3)**|0.23.0|MIT **[accepts](#4c224d266c36e8e0abc4a53eb7eaa038504ee20b9b91f3e761187298a447d76b)**|1.3.8|MIT **[acorn](#4aa96f656a11c11b0e17ee35cc26cad7c13dcf4afdff6431e6d074261b59f47d)**|8.8.2|MIT @@ -163,18 +161,13 @@ Package|Version|License **[ampersand-state](#5a76226bf9a842fcccb127eb22fdd20e0bf973f5c4d2e3330bb88a587cbcdb38)**|4.8.2|MIT **[ampersand-state](#50886d5661d4241b348d233af087614640a657fad2d772282410875a410ba00a)**|5.0.3|MIT **[ampersand-view](#04597f3cef8beed68d8312481c66b00b5cfb5700dcd5e7fc97a1358472ad7dd0)**|9.0.2|MIT -**[ansi-regex](#7fa0e28daa6f9c697017b06f32a9e31a57ccfb4f138a8daded68a5d002231e29)**|5.0.1|MIT **[ansi-styles](#3d188f4ce9ad01e2061b3dafeb74005547429b09fb5b114980303db9cf34f4ee)**|3.2.1|MIT **[ansi-styles](#22c90e10fdbeeedded470f2fb78a8094893efd4675108074eddde452da52ef87)**|4.3.0|MIT -**[ansi-styles](#a480abbdfa49ebce7f9eb04451485c433d1fa24a2ddc4380cc92fd2d34642d82)**|5.2.0|MIT **[antlr4](#c5ad356fae2f067425b6c90b7251290842a1f2dec296bbd5afd5ccc32dcf3acc)**|4.7.2|BSD-3-Clause -**[aria-query](#ea709a066de0bac38519808675639c17ed8511255f6f1604c0262ea3914cfd2f)**|5.1.3|Apache-2.0 -**[array-buffer-byte-length](#cc88781e246dc898d7b281d0c92ffc26ae81261dc07ec4ea7d1257688f769328)**|1.0.1|MIT **[array-flatten](#832052c97b92484a7685d432fbdac9cb8d6cd26a0de715df336780d91762bfc9)**|1.1.1|MIT **[array-next](#2eca7126c828f7c4b047e8bc3982acc390adc906c9e1fd2ab512d7ade811a40d)**|0.0.1|MIT **[asn1](#c03a7b8eb9b75e350660b88148698446ab536a4ea01c5f321c14036a86aac2ef)**|0.2.6|MIT **[ast-types](#b10f17e6889028ee16e1f388d24ed535333cd289f0871c70d99c6180f498c6e0)**|0.13.4|MIT -**[available-typed-arrays](#b26a9227325a0e2f27e4793244a52200e15f63f970e71f86ead22e0f696c4a41)**|1.0.7|MIT **[aws4](#10a86cbc2356f4c2e30ecdd2d3f40dce2dee62e2a2efa860bf539568a5d14573)**|1.11.0|MIT **[base64-js](#cf278cb8d073b3bd22b60816c2ba78b69043aec6bcd673437b4c1db3375153d6)**|1.5.1|MIT **[basic-ftp](#2893c6a2ae0507b9073fc65146e8902587fef3bfeb9e94a67ea34cb09124b902)**|5.0.5|MIT @@ -214,7 +207,7 @@ Package|Version|License **[cpu-features](#fa992e00865a6ed732ac63bbf64c89ee2da4ec39944684e6002a3a34b5adb65c)**|0.0.9|MIT **[crelt](#9eba7acaba2af9d27a0a18fcf40d1f133ffa888d85321e4633e7dac58cab2db9)**|1.0.5|MIT **[cross-fetch](#2cd4375069c47bf89a4b399cd21cd9573086803b2cb9fc56c29df5a598e051e5)**|3.1.8|MIT -**[cross-spawn](#67de3a765808182ee1018c35bc07d7a023a8d645e98cc32814dcac2fc2c427ff)**|7.0.3|MIT +**[cross-spawn](#18650458ca35439e7a812c8f7c2ed7a891653f9c6686fd1f0456eb4f645d367d)**|7.0.5|MIT **[css-loader](#36a5fb6f554559a2f884527f4dd7aa81131ccc3b1aee899472cfec2eda765798)**|4.3.0|MIT **[d3-flextree](#d4848a862048d0f4733db2a8631b802f3b5f86f2d4a1efb77fc8b8cf9a06bf73)**|2.1.2|WTFPL **[d3-hierarchy](#e718643319205524a77c56ca75dcbf37e3975cc5e187760d1eef01cdd94a7d74)**|1.1.9|BSD-3-Clause @@ -227,13 +220,11 @@ Package|Version|License **[debug](#8f6d58c520b4b6702b6fb9abb811ba1798560ac052612c0fa8dc243516825360)**|4.3.6|MIT **[debug](#8bcd678354554043662ec7b1a1fc890da6dca2f1f245833d5400831daaeb3fc5)**|4.3.7|MIT **[decompress-response](#71cad5eab34cc643a6a7853a43d3090ac7e8b6014c9ec55fabb8112cdbfd9fbd)**|5.0.0|MIT -**[deep-equal](#2f9e585913d3ba1d9ffaf3e79f616e66788fa687f6069a567aee25bb3045410a)**|2.2.3|MIT **[deep-extend](#654bd7d00073c2195bca924a07d93393b2aaf5cacbb6f52a383877f6f33dbfbf)**|0.6.0|MIT **[default-browser-id](#bc6a381b83371172dbb72cac459792e2d4d55ecb71165c082142ef085b2130ee)**|3.0.0|MIT **[default-browser](#bf5c7331e49e4c648e57747ffd553870a7fe79fea24780366a6bc22ef346f304)**|4.0.0|MIT **[define-data-property](#a776d26c4eb3429c37b30afeed2ddcd9be51dec6d9ea7025b0e6426a5d4f78d6)**|1.1.4|MIT **[define-lazy-prop](#6e79b04c4690532e40a5cdfb76f3ab49de1d6778466fede1548a2e19ac8e75c4)**|3.0.0|MIT -**[define-properties](#332935df321f270f8588f3ae5e25759d1611d1610bd987eac78b79dd1ee5fe35)**|1.2.1|MIT **[degenerator](#6cb75d096539cebca1a3054d0012d40eda0230d9c8da8455621c9d78b92f0b69)**|5.0.1|MIT **[delegate-events](#9bd9e92528721909dffad7816bd183b65a96891a390f9420036ba9a2cc6ae291)**|1.1.1|MIT **[delegate](#bc2c0cfa061f5865ffa83a2bf2c0f3e29dc3a2056113b1ce3e9acd33709e7606)**|3.2.0|MIT @@ -241,21 +232,19 @@ Package|Version|License **[destroy](#b0d735940e17a041d544c301b27489e5d09c3032fa11e7832f03be6541182fd6)**|1.2.0|MIT **[detect-libc](#75227d1b1c09630ea361abee4d27101e350832bbeab9640a013c82662408b467)**|2.0.1|Apache-2.0 **[diff-match-patch](#850176c67954354dc12126896278644187ef9d1eeeaa1d67f1b6ef48b0c23321)**|1.0.5|Apache-2.0 -**[dom-accessibility-api](#a91e4ceabaaddea1b80532694b37621980591fa28c7144a3a848e66363bfee06)**|0.5.9|MIT **[dom-helpers](#8d51cc2c2eba67a9ee7b80bdbca48b1102ceeb0618178fae05b1a82522a80e6e)**|5.2.1|MIT **[domify](#4360a769ee10e827f9ae503aa7ea9aeb9039932fa02ac938316df303704a7fb1)**|1.4.1|MIT **[dset](#f51cb933ffb40a4dfeed4e6c3f7e6299cf7d05c42528b3fccc5bc7cab310914c)**|3.1.4|MIT **[ee-first](#e2746902c758ae8a6f91ffb9618cd53717f936cb33c6323e65b6b7b24f7ebefe)**|1.1.1|MIT **[electron-dl](#e97e034c7b93c63e7a433d75f6f1de3e0668764225ebbd61dbde8d1b55d6f3b7)**|3.5.0|MIT **[electron-squirrel-startup](#09fb8168e8fda2e174f8d1a1c392ffd8f762c5637c788edd00d1e2486d060349)**|1.0.1|Apache-2.0 -**[electron](#ddfad0a406da8c661d832155ebc87c378ac67db5d3c70f33126149f0084c639b)**|32.2.2|MIT +**[electron](#95b070aa09c824727d991b85b6b410b671792a0eb89ed3001cda13e3146f266f)**|32.2.5|MIT **[encodeurl](#b89152db475e86531e570f87b45d8a51aa5e5d87d4cc3b960cee7b8febf1d26a)**|1.0.2|MIT **[encodeurl](#177948a319ae0aeebbd65742c53c62b37c75ec1d021afa5a188d10a7ceae6623)**|2.0.0|MIT **[end-of-stream](#fadc10994f5fa767d06fb25cfff35fb17a895daf3bc3477c782907668ed16563)**|1.4.4|MIT **[ensure-error](#3b1eba5276d89414cef21a1007e85c4f1d6749bf57b300e082ab23975a41dbc9)**|3.0.1|MIT **[es-define-property](#f19a2c06a58db5974cd4d8abbd3fa0453122ea6d3bac0de0603ca69f72dcce38)**|1.0.0|MIT **[es-errors](#645b141d3027520f69209dba8e012e737f0ee8cad89ea8d0e26d02669d14a981)**|1.3.0|MIT -**[es-get-iterator](#d9180f3ad32c9d77645aa98ee5b6b8c233f3341b4cdfe00a1b8909505dc0f84b)**|1.1.3|MIT **[escape-goat](#9e11fd1d88e064409c700bdd041e7a9077ebe4bb0e8ad151a6820df52ac0a9e3)**|2.1.1|MIT **[escape-html](#5463e0a52abb42be051fba2f4ea5d49d907d2b5ed09df0983b54f88c59c8c481)**|1.0.3|MIT **[escape-string-regexp](#a9c53481a9db89e7cf01e302086c50fcfbde360978cdd2bbe1e52a430d3fee42)**|1.0.5|MIT @@ -283,14 +272,12 @@ Package|Version|License **[first-chunk-stream](#c940079dd0a2457019ab184334f928cab84e316cd4016ba3581b312aa55c70f9)**|3.0.0|MIT **[focus-trap-react](#4db13d4bfad6e874b38f8054935a1c7872c265b0a9f279e24dbe2523f3d1ce53)**|9.0.2|MIT **[focus-trap](#c34eea0a3a357645a464ee2dd814f280c9670f39b9b85132394eb15acb70916a)**|6.9.4|MIT -**[for-each](#8b82c7ffa1300f8e1575c1d59105d6b256827ec211760d6fb6f884e4290e0abe)**|0.3.3|MIT **[formdata-polyfill](#57e46e70e3cf628270eb56d751c6e2dd8332438324f1e4f5a3602c34ff7c85b9)**|4.0.10|MIT **[forwarded](#2d7f4275b09b041fd821b7672ebae7c9ccad3c87f3f37b6bd91306973c02b9a3)**|0.2.0|MIT **[fresh](#d7c677c373e09a5e9c7fe1d1ce69ca3147fe0455bf5606a26251970181d9efc4)**|0.5.2|MIT **[fs-constants](#9961a9f7535cded379a7696ad6d002a62d4826a3a8c2ffb5624383b942c879e5)**|1.0.0|MIT **[fs-extra](#f4bda72fc58b809b6533077d1826716805d4bec29651a76697ededec9689e0a4)**|11.2.0|MIT **[function-bind](#83de3b394293d96fb3fea968392a9d9ffb8b461f6c173bbb76a5bc51db5bec52)**|1.1.2|MIT -**[functions-have-names](#e47bfb8af99536984c43eccff65479505a133c528be9e5e73fa43c03b31749bf)**|1.2.3|MIT **[fuse.js](#ced18d15cdf119bfd867863e1f147fb1f4021544033d6cf956803c71a14cf53d)**|6.5.3|Apache-2.0 **[gensync](#c49cbe8d63515db5596a717f0d65eab2f06a623b4f1dfbd512d61bbdccf1aa4c)**|1.0.0-beta.2|MIT **[get-intrinsic](#2c1a0d16eee22217701f9243a8041f80f74f0a262eb6c10bf1b1f7f41e8599ac)**|1.2.4|MIT @@ -306,7 +293,6 @@ Package|Version|License **[has-property-descriptors](#4616611d5db8c73d2811bc79dd6cbde0b69f1cc891c1f997448bc79546ba9913)**|1.0.2|MIT **[has-proto](#7a8e708aab5b7c789098be88699f7f374a9b3a2f2737537a66d391147377b362)**|1.0.3|MIT **[has-symbols](#26dae1ac20c49dbfafbfca8c84abb75e056b0213a6ff12412dd23dd752e1a424)**|1.0.3|MIT -**[has-tostringtag](#e39d802569f1249ba08678c5fb24fc1b87ee4c92cc0f6eaa259f5b54038f2e13)**|1.0.2|MIT **[hasown](#ace41f4c3d63ecdc85c94d28b43fc006fc67f35c24ecaa112b631dbcb5c0b39d)**|2.0.2|MIT **[heap-js](#02ff1972404d29f951641af2b6cf6b371521d70f6daaf4196dcc45e6b5dbe96d)**|2.3.0|BSD-3-Clause **[highlight.js](#2c60adc5db39462d0c2ff2176f71b4694ffe5060c53b1aa4f6f670e269ec1905)**|11.5.1|BSD-3-Clause @@ -322,37 +308,20 @@ Package|Version|License **[imurmurhash](#d1af6342e06cf4463a1e70d43bb8fd673f060cc7c236f7fe024631d6714c81c8)**|0.1.4|MIT **[inherits](#3eafa9bfb872baf192e837ab771da2e95e983ee682371a2b1c579e518e96f7b4)**|2.0.4|ISC **[ini](#2269ab4bd2e1fa90571f520780ab5499f6d49da3b7daee9b9dfdad9e93c33a18)**|1.3.8|ISC -**[internal-slot](#1ecccc52c5daf9836e78ebc03604e73050b23a095bc4474240968ba1b9cd8892)**|1.0.7|MIT **[interruptor](#e8a35d2ce64b947fb7a1aba891bc1e4eb166be57a59249cda1fcc689e767b6bc)**|1.0.2|Apache-2.0 **[ip-address](#8de6e89459554be8a933663b25ae1d1ffee71458028fa8cbe5d68b349438a8c8)**|9.0.5|MIT **[ipaddr.js](#38a5a1606dbc89a9c65a28d1e9ebe3c8d323e107a77c495a56dbf522211676d2)**|1.9.1|MIT **[ipaddr.js](#d8a1c47a5dc5581d8d9e84268efa779a5140196540c2a4425e8317c1eeb93fb7)**|2.1.0|MIT **[ipv6-normalize](#7a4346dbf206011966449898fcd37178a9be89acf6dff120b676d4c4d0dec203)**|1.0.1|MIT -**[is-arguments](#4af472b071742337deb4d56d6c4a507fd58990e8922613def80a84ba532a2b6d)**|1.1.1|MIT -**[is-array-buffer](#442760df883a3fb368f6c5666080a8c4e07d95f5f69fc92654bed5bd4be7f814)**|3.0.4|MIT -**[is-bigint](#76328e128016cee0810bc1fd650e8f63f1ad3a062d2e0c555515448ffd3f13cd)**|1.0.2|MIT -**[is-boolean-object](#db76784fdb608b8a1760612e770f909cb121ee1d4f6067a33c25443f06b9c998)**|1.1.1|MIT -**[is-callable](#8cf8f70dfb44d8f426d81a03a0f5a1e4be28081368aa69089c22ac2571dcac14)**|1.2.7|MIT -**[is-date-object](#4e4be4dc1852d5d512c7afa3107dcff477e27efa4ac81bda7a72422f55fc5841)**|1.0.5|MIT **[is-docker](#893885e21608c60de02539fa3bd5a98f7068127aa5fab86a215bfec41a3119a4)**|2.2.1|MIT **[is-docker](#b21de9a8d47c7c165b912be5c7a36eae3939076531e05733aa2ac7f1099dc46d)**|3.0.0|MIT **[is-electron-renderer](#5f979579f0e64b4ba63a2cf1d32f11e274d285511e84ee596bddc57424d5299c)**|2.0.1|MIT **[is-inside-container](#3f45825f7cda0ec2231b94ee915a0dc76a31eb0f97746c44510d9b05d80c1a97)**|1.0.0|MIT -**[is-map](#a9d75aec4f0b5614e4286c133a5fb6390141bd79d8b5bff8f3f7815869d04f8e)**|2.0.3|MIT -**[is-number-object](#98d946a111ed40a337dcf7f4aa4824b69cfe20d4b3b230710bcd5f9c803c9348)**|1.0.5|MIT **[is-plain-obj](#6aa44f19e7afb6047589b7ad4e4ee3d44264e44f4a4ac5057efb8e3000820525)**|1.1.0|MIT -**[is-regex](#b98aa247d6a1b7f75692f6acb485fc213de3ca0cd8ecdd6bab7f96393e255d07)**|1.1.4|MIT -**[is-set](#af0e69272cbdbff01e5f873f16f9aa12c5c8fcbc228972be63e0b1ce16bd180a)**|2.0.3|MIT -**[is-shared-array-buffer](#6828bd9e33499632e06a110b3a3ecc06df254c4a28caf86e436a9939af9b3ed7)**|1.0.3|MIT **[is-stream](#6a348f7c7e9ad013ef74124a87896ed11f8bafac3344e58377dcfc0944187cf6)**|2.0.0|MIT **[is-stream](#309bd1940a381ff538d0c335564cc3e436c79307c991516433092d84e35acfc7)**|3.0.0|MIT -**[is-string](#f00a8e1cf00a8951016596ae951454a7d9944dc72a4f1b1127e7ec5879db5654)**|1.0.7|MIT -**[is-symbol](#3550f187e60fe8b94de5ebefd70dca43157d4c7a8ac847bb8d5ddfb1c59c1723)**|1.0.4|MIT **[is-utf8](#df5522c387e62effc17916c612bf340d6543c4bccca99fed4c1c1fae77ed4900)**|0.2.1|MIT -**[is-weakmap](#ed08152c59d2b4e2e55e4c75373f7cd102901b6de08e20dba61722d1bb7a5086)**|2.0.2|MIT -**[is-weakset](#5538f4c86728250aa4d278637d76d6fff7d7a2cf1ff7433f842cc4045c95ec6e)**|2.0.3|MIT **[is-wsl](#133bdb52dad1bbd87bcda9564e6df13fe7c51ae7d67575fea63cf0a2072ac884)**|2.2.0|MIT -**[isarray](#55a8a963f7aba0af49a654ea316f8dc19b717b632b88145881fda3988256ef6d)**|2.0.5|MIT **[isexe](#2f62e711a6921973ef3f9650fd3e06585fd3842e34078c8fa959481738600405)**|2.0.0|ISC **[javascript-stringify](#e0d27d21a288d227e51243715c044b3933d9fc0fb025dc16ec79c78af35f85a7)**|2.1.0|MIT **[jose](#7c6ba2890a65df8d382e1b102b311651675d0ed5fd5443e911c520b18e93f62f)**|4.15.5|MIT @@ -440,7 +409,6 @@ Package|Version|License **[lru-cache](#8d10f71b6ab389fdca1b55e9aa96d77790f776843bd42ca91804a40a0d543f19)**|11.0.1|ISC **[lru-cache](#fe7f0a2f2cf4c92f13c3a2a63f14f80f20f6919979306dc054e4f947c1234651)**|5.1.1|ISC **[lru-cache](#938513411a6603ce29334db15563fb94b7d52f839d32b9bd78c18f5d3f98aa5a)**|6.0.0|ISC -**[lz-string](#a04d0916e49897705fe7a9d865134920984a19a03f8de501d4e46c6698a6b421)**|1.5.0|MIT **[marky](#c5789082b93eeeb451a00e87792a533dd2589421119d3560a06c5f96b39414ea)**|1.2.2|Apache-2.0 **[matches-selector](#ed68b9f3ecca4297cbb806474484688a85517361d99a33773e3152603a6771e6)**|0.0.1|MIT **[matches-selector](#cec79a3cd38ecccf3066baf0e39cf87735fffea201040dd2799e4c6b5221d981)**|1.2.0|MIT @@ -459,7 +427,6 @@ Package|Version|License **[minimist](#837db6b00930af97755b724568aecf8b139361dc2148c7db77673ba6ae44a44d)**|1.2.6|MIT **[mkdirp-classic](#e79cc875152b50c2eb57a97163d99f0155bf4e4af7ba4a7e01c12a17a4a3305c)**|0.5.3|MIT **[modify-filename](#7153be07939379ccf0072006c519fba2bdf5ab79ca8bb59bc5273f87a7bacbf6)**|1.1.0|MIT -**[moment](#94975b5423311209f3beed9c2c6bb6157f622312a3f8563d507b52e804bf6285)**|2.29.4|MIT **[mongodb-build-info](#f0a98c22ae0766702726f79e058ac6dc4e4bead8557b67b816f40bd13fb54170)**|1.7.2|Apache-2.0 **[mongodb-client-encryption](#01c104ff07b0715f77217b6b7adfc9a0056f35ffd976182ffbf409f69b3a0df3)**|6.1.0|Apache-2.0 **[mongodb-cloud-info](#a784f3b401cf51746f49964e044db933529b3e3791e557702715730f5a3f1e46)**|2.1.2|Apache-2.0 @@ -489,9 +456,6 @@ Package|Version|License **[object-assign](#598e372231bb5bef26b7d61105282eb20e14ade430143052d064d2d406769b95)**|4.1.1|MIT **[object-hash](#848d5d28b20a6a7f2e701e9b2b7e65b5518313269696dacf4ac69fa8bc5b571a)**|2.2.0|MIT **[object-inspect](#b9d7050d521cb65fdc84f2212e39302b36e9bb0f7191e0be89ac3e4ea488b1fb)**|1.13.1|MIT -**[object-is](#d597163d660664be4b28b1f40171738a17ec18b028d62ee1cf2e264e30924d84)**|1.1.5|MIT -**[object-keys](#e9aac5890f5f1c6f8d56c08ce91012ba530b586511a89d1fa99ae2d7c39d8b2e)**|1.1.1|MIT -**[object.assign](#498d41061b8e766f5d53d287d41307891ca86b3d63eee61a1c4131f5dc5f185c)**|4.1.5|MIT **[oidc-token-hash](#3beaf628821d1b6d7ec7b67b3c9ceea1d37727ea52253383f31d3e73141cf29f)**|5.0.3|MIT **[on-finished](#d3c391e10faad1d82190a06f5be315d94a9194cff75aa389940432ef15cf45de)**|2.4.1|MIT **[once](#d0d1303998dfae04e4f898f477380aac35568f4d6679f4ea913c2441cf9ebb0b)**|1.4.0|ISC @@ -510,10 +474,8 @@ Package|Version|License **[path-to-regexp](#96d230365f414cce8d80ceb9d99d855685dfa922f931b49ea01952a1efe64266)**|0.1.10|MIT **[picocolors](#f964752f1f8cfd947506fd51ce1c148469ecf3b6f531d826511b720670e556f1)**|1.1.0|ISC **[polished](#a7a5d1244e48a082dbc54de31b5309caf950b12aa6bd9fefbba39e362e705f06)**|4.2.2|MIT -**[possible-typed-array-names](#5ba4283f5512abd5d57e79c0a75acb3818d98d169df979afb01ad6867cefd312)**|1.0.0|MIT **[prebuild-install](#93d13a9b3a51a6a802fcd35aa031d3ae7369aa6fd47d3a89f28a6d31ea3c9dc5)**|7.1.2|MIT **[prettier](#2e1e2077936be4bb5f075fd4d279f9ece641322ccd12a8116edb3f99f08f7411)**|2.7.1|MIT -**[pretty-format](#0c53580441217a6c2b9c885eb1ec35adde420c312ccf9f408c856dc3845cce8b)**|27.5.1|MIT **[prop-types](#e4dd0bb5b6f98fbf52f0ad7062b8514aadc56a47a692bf6d8aab369786b6039f)**|15.8.1|MIT **[proxy-addr](#7b128e3d41d39ecb1a405a490a53ae86f70ef45f01079333ed3ca49939f5fba8)**|2.0.7|MIT **[pump](#147f1bd3a6380306e696f0574feda0b1490121a1d12e4500e91ffb6e888ffa3a)**|3.0.0|MIT @@ -528,7 +490,6 @@ Package|Version|License **[react-hotkeys-hook](#6ce07fe9653ad69a76354e2d71137c70ab9a838377fe5a8f8e45c559cfbf41cc)**|4.3.7|MIT **[react-intersection-observer](#84f998bdb33a5f9330d81ef063f7ad0897f1b004661fbf131725697b847a5b6a)**|8.34.0|MIT **[react-is](#7183835e2bcaca6754fe10854fc3b65407d2cb9aa3b68b1c06ccaafb7b9be28a)**|16.13.1|MIT -**[react-is](#5ec174b50bba38f48ee8da3d8a5b9463a9e77c3f01d74a132ecc30a2be099c4b)**|17.0.2|MIT **[react-is](#5746232ad830b635a6581ee7d3b826ee932c6877087c98cb46b94101eb5ce40b)**|18.2.0|MIT **[react-keyed-flatten-children](#9c7ffa4be6351eaf0a19b808fc4048eb28455824378f089da7a566cdeb0bdd84)**|1.3.0|MIT **[react-leaflet-draw](#d80b4b765d856cdefe411a073d3b3dde06100128005f1381b4d26d6cf53134c7)**|0.19.0|ISC @@ -544,7 +505,6 @@ Package|Version|License **[redux](#98b5d53f97fab4eea98fb5f423cad33400855b69ac662f1fdf55f0fb9e33f2ab)**|4.2.1|MIT **[reflux-core](#7af6ea33b0ed18717d672b44743ae53dcef843ae464690bb9e10eb1df048e9ea)**|0.3.0|BSD-3-Clause **[reflux](#f892193924d403a4dd1a73a5861913838f1a9d704055d9d098eb0d40f752e053)**|0.4.1|BSD-3-Clause -**[regexp.prototype.flags](#51cb6c20041a1fef833bb3f46483fcbd99a186e3767ec2ad32f7b3db74d296f2)**|1.5.2|MIT **[reservoir](#84f8998f94ad5bd85b50458378edf3815fff553cdcabf8ced3db418f05e85ff6)**|0.1.2|MIT **[resolve-mongodb-srv](#2ae8b0c9dbe8e8c900bfaf5567bcf2af917e62fb0a24121b4d667dffbeaffa99)**|1.1.5|Apache-2.0 **[run-applescript](#f4d3cc18b69c2dec9e4f1d19a1cb794c8fa2e548e530f4033dc6b0caf803bebc)**|5.0.0|MIT @@ -557,7 +517,6 @@ Package|Version|License **[send](#412cd4c4a8e6aaa433d5e67852c05a1e307fd4eb9dc362bdc30fa099313c24cb)**|0.19.0|MIT **[serve-static](#9a2d04a479ef9c6e990f1fb614478dea4368c040af707296400ff7f9bb68d30b)**|1.16.2|MIT **[set-function-length](#88ee3e1c8e8c22ac3653a290c1cdc68787d064f17a743020a070b31290bb4eb9)**|1.2.2|MIT -**[set-function-name](#f9d4c9272c71403774a64f46fc69cefd1039845f2ee1d252fb62cbd97f9e7fb4)**|2.0.2|MIT **[setprototypeof](#7787a1d3bc2f39b65d75407d5d8d02d8ddb70f1cdb74897f15115e995fb64a56)**|1.2.0|ISC **[shebang-command](#a9cba97b71b818fb0a4978f8b14875ae118f292a19ffa97c8b2d848f9a897d89)**|2.0.0|MIT **[shebang-regex](#849fb37298f1c4dcdeb6065edc4242918c7533bcfda5c67747e6ce4620c587bb)**|3.0.0|MIT @@ -577,7 +536,6 @@ Package|Version|License **[sprintf-js](#d8b6ff1ba6436283de681a756ad453428005e61986c5113a3a8088ced2b36eb7)**|1.1.3|BSD-3-Clause **[ssh2](#caa88a7f6fedc946b33fe4cdcd84104598cca8b841b593d1ffb031578cd3d8c9)**|1.15.0|MIT **[statuses](#a347e5a1994ef74647a2af80f58030a572f71173d5c1dfc0ce6eb55f4005b17d)**|2.0.1|MIT -**[stop-iteration-iterator](#b4a114e720966d8d69055a584424fa2465b603774072e8b7e35619282ff67afb)**|1.0.0|MIT **[stream-chain](#dbe4594ad347bd2850f84bc41ea7ed1f0bebb82c38b9e7e0f6820d1c071e534c)**|2.2.5|BSD-3-Clause **[stream-json](#ff32de703b38cb80287bf73b31ddc47fb97277eadcfb231017f31a06824e41e0)**|1.7.5|BSD-3-Clause **[string_decoder](#b7999058a36380603fb66d82d8b9e36ddb8f0e5b81cd3f3233f31eac12b793fe)**|1.3.0|MIT @@ -627,9 +585,6 @@ Package|Version|License **[webpack](#bd55cdb69f5b1b336d12c3f00d849ccb1f2c39987c257c89027d6a790f947496)**|5.94.0|MIT **[whatwg-url](#3a968d9d3fed498fc1edf2f65459cc89b6a2fea277b5c9b5c3f3a0b41390835a)**|13.0.0|MIT **[whatwg-url](#cd3f81c4a0fd856ab1d9c9fc99c1d7eaf2c12c4867b218e9901e5020a1ffcd85)**|5.0.0|MIT -**[which-boxed-primitive](#b3f94b6da310368951f52909c400e19c4c2c7a282ba67374f41ab2d070bf83f2)**|1.0.2|MIT -**[which-collection](#8d30c0dc07cdaccc2163cb70ff87fa91c48abdf4963bf5603218d66dbd6ae538)**|1.0.2|MIT -**[which-typed-array](#949a7e27fa7c5423fa71694a92b2c5e0d1b7f9e43ba00aab74414d4311e82530)**|1.1.15|MIT **[which](#5a71f2b741944bf107d6e7f067241798a6e277e42e8ca1e28c4608ccc233f8ec)**|2.0.2|ISC **[winreg-ts](#b1df7eee15fa28ae85b9086513c8316c08a21c254e8eda11e63c6321a03ac4a7)**|1.0.4|BSD-2-Clause **[wrappy](#13cebf193d7ada5ee347b9ae819b96f5e6da21f9b53e7f268c7703b686158595)**|1.0.2|ISC @@ -7021,11 +6976,6 @@ License files: - -### [@lg-tools/test-harnesses](https://www.npmjs.com/package/@lg-tools/test-harnesses) (version 0.1.2) -License tags: Apache-2.0 - - ### [@lukeed/uuid](https://www.npmjs.com/package/@lukeed/uuid) (version 2.0.1) License tags: MIT @@ -15640,36 +15590,6 @@ License files: - -### [@testing-library/dom](https://www.npmjs.com/package/@testing-library/dom) (version 9.3.1) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - Copyright (c) 2017 Kent C. Dodds - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [@tootallnate/quickjs-emscripten](https://www.npmjs.com/package/@tootallnate/quickjs-emscripten) (version 0.23.0) License tags: MIT @@ -16216,25 +16136,6 @@ License files: - -### [ansi-regex](https://www.npmjs.com/package/ansi-regex) (version 5.0.1) -License tags: MIT - -License files: -* license: - - MIT License - - Copyright (c) Sindre Sorhus (sindresorhus.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - ### [ansi-styles](https://www.npmjs.com/package/ansi-styles) (version 3.2.1) License tags: MIT @@ -16273,272 +16174,11 @@ License files: - -### [ansi-styles](https://www.npmjs.com/package/ansi-styles) (version 5.2.0) -License tags: MIT - -License files: -* license: - - MIT License - - Copyright (c) Sindre Sorhus (sindresorhus.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - ### [antlr4](https://www.npmjs.com/package/antlr4) (version 4.7.2) License tags: BSD-3-Clause - -### [aria-query](https://www.npmjs.com/package/aria-query) (version 5.1.3) -License tags: Apache-2.0 - -License files: -* LICENSE: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2020 A11yance - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - - -### [array-buffer-byte-length](https://www.npmjs.com/package/array-buffer-byte-length) (version 1.0.1) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2023 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [array-flatten](https://www.npmjs.com/package/array-flatten) (version 1.1.1) License tags: MIT @@ -16634,37 +16274,6 @@ License files: - -### [available-typed-arrays](https://www.npmjs.com/package/available-typed-arrays) (version 1.0.7) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2020 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [aws4](https://www.npmjs.com/package/aws4) (version 1.11.0) License tags: MIT @@ -17806,8 +17415,8 @@ License files: - -### [cross-spawn](https://www.npmjs.com/package/cross-spawn) (version 7.0.3) + +### [cross-spawn](https://www.npmjs.com/package/cross-spawn) (version 7.0.5) License tags: MIT License files: @@ -18175,37 +17784,6 @@ License files: - -### [deep-equal](https://www.npmjs.com/package/deep-equal) (version 2.2.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2012, 2013, 2014 James Halliday , 2009 Thomas Robinson <280north.com> - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [deep-extend](https://www.npmjs.com/package/deep-extend) (version 0.6.0) License tags: MIT @@ -18324,36 +17902,6 @@ License files: - -### [define-properties](https://www.npmjs.com/package/define-properties) (version 1.2.1) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (C) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - ### [degenerator](https://www.npmjs.com/package/degenerator) (version 5.0.1) License tags: MIT @@ -18856,37 +18404,6 @@ License files: limitations under the License. - -### [dom-accessibility-api](https://www.npmjs.com/package/dom-accessibility-api) (version 0.5.9) -License tags: MIT - -License files: -* LICENSE.md: - - MIT License - - Copyright (c) 2020 Sebastian Silbermann - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [dom-helpers](https://www.npmjs.com/package/dom-helpers) (version 5.2.1) License tags: MIT @@ -19215,8 +18732,8 @@ License files: - -### [electron](https://www.npmjs.com/package/electron) (version 32.2.2) + +### [electron](https://www.npmjs.com/package/electron) (version 32.2.5) License tags: MIT License files: @@ -19421,37 +18938,6 @@ License files: - -### [es-get-iterator](https://www.npmjs.com/package/es-get-iterator) (version 1.1.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [escape-goat](https://www.npmjs.com/package/escape-goat) (version 2.1.1) License tags: MIT @@ -20192,38 +19678,6 @@ License files: - -### [for-each](https://www.npmjs.com/package/for-each) (version 0.3.3) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2012 Raynos. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - ### [formdata-polyfill](https://www.npmjs.com/package/formdata-polyfill) (version 4.0.10) License tags: MIT @@ -20406,37 +19860,6 @@ License files: - -### [functions-have-names](https://www.npmjs.com/package/functions-have-names) (version 1.2.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [fuse.js](https://www.npmjs.com/package/fuse.js) (version 6.5.3) License tags: Apache-2.0 @@ -20985,37 +20408,6 @@ License files: - -### [has-tostringtag](https://www.npmjs.com/package/has-tostringtag) (version 1.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2021 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [hasown](https://www.npmjs.com/package/hasown) (version 2.0.2) License tags: MIT @@ -21821,37 +21213,6 @@ License files: - -### [internal-slot](https://www.npmjs.com/package/internal-slot) (version 1.0.7) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [interruptor](https://www.npmjs.com/package/interruptor) (version 1.0.2) License tags: Apache-2.0 @@ -22146,194 +21507,6 @@ License files: License tags: MIT - -### [is-arguments](https://www.npmjs.com/package/is-arguments) (version 1.1.1) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2014 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -### [is-array-buffer](https://www.npmjs.com/package/is-array-buffer) (version 3.0.4) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2015 Chen Gengyuan, Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [is-bigint](https://www.npmjs.com/package/is-bigint) (version 1.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2018 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [is-boolean-object](https://www.npmjs.com/package/is-boolean-object) (version 1.1.1) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - - -### [is-callable](https://www.npmjs.com/package/is-callable) (version 1.2.7) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - - -### [is-date-object](https://www.npmjs.com/package/is-date-object) (version 1.0.5) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - ### [is-docker](https://www.npmjs.com/package/is-docker) (version 2.2.1) License tags: MIT @@ -22396,69 +21569,6 @@ License files: - -### [is-map](https://www.npmjs.com/package/is-map) (version 2.0.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [is-number-object](https://www.npmjs.com/package/is-number-object) (version 1.0.5) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - ### [is-plain-obj](https://www.npmjs.com/package/is-plain-obj) (version 1.1.0) License tags: MIT @@ -22490,98 +21600,6 @@ License files: - -### [is-regex](https://www.npmjs.com/package/is-regex) (version 1.1.4) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2014 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -### [is-set](https://www.npmjs.com/package/is-set) (version 2.0.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [is-shared-array-buffer](https://www.npmjs.com/package/is-shared-array-buffer) (version 1.0.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2021 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [is-stream](https://www.npmjs.com/package/is-stream) (version 2.0.0) License tags: MIT @@ -22620,70 +21638,6 @@ License files: - -### [is-string](https://www.npmjs.com/package/is-string) (version 1.0.7) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - - -### [is-symbol](https://www.npmjs.com/package/is-symbol) (version 1.0.4) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - ### [is-utf8](https://www.npmjs.com/package/is-utf8) (version 0.2.1) License tags: MIT @@ -22703,68 +21657,6 @@ License files: - -### [is-weakmap](https://www.npmjs.com/package/is-weakmap) (version 2.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [is-weakset](https://www.npmjs.com/package/is-weakset) (version 2.0.3) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [is-wsl](https://www.npmjs.com/package/is-wsl) (version 2.2.0) License tags: MIT @@ -22784,37 +21676,6 @@ License files: - -### [isarray](https://www.npmjs.com/package/isarray) (version 2.0.5) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2013 Julian Gruber - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [isexe](https://www.npmjs.com/package/isexe) (version 2.0.0) License tags: ISC @@ -25826,37 +24687,6 @@ License files: - -### [lz-string](https://www.npmjs.com/package/lz-string) (version 1.5.0) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2013 pieroxy - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [marky](https://www.npmjs.com/package/marky) (version 1.2.2) License tags: Apache-2.0 @@ -26544,38 +25374,6 @@ License files: - -### [moment](https://www.npmjs.com/package/moment) (version 2.29.4) -License tags: MIT - -License files: -* LICENSE: - - Copyright (c) JS Foundation and other contributors - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - - ### [mongodb-build-info](https://www.npmjs.com/package/mongodb-build-info) (version 1.7.2) License tags: Apache-2.0 @@ -29024,96 +27822,6 @@ License files: - -### [object-is](https://www.npmjs.com/package/object-is) (version 1.1.5) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2014 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - - -### [object-keys](https://www.npmjs.com/package/object-keys) (version 1.1.1) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (C) 2013 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - - -### [object.assign](https://www.npmjs.com/package/object.assign) (version 4.1.5) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2014 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - ### [oidc-token-hash](https://www.npmjs.com/package/oidc-token-hash) (version 5.0.3) License tags: MIT @@ -29594,37 +28302,6 @@ License files: - -### [possible-typed-array-names](https://www.npmjs.com/package/possible-typed-array-names) (version 1.0.0) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2024 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [prebuild-install](https://www.npmjs.com/package/prebuild-install) (version 7.1.2) License tags: MIT @@ -35667,37 +34344,6 @@ License files: - -### [pretty-format](https://www.npmjs.com/package/pretty-format) (version 27.5.1) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) Facebook, Inc. and its affiliates. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [prop-types](https://www.npmjs.com/package/prop-types) (version 15.8.1) License tags: MIT @@ -36182,37 +34828,6 @@ License files: - -### [react-is](https://www.npmjs.com/package/react-is) (version 17.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) Facebook, Inc. and its affiliates. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [react-is](https://www.npmjs.com/package/react-is) (version 18.2.0) License tags: MIT @@ -36667,38 +35282,6 @@ License files: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -### [regexp.prototype.flags](https://www.npmjs.com/package/regexp.prototype.flags) (version 1.5.2) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (C) 2014 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - - - ### [reservoir](https://www.npmjs.com/package/reservoir) (version 0.1.2) License tags: MIT @@ -37172,37 +35755,6 @@ License files: - -### [set-function-name](https://www.npmjs.com/package/set-function-name) (version 2.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) Jordan Harband and contributors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [setprototypeof](https://www.npmjs.com/package/setprototypeof) (version 1.2.0) License tags: ISC @@ -37825,37 +36377,6 @@ License files: - -### [stop-iteration-iterator](https://www.npmjs.com/package/stop-iteration-iterator) (version 1.0.0) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2023 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - ### [stream-chain](https://www.npmjs.com/package/stream-chain) (version 2.2.5) License tags: BSD-3-Clause @@ -39801,100 +38322,6 @@ License files: - -### [which-boxed-primitive](https://www.npmjs.com/package/which-boxed-primitive) (version 1.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [which-collection](https://www.npmjs.com/package/which-collection) (version 1.0.2) -License tags: MIT - -License files: -* LICENSE: - - MIT License - - Copyright (c) 2019 Inspect JS - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - -### [which-typed-array](https://www.npmjs.com/package/which-typed-array) (version 1.1.15) -License tags: MIT - -License files: -* LICENSE: - - The MIT License (MIT) - - Copyright (c) 2015 Jordan Harband - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - - - ### [which](https://www.npmjs.com/package/which) (version 2.0.2) License tags: ISC diff --git a/configs/webpack-config-compass/package.json b/configs/webpack-config-compass/package.json index 2c9d6cac679..3154716299e 100644 --- a/configs/webpack-config-compass/package.json +++ b/configs/webpack-config-compass/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.4.5", + "version": "1.4.6", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -73,7 +73,7 @@ "cli-progress": "^3.9.1", "core-js": "^3.17.3", "css-loader": "^4.3.0", - "electron": "^32.2.2", + "electron": "^32.2.5", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", "less-loader": "^10.0.1", diff --git a/configs/webpack-config-compass/src/index.ts b/configs/webpack-config-compass/src/index.ts index 2211b985f74..1b01bd891b4 100644 --- a/configs/webpack-config-compass/src/index.ts +++ b/configs/webpack-config-compass/src/index.ts @@ -107,6 +107,10 @@ const sharedResolveOptions = ( // This is an optional dependency of the AWS SDK that doesn't look like // an optional dependency to webpack because it's not wrapped in try/catch. '@aws-sdk/client-sso-oidc': false, + + // Some lg test helpers that are getting bundled due to re-exporting from + // the actual component packages, never needed in the webpack bundles + '@lg-tools/test-harnesses': false, }, }; }; diff --git a/docs/tracking-plan.md b/docs/tracking-plan.md index 3efef1ae2ad..6eef4380f1d 100644 --- a/docs/tracking-plan.md +++ b/docs/tracking-plan.md @@ -1,7 +1,7 @@ # Compass Tracking Plan -Generated on Tue, Oct 29, 2024 at 05:29 PM +Generated on Mon, Nov 18, 2024 at 04:28 PM ## Table of Contents @@ -148,6 +148,7 @@ Generated on Tue, Oct 29, 2024 at 05:29 PM ### Schema - [Schema Analyzed](#event--SchemaAnalyzedEvent) +- [Schema Exported](#event--SchemaExportedEvent) ### Schema Validation - [Schema Validation Added](#event--SchemaValidationAddedEvent) @@ -243,7 +244,7 @@ This event is fired when user copied the pipeline to clipboard. **Properties**: - **id** (required): `string` - - A unique id for the aggregation object being deleted. + - A unique id for the aggregation object being copied. - **screen** (required): `"my-queries"` - The screen from which the aggregation has been copied. @@ -853,6 +854,10 @@ This event is fired when user successfully connects to a new server/cluster. - The OS family of the connected server. - **topology_type** (required): `string` - The type of connected topology. +- **num_active_connections** (required): `number` + - The number of active connections. +- **num_inactive_connections** (required): `number` + - The number of inactive connections. - **auth_type** (optional): `string | undefined` - Desktop only. The authentication type used in the connection. - **tunnel** (optional): `string | undefined` @@ -1801,6 +1806,25 @@ This event is fired when user analyzes the schema. - **connection_id** (optional): `string | undefined` - The id of the connection associated to this event. + + +### Schema Exported + +This event is fired when user shares the schema. + +**Properties**: + +- **has_schema** (required): `boolean` + - Indicates whether the schema was analyzed before sharing. +- **schema_width** (required): `number` + - The number of fields at the top level. +- **schema_depth** (required): `number` + - The number of nested levels. +- **geo_data** (required): `boolean` + - Indicates whether the schema contains geospatial data. +- **connection_id** (optional): `string | undefined` + - The id of the connection associated to this event. + ## Schema Validation diff --git a/package-lock.json b/package-lock.json index 5a7694a827e..3f77c8f8b12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -497,7 +497,7 @@ }, "configs/webpack-config-compass": { "name": "@mongodb-js/webpack-config-compass", - "version": "1.4.5", + "version": "1.4.6", "license": "SSPL", "dependencies": { "@babel/core": "^7.21.4", @@ -516,7 +516,7 @@ "cli-progress": "^3.9.1", "core-js": "^3.17.3", "css-loader": "^4.3.0", - "electron": "^32.2.2", + "electron": "^32.2.5", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", "less-loader": "^10.0.1", @@ -4324,9 +4324,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", - "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.1.tgz", + "integrity": "sha512-sKGD+xav4Gh25+LcLY0rjIwcCFTw+f/HU1pB48UVbwxXXRGaXEqIH0AaYKN46dgd/7+6kuiDXzoyAEvx1zCsdw==", "dependencies": { "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", @@ -4364,7 +4364,6 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], - "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -4376,7 +4375,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4388,7 +4386,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4397,7 +4394,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "license": "MIT", "engines": { "node": ">=10.6.0" } @@ -4406,7 +4402,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4420,7 +4415,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -4435,7 +4429,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4449,7 +4442,6 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -4474,7 +4466,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4486,7 +4477,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4498,7 +4488,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4516,7 +4505,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", "engines": { "node": ">=12" } @@ -18062,9 +18050,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -20162,9 +20151,9 @@ } }, "node_modules/electron": { - "version": "32.2.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.2.2.tgz", - "integrity": "sha512-c7TRE42JcgEmJ4elJyCdKk/2os0UX7YMkRDeXBkxFEoM34iX1/2x+c5T9PgeroKz8FEG7omRU5TvjulqVtXvdw==", + "version": "32.2.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.2.5.tgz", + "integrity": "sha512-8t5IGOvms/JTcLNnlOH7rFCAJIZJAazwYrF7kQsKQSLzDHh4z8mGFrU11NN3W4bIT6Yg5DJNniSWz3O5wJLmCw==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -20519,9 +20508,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", - "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==" + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==" }, "node_modules/electron-window": { "version": "0.8.1", @@ -43014,25 +43003,24 @@ }, "packages/atlas-service": { "name": "@mongodb-js/atlas-service", - "version": "0.31.0", + "version": "0.32.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/devtools-connect": "^3.3.1", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/oidc-plugin": "^1.1.1", - "compass-preferences-model": "^2.29.2", - "electron": "^32.2.2", + "compass-preferences-model": "^2.30.0", + "electron": "^32.2.5", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "react": "^17.0.2", - "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, @@ -43120,12 +43108,12 @@ }, "packages/collection-model": { "name": "mongodb-collection-model", - "version": "5.23.6", + "version": "5.23.7", "license": "SSPL", "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2" }, "devDependencies": { @@ -43140,7 +43128,7 @@ }, "packages/compass": { "name": "mongodb-compass", - "version": "1.44.6", + "version": "1.44.7-beta.3", "hasInstallScript": true, "license": "SSPL", "dependencies": { @@ -43153,62 +43141,62 @@ "system-ca": "^2.0.0" }, "devDependencies": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@electron/remote": "^2.1.2", - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-aggregations": "^9.47.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connection-import-export": "^0.41.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-databases-collections": "^1.44.0", - "@mongodb-js/compass-explain-plan": "^6.45.0", - "@mongodb-js/compass-export-to-language": "^9.21.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-find-in-page": "^4.32.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-global-writes": "^1.4.0", - "@mongodb-js/compass-import-export": "^7.44.0", - "@mongodb-js/compass-indexes": "^5.44.0", - "@mongodb-js/compass-intercom": "^0.13.2", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-saved-aggregations-queries": "^1.45.0", - "@mongodb-js/compass-schema": "^6.46.0", - "@mongodb-js/compass-schema-validation": "^6.45.0", - "@mongodb-js/compass-serverstats": "^16.44.0", - "@mongodb-js/compass-settings": "^0.43.0", - "@mongodb-js/compass-shell": "^3.44.0", - "@mongodb-js/compass-sidebar": "^5.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-welcome": "^0.43.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-aggregations": "^9.49.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connection-import-export": "^0.43.0", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-databases-collections": "^1.46.0", + "@mongodb-js/compass-explain-plan": "^6.47.0", + "@mongodb-js/compass-export-to-language": "^9.23.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-find-in-page": "^4.32.1", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-global-writes": "^1.6.0", + "@mongodb-js/compass-import-export": "^7.46.0", + "@mongodb-js/compass-indexes": "^5.46.0", + "@mongodb-js/compass-intercom": "^0.14.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-saved-aggregations-queries": "^1.47.0", + "@mongodb-js/compass-schema": "^6.48.0", + "@mongodb-js/compass-schema-validation": "^6.47.0", + "@mongodb-js/compass-serverstats": "^16.46.0", + "@mongodb-js/compass-settings": "^0.45.0", + "@mongodb-js/compass-shell": "^3.46.0", + "@mongodb-js/compass-sidebar": "^5.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-welcome": "^0.45.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/get-os-info": "^0.3.24", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-downloader": "^0.3.5", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/sbom-tools": "^0.7.0", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", - "@mongodb-js/webpack-config-compass": "^1.4.5", + "@mongodb-js/webpack-config-compass": "^1.4.6", "@segment/analytics-node": "^1.1.4", "ampersand-view": "^9.0.0", "chai": "^4.3.4", "chalk": "^4.1.2", "clean-stack": "^2.0.0", - "compass-preferences-model": "^2.29.2", - "cross-spawn": "^7.0.3", + "compass-preferences-model": "^2.30.0", + "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-devtools-installer": "^3.2.0", "electron-dl": "^3.5.0", "electron-mocha": "^12.2.0", @@ -43216,8 +43204,8 @@ "ensure-error": "^3.0.1", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-build": "^25.5.13", - "hadron-ipc": "^3.2.24", + "hadron-build": "^25.5.14", + "hadron-ipc": "^3.2.25", "local-links": "^1.4.0", "make-fetch-happen": "^10.2.1", "marky": "^1.2.1", @@ -43225,8 +43213,8 @@ "mongodb-build-info": "^1.7.2", "mongodb-cloud-info": "^2.1.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-data-service": "^22.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-log-writer": "^1.4.2", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -43246,7 +43234,7 @@ }, "packages/compass-aggregations": { "name": "@mongodb-js/compass-aggregations", - "version": "9.47.0", + "version": "9.49.0", "license": "SSPL", "dependencies": { "@babel/generator": "^7.19.5", @@ -43255,34 +43243,34 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/explain-plan-helper": "^1.2.4", "@mongodb-js/mongodb-constants": "^0.10.0", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/shell-bson-parser": "^1.1.2", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", "hadron-type-checker": "^7.2.3", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-schema": "^12.2.0", @@ -43347,17 +43335,17 @@ }, "packages/compass-app-stores": { "name": "@mongodb-js/compass-app-stores", - "version": "7.31.0", + "version": "7.33.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/connection-info": "^0.9.3", "hadron-app-registry": "^9.2.7", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, @@ -43411,20 +43399,20 @@ }, "packages/compass-collection": { "name": "@mongodb-js/compass-collection", - "version": "4.44.0", + "version": "4.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/mongodb-constants": "^0.10.2", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", - "mongodb-collection-model": "^5.23.6", + "mongodb-collection-model": "^5.23.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -43485,7 +43473,7 @@ }, "packages/compass-components": { "name": "@mongodb-js/compass-components", - "version": "1.31.0", + "version": "1.31.1", "license": "SSPL", "dependencies": { "@dnd-kit/core": "^6.0.7", @@ -43694,14 +43682,14 @@ }, "packages/compass-connection-import-export": { "name": "@mongodb-js/compass-connection-import-export", - "version": "0.41.0", + "version": "0.43.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/connection-storage": "^0.22.3", - "compass-preferences-model": "^2.29.2", - "hadron-ipc": "^3.2.24", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/connection-storage": "^0.23.0", + "compass-preferences-model": "^2.30.0", + "hadron-ipc": "^3.2.25", "react": "^17.0.2" }, "devDependencies": { @@ -43756,24 +43744,24 @@ }, "packages/compass-connections": { "name": "@mongodb-js/compass-connections", - "version": "1.45.0", + "version": "1.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-storage": "^0.23.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", @@ -43805,15 +43793,15 @@ }, "packages/compass-connections-navigation": { "name": "@mongodb-js/compass-connections-navigation", - "version": "1.44.0", + "version": "1.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "compass-preferences-model": "^2.30.0", "mongodb-build-info": "^1.7.2", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", @@ -43900,33 +43888,33 @@ }, "packages/compass-crud": { "name": "@mongodb-js/compass-crud", - "version": "13.45.0", + "version": "13.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/explain-plan-helper": "^1.2.4", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/reflux-state-mixin": "^1.0.7", "@mongodb-js/shell-bson-parser": "^1.1.2", "ag-grid-community": "^20.2.0", "ag-grid-react": "^20.2.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", "hadron-type-checker": "^7.2.3", "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "numeral": "^2.0.6", @@ -43947,12 +43935,12 @@ "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^8.1.1", @@ -44004,11 +43992,11 @@ } }, "packages/compass-e2e-tests": { - "version": "1.27.4", + "version": "1.27.6", "devDependencies": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/oidc-mock-provider": "^0.9.3", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -44022,15 +44010,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.29.2", - "cross-spawn": "^7.0.3", + "compass-preferences-model": "^2.30.0", + "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", - "electron-to-chromium": "^1.5.49", + "electron": "^32.2.5", + "electron-to-chromium": "^1.5.62", "eslint": "^7.25.0", "glob": "^10.2.5", - "hadron-build": "^25.5.13", + "hadron-build": "^25.5.14", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", @@ -44410,7 +44398,7 @@ }, "packages/compass-editor": { "name": "@mongodb-js/compass-editor", - "version": "0.32.0", + "version": "0.33.0", "license": "SSPL", "dependencies": { "@codemirror/autocomplete": "^6.17.0", @@ -44422,7 +44410,7 @@ "@codemirror/state": "^6.1.4", "@codemirror/view": "^6.7.1", "@lezer/highlight": "^1.2.0", - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "@mongodb-js/mongodb-constants": "^0.10.0", "mongodb-query-parser": "^4.2.3", "polished": "^4.2.2", @@ -44476,17 +44464,17 @@ }, "packages/compass-explain-plan": { "name": "@mongodb-js/compass-explain-plan", - "version": "6.45.0", + "version": "6.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/explain-plan-helper": "^1.2.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "d3": "^3.5.17", "d3-flextree": "^2.1.2", "d3-hierarchy": "^3.1.2", @@ -44509,7 +44497,7 @@ "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -44555,18 +44543,18 @@ }, "packages/compass-export-to-language": { "name": "@mongodb-js/compass-export-to-language", - "version": "9.21.0", + "version": "9.23.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/shell-bson-parser": "^1.1.2", "bson-transpilers": "^3.0.10", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -44618,11 +44606,11 @@ }, "packages/compass-field-store": { "name": "@mongodb-js/compass-field-store", - "version": "9.20.0", + "version": "9.22.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb-schema": "^12.2.0", @@ -44681,12 +44669,12 @@ }, "packages/compass-find-in-page": { "name": "@mongodb-js/compass-find-in-page", - "version": "4.32.0", + "version": "4.32.1", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", @@ -44706,7 +44694,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -44747,21 +44735,27 @@ }, "packages/compass-generative-ai": { "name": "@mongodb-js/compass-generative-ai", - "version": "0.25.0", + "version": "0.27.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-intercom": "^0.13.2", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-intercom": "^0.14.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "mongodb": "^6.9.0", "mongodb-schema": "^12.2.0", - "react": "^17.0.2" + "react": "^17.0.2", + "react-redux": "^8.1.3", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2" }, "devDependencies": { + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -44848,16 +44842,16 @@ }, "packages/compass-global-writes": { "name": "@mongodb-js/compass-global-writes", - "version": "1.4.0", + "version": "1.6.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb-ns": "^2.4.2", @@ -45042,27 +45036,27 @@ }, "packages/compass-import-export": { "name": "@mongodb-js/compass-import-export", - "version": "7.44.0", + "version": "7.46.0", "license": "SSPL", "dependencies": { "@electron/remote": "^2.1.2", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "debug": "^4.3.4", - "electron": "^32.2.2", + "electron": "^32.2.5", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-schema": "^12.2.0", @@ -45136,28 +45130,28 @@ }, "packages/compass-indexes": { "name": "@mongodb-js/compass-indexes", - "version": "5.44.0", + "version": "5.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/mongodb-constants": "^0.10.0", "@mongodb-js/shell-bson-parser": "^1.1.2", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "numeral": "^2.0.6", @@ -45176,7 +45170,7 @@ "@types/numeral": "^2.0.5", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -45266,11 +45260,11 @@ }, "packages/compass-intercom": { "name": "@mongodb-js/compass-intercom", - "version": "0.13.2", + "version": "0.14.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", - "compass-preferences-model": "^2.29.2" + "@mongodb-js/compass-logging": "^1.4.10", + "compass-preferences-model": "^2.30.0" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -45373,12 +45367,12 @@ }, "packages/compass-logging": { "name": "@mongodb-js/compass-logging", - "version": "1.4.9", + "version": "1.4.10", "license": "SSPL", "dependencies": { "debug": "^4.3.4", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "is-electron-renderer": "^2.0.1", "mongodb-log-writer": "^1.4.2", "react": "^17.0.2" @@ -45431,10 +45425,10 @@ }, "packages/compass-maybe-protect-connection-string": { "name": "@mongodb-js/compass-maybe-protect-connection-string", - "version": "0.27.2", + "version": "0.28.0", "license": "SSPL", "dependencies": { - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "mongodb-connection-string-url": "^3.0.1" }, "devDependencies": { @@ -45484,15 +45478,15 @@ } }, "packages/compass-preferences-model": { - "version": "2.29.2", + "version": "2.30.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-user-data": "^0.3.9", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-user-data": "^0.3.10", "@mongodb-js/devtools-proxy-support": "^0.4.1", "bson": "^6.8.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "react": "^17.0.2", @@ -45550,27 +45544,27 @@ }, "packages/compass-query-bar": { "name": "@mongodb-js/compass-query-bar", - "version": "8.46.0", + "version": "8.48.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/mongodb-constants": "^0.10.0", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-query-util": "^2.2.9", @@ -45588,7 +45582,7 @@ "@mongodb-js/tsconfig-compass": "^1.0.5", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -45628,20 +45622,20 @@ }, "packages/compass-saved-aggregations-queries": { "name": "@mongodb-js/compass-saved-aggregations-queries", - "version": "1.45.0", + "version": "1.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/my-queries-storage": "^0.19.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "fuse.js": "^6.5.3", "hadron-app-registry": "^9.2.7", "mongodb-ns": "^2.4.2", @@ -45704,20 +45698,20 @@ }, "packages/compass-schema": { "name": "@mongodb-js/compass-schema", - "version": "6.46.0", + "version": "6.48.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/reflux-state-mixin": "^1.0.7", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "d3": "^3.5.17", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", @@ -45725,7 +45719,6 @@ "leaflet-defaulticon-compatibility": "^0.1.1", "leaflet-draw": "^1.0.4", "lodash": "^4.17.21", - "moment": "^2.29.4", "mongodb": "^6.9.0", "mongodb-query-util": "^2.2.9", "mongodb-schema": "^12.2.0", @@ -45739,7 +45732,7 @@ "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", @@ -45763,20 +45756,20 @@ }, "packages/compass-schema-validation": { "name": "@mongodb-js/compass-schema-validation", - "version": "6.45.0", + "version": "6.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "javascript-stringify": "^2.0.1", "lodash": "^4.17.21", @@ -45798,13 +45791,13 @@ "@types/enzyme": "^3.10.14", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^8.1.1", @@ -45840,14 +45833,14 @@ }, "packages/compass-serverstats": { "name": "@mongodb-js/compass-serverstats", - "version": "16.44.0", + "version": "16.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", "d3": "^3.5.17", "d3-timer": "^1.0.3", "debug": "^4.3.4", @@ -45889,16 +45882,16 @@ }, "packages/compass-settings": { "name": "@mongodb-js/compass-settings", - "version": "0.43.0", + "version": "0.45.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", @@ -45958,21 +45951,21 @@ }, "packages/compass-shell": { "name": "@mongodb-js/compass-shell", - "version": "3.44.0", + "version": "3.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongosh/browser-repl": "^2.3.2", "@mongosh/logging": "^2.3.2", "@mongosh/node-runtime-worker-thread": "^2.3.2", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -45988,7 +45981,7 @@ "@types/enzyme": "^3.10.14", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", @@ -46028,25 +46021,25 @@ }, "packages/compass-sidebar": { "name": "@mongodb-js/compass-sidebar", - "version": "5.45.0", + "version": "5.47.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connection-import-export": "^0.41.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-connections-navigation": "^1.44.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connection-import-export": "^0.43.0", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-connections-navigation": "^1.46.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -46070,7 +46063,7 @@ "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "nyc": "^15.1.0", "prettier": "^2.7.1", "react-dom": "^17.0.2", @@ -46108,12 +46101,12 @@ }, "packages/compass-telemetry": { "name": "@mongodb-js/compass-telemetry", - "version": "1.2.2", + "version": "1.2.3", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-logging": "^1.4.10", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "react": "^17.0.2" }, "devDependencies": { @@ -46269,11 +46262,11 @@ }, "packages/compass-user-data": { "name": "@mongodb-js/compass-user-data", - "version": "0.3.9", + "version": "0.3.10", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-utils": "^0.6.13", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", "write-file-atomic": "^5.0.1", "zod": "^3.22.3" }, @@ -46349,11 +46342,11 @@ }, "packages/compass-utils": { "name": "@mongodb-js/compass-utils", - "version": "0.6.13", + "version": "0.6.14", "license": "SSPL", "dependencies": { "@electron/remote": "^2.1.2", - "electron": "^32.2.2" + "electron": "^32.2.5" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -46403,39 +46396,39 @@ }, "packages/compass-web": { "name": "@mongodb-js/compass-web", - "version": "0.10.0", + "version": "0.11.0", "license": "SSPL", "devDependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-aggregations": "^9.47.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-databases-collections": "^1.44.0", - "@mongodb-js/compass-explain-plan": "^6.45.0", - "@mongodb-js/compass-export-to-language": "^9.21.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-global-writes": "^1.4.0", - "@mongodb-js/compass-indexes": "^5.44.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-schema": "^6.46.0", - "@mongodb-js/compass-schema-validation": "^6.45.0", - "@mongodb-js/compass-sidebar": "^5.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-welcome": "^0.43.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-aggregations": "^9.49.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-databases-collections": "^1.46.0", + "@mongodb-js/compass-explain-plan": "^6.47.0", + "@mongodb-js/compass-export-to-language": "^9.23.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-global-writes": "^1.6.0", + "@mongodb-js/compass-indexes": "^5.46.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-schema": "^6.48.0", + "@mongodb-js/compass-schema-validation": "^6.47.0", + "@mongodb-js/compass-sidebar": "^5.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-welcome": "^0.45.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", - "@mongodb-js/webpack-config-compass": "^1.4.5", + "@mongodb-js/webpack-config-compass": "^1.4.6", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", "@types/express-http-proxy": "^1.6.6", @@ -46447,12 +46440,12 @@ "bson": "^6.2.0", "buffer": "^6.0.3", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.4", "depcheck": "^1.4.1", "dns-query": "^0.11.2", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "events": "^3.3.0", "express": "^4.21.1", @@ -46463,7 +46456,7 @@ "mocha": "^10.2.0", "mongodb": "^6.9.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "os-browserify": "^0.3.0", @@ -46668,15 +46661,15 @@ }, "packages/compass-welcome": { "name": "@mongodb-js/compass-welcome", - "version": "0.43.0", + "version": "0.45.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "react": "^17.0.2", "redux": "^4.2.1", @@ -46734,19 +46727,19 @@ }, "packages/compass-workspaces": { "name": "@mongodb-js/compass-workspaces", - "version": "0.26.0", + "version": "0.28.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -46914,18 +46907,18 @@ }, "packages/connection-form": { "name": "@mongodb-js/connection-form", - "version": "1.43.0", + "version": "1.44.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/shell-bson-parser": "^1.1.2", "lodash": "^4.17.21", "mongodb": "^6.9.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-query-parser": "^4.2.3", "react": "^17.0.2" }, @@ -46981,13 +46974,13 @@ }, "packages/connection-info": { "name": "@mongodb-js/connection-info", - "version": "0.9.2", + "version": "0.9.3", "license": "SSPL", "dependencies": { "lodash": "^4.17.21", "mongodb": "^6.9.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6" + "mongodb-data-service": "^22.23.7" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -47107,19 +47100,19 @@ }, "packages/connection-storage": { "name": "@mongodb-js/connection-storage", - "version": "0.22.3", + "version": "0.23.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", - "electron": "^32.2.2", + "compass-preferences-model": "^2.30.0", + "electron": "^32.2.5", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "keytar": "^7.9.0", "lodash": "^4.17.21", "mongodb-connection-string-url": "^3.0.1", @@ -47172,11 +47165,11 @@ }, "packages/data-service": { "name": "mongodb-data-service", - "version": "22.23.6", + "version": "22.23.7", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-utils": "^0.6.13", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", "@mongodb-js/devtools-connect": "^3.3.1", "@mongodb-js/devtools-proxy-support": "^0.4.1", "bson": "^6.8.0", @@ -47357,13 +47350,13 @@ }, "packages/database-model": { "name": "mongodb-database-model", - "version": "2.23.6", + "version": "2.23.7", "license": "SSPL", "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6" + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -47424,24 +47417,24 @@ }, "packages/databases-collections": { "name": "@mongodb-js/compass-databases-collections", - "version": "1.44.0", + "version": "1.46.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/databases-collections-list": "^1.42.0", - "@mongodb-js/my-queries-storage": "^0.18.0", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/databases-collections-list": "^1.44.0", + "@mongodb-js/my-queries-storage": "^0.19.0", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "prop-types": "^15.7.2", @@ -47471,15 +47464,15 @@ }, "packages/databases-collections-list": { "name": "@mongodb-js/databases-collections-list", - "version": "1.42.0", + "version": "1.44.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", + "compass-preferences-model": "^2.30.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, @@ -47723,11 +47716,11 @@ } }, "packages/hadron-build": { - "version": "25.5.13", + "version": "25.5.14", "hasInstallScript": true, "license": "SSPL", "dependencies": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@mongodb-js/devtools-github-repo": "^1.4.1", "@mongodb-js/dl-center": "^1.0.1", "@mongodb-js/electron-wix-msi": "^3.0.0", @@ -47740,7 +47733,7 @@ "debug": "^4.3.4", "del": "^2.0.2", "download": "^8.0.0", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-packager": "^15.5.1", "electron-packager-plugin-non-proprietary-codecs-ffmpeg": "^1.0.2", "flatnest": "^1.0.0", @@ -48600,11 +48593,11 @@ } }, "packages/hadron-ipc": { - "version": "3.2.24", + "version": "3.2.25", "license": "SSPL", "dependencies": { "debug": "^4.3.4", - "electron": "^32.2.2", + "electron": "^32.2.5", "is-electron-renderer": "^2.0.1" }, "devDependencies": { @@ -48671,13 +48664,13 @@ }, "packages/instance-model": { "name": "mongodb-instance-model", - "version": "12.24.6", + "version": "12.24.7", "license": "SSPL", "dependencies": { "ampersand-model": "^8.0.1", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", - "mongodb-database-model": "^2.23.6" + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", + "mongodb-database-model": "^2.23.7" }, "devDependencies": { "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -48943,11 +48936,11 @@ }, "packages/my-queries-storage": { "name": "@mongodb-js/my-queries-storage", - "version": "0.18.0", + "version": "0.19.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-user-data": "^0.3.9", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-user-data": "^0.3.10", "bson": "^6.8.0", "hadron-app-registry": "^9.2.7", "react": "^17.0.2" @@ -49564,13 +49557,13 @@ }, "scripts": { "name": "@mongodb-js/compass-scripts", - "version": "0.16.24", + "version": "0.16.25", "license": "SSPL", "dependencies": { "@babel/core": "^7.24.3", "@mongodb-js/monorepo-tools": "^1.1.1", "commander": "^11.0.0", - "electron": "^32.2.2", + "electron": "^32.2.5", "jsdom": "^24.1.3", "make-fetch-happen": "^10.2.1", "pacote": "^11.3.5", @@ -49701,41 +49694,6 @@ } } }, - "scripts/node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "scripts/node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "scripts/node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "scripts/node_modules/nwsapi": { "version": "2.2.12", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", @@ -52361,9 +52319,9 @@ } }, "@electron/rebuild": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", - "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.1.tgz", + "integrity": "sha512-sKGD+xav4Gh25+LcLY0rjIwcCFTw+f/HU1pB48UVbwxXXRGaXEqIH0AaYKN46dgd/7+6kuiDXzoyAEvx1zCsdw==", "requires": { "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", @@ -54897,12 +54855,12 @@ "@mongodb-js/atlas-service": { "version": "file:packages/atlas-service", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/devtools-connect": "^3.3.1", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", @@ -54915,18 +54873,17 @@ "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "mocha": "^10.2.0", "nyc": "^15.1.0", "prettier": "^2.7.1", "react": "^17.0.2", - "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2", "sinon": "^9.2.3", @@ -54964,24 +54921,24 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/explain-plan-helper": "^1.2.4", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-constants": "^0.10.0", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/shell-bson-parser": "^1.1.2", "@mongodb-js/testing-library-compass": "^1.0.2", @@ -54992,7 +54949,7 @@ "@types/semver": "^7.3.9", "bson": "^6.8.0", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", @@ -55003,10 +54960,10 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-schema": "^12.2.0", @@ -55050,10 +55007,10 @@ "@mongodb-js/compass-app-stores": { "version": "file:packages/compass-app-stores", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55068,9 +55025,9 @@ "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -55105,13 +55062,13 @@ "@mongodb-js/compass-collection": { "version": "file:packages/compass-collection", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-constants": "^0.10.2", @@ -55125,13 +55082,13 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", + "mongodb-collection-model": "^5.23.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -55359,9 +55316,9 @@ "@mongodb-js/compass-connection-import-export": { "version": "file:packages/compass-connection-import-export", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55373,11 +55330,11 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -55414,14 +55371,14 @@ "@mongodb-js/compass-connections": { "version": "file:packages/compass-connections", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55435,7 +55392,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.8.0", "chai": "^4.3.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", @@ -55444,7 +55401,7 @@ "mocha": "^10.2.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "nyc": "^15.1.0", "prettier": "^2.7.1", "react": "^17.0.2", @@ -55483,11 +55440,11 @@ "@mongodb-js/compass-connections-navigation": { "version": "file:packages/compass-connections-navigation", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55502,7 +55459,7 @@ "@types/react-window": "^1.8.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -55544,21 +55501,21 @@ "@mongodb-js/compass-crud": { "version": "file:packages/compass-crud", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/explain-plan-helper": "^1.2.4", "@mongodb-js/mocha-config-compass": "^1.4.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/reflux-state-mixin": "^1.0.7", "@mongodb-js/shell-bson-parser": "^1.1.2", @@ -55571,9 +55528,9 @@ "bson": "^6.8.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", @@ -55583,8 +55540,8 @@ "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-data-service": "^22.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-data-service": "^22.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "numeral": "^2.0.6", @@ -55608,32 +55565,32 @@ "@mongodb-js/compass-databases-collections": { "version": "file:packages/databases-collections", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/databases-collections-list": "^1.42.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/databases-collections-list": "^1.44.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", "bson": "^6.8.0", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "enzyme": "^3.11.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "nyc": "^15.1.0", @@ -55682,7 +55639,7 @@ "@codemirror/state": "^6.1.4", "@codemirror/view": "^6.7.1", "@lezer/highlight": "^1.2.0", - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-constants": "^0.10.0", @@ -55732,12 +55689,12 @@ "@mongodb-js/compass-explain-plan": { "version": "file:packages/compass-explain-plan", "requires": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/explain-plan-helper": "^1.2.4", "@mongodb-js/mocha-config-compass": "^1.4.2", @@ -55748,12 +55705,12 @@ "@types/d3-flextree": "^2.1.0", "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "d3": "^3.5.17", "d3-flextree": "^2.1.2", "d3-hierarchy": "^3.1.2", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", @@ -55802,12 +55759,12 @@ "@mongodb-js/compass-export-to-language": { "version": "file:packages/compass-export-to-language", "requires": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55816,7 +55773,7 @@ "@mongodb-js/tsconfig-compass": "^1.0.5", "bson-transpilers": "^3.0.10", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", @@ -55858,8 +55815,8 @@ "@mongodb-js/compass-field-store": { "version": "file:packages/compass-field-store", "requires": { - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55912,7 +55869,7 @@ "@mongodb-js/compass-find-in-page": { "version": "file:packages/compass-find-in-page", "requires": { - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55926,11 +55883,11 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "mocha": "^10.2.0", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -55971,10 +55928,13 @@ "@mongodb-js/compass-generative-ai": { "version": "file:packages/compass-generative-ai", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-intercom": "^0.13.2", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-intercom": "^0.14.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -55987,7 +55947,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.8.0", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", @@ -55999,6 +55959,9 @@ "p-queue": "^7.4.1", "prettier": "^2.7.1", "react": "^17.0.2", + "react-redux": "^8.1.3", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", "sinon": "^9.2.3", "typescript": "^5.0.4", "xvfb-maybe": "^0.2.1" @@ -56051,13 +56014,13 @@ "@mongodb-js/compass-global-writes": { "version": "file:packages/compass-global-writes", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -56169,14 +56132,14 @@ "version": "file:packages/compass-import-export", "requires": { "@electron/remote": "^2.1.2", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -56195,19 +56158,19 @@ "bson": "^6.8.0", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-schema": "^12.2.0", @@ -56253,16 +56216,16 @@ "@mongodb-js/compass-indexes": { "version": "file:packages/compass-indexes", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-constants": "^0.10.0", @@ -56273,17 +56236,17 @@ "@types/numeral": "^2.0.5", "bson": "^6.8.0", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "numeral": "^2.0.6", @@ -56331,7 +56294,7 @@ "@mongodb-js/compass-intercom": { "version": "file:packages/compass-intercom", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -56340,7 +56303,7 @@ "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", @@ -56447,7 +56410,7 @@ "depcheck": "^1.4.1", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "is-electron-renderer": "^2.0.1", "mocha": "^10.2.0", "mongodb-log-writer": "^1.4.2", @@ -56493,7 +56456,7 @@ "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", @@ -56532,35 +56495,35 @@ "@mongodb-js/compass-query-bar": { "version": "file:packages/compass-query-bar", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-constants": "^0.10.0", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", "bson": "^6.8.0", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-query-util": "^2.2.9", @@ -56601,17 +56564,17 @@ "@mongodb-js/compass-saved-aggregations-queries": { "version": "file:packages/compass-saved-aggregations-queries", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", @@ -56623,7 +56586,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.8.0", "chai": "^4.3.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", @@ -56670,17 +56633,17 @@ "@mongodb-js/compass-schema": { "version": "file:packages/compass-schema", "requires": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/reflux-state-mixin": "^1.0.7", "@mongodb-js/testing-library-compass": "^1.0.2", @@ -56693,7 +56656,7 @@ "@types/react-dom": "^17.0.10", "bson": "^6.8.0", "chai": "^4.3.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "d3": "^3.5.17", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", @@ -56705,7 +56668,6 @@ "leaflet-draw": "^1.0.4", "lodash": "^4.17.21", "mocha": "^10.2.0", - "moment": "^2.29.4", "mongodb": "^6.9.0", "mongodb-query-util": "^2.2.9", "mongodb-schema": "^12.2.0", @@ -56747,15 +56709,15 @@ "@mongodb-js/compass-schema-validation": { "version": "file:packages/compass-schema-validation", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -56764,18 +56726,18 @@ "@types/enzyme": "^3.10.14", "bson": "^6.8.0", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "javascript-stringify": "^2.0.1", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "nyc": "^15.1.0", @@ -56800,7 +56762,7 @@ "@mongodb-js/tsconfig-compass": "^1.0.5", "commander": "^11.0.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "jsdom": "^24.1.3", "make-fetch-happen": "^10.2.1", @@ -56890,34 +56852,6 @@ "whatwg-url": "^14.0.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" - }, - "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "requires": { - "debug": "^4.3.4" - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - } } }, "nwsapi": { @@ -56984,11 +56918,11 @@ "@mongodb-js/compass-serverstats": { "version": "file:packages/compass-serverstats", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57031,10 +56965,10 @@ "@mongodb-js/compass-settings": { "version": "file:packages/compass-settings", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57047,12 +56981,12 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "mocha": "^10.2.0", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -57093,13 +57027,13 @@ "@mongodb-js/compass-shell": { "version": "file:packages/compass-shell", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57111,9 +57045,9 @@ "@types/enzyme": "^3.10.14", "bson": "^6.8.0", "chai": "^4.2.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", @@ -57154,17 +57088,17 @@ "@mongodb-js/compass-sidebar": { "version": "file:packages/compass-sidebar", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connection-import-export": "^0.41.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-connections-navigation": "^1.44.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connection-import-export": "^0.43.0", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-connections-navigation": "^1.46.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57177,7 +57111,7 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", @@ -57185,8 +57119,8 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", - "mongodb-data-service": "^22.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-data-service": "^22.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -57227,7 +57161,7 @@ "@mongodb-js/compass-telemetry": { "version": "file:packages/compass-telemetry", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57240,7 +57174,7 @@ "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "mocha": "^10.2.0", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -57375,8 +57309,8 @@ "@mongodb-js/compass-user-data": { "version": "file:packages/compass-user-data", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-utils": "^0.6.13", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57447,7 +57381,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", @@ -57484,36 +57418,36 @@ "@mongodb-js/compass-web": { "version": "file:packages/compass-web", "requires": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-aggregations": "^9.47.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-databases-collections": "^1.44.0", - "@mongodb-js/compass-explain-plan": "^6.45.0", - "@mongodb-js/compass-export-to-language": "^9.21.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-global-writes": "^1.4.0", - "@mongodb-js/compass-indexes": "^5.44.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-schema": "^6.46.0", - "@mongodb-js/compass-schema-validation": "^6.45.0", - "@mongodb-js/compass-sidebar": "^5.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-welcome": "^0.43.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-aggregations": "^9.49.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-databases-collections": "^1.46.0", + "@mongodb-js/compass-explain-plan": "^6.47.0", + "@mongodb-js/compass-export-to-language": "^9.23.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-global-writes": "^1.6.0", + "@mongodb-js/compass-indexes": "^5.46.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-schema": "^6.48.0", + "@mongodb-js/compass-schema-validation": "^6.47.0", + "@mongodb-js/compass-sidebar": "^5.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-welcome": "^0.45.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", - "@mongodb-js/webpack-config-compass": "^1.4.5", + "@mongodb-js/webpack-config-compass": "^1.4.6", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", "@types/express-http-proxy": "^1.6.6", @@ -57525,12 +57459,12 @@ "bson": "^6.2.0", "buffer": "^6.0.3", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.4", "depcheck": "^1.4.1", "dns-query": "^0.11.2", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "events": "^3.3.0", "express": "^4.21.1", @@ -57541,7 +57475,7 @@ "mocha": "^10.2.0", "mongodb": "^6.9.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "os-browserify": "^0.3.0", @@ -57717,11 +57651,11 @@ "@mongodb-js/compass-welcome": { "version": "file:packages/compass-welcome", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57733,7 +57667,7 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", @@ -57776,10 +57710,10 @@ "@mongodb-js/compass-workspaces": { "version": "file:packages/compass-workspaces", "requires": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57793,15 +57727,15 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.8.0", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -57918,9 +57852,9 @@ "@mongodb-js/connection-form": { "version": "file:packages/connection-form", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -57942,7 +57876,7 @@ "mongodb": "^6.9.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-query-parser": "^4.2.3", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -57994,7 +57928,7 @@ "mocha": "^10.2.0", "mongodb": "^6.9.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "nyc": "^15.1.0", "prettier": "^2.7.1", "sinon": "^17.0.1", @@ -58104,11 +58038,11 @@ "@mongodb-js/connection-storage": { "version": "file:packages/connection-storage", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -58118,12 +58052,12 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.8.0", "chai": "^4.3.6", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "keytar": "^7.9.0", "lodash": "^4.17.21", "mocha": "^10.2.0", @@ -58160,11 +58094,11 @@ "@mongodb-js/databases-collections-list": { "version": "file:packages/databases-collections-list", "requires": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -58176,7 +58110,7 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -58797,8 +58731,8 @@ "@mongodb-js/my-queries-storage": { "version": "file:packages/my-queries-storage", "requires": { - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-user-data": "^0.3.9", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-user-data": "^0.3.10", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -59315,7 +59249,7 @@ "core-js": "^3.17.3", "css-loader": "^4.3.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", @@ -66692,9 +66626,9 @@ "compass-e2e-tests": { "version": "file:packages/compass-e2e-tests", "requires": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/oidc-mock-provider": "^0.9.3", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -66708,15 +66642,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.29.2", - "cross-spawn": "^7.0.3", + "compass-preferences-model": "^2.30.0", + "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", - "electron-to-chromium": "^1.5.49", + "electron": "^32.2.5", + "electron-to-chromium": "^1.5.62", "eslint": "^7.25.0", "glob": "^10.2.5", - "hadron-build": "^25.5.13", + "hadron-build": "^25.5.14", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", @@ -66996,8 +66930,8 @@ "compass-preferences-model": { "version": "file:packages/compass-preferences-model", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-user-data": "^0.3.9", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-user-data": "^0.3.10", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", @@ -67010,7 +66944,7 @@ "depcheck": "^1.4.1", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "mocha": "^10.2.0", @@ -67538,9 +67472,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -69124,9 +69058,9 @@ } }, "electron": { - "version": "32.2.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.2.2.tgz", - "integrity": "sha512-c7TRE42JcgEmJ4elJyCdKk/2os0UX7YMkRDeXBkxFEoM34iX1/2x+c5T9PgeroKz8FEG7omRU5TvjulqVtXvdw==", + "version": "32.2.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.2.5.tgz", + "integrity": "sha512-8t5IGOvms/JTcLNnlOH7rFCAJIZJAazwYrF7kQsKQSLzDHh4z8mGFrU11NN3W4bIT6Yg5DJNniSWz3O5wJLmCw==", "requires": { "@electron/get": "^2.0.0", "@types/node": "^20.9.0", @@ -69490,9 +69424,9 @@ } }, "electron-to-chromium": { - "version": "1.5.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", - "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==" + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==" }, "electron-window": { "version": "0.8.1", @@ -72734,7 +72668,7 @@ "hadron-build": { "version": "file:packages/hadron-build", "requires": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@mongodb-js/devtools-github-repo": "^1.4.1", "@mongodb-js/dl-center": "^1.0.1", "@mongodb-js/electron-wix-msi": "^3.0.0", @@ -72750,7 +72684,7 @@ "del": "^2.0.2", "depcheck": "^1.4.1", "download": "^8.0.0", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-installer-debian": "^3.2.0", "electron-installer-dmg": "^5.0.1", "electron-installer-redhat": "^2.0.0", @@ -73474,7 +73408,7 @@ "chai": "^4.3.6", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "eslint": "^7.25.0", "is-electron-renderer": "^2.0.1", "mocha": "^10.2.0", @@ -78516,7 +78450,7 @@ "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "xvfb-maybe": "^0.2.1" } @@ -78524,52 +78458,52 @@ "mongodb-compass": { "version": "file:packages/compass", "requires": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@electron/remote": "^2.1.2", - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-aggregations": "^9.47.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connection-import-export": "^0.41.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-databases-collections": "^1.44.0", - "@mongodb-js/compass-explain-plan": "^6.45.0", - "@mongodb-js/compass-export-to-language": "^9.21.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-find-in-page": "^4.32.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-global-writes": "^1.4.0", - "@mongodb-js/compass-import-export": "^7.44.0", - "@mongodb-js/compass-indexes": "^5.44.0", - "@mongodb-js/compass-intercom": "^0.13.2", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-saved-aggregations-queries": "^1.45.0", - "@mongodb-js/compass-schema": "^6.46.0", - "@mongodb-js/compass-schema-validation": "^6.45.0", - "@mongodb-js/compass-serverstats": "^16.44.0", - "@mongodb-js/compass-settings": "^0.43.0", - "@mongodb-js/compass-shell": "^3.44.0", - "@mongodb-js/compass-sidebar": "^5.45.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-welcome": "^0.43.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-aggregations": "^9.49.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connection-import-export": "^0.43.0", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-databases-collections": "^1.46.0", + "@mongodb-js/compass-explain-plan": "^6.47.0", + "@mongodb-js/compass-export-to-language": "^9.23.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-find-in-page": "^4.32.1", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-global-writes": "^1.6.0", + "@mongodb-js/compass-import-export": "^7.46.0", + "@mongodb-js/compass-indexes": "^5.46.0", + "@mongodb-js/compass-intercom": "^0.14.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-saved-aggregations-queries": "^1.47.0", + "@mongodb-js/compass-schema": "^6.48.0", + "@mongodb-js/compass-schema-validation": "^6.47.0", + "@mongodb-js/compass-serverstats": "^16.46.0", + "@mongodb-js/compass-settings": "^0.45.0", + "@mongodb-js/compass-shell": "^3.46.0", + "@mongodb-js/compass-sidebar": "^5.47.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-welcome": "^0.45.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-storage": "^0.23.0", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/get-os-info": "^0.3.24", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/mongodb-downloader": "^0.3.5", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/prettier-config-compass": "^1.0.2", "@mongodb-js/sbom-tools": "^0.7.0", "@mongodb-js/testing-library-compass": "^1.0.2", "@mongodb-js/tsconfig-compass": "^1.0.5", - "@mongodb-js/webpack-config-compass": "^1.4.5", + "@mongodb-js/webpack-config-compass": "^1.4.6", "@mongosh/node-runtime-worker-thread": "^2.3.2", "@segment/analytics-node": "^1.1.4", "ampersand-view": "^9.0.0", @@ -78577,11 +78511,11 @@ "chalk": "^4.1.2", "clean-stack": "^2.0.0", "clipboard": "^2.0.6", - "compass-preferences-model": "^2.29.2", - "cross-spawn": "^7.0.3", + "compass-preferences-model": "^2.30.0", + "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-devtools-installer": "^3.2.0", "electron-dl": "^3.5.0", "electron-mocha": "^12.2.0", @@ -78589,8 +78523,8 @@ "ensure-error": "^3.0.1", "eslint": "^7.25.0", "hadron-app-registry": "^9.2.7", - "hadron-build": "^25.5.13", - "hadron-ipc": "^3.2.24", + "hadron-build": "^25.5.14", + "hadron-ipc": "^3.2.25", "kerberos": "^2.2.0", "keytar": "^7.9.0", "local-links": "^1.4.0", @@ -78602,8 +78536,8 @@ "mongodb-client-encryption": "^6.1.0", "mongodb-cloud-info": "^2.1.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-data-service": "^22.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-log-writer": "^1.4.2", "mongodb-ns": "^2.4.2", "os-dns-native": "^1.2.1", @@ -78668,9 +78602,9 @@ "mongodb-data-service": { "version": "file:packages/data-service", "requires": { - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-logging": "^1.4.10", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/compass-utils": "^0.6.13", + "@mongodb-js/compass-utils": "^0.6.14", "@mongodb-js/devtools-connect": "^3.3.1", "@mongodb-js/devtools-docker-test-envs": "^1.3.3", "@mongodb-js/devtools-proxy-support": "^0.4.1", @@ -78823,8 +78757,8 @@ "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6" + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7" } }, "mongodb-download-url": { @@ -78858,9 +78792,9 @@ "depcheck": "^1.4.1", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", - "mongodb-database-model": "^2.23.6" + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", + "mongodb-database-model": "^2.23.7" } }, "mongodb-js-cli": { diff --git a/packages/atlas-service/package.json b/packages/atlas-service/package.json index 8166484a3ed..1ab5b89d5dd 100644 --- a/packages/atlas-service/package.json +++ b/packages/atlas-service/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.31.0", + "version": "0.32.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -73,22 +73,21 @@ "typescript": "^5.0.4" }, "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-user-data": "^0.3.9", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-user-data": "^0.3.10", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/devtools-connect": "^3.3.1", "@mongodb-js/devtools-proxy-support": "^0.4.1", "@mongodb-js/oidc-plugin": "^1.1.1", "hadron-app-registry": "^9.2.7", - "compass-preferences-model": "^2.29.2", - "electron": "^32.2.2", - "hadron-ipc": "^3.2.24", + "compass-preferences-model": "^2.30.0", + "electron": "^32.2.5", + "hadron-ipc": "^3.2.25", "lodash": "^4.17.21", "react": "^17.0.2", - "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" } diff --git a/packages/atlas-service/src/atlas-auth-service.ts b/packages/atlas-service/src/atlas-auth-service.ts index 22cf698a786..76f2ff6acf8 100644 --- a/packages/atlas-service/src/atlas-auth-service.ts +++ b/packages/atlas-service/src/atlas-auth-service.ts @@ -4,7 +4,7 @@ import type { AtlasUserInfo } from './util'; export type ArgsWithSignal> = T & { signal?: AbortSignal; }; -export type SignInPrompt = 'none' | 'ai-promo-modal'; +export type SignInPrompt = 'none'; type AtlasAuthServiceEvents = { 'signed-in': []; diff --git a/packages/atlas-service/src/atlas-service.spec.ts b/packages/atlas-service/src/atlas-service.spec.ts index 956ee370462..b63d7a9a1d6 100644 --- a/packages/atlas-service/src/atlas-service.spec.ts +++ b/packages/atlas-service/src/atlas-service.spec.ts @@ -132,4 +132,30 @@ describe('AtlasService', function () { ); expect(getAuthHeadersFn.calledOnce).to.be.true; }); + + it('should set CSRF headers when available', async function () { + const fetchStub = sandbox.stub().resolves({ status: 200, ok: true }); + global.fetch = fetchStub; + document.head.append( + (() => { + const el = document.createElement('meta'); + el.setAttribute('name', 'csrf-token'); + el.setAttribute('content', 'token'); + return el; + })() + ); + document.head.append( + (() => { + const el = document.createElement('meta'); + el.setAttribute('name', 'CSRF-TIME'); + el.setAttribute('content', 'time'); + return el; + })() + ); + await atlasService.fetch('/foo/bar', { method: 'POST' }); + expect(fetchStub.firstCall.lastArg.headers).to.deep.eq({ + 'X-CSRF-Time': 'time', + 'X-CSRF-Token': 'token', + }); + }); }); diff --git a/packages/atlas-service/src/atlas-service.ts b/packages/atlas-service/src/atlas-service.ts index dd80e78bfa3..bdd401f7fdb 100644 --- a/packages/atlas-service/src/atlas-service.ts +++ b/packages/atlas-service/src/atlas-service.ts @@ -19,6 +19,23 @@ function normalizePath(path?: string) { return encodeURI(path); } +function getCSRFHeaders() { + return { + 'X-CSRF-Token': + document + .querySelector('meta[name="csrf-token" i]') + ?.getAttribute('content') ?? '', + 'X-CSRF-Time': + document + .querySelector('meta[name="csrf-time" i]') + ?.getAttribute('content') ?? '', + }; +} + +function shouldAddCSRFHeaders(method = 'get') { + return !/^(get|head|options|trace)$/.test(method.toLowerCase()); +} + export class AtlasService { private config: AtlasServiceConfig; constructor( @@ -29,12 +46,8 @@ export class AtlasService { ) { this.config = getAtlasConfig(preferences); } - adminApiEndpoint(path?: string, requestId?: string): string { - const uri = `${this.config.atlasApiBaseUrl}${normalizePath(path)}`; - const query = requestId - ? `?request_id=${encodeURIComponent(requestId)}` - : ''; - return `${uri}${query}`; + adminApiEndpoint(path?: string): string { + return `${this.config.atlasApiBaseUrl}${normalizePath(path)}`; } cloudEndpoint(path?: string): string { return `${this.config.cloudBaseUrl}${normalizePath(path)}`; @@ -64,6 +77,7 @@ export class AtlasService { ...init, headers: { ...this.options?.defaultHeaders, + ...(shouldAddCSRFHeaders(init?.method) && getCSRFHeaders()), ...init?.headers, }, }); diff --git a/packages/atlas-service/src/compass-atlas-auth-service.ts b/packages/atlas-service/src/compass-atlas-auth-service.ts index d4ee83c9072..51f3fed1535 100644 --- a/packages/atlas-service/src/compass-atlas-auth-service.ts +++ b/packages/atlas-service/src/compass-atlas-auth-service.ts @@ -1,9 +1,6 @@ import { ipcRenderer } from 'hadron-ipc'; import type { CompassAuthService as AtlasServiceMain } from './main'; -import { - signInWithModalPrompt, - signInWithoutPrompt, -} from './store/atlas-signin-reducer'; +import { signInWithoutPrompt } from './store/atlas-signin-reducer'; import { getStore } from './store/atlas-signin-store'; import { AtlasAuthService } from './atlas-auth-service'; import type { ArgsWithSignal, SignInPrompt } from './atlas-auth-service'; @@ -46,8 +43,6 @@ export class CompassAtlasAuthService extends AtlasAuthService { switch (promptType) { case 'none': return getStore().dispatch(signInWithoutPrompt({ signal })); - case 'ai-promo-modal': - return getStore().dispatch(signInWithModalPrompt({ signal })); default: return this.ipc.signIn({ signal }); } diff --git a/packages/atlas-service/src/renderer.ts b/packages/atlas-service/src/renderer.ts index 2407aee7b21..f69e1ce5225 100644 --- a/packages/atlas-service/src/renderer.ts +++ b/packages/atlas-service/src/renderer.ts @@ -1,12 +1,11 @@ import { registerHadronPlugin } from 'hadron-app-registry'; import { activatePlugin } from './store/atlas-signin-store'; import { atlasAuthServiceLocator } from './provider'; -import { AtlasSignIn } from './components'; export const AtlasAuthPlugin = registerHadronPlugin( { name: 'AtlasAuth', - component: AtlasSignIn, + component: () => null, activate: activatePlugin, }, { diff --git a/packages/atlas-service/src/store/atlas-signin-reducer.spec.ts b/packages/atlas-service/src/store/atlas-signin-reducer.spec.ts index 653097138ab..0c13a4bc062 100644 --- a/packages/atlas-service/src/store/atlas-signin-reducer.spec.ts +++ b/packages/atlas-service/src/store/atlas-signin-reducer.spec.ts @@ -5,8 +5,6 @@ import { cancelSignIn, attemptId, AttemptStateMap, - signInWithModalPrompt, - closeSignInModal, signInWithoutPrompt, } from './atlas-signin-reducer'; import { expect } from 'chai'; @@ -176,7 +174,7 @@ describe('atlasSignInReducer', function () { atlasAuthService: mockAtlasService as any, }); - void store.dispatch(signInWithModalPrompt()).catch(() => {}); + void store.dispatch(signInWithoutPrompt()).catch(() => {}); await Promise.all([ store.dispatch(signIn()), @@ -186,101 +184,6 @@ describe('atlasSignInReducer', function () { }); }); - describe('signInWithModalPrompt', function () { - it('should resolve when user finishes sign in with prompt flow', async function () { - const mockAtlasService = { - isAuthenticated: sandbox.stub().resolves(false), - signIn: sandbox.stub().resolves({ sub: '1234' }), - getUserInfo: sandbox.stub().resolves({ sub: '1234' }), - emit: sandbox.stub(), - }; - const store = configureStore({ - atlasAuthService: mockAtlasService as any, - }); - - const signInPromise = store.dispatch(signInWithModalPrompt()); - await store.dispatch(signIn()); - await signInPromise; - - expect(store.getState()).to.have.property('state', 'success'); - }); - - it('should reject if sign in flow fails', async function () { - const mockAtlasService = { - isAuthenticated: sandbox.stub().resolves(false), - signIn: sandbox.stub().rejects(new Error('Whoops!')), - getUserInfo: sandbox.stub().resolves({ sub: '1234' }), - emit: sandbox.stub(), - }; - const store = configureStore({ - atlasAuthService: mockAtlasService as any, - }); - - const signInPromise = store.dispatch(signInWithModalPrompt()); - await store.dispatch(signIn()); - - try { - await signInPromise; - throw new Error('Expected signInPromise to throw'); - } catch (err) { - expect(err).to.have.property('message', 'Whoops!'); - } - - expect(store.getState()).to.have.property('state', 'error'); - }); - - it('should reject if user dismissed the modal', async function () { - const mockAtlasService = { - isAuthenticated: sandbox.stub().resolves(false), - signIn: sandbox.stub().resolves({ sub: '1234' }), - getUserInfo: sandbox.stub().resolves({ sub: '1234' }), - emit: sandbox.stub(), - }; - const store = configureStore({ - atlasAuthService: mockAtlasService as any, - }); - - const signInPromise = store.dispatch(signInWithModalPrompt()); - store.dispatch(closeSignInModal()); - - try { - await signInPromise; - throw new Error('Expected signInPromise to throw'); - } catch (err) { - expect(err).to.have.property('message', 'This operation was aborted'); - } - - expect(store.getState()).to.have.property('state', 'canceled'); - }); - - it('should reject if provided signal was aborted', async function () { - const mockAtlasService = { - isAuthenticated: sandbox.stub().resolves(false), - signIn: sandbox.stub().resolves({ sub: '1234' }), - getUserInfo: sandbox.stub().resolves({ sub: '1234' }), - emit: sandbox.stub(), - }; - const store = configureStore({ - atlasAuthService: mockAtlasService as any, - }); - - const c = new AbortController(); - const signInPromise = store.dispatch( - signInWithModalPrompt({ signal: c.signal }) - ); - c.abort(new Error('Aborted from outside')); - - try { - await signInPromise; - throw new Error('Expected signInPromise to throw'); - } catch (err) { - expect(err).to.have.property('message', 'Aborted from outside'); - } - - expect(store.getState()).to.have.property('state', 'canceled'); - }); - }); - describe('signInWithoutPrompt', function () { it('should resolve when sign in flow finishes', async function () { const mockAtlasService = { diff --git a/packages/atlas-service/src/store/atlas-signin-reducer.ts b/packages/atlas-service/src/store/atlas-signin-reducer.ts index b1d4c4d8b6f..92561fdee0c 100644 --- a/packages/atlas-service/src/store/atlas-signin-reducer.ts +++ b/packages/atlas-service/src/store/atlas-signin-reducer.ts @@ -14,7 +14,6 @@ export function isAction( export type AtlasSignInState = { error: string | null; - isModalOpen: boolean; // For managing attempt state that doesn't belong in the store currentAttemptId: number | null; } & ( @@ -37,8 +36,6 @@ export type AtlasSignInThunkAction< > = ThunkAction; export const enum AtlasSignInActions { - OpenSignInModal = 'atlas-service/atlas-signin/OpenSignInModal', - CloseSignInModal = 'atlas-service/atlas-signin/CloseSignInModal', RestoringStart = 'atlas-service/atlas-signin/StartRestoring', RestoringFailed = 'atlas-service/atlas-signin/RestoringFailed', RestoringSuccess = 'atlas-service/atlas-signin/RestoringSuccess', @@ -52,14 +49,6 @@ export const enum AtlasSignInActions { SignedOut = 'atlas-service/atlas-signin/SignedOut', } -export type AtlasSignInOpenModalAction = { - type: AtlasSignInActions.OpenSignInModal; -}; - -export type AtlasSignInCloseModalAction = { - type: AtlasSignInActions.CloseSignInModal; -}; - export type AtlasSignInRestoringStartAction = { type: AtlasSignInActions.RestoringStart; }; @@ -250,24 +239,6 @@ const reducer: Reducer = ( return { ...INITIAL_STATE, state: 'canceled' }; } - if ( - isAction( - action, - AtlasSignInActions.OpenSignInModal - ) - ) { - return { ...state, isModalOpen: true }; - } - - if ( - isAction( - action, - AtlasSignInActions.CloseSignInModal - ) - ) { - return { ...state, isModalOpen: false }; - } - if ( isAction( action, @@ -337,29 +308,6 @@ const startAttempt = (fn: () => void): AtlasSignInThunkAction => { }; }; -export const signInWithModalPrompt = ({ - signal, -}: { signal?: AbortSignal } = {}): AtlasSignInThunkAction< - Promise -> => { - return async (dispatch, getState) => { - // Nothing to do if we already signed in - const { state, userInfo } = getState(); - if (state === 'success') { - return userInfo; - } - const attempt = dispatch( - startAttempt(() => { - dispatch(openSignInModal()); - }) - ); - signal?.addEventListener('abort', () => { - dispatch(closeSignInModal(signal.reason)); - }); - return attempt.promise; - }; -}; - export const signInWithoutPrompt = ({ signal, }: { signal?: AbortSignal } = {}): AtlasSignInThunkAction< @@ -383,12 +331,8 @@ export const signInWithoutPrompt = ({ }; }; -export const openSignInModal = () => { - return { type: AtlasSignInActions.OpenSignInModal }; -}; - /** - * Sign in from the opt in window + * Sign into Atlas. To be called when the user isn't signed in yet. */ export const signIn = (): AtlasSignInThunkAction> => { return async (dispatch, getState, { atlasAuthService }) => { @@ -434,15 +378,6 @@ export const signIn = (): AtlasSignInThunkAction> => { }; }; -export const closeSignInModal = ( - reason?: any -): AtlasSignInThunkAction => { - return (dispatch) => { - dispatch(cancelSignIn(reason)); - dispatch({ type: AtlasSignInActions.CloseSignInModal }); - }; -}; - export const cancelSignIn = (reason?: any): AtlasSignInThunkAction => { return (dispatch, getState) => { // Can't cancel sign in after the flow was finished indicated by current diff --git a/packages/collection-model/package.json b/packages/collection-model/package.json index 42c5c11a3e7..8dceec2ff92 100644 --- a/packages/collection-model/package.json +++ b/packages/collection-model/package.json @@ -2,7 +2,7 @@ "name": "mongodb-collection-model", "description": "MongoDB collection model", "author": "Lucas Hrabovsky ", - "version": "5.23.6", + "version": "5.23.7", "bugs": { "url": "https://jira.mongodb.org/projects/COMPASS/issues", "email": "compass@mongodb.com" @@ -31,7 +31,7 @@ "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2" }, "devDependencies": { diff --git a/packages/compass-aggregations/package.json b/packages/compass-aggregations/package.json index 9fc31abeffb..7d4d1c19efd 100644 --- a/packages/compass-aggregations/package.json +++ b/packages/compass-aggregations/package.json @@ -2,7 +2,7 @@ "name": "@mongodb-js/compass-aggregations", "description": "Compass Aggregation Pipeline Builder", "private": true, - "version": "9.47.0", + "version": "9.49.0", "main": "dist/index.js", "compass:main": "src/index.ts", "types": "dist/index.d.ts", @@ -61,34 +61,34 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-crud": "^13.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-generative-ai": "^0.25.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-crud": "^13.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-generative-ai": "^0.27.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/explain-plan-helper": "^1.2.4", "@mongodb-js/mongodb-constants": "^0.10.0", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/shell-bson-parser": "^1.1.2", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", "hadron-type-checker": "^7.2.3", "lodash": "^4.17.21", "mongodb": "^6.9.0", - "mongodb-collection-model": "^5.23.6", - "mongodb-data-service": "^22.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-data-service": "^22.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "mongodb-schema": "^12.2.0", diff --git a/packages/compass-aggregations/src/index.ts b/packages/compass-aggregations/src/index.ts index 386fef6a51e..967b2e091bb 100644 --- a/packages/compass-aggregations/src/index.ts +++ b/packages/compass-aggregations/src/index.ts @@ -25,7 +25,6 @@ import { } from '@mongodb-js/compass-app-stores/provider'; import { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; import { preferencesLocator } from 'compass-preferences-model/provider'; -import { atlasAuthServiceLocator } from '@mongodb-js/atlas-service/provider'; import { atlasAiServiceLocator } from '@mongodb-js/compass-generative-ai/provider'; import { pipelineStorageLocator } from '@mongodb-js/my-queries-storage/provider'; import { connectionRepositoryAccessLocator } from '@mongodb-js/compass-connections/provider'; @@ -49,7 +48,6 @@ const CompassAggregationsHadronPlugin = registerHadronPlugin( preferences: preferencesLocator, logger: createLoggerLocator('COMPASS-AGGREGATIONS-UI'), track: telemetryLocator, - atlasAuthService: atlasAuthServiceLocator, atlasAiService: atlasAiServiceLocator, pipelineStorage: pipelineStorageLocator, connectionInfoRef: connectionInfoRefLocator, diff --git a/packages/compass-aggregations/src/modules/index.ts b/packages/compass-aggregations/src/modules/index.ts index 2a58a0a6cf0..59686b726d0 100644 --- a/packages/compass-aggregations/src/modules/index.ts +++ b/packages/compass-aggregations/src/modules/index.ts @@ -42,7 +42,6 @@ import type { PreferencesAccess } from 'compass-preferences-model'; import type { Logger } from '@mongodb-js/compass-logging/provider'; import type AppRegistry from 'hadron-app-registry'; import type { AtlasAiService } from '@mongodb-js/compass-generative-ai/provider'; -import type { AtlasAuthService } from '@mongodb-js/atlas-service/provider'; import type { MongoDBInstance } from 'mongodb-instance-model'; import type { DataService } from '../modules/data-service'; import type { @@ -100,7 +99,6 @@ export type PipelineBuilderExtraArgs = { localAppRegistry: AppRegistry; pipelineBuilder: PipelineBuilder; pipelineStorage: PipelineStorage; - atlasAuthService: AtlasAuthService; workspaces: WorkspacesService; preferences: PreferencesAccess; logger: Logger; diff --git a/packages/compass-aggregations/src/modules/pipeline-builder/pipeline-ai.ts b/packages/compass-aggregations/src/modules/pipeline-builder/pipeline-ai.ts index ff5882dde11..f2f980d485a 100644 --- a/packages/compass-aggregations/src/modules/pipeline-builder/pipeline-ai.ts +++ b/packages/compass-aggregations/src/modules/pipeline-builder/pipeline-ai.ts @@ -281,20 +281,23 @@ export const runAIPipelineGeneration = ( const { collection: collectionName, database: databaseName } = toNS(namespace); - jsonResponse = await atlasAiService.getAggregationFromUserInput({ - signal: abortController.signal, - userInput, - collectionName, - databaseName, - schema, - // Provide sample documents when the user has opted in in their settings. - ...(provideSampleDocuments - ? { - sampleDocuments, - } - : undefined), - requestId, - }); + jsonResponse = await atlasAiService.getAggregationFromUserInput( + { + signal: abortController.signal, + userInput, + collectionName, + databaseName, + schema, + // Provide sample documents when the user has opted in in their settings. + ...(provideSampleDocuments + ? { + sampleDocuments, + } + : undefined), + requestId, + }, + connectionInfo + ); } catch (err: any) { if (signal.aborted) { // If we already aborted so we ignore the error. @@ -444,10 +447,10 @@ export const resetIsAggregationGeneratedFromQuery = }; export const showInput = (): PipelineBuilderThunkAction> => { - return async (dispatch, _getState, { atlasAuthService }) => { + return async (dispatch, _getState, { atlasAiService }) => { try { if (process.env.COMPASS_E2E_SKIP_ATLAS_SIGNIN !== 'true') { - await atlasAuthService.signIn({ promptType: 'ai-promo-modal' }); + await atlasAiService.ensureAiFeatureAccess(); } dispatch({ type: AIPipelineActionTypes.ShowInput, diff --git a/packages/compass-aggregations/src/modules/pipeline-builder/stage-editor.spec.ts b/packages/compass-aggregations/src/modules/pipeline-builder/stage-editor.spec.ts index 8de3a4be5ae..b85472af616 100644 --- a/packages/compass-aggregations/src/modules/pipeline-builder/stage-editor.spec.ts +++ b/packages/compass-aggregations/src/modules/pipeline-builder/stage-editor.spec.ts @@ -128,7 +128,6 @@ function createStore({ thunk.withExtraArgument({ globalAppRegistry: new AppRegistry(), localAppRegistry: new AppRegistry(), - atlasAuthService: {} as any, atlasAiService: {} as any, pipelineBuilder, pipelineStorage: new CompassPipelineStorage(), diff --git a/packages/compass-aggregations/src/modules/pipeline-builder/text-editor-pipeline.spec.ts b/packages/compass-aggregations/src/modules/pipeline-builder/text-editor-pipeline.spec.ts index ee34bed867b..72a4743c575 100644 --- a/packages/compass-aggregations/src/modules/pipeline-builder/text-editor-pipeline.spec.ts +++ b/packages/compass-aggregations/src/modules/pipeline-builder/text-editor-pipeline.spec.ts @@ -44,7 +44,6 @@ function createStore( }, applyMiddleware( thunk.withExtraArgument({ - atlasAuthService: {} as any, atlasAiService: {} as any, pipelineBuilder, pipelineStorage: new CompassPipelineStorage(), diff --git a/packages/compass-aggregations/src/stores/store.ts b/packages/compass-aggregations/src/stores/store.ts index 4f0d950be02..7ee9ebedb01 100644 --- a/packages/compass-aggregations/src/stores/store.ts +++ b/packages/compass-aggregations/src/stores/store.ts @@ -33,7 +33,6 @@ import type { CollectionTabPluginMetadata } from '@mongodb-js/compass-collection import type { PreferencesAccess } from 'compass-preferences-model'; import type { Logger } from '@mongodb-js/compass-logging/provider'; import type { AtlasAiService } from '@mongodb-js/compass-generative-ai/provider'; -import type { AtlasAuthService } from '@mongodb-js/atlas-service/provider'; import type { PipelineStorage } from '@mongodb-js/my-queries-storage/provider'; import { maxTimeMSChanged } from '../modules/max-time-ms'; import type { @@ -80,7 +79,6 @@ export type AggregationsPluginServices = { preferences: PreferencesAccess; logger: Logger; track: TrackFunction; - atlasAuthService: AtlasAuthService; atlasAiService: AtlasAiService; pipelineStorage?: PipelineStorage; connectionInfoRef: ConnectionInfoRef; @@ -100,7 +98,6 @@ export function activateAggregationsPlugin( logger, track, atlasAiService, - atlasAuthService, pipelineStorage, connectionInfoRef, connectionScopedAppRegistry, @@ -184,7 +181,6 @@ export function activateAggregationsPlugin( localAppRegistry, pipelineBuilder, pipelineStorage, - atlasAuthService, workspaces, instance, preferences, diff --git a/packages/compass-aggregations/test/configure-store.ts b/packages/compass-aggregations/test/configure-store.ts index a211c17dea9..4cf517cbbf8 100644 --- a/packages/compass-aggregations/test/configure-store.ts +++ b/packages/compass-aggregations/test/configure-store.ts @@ -3,31 +3,12 @@ import type { ConfigureStoreOptions, } from '../src/stores/store'; import { mockDataService } from './mocks/data-service'; -import { AtlasAuthService } from '@mongodb-js/atlas-service/provider'; import { createPluginTestHelpers } from '@mongodb-js/testing-library-compass'; import { CompassAggregationsPlugin } from '../src/index'; import type { DataService } from '@mongodb-js/compass-connections/provider'; import React from 'react'; import { PipelineStorageProvider } from '@mongodb-js/my-queries-storage/provider'; -export class MockAtlasAuthService extends AtlasAuthService { - isAuthenticated() { - return Promise.resolve(true); - } - async getUserInfo() { - return Promise.resolve({} as any); - } - async signIn() { - return Promise.resolve({} as any); - } - async signOut() { - return Promise.resolve(); - } - getAuthHeaders() { - return Promise.resolve({}); - } -} - export class MockAtlasAiService { async getAggregationFromUserInput() { return Promise.resolve({}); @@ -35,6 +16,9 @@ export class MockAtlasAiService { async getQueryFromUserInput() { return Promise.resolve({}); } + async ensureAiFeatureAccess() { + return Promise.resolve(); + } } function getMockedPluginArgs( @@ -42,11 +26,9 @@ function getMockedPluginArgs( dataService: Partial = mockDataService(), services: Partial = {} ) { - const atlasAuthService = new MockAtlasAuthService(); const atlasAiService = new MockAtlasAiService(); return [ CompassAggregationsPlugin.provider.withMockServices({ - atlasAuthService, atlasAiService, collection: { toJSON: () => ({}), diff --git a/packages/compass-app-stores/package.json b/packages/compass-app-stores/package.json index 2c6b9c3470a..eaa45e1512f 100644 --- a/packages/compass-app-stores/package.json +++ b/packages/compass-app-stores/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "7.31.0", + "version": "7.33.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -73,14 +73,14 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/connection-info": "^0.9.3", "hadron-app-registry": "^9.2.7", - "mongodb-collection-model": "^5.23.6", - "mongodb-database-model": "^2.23.6", - "mongodb-instance-model": "^12.24.6", + "mongodb-collection-model": "^5.23.7", + "mongodb-database-model": "^2.23.7", + "mongodb-instance-model": "^12.24.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, diff --git a/packages/compass-collection/package.json b/packages/compass-collection/package.json index 33a597ff289..f11679274c8 100644 --- a/packages/compass-collection/package.json +++ b/packages/compass-collection/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "4.44.0", + "version": "4.46.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,17 +48,17 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/mongodb-constants": "^0.10.2", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", - "mongodb-collection-model": "^5.23.6", + "mongodb-collection-model": "^5.23.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", diff --git a/packages/compass-collection/src/components/collection-tab.tsx b/packages/compass-collection/src/components/collection-tab.tsx index f4da240c81b..305a115204d 100644 --- a/packages/compass-collection/src/components/collection-tab.tsx +++ b/packages/compass-collection/src/components/collection-tab.tsx @@ -3,6 +3,7 @@ import { connect } from 'react-redux'; import { type CollectionState, selectTab } from '../modules/collection-tab'; import { css, ErrorBoundary, TabNavBar } from '@mongodb-js/compass-components'; import CollectionHeader from './collection-header'; +import toNS from 'mongodb-ns'; import { useLogger } from '@mongodb-js/compass-logging/provider'; import { useCollectionQueryBar, @@ -118,10 +119,10 @@ function WithErrorBoundary({ function useCollectionTabs(props: CollectionMetadata) { const pluginTabs = useCollectionSubTabs(); const connectionInfoRef = useConnectionInfoRef(); - const isGlobalWritesSupported = useConnectionSupports( - connectionInfoRef.current.id, - 'globalWrites' - ); + const isGlobalWritesSupported = + useConnectionSupports(connectionInfoRef.current.id, 'globalWrites') && + !props.isReadonly && + !toNS(props.namespace).specialish; return pluginTabs .filter((x) => { if (x.name === 'GlobalWrites' && !isGlobalWritesSupported) { diff --git a/packages/compass-components/package.json b/packages/compass-components/package.json index 1066802b726..aee1cf502fb 100644 --- a/packages/compass-components/package.json +++ b/packages/compass-components/package.json @@ -1,6 +1,6 @@ { "name": "@mongodb-js/compass-components", - "version": "1.31.0", + "version": "1.31.1", "description": "React Components used in Compass", "license": "SSPL", "main": "lib/index.js", diff --git a/packages/compass-components/src/components/document-list/document-actions-group.tsx b/packages/compass-components/src/components/document-list/document-actions-group.tsx index de1c7c82ef8..6987721bcb9 100644 --- a/packages/compass-components/src/components/document-list/document-actions-group.tsx +++ b/packages/compass-components/src/components/document-list/document-actions-group.tsx @@ -9,11 +9,11 @@ const actionsGroupContainer = css({ position: 'absolute', display: 'flex', alignItems: 'center', - gap: spacing[2], + gap: spacing[200], width: '100%', - top: spacing[2] + spacing[1], - paddingLeft: spacing[3], - paddingRight: spacing[3], + top: spacing[300], + paddingLeft: spacing[300], + paddingRight: spacing[300], pointerEvents: 'none', }); @@ -44,6 +44,13 @@ const actionsGroupSignalPopover = css({ display: 'block !important', }); +const expandButton = css({ + '& > div:has(svg)': { + paddingLeft: 3, + paddingRight: 3, + }, +}); + function useElementParentHoverState( ref: React.RefObject ): boolean { @@ -159,7 +166,7 @@ const DocumentActionsGroup: React.FunctionComponent< aria-pressed={expanded} data-testid="expand-document-button" onClick={onExpand} - className={actionsGroupItem} + className={cx(actionsGroupItem, expandButton)} tooltipText={expanded ? 'Collapse all' : 'Expand all'} /> )} diff --git a/packages/compass-components/src/components/document-list/document.tsx b/packages/compass-components/src/components/document-list/document.tsx index d7bef7101be..2e2d9cb540c 100644 --- a/packages/compass-components/src/components/document-list/document.tsx +++ b/packages/compass-components/src/components/document-list/document.tsx @@ -85,7 +85,14 @@ const HadronDocument: React.FunctionComponent<{ editable?: boolean; editing?: boolean; onEditStart?: () => void; -}> = ({ value: document, editable = false, editing = false, onEditStart }) => { + extraGutterWidth?: number; +}> = ({ + value: document, + editable = false, + editing = false, + onEditStart, + extraGutterWidth, +}) => { const { elements, visibleElements } = useHadronDocument(document); const [autoFocus, setAutoFocus] = useState<{ id: string; @@ -113,8 +120,9 @@ const HadronDocument: React.FunctionComponent<{ editable, level: 0, alignWithNestedExpandIcon: false, + extraGutterWidth, }), - [editable] + [editable, extraGutterWidth] ); return ( @@ -147,6 +155,7 @@ const HadronDocument: React.FunctionComponent<{ type: el.parent?.currentType === 'Array' ? 'value' : 'key', }); }} + extraGutterWidth={extraGutterWidth} > ); })} diff --git a/packages/compass-components/src/components/document-list/element.tsx b/packages/compass-components/src/components/document-list/element.tsx index de3e51e54c2..85197f9e709 100644 --- a/packages/compass-components/src/components/document-list/element.tsx +++ b/packages/compass-components/src/components/document-list/element.tsx @@ -192,8 +192,8 @@ const expandButton = css({ const hadronElement = css({ display: 'flex', - paddingLeft: spacing[2], - paddingRight: spacing[2], + paddingLeft: spacing[50], + paddingRight: spacing[50], marginTop: 1, }); @@ -239,7 +239,7 @@ const elementRemovedDarkMode = css({ const elementActions = css({ flex: 'none', - width: spacing[3], + width: spacing[300], position: 'relative', }); @@ -363,36 +363,39 @@ const elementKeyDarkMode = css({ color: palette.gray.light2, }); -const calculateElementSpacerWidth = (editable: boolean, level: number) => { - return (editable ? spacing[200] : 0) + spacing[400] * level; +const calculateElementSpacerWidth = ( + editable: boolean, + level: number, + extra: number +) => { + return (editable ? spacing[100] : 0) + extra + spacing[400] * level; }; export const calculateShowMoreToggleOffset = ({ editable, level, alignWithNestedExpandIcon, + extraGutterWidth = 0, }: { editable: boolean; level: number; alignWithNestedExpandIcon: boolean; + extraGutterWidth: number | undefined; }) => { - // the base padding that we have on all elements rendered in the document - const BASE_PADDING_LEFT = spacing[200]; - const OFFSET_WHEN_EDITABLE = editable + const spacerWidth = calculateElementSpacerWidth( + editable, + level, + extraGutterWidth + ); + const editableOffset = editable ? // space taken by element actions - spacing[400] + + spacing[300] + // space and margin taken by line number element spacing[400] + - spacing[100] + - // element spacer width that we render - calculateElementSpacerWidth(editable, level) + spacing[100] : 0; - const EXPAND_ICON_SIZE = spacing[400]; - return ( - BASE_PADDING_LEFT + - OFFSET_WHEN_EDITABLE + - (alignWithNestedExpandIcon ? EXPAND_ICON_SIZE : 0) - ); + const expandIconSize = alignWithNestedExpandIcon ? spacing[400] : 0; + return spacerWidth + editableOffset + expandIconSize; }; export const HadronElement: React.FunctionComponent<{ @@ -402,6 +405,7 @@ export const HadronElement: React.FunctionComponent<{ onEditStart?: (id: string, field: 'key' | 'value' | 'type') => void; lineNumberSize: number; onAddElement(el: HadronElementType): void; + extraGutterWidth?: number; }> = ({ value: element, editable, @@ -409,6 +413,7 @@ export const HadronElement: React.FunctionComponent<{ onEditStart, lineNumberSize, onAddElement, + extraGutterWidth = 0, }) => { const darkMode = useDarkMode(); const autoFocus = useAutoFocusContext(); @@ -445,8 +450,8 @@ export const HadronElement: React.FunctionComponent<{ }, [lineNumberSize, editingEnabled]); const elementSpacerWidth = useMemo( - () => calculateElementSpacerWidth(editable, level), - [editable, level] + () => calculateElementSpacerWidth(editable, level, extraGutterWidth), + [editable, level, extraGutterWidth] ); // To render the "Show more" toggle for the nested expandable elements we need @@ -457,8 +462,9 @@ export const HadronElement: React.FunctionComponent<{ editable, level, alignWithNestedExpandIcon: true, + extraGutterWidth, }), - [editable, level] + [editable, level, extraGutterWidth] ); const isValid = key.valid && value.valid; @@ -711,6 +717,7 @@ export const HadronElement: React.FunctionComponent<{ onEditStart={onEditStart} lineNumberSize={lineNumberSize} onAddElement={onAddElement} + extraGutterWidth={extraGutterWidth} > ); })} diff --git a/packages/compass-components/src/components/interactive-popover.tsx b/packages/compass-components/src/components/interactive-popover.tsx index e7ed4aa442c..901c01353ae 100644 --- a/packages/compass-components/src/components/interactive-popover.tsx +++ b/packages/compass-components/src/components/interactive-popover.tsx @@ -8,7 +8,6 @@ import { palette } from '@leafygreen-ui/palette'; import { rgba } from 'polished'; import { useDarkMode } from '../hooks/use-theme'; import { useHotkeys } from '../hooks/use-hotkeys'; -import { useId } from '@react-aria/utils'; const borderRadius = spacing[2]; @@ -162,7 +161,7 @@ function InteractivePopover({ useHotkeys('Escape', onClose, { enabled: open }, [onClose]); - const closeButtonId = useId('close-button-id'); + const closeButtonId = 'close-button-id'; return trigger({ onClick: onClickTrigger, diff --git a/packages/compass-components/src/components/item-action-controls.tsx b/packages/compass-components/src/components/item-action-controls.tsx index 5297b7a6211..1f2d58d223f 100644 --- a/packages/compass-components/src/components/item-action-controls.tsx +++ b/packages/compass-components/src/components/item-action-controls.tsx @@ -29,6 +29,8 @@ export type ItemAction = { disabledDescription?: string; tooltip?: string; actionButtonClassName?: string; + /** How to show the item when not collapsed into the menu */ + expandedPresentation?: 'icon' | 'button'; }; export type ItemSeparator = { separator: true }; @@ -343,26 +345,42 @@ export function ItemActionGroup({ tooltip, tooltipProps, actionButtonClassName, + expandedPresentation = 'icon', } = menuItem; - const button = ( - (dataTestId, action)} - onClick={onClick} - className={cx( - actionGroupButtonStyle, - iconClassName, - actionButtonClassName - )} - style={iconStyle} - disabled={isDisabled} - /> - ); + const button = + expandedPresentation === 'icon' ? ( + (dataTestId, action)} + onClick={onClick} + className={cx( + actionGroupButtonStyle, + iconClassName, + actionButtonClassName + )} + style={iconStyle} + disabled={isDisabled} + /> + ) : ( + + ); if (tooltip) { return ( diff --git a/packages/compass-components/src/hooks/use-sort.spec.ts b/packages/compass-components/src/hooks/use-sort.spec.ts index af0e3cff926..da177b4a8ac 100644 --- a/packages/compass-components/src/hooks/use-sort.spec.ts +++ b/packages/compass-components/src/hooks/use-sort.spec.ts @@ -57,7 +57,7 @@ describe('use-sort', function () { expect( screen .getByRole('button', { - name: /title/i, + name: 'Sort by', }) .getAttribute('aria-disabled') ).to.equal('true'); @@ -70,7 +70,7 @@ describe('use-sort', function () { // Opens dropdown userEvent.click( screen.getByRole('button', { - name: /title/i, + name: 'Sort by', }), undefined, { @@ -111,7 +111,7 @@ describe('use-sort', function () { // Opens dropdown userEvent.click( screen.getByRole('button', { - name: /title/i, + name: 'Sort by', }), undefined, { @@ -141,7 +141,7 @@ describe('use-sort', function () { // Opens dropdown userEvent.click( screen.getByRole('button', { - name: /title/i, + name: 'Sort by', }), undefined, { diff --git a/packages/compass-components/src/hooks/use-sort.tsx b/packages/compass-components/src/hooks/use-sort.tsx index 54efc07fe53..5fdec02a9c5 100644 --- a/packages/compass-components/src/hooks/use-sort.tsx +++ b/packages/compass-components/src/hooks/use-sort.tsx @@ -43,7 +43,7 @@ export function useSortControls( items: readonly { name: T; label: string }[], options?: SortOptions ): [React.ReactElement, SortState['name']>] { - const labelId = useId('Sort by'); + const labelId = 'sort-by'; const controlId = useId(); const [sortState, dispatch] = useReducer( diff --git a/packages/compass-connection-import-export/package.json b/packages/compass-connection-import-export/package.json index 3a38a4f87a2..fa3748dfd82 100644 --- a/packages/compass-connection-import-export/package.json +++ b/packages/compass-connection-import-export/package.json @@ -14,7 +14,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.41.0", + "version": "0.43.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -51,11 +51,11 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/connection-storage": "^0.22.3", - "compass-preferences-model": "^2.29.2", - "hadron-ipc": "^3.2.24", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/connection-storage": "^0.23.0", + "compass-preferences-model": "^2.30.0", + "hadron-ipc": "^3.2.25", "react": "^17.0.2" }, "devDependencies": { diff --git a/packages/compass-connections-navigation/package.json b/packages/compass-connections-navigation/package.json index d1f7129104b..377754421c2 100644 --- a/packages/compass-connections-navigation/package.json +++ b/packages/compass-connections-navigation/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.44.0", + "version": "1.46.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,12 +49,12 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/compass-workspaces": "^0.26.0", - "compass-preferences-model": "^2.29.2", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/compass-workspaces": "^0.28.0", + "compass-preferences-model": "^2.30.0", "mongodb-build-info": "^1.7.2", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", diff --git a/packages/compass-connections-navigation/src/base-navigation-item.tsx b/packages/compass-connections-navigation/src/base-navigation-item.tsx index 6434b8b0c0a..f4dfa113de4 100644 --- a/packages/compass-connections-navigation/src/base-navigation-item.tsx +++ b/packages/compass-connections-navigation/src/base-navigation-item.tsx @@ -17,6 +17,7 @@ type NavigationBaseItemProps = { isExpandDisabled: boolean; isExpanded: boolean; isFocused: boolean; + hasDefaultAction: boolean; icon: React.ReactNode; style: React.CSSProperties; @@ -37,7 +38,6 @@ const menuStyles = css({ }); const itemContainerStyles = css({ - cursor: 'pointer', color: 'var(--item-color)', backgroundColor: 'var(--item-bg-color)', '&[data-is-active="true"] .item-wrapper': { @@ -53,6 +53,10 @@ const itemContainerStyles = css({ }, }); +const itemContainerWithActionStyles = css({ + cursor: 'pointer', +}); + const itemWrapperStyles = css({ display: 'flex', height: ROW_HEIGHT, @@ -93,6 +97,7 @@ export const NavigationBaseItem: React.FC = ({ isExpandDisabled, isExpanded, isFocused, + hasDefaultAction, onExpand, children, }) => { @@ -100,7 +105,9 @@ export const NavigationBaseItem: React.FC = ({ return (
diff --git a/packages/compass-connections-navigation/src/connections-navigation-tree.tsx b/packages/compass-connections-navigation/src/connections-navigation-tree.tsx index d5a68cd560a..14e6bbec8b5 100644 --- a/packages/compass-connections-navigation/src/connections-navigation-tree.tsx +++ b/packages/compass-connections-navigation/src/connections-navigation-tree.tsx @@ -87,8 +87,6 @@ const ConnectionsNavigationTree: React.FunctionComponent< if (item.type === 'connection') { if (item.connectionStatus === 'connected') { onItemAction(item, 'select-connection'); - } else { - onItemAction(item, 'connection-connect'); } } else if (item.type === 'database') { onItemAction(item, 'select-database'); @@ -187,7 +185,7 @@ const ConnectionsNavigationTree: React.FunctionComponent< connectionInfo: item.connectionInfo, }), config: { - collapseAfter: 0, + collapseAfter: 1, }, }; } diff --git a/packages/compass-connections-navigation/src/item-actions.ts b/packages/compass-connections-navigation/src/item-actions.ts index 7930ed44e8c..c412c25279c 100644 --- a/packages/compass-connections-navigation/src/item-actions.ts +++ b/packages/compass-connections-navigation/src/item-actions.ts @@ -5,7 +5,7 @@ import { type ItemSeparator } from '@mongodb-js/compass-components'; export type NavigationItemActions = (ItemAction | ItemSeparator)[]; -export const notConnectedConnectionItemActions = ({ +export const commonConnectionItemActions = ({ connectionInfo, }: { connectionInfo: ConnectionInfo; @@ -81,7 +81,7 @@ export const connectedConnectionItemActions = ({ isShellEnabled: boolean; }): NavigationItemActions => { const isAtlas = !!connectionInfo.atlasMetadata; - const connectionManagementActions = notConnectedConnectionItemActions({ + const connectionManagementActions = commonConnectionItemActions({ connectionInfo, }); const actions: (ItemAction | ItemSeparator | null)[] = [ @@ -135,6 +135,23 @@ export const connectedConnectionItemActions = ({ }); }; +export const notConnectedConnectionItemActions = ({ + connectionInfo, +}: { + connectionInfo: ConnectionInfo; +}): NavigationItemActions => { + const commonActions = commonConnectionItemActions({ connectionInfo }); + return [ + { + action: 'connection-connect', + label: 'Connect', + icon: 'Connect', + expandedPresentation: 'button', + }, + ...commonActions, + ]; +}; + export const databaseItemActions = ({ hasWriteActionsDisabled, }: { diff --git a/packages/compass-connections-navigation/src/navigation-item.tsx b/packages/compass-connections-navigation/src/navigation-item.tsx index e655bbe04f9..a5b3d530070 100644 --- a/packages/compass-connections-navigation/src/navigation-item.tsx +++ b/packages/compass-connections-navigation/src/navigation-item.tsx @@ -251,6 +251,9 @@ export function NavigationItem({ isActive={isActive} isFocused={isFocused} isExpanded={!!item.isExpanded} + hasDefaultAction={ + item.type !== 'connection' || item.connectionStatus === 'connected' + } icon={itemIcon} name={item.name} style={style} diff --git a/packages/compass-connections/package.json b/packages/compass-connections/package.json index 8789d0cb781..5f078107074 100644 --- a/packages/compass-connections/package.json +++ b/packages/compass-connections/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.45.0", + "version": "1.47.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -51,21 +51,21 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-utils": "^0.6.13", - "@mongodb-js/connection-form": "^1.43.0", - "@mongodb-js/connection-info": "^0.9.2", - "@mongodb-js/connection-storage": "^0.22.3", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-utils": "^0.6.14", + "@mongodb-js/connection-form": "^1.44.0", + "@mongodb-js/connection-info": "^0.9.3", + "@mongodb-js/connection-storage": "^0.23.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", diff --git a/packages/compass-connections/src/stores/connections-store-redux.ts b/packages/compass-connections/src/stores/connections-store-redux.ts index 368e5875e65..f40270a6503 100644 --- a/packages/compass-connections/src/stores/connections-store-redux.ts +++ b/packages/compass-connections/src/stores/connections-store-redux.ts @@ -1739,6 +1739,16 @@ const connectWithOptions = ( getExtraConnectionData(connectionInfo), ]); + const connections = getState().connections; + // Counting all connections, we need to filter out any connections currently being created + const totalConnectionsCount = Object.values( + connections.byId + ).filter(({ isBeingCreated }) => !isBeingCreated).length; + const activeConnectionsCount = + getActiveConnectionsCount(connections); + const inactiveConnectionsCount = + totalConnectionsCount - activeConnectionsCount; + return { is_atlas: isAtlas, atlas_hostname: isAtlas ? resolvedHostname : null, @@ -1751,6 +1761,8 @@ const connectWithOptions = ( server_arch: host.arch, server_os_family: host.os_family, topology_type: dataService.getCurrentTopologyType(), + num_active_connections: activeConnectionsCount, + num_inactive_connections: inactiveConnectionsCount, ...extraInfo, }; }, diff --git a/packages/compass-crud/package.json b/packages/compass-crud/package.json index 824fe06f1ef..6d0f47b98bc 100644 --- a/packages/compass-crud/package.json +++ b/packages/compass-crud/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "13.45.0", + "version": "13.47.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -59,42 +59,42 @@ "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "eslint": "^7.25.0", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.24.6", + "mongodb-instance-model": "^12.24.7", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^8.1.1", "typescript": "^5.0.4" }, "dependencies": { - "@mongodb-js/compass-app-stores": "^7.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-field-store": "^9.20.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-query-bar": "^8.46.0", - "@mongodb-js/compass-telemetry": "^1.2.2", - "@mongodb-js/compass-workspaces": "^0.26.0", + "@mongodb-js/compass-app-stores": "^7.33.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-field-store": "^9.22.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-query-bar": "^8.48.0", + "@mongodb-js/compass-telemetry": "^1.2.3", + "@mongodb-js/compass-workspaces": "^0.28.0", "@mongodb-js/explain-plan-helper": "^1.2.4", - "@mongodb-js/my-queries-storage": "^0.18.0", + "@mongodb-js/my-queries-storage": "^0.19.0", "@mongodb-js/reflux-state-mixin": "^1.0.7", "@mongodb-js/shell-bson-parser": "^1.1.2", "ag-grid-community": "^20.2.0", "ag-grid-react": "^20.2.0", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "hadron-document": "^8.6.5", "hadron-type-checker": "^7.2.3", "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", - "mongodb-data-service": "^22.23.6", + "mongodb-data-service": "^22.23.7", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.2.3", "numeral": "^2.0.6", diff --git a/packages/compass-crud/src/components/crud-toolbar.spec.tsx b/packages/compass-crud/src/components/crud-toolbar.spec.tsx index 77b4643f491..43ce37903c3 100644 --- a/packages/compass-crud/src/components/crud-toolbar.spec.tsx +++ b/packages/compass-crud/src/components/crud-toolbar.spec.tsx @@ -39,7 +39,6 @@ const MockQueryBarPlugin = QueryBarPlugin.withMockServices({ favoriteQueryStorageAccess: compassFavoriteQueryStorageAccess, recentQueryStorageAccess: compassRecentQueryStorageAccess, atlasAiService: {} as any, - atlasAuthService: { on() {}, removeListener() {} } as any, }); const addDataText = 'Add Data'; diff --git a/packages/compass-crud/src/components/json-editor.tsx b/packages/compass-crud/src/components/json-editor.tsx index 2dda284dba4..3c86cff5c68 100644 --- a/packages/compass-crud/src/components/json-editor.tsx +++ b/packages/compass-crud/src/components/json-editor.tsx @@ -45,8 +45,7 @@ const editorDarkModeStyles = css({ }); const actionsGroupStyles = css({ - paddingTop: spacing[2], - paddingRight: spacing[2], + padding: spacing[200], }); export type JSONEditorProps = { @@ -258,6 +257,14 @@ const JSONEditor: React.FunctionComponent = ({ onDeletionFinished, ]); + const toggleExpandCollapse = useCallback(() => { + if (doc.expanded) { + doc.collapse(); + } else { + doc.expand(); + } + }, [doc]); + // Trying to change CodeMirror editor state when an update "effect" is in // progress results in an error which is why we timeout the code mirror update // itself. @@ -297,6 +304,8 @@ const JSONEditor: React.FunctionComponent = ({ className={cx(editorStyles, darkMode && editorDarkModeStyles)} actionsClassName={actionsGroupStyles} completer={completer} + onExpand={editing ? undefined : toggleExpandCollapse} + expanded={expanded} /> { +class ReadonlyDocument extends React.Component< + ReadonlyDocumentProps, + ReadonlyDocumentState +> { + constructor(props: ReadonlyDocumentProps) { + super(props); + this.state = { + expanded: props.doc.expanded, + }; + } + + /** + * Subscribe to the update store on mount. + */ + componentDidMount() { + this.subscribeToDocumentEvents(this.props.doc); + } + + /** + * Refreshing the list updates the doc in the props so we should update the + * document on the instance. + */ + componentDidUpdate(prevProps: ReadonlyDocumentProps) { + if (prevProps.doc !== this.props.doc) { + this.unsubscribeFromDocumentEvents(prevProps.doc); + this.subscribeToDocumentEvents(this.props.doc); + } + } + + /** + * Unsubscribe from the update store on unmount. + */ + componentWillUnmount() { + this.unsubscribeFromDocumentEvents(this.props.doc); + } + + /** + * Subscribe to the document events. + */ + subscribeToDocumentEvents(doc: Document) { + doc.on(DocumentEvents.Expanded, this.handleExpanded); + doc.on(DocumentEvents.Collapsed, this.handleCollapsed); + } + + /** + * Unsubscribe from the document events. + */ + unsubscribeFromDocumentEvents(doc: Document) { + doc.on(DocumentEvents.Expanded, this.handleExpanded); + doc.on(DocumentEvents.Collapsed, this.handleCollapsed); + } + + handleExpanded = () => { + this.setState({ expanded: true }); + }; + + handleCollapsed = () => { + this.setState({ expanded: false }); + }; + handleClone = () => { const clonedDoc = this.props.doc.generateObject({ excludeInternalFields: true, @@ -48,13 +112,32 @@ class ReadonlyDocument extends React.Component { this.props.copyToClipboard?.(this.props.doc); }; + /** + * Handle clicking the expand all button. + */ + handleExpandAll = () => { + const { doc } = this.props; + // Update the doc directly - the components internal state will update via events + if (doc.expanded) { + doc.collapse(); + } else { + doc.expand(); + } + }; + /** * Get the elements for the document. * * @returns {Array} The elements. */ renderElements() { - return ; + return ( + + ); } renderActions() { @@ -64,6 +147,8 @@ class ReadonlyDocument extends React.Component { onClone={ this.props.openInsertDocumentDialog ? this.handleClone : undefined } + onExpand={this.handleExpandAll} + expanded={this.state.expanded} insights={ this.props.showInsights ? getInsightsForDocument(this.props.doc) @@ -94,7 +179,6 @@ class ReadonlyDocument extends React.Component { static propTypes = { copyToClipboard: PropTypes.func, doc: PropTypes.object.isRequired, - expandAll: PropTypes.bool, openInsertDocumentDialog: PropTypes.func, showInsights: PropTypes.bool, }; diff --git a/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts b/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts new file mode 100644 index 00000000000..9524c4ef5a3 --- /dev/null +++ b/packages/compass-e2e-tests/helpers/commands/click-confirmation-action.ts @@ -0,0 +1,28 @@ +import type { CompassBrowser } from '../compass-browser'; +import * as Selectors from '../selectors'; + +export async function clickConfirmationAction( + browser: CompassBrowser, + actionButtonSelector: string, + confirmationText?: string, + screenshot?: string +) { + await browser.clickVisible(actionButtonSelector); + + const confirmationModal = await browser.$(Selectors.ConfirmationModal); + await confirmationModal.waitForDisplayed(); + + if (confirmationText) { + await browser.setValueVisible( + Selectors.ConfirmationModalInput, + confirmationText + ); + } + + if (screenshot) { + await browser.screenshot(screenshot); + } + + await browser.clickVisible(Selectors.confirmationModalConfirmButton()); + await confirmationModal.waitForDisplayed({ reverse: true }); +} diff --git a/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts b/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts index 8ca6d89c0c3..1b2bb502ccc 100644 --- a/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts +++ b/packages/compass-e2e-tests/helpers/commands/collection-workspaces.ts @@ -2,6 +2,14 @@ import type { CompassBrowser } from '../compass-browser'; import * as Selectors from '../selectors'; import type { WorkspaceTabSelectorOptions } from '../selectors'; +type CollectionWorkspaceSubTab = + | 'Documents' + | 'Aggregations' + | 'Schema' + | 'Indexes' + | 'Validation' + | 'GlobalWrites'; + async function navigateToCollection( browser: CompassBrowser, connectionName: string, @@ -50,12 +58,8 @@ export async function navigateToCollectionTab( connectionName: string, dbName: string, collectionName: string, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents', + tabName: CollectionWorkspaceSubTab = 'Documents', + closeExistingTabs = true ): Promise { await navigateToCollection( @@ -83,12 +87,7 @@ export async function navigateToCollectionTab( export async function navigateWithinCurrentCollectionTabs( browser: CompassBrowser, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents' + tabName: CollectionWorkspaceSubTab = 'Documents' ): Promise { const tab = browser.$(Selectors.collectionSubTab(tabName)); const selectedTab = browser.$(Selectors.collectionSubTab(tabName, true)); @@ -108,13 +107,7 @@ async function waitUntilActiveCollectionTab( connectionName: string, dbName: string, collectionName: string, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' - | null = null + tabName: CollectionWorkspaceSubTab | null = null ) { const options: WorkspaceTabSelectorOptions = { type: 'Collection', @@ -132,12 +125,7 @@ async function waitUntilActiveCollectionTab( export async function waitUntilActiveCollectionSubTab( browser: CompassBrowser, - tabName: - | 'Documents' - | 'Aggregations' - | 'Schema' - | 'Indexes' - | 'Validation' = 'Documents' + tabName: CollectionWorkspaceSubTab = 'Documents' ) { await browser.$(Selectors.collectionSubTab(tabName, true)).waitForDisplayed(); } diff --git a/packages/compass-e2e-tests/helpers/commands/connect.ts b/packages/compass-e2e-tests/helpers/commands/connect.ts index 97356a91de5..0dada57a24f 100644 --- a/packages/compass-e2e-tests/helpers/commands/connect.ts +++ b/packages/compass-e2e-tests/helpers/commands/connect.ts @@ -185,6 +185,7 @@ export async function connectByName( connectionName: string, options: ConnectionResultOptions = {} ) { + await browser.hover(Selectors.sidebarConnection(connectionName)); await browser.clickVisible(Selectors.sidebarConnectionButton(connectionName)); await browser.waitForConnectionResult(connectionName, options); } diff --git a/packages/compass-e2e-tests/helpers/commands/hide-index.ts b/packages/compass-e2e-tests/helpers/commands/hide-index.ts index ed1d0e5b6c6..d082ab91a98 100644 --- a/packages/compass-e2e-tests/helpers/commands/hide-index.ts +++ b/packages/compass-e2e-tests/helpers/commands/hide-index.ts @@ -11,21 +11,11 @@ export async function hideIndex( await indexComponent.waitForDisplayed(); await browser.hover(indexComponentSelector); - await browser.clickVisible( - `${indexComponentSelector} ${Selectors.HideIndexButton}` + await browser.clickConfirmationAction( + `${indexComponentSelector} ${Selectors.HideIndexButton}`, + undefined, + screenshotName ); - - const hideModal = await browser.$(Selectors.ConfirmationModal); - await hideModal.waitForDisplayed(); - - if (screenshotName) { - await browser.screenshot(screenshotName); - } - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await hideModal.waitForDisplayed({ reverse: true }); - const hiddenBadge = await browser.$(Selectors.HiddenIndexBadge(indexName)); await hiddenBadge.waitForDisplayed(); } diff --git a/packages/compass-e2e-tests/helpers/commands/index.ts b/packages/compass-e2e-tests/helpers/commands/index.ts index 2ad04e81f01..080501905f9 100644 --- a/packages/compass-e2e-tests/helpers/commands/index.ts +++ b/packages/compass-e2e-tests/helpers/commands/index.ts @@ -64,3 +64,4 @@ export * from './hide-visible-toasts'; export * from './sidebar-collection'; export * from './read-first-document-content'; export * from './read-stage-operators'; +export * from './click-confirmation-action'; diff --git a/packages/compass-e2e-tests/helpers/commands/unhide-index.ts b/packages/compass-e2e-tests/helpers/commands/unhide-index.ts index 305ce3cea96..4d7e3905b7f 100644 --- a/packages/compass-e2e-tests/helpers/commands/unhide-index.ts +++ b/packages/compass-e2e-tests/helpers/commands/unhide-index.ts @@ -11,21 +11,12 @@ export async function unhideIndex( await indexComponent.waitForDisplayed(); await browser.hover(indexComponentSelector); - await browser.clickVisible( - `${indexComponentSelector} ${Selectors.UnhideIndexButton}` + await browser.clickConfirmationAction( + `${indexComponentSelector} ${Selectors.UnhideIndexButton}`, + undefined, + screenshotName ); - const unhideModal = await browser.$(Selectors.ConfirmationModal); - await unhideModal.waitForDisplayed(); - - if (screenshotName) { - await browser.screenshot(screenshotName); - } - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await unhideModal.waitForDisplayed({ reverse: true }); - const hiddenBadge = await browser.$(Selectors.HiddenIndexBadge(indexName)); await hiddenBadge.waitForDisplayed({ reverse: true }); } diff --git a/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts b/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts index 2f4345dc941..0a67b13d5e3 100644 --- a/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts +++ b/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts @@ -132,7 +132,44 @@ export async function spawnCompassWebSandboxAndSignInToAtlas( debug('Waiting for the auth to finish ...'); - const res = await authenticatePromise; + let authenticatedPromiseSettled = false; + + // Atlas Cloud will periodically remind user to enable MFA (which we can't + // enable in e2e CI environment), so to account for that, in parallel to + // waiting for auth to finish, we'll wait for the MFA screen to show up and + // skip it if it appears + const [, settledRes] = await Promise.allSettled([ + (async () => { + const remindMeLaterButton = 'button*=Remind me later'; + + await electronProxyRemote.waitUntil( + async () => { + return ( + authenticatedPromiseSettled || + (await electronProxyRemote.$(remindMeLaterButton).isDisplayed()) + ); + }, + // Takes awhile for the redirect to land on this reminder page when it + // happens, so no need to bombard the browser with displayed checks + { interval: 2000 } + ); + + if (authenticatedPromiseSettled) { + return; + } + + await electronProxyRemote.$(remindMeLaterButton).click(); + })(), + authenticatePromise.finally(() => { + authenticatedPromiseSettled = true; + }), + ]); + + if (settledRes.status === 'rejected') { + throw settledRes.reason; + } + + const res = settledRes.value; if (res.ok === false || !(await res.json()).projectId) { throw new Error( diff --git a/packages/compass-e2e-tests/helpers/insert-data.ts b/packages/compass-e2e-tests/helpers/insert-data.ts index ab0fa1894b8..aa17255aad5 100644 --- a/packages/compass-e2e-tests/helpers/insert-data.ts +++ b/packages/compass-e2e-tests/helpers/insert-data.ts @@ -168,13 +168,15 @@ export async function createNumbersStringCollection( ); } -export async function createGeospatialCollection(): Promise { +export async function createGeospatialCollection( + name = 'geospatial' +): Promise { await Promise.all( test_dbs.map(async (db) => { const lon = () => Math.random() * 360 - 180; const lat = () => Math.random() * 180 - 90; - await db.collection('geospatial').insertMany( + await db.collection(name).insertMany( [...Array(1000).keys()].map(() => ({ location: { type: 'Point', coordinates: [lon(), lat()] }, })) diff --git a/packages/compass-e2e-tests/helpers/selectors.ts b/packages/compass-e2e-tests/helpers/selectors.ts index 0d4532ea4c1..235df5d5f1f 100644 --- a/packages/compass-e2e-tests/helpers/selectors.ts +++ b/packages/compass-e2e-tests/helpers/selectors.ts @@ -281,6 +281,7 @@ export const Single = { // Multiple Connections sidebar export const Multiple = { ConnectionsTitle: '[data-testid="connections-header"]', + ConnectButton: '[data-action="connection-connect"]', SidebarNewConnectionButton: '[data-action="add-new-connection"]', ConnectionMenu: '[data-testid="sidebar-navigation-item-actions"]', CreateDatabaseButton: @@ -402,7 +403,7 @@ export const sidebarConnection = (connectionName: string): string => { }; export const sidebarConnectionButton = (connectionName: string): string => { - return `${sidebarConnection(connectionName)} > div > button`; + return `${sidebarConnection(connectionName)} ${Multiple.ConnectButton}`; }; export const sidebarConnectionActionButton = ( @@ -1400,3 +1401,23 @@ export const ProxyCustomButton = // Close tab confirmation export const ConfirmTabCloseModal = '[data-testid="confirm-tab-close"]'; + +export const GlobalWrites = { + tabStatus: (status: string) => + `[data-testid="globalwrites-content"] > [data-status="${status.toLowerCase()}"]`, + + ShardKeyFormSecondKeyInputCombobox: + '[data-testid="second-shard-key"] [role="combobox"] input', + ShardKeyFormAdvancedOptionsToggle: + '[data-testid="advanced-shard-key-configuration"]', + shardKeyFormIndexType: (type: 'UNIQUE' | 'HASHED') => + `[data-testid="${type.toLowerCase()}-index"]`, + ShardKeyFormSubmitButton: '[data-testid="shard-collection-button"]', + + CancelShardingButton: '[data-testid="cancel-sharding-btn"]', + UnmanageNamespaceButton: '[data-testid="unmanage-collection-button"]', + ManageNamespaceButton: '[data-testid="manage-collection-button"]', + + SampleFindingDocuments: '[data-testid="sample-finding-documents"]', + SampleInsertingDocuments: '[data-testid="sample-inserting-documents"]', +}; diff --git a/packages/compass-e2e-tests/helpers/test-runner-context.ts b/packages/compass-e2e-tests/helpers/test-runner-context.ts index 4ad3fe13892..2c73d855471 100644 --- a/packages/compass-e2e-tests/helpers/test-runner-context.ts +++ b/packages/compass-e2e-tests/helpers/test-runner-context.ts @@ -4,7 +4,7 @@ import { } from '@mongodb-js/connection-info'; import type { MongoClusterOptions } from 'mongodb-runner'; import yargs from 'yargs'; -import type { Argv } from 'yargs'; +import type { Argv, CamelCase } from 'yargs'; import { hideBin } from 'yargs/helpers'; import Debug from 'debug'; import fs from 'fs'; @@ -39,7 +39,7 @@ function buildCommonArgs(yargs: Argv) { .option('webdriver-waitfor-timeout', { type: 'number', description: 'Set a custom default webdriver waitFor timeout', - default: 120_000, // webdriver default is 3000ms + default: 1000 * 60 * 2, // 2min, webdriver default is 3s }) .option('webdriver-waitfor-interval', { type: 'number', @@ -106,15 +106,17 @@ function buildDesktopArgs(yargs: Argv) { * make sure that the tests in mms are also updated to account for that */ const atlasCloudExternalArgs = [ - 'test-atlas-cloud-external', 'atlas-cloud-external-url', 'atlas-cloud-external-project-id', 'atlas-cloud-external-cookies-file', 'atlas-cloud-external-default-connections-file', ] as const; +type AtlasCloudExternalArgs = + | typeof atlasCloudExternalArgs[number] + | CamelCase; + const atlasCloudSandboxArgs = [ - 'test-atlas-cloud-sandbox', 'atlas-cloud-sandbox-cloud-config', 'atlas-cloud-sandbox-username', 'atlas-cloud-sandbox-password', @@ -123,6 +125,10 @@ const atlasCloudSandboxArgs = [ 'atlas-cloud-sandbox-default-connections', ] as const; +type AtlasCloudSandboxArgs = + | typeof atlasCloudSandboxArgs[number] + | CamelCase; + let testEnv: 'desktop' | 'web' | undefined; function buildWebArgs(yargs: Argv) { @@ -191,13 +197,9 @@ function buildWebArgs(yargs: Argv) { description: 'Stringified JSON with connections that are expected to be available in the Atlas project', }) - .implies( - Object.fromEntries( - atlasCloudSandboxArgs.map((arg) => { - return [arg, atlasCloudSandboxArgs]; - }) - ) - ) + .implies({ + 'test-atlas-cloud-sandbox': atlasCloudSandboxArgs, + }) .option('test-atlas-cloud-external', { type: 'boolean', description: @@ -221,13 +223,9 @@ function buildWebArgs(yargs: Argv) { description: 'File with JSON array of connections (following ConnectionInfo schema) that are expected to be available in the Atlas project', }) - .implies( - Object.fromEntries( - atlasCloudExternalArgs.map((arg) => { - return [arg, atlasCloudExternalArgs]; - }) - ) - ) + .implies({ + 'test-atlas-cloud-external': atlasCloudExternalArgs, + }) .conflicts({ 'test-atlas-cloud-external': 'test-atlas-cloud-sandbox', 'test-atlas-cloud-sandbox': 'test-atlas-cloud-external', @@ -310,14 +308,7 @@ export function assertTestingWeb(ctx = context): asserts ctx is WebParsedArgs { export function isTestingAtlasCloudExternal( ctx = context ): ctx is WebParsedArgs & { - [K in - | 'testAtlasCloudExternal' - | 'atlasCloudExternalUrl' - | 'atlasCloudExternalProjectId' - | 'atlasCloudExternalCookiesFile' - | 'atlasCloudExternalDefaultConnectionsFile']: NonNullable< - WebParsedArgs[K] - >; + [K in AtlasCloudExternalArgs]: NonNullable; } { return isTestingWeb(ctx) && !!ctx.testAtlasCloudExternal; } @@ -325,13 +316,7 @@ export function isTestingAtlasCloudExternal( export function isTestingAtlasCloudSandbox( ctx = context ): ctx is WebParsedArgs & { - [K in - | 'testAtlasCloudSandbox' - | 'atlasCloudSandboxUsername' - | 'atlasCloudSandboxPassword' - | 'atlasCloudSandboxDbuserUsername' - | 'atlasCloudSandboxDbuserPassword' - | 'atlasCloudSandboxDefaultConnections']: NonNullable; + [K in AtlasCloudSandboxArgs]: NonNullable; } { return isTestingWeb(ctx) && !!ctx.testAtlasCloudSandbox; } @@ -339,13 +324,7 @@ export function isTestingAtlasCloudSandbox( export function assertTestingAtlasCloudSandbox( ctx = context ): asserts ctx is WebParsedArgs & { - [K in - | 'testAtlasCloudSandbox' - | 'atlasCloudSandboxUsername' - | 'atlasCloudSandboxPassword' - | 'atlasCloudSandboxDbuserUsername' - | 'atlasCloudSandboxDbuserPassword' - | 'atlasCloudSandboxDefaultConnections']: NonNullable; + [K in AtlasCloudSandboxArgs]: NonNullable; } { if (!isTestingAtlasCloudSandbox(ctx)) { throw new Error(`Expected tested runtime to be web w/ Atlas Cloud account`); diff --git a/packages/compass-e2e-tests/package.json b/packages/compass-e2e-tests/package.json index cae7fa21011..9af133a8c61 100644 --- a/packages/compass-e2e-tests/package.json +++ b/packages/compass-e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "compass-e2e-tests", - "version": "1.27.4", + "version": "1.27.6", "private": true, "description": "E2E test suite for Compass app that follows smoke tests / feature testing matrix", "scripts": { @@ -31,9 +31,9 @@ "coverage-report": "npm run coverage-merge && nyc report" }, "devDependencies": { - "@electron/rebuild": "^3.7.0", + "@electron/rebuild": "^3.7.1", "@mongodb-js/compass-test-server": "^0.1.22", - "@mongodb-js/connection-info": "^0.9.2", + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/oidc-mock-provider": "^0.9.3", "@mongodb-js/prettier-config-compass": "^1.0.2", @@ -47,15 +47,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.29.2", - "cross-spawn": "^7.0.3", + "compass-preferences-model": "^2.30.0", + "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", - "electron-to-chromium": "^1.5.49", + "electron": "^32.2.5", + "electron-to-chromium": "^1.5.62", "eslint": "^7.25.0", "glob": "^10.2.5", - "hadron-build": "^25.5.13", + "hadron-build": "^25.5.14", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.9.0", diff --git a/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts b/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts new file mode 100644 index 00000000000..a45d5758761 --- /dev/null +++ b/packages/compass-e2e-tests/tests/atlas-cloud/global-writes.test.ts @@ -0,0 +1,174 @@ +import { expect } from 'chai'; +import type { Compass } from '../../helpers/compass'; +import { + cleanup, + init, + screenshotIfFailed, + Selectors, +} from '../../helpers/compass'; +import type { CompassBrowser } from '../../helpers/compass-browser'; +import { createGeospatialCollection } from '../../helpers/insert-data'; +import { + DEFAULT_CONNECTION_NAMES, + isTestingAtlasCloudSandbox, +} from '../../helpers/test-runner-context'; + +type GeoShardingFormData = { + secondShardKey: string; + keyType?: 'UNIQUE' | 'HASHED'; +}; + +type GeoShardingStatus = + | 'UNSHARDED' + | 'SHARDING' + | 'SHARD_KEY_CORRECT' + | 'INCOMPLETE_SHARDING_SETUP'; + +const WEBDRIVER_TIMEOUT = 1000 * 60 * 10; +const MOCHA_TIMEOUT = WEBDRIVER_TIMEOUT * 1.2; + +async function createGeoShardKey( + browser: CompassBrowser, + formData: GeoShardingFormData +) { + await browser.setComboBoxValue( + Selectors.GlobalWrites.ShardKeyFormSecondKeyInputCombobox, + formData.secondShardKey + ); + + if (formData.keyType) { + await browser.clickVisible( + Selectors.GlobalWrites.ShardKeyFormAdvancedOptionsToggle + ); + await browser.clickParent( + Selectors.GlobalWrites.shardKeyFormIndexType(formData.keyType) + ); + } + await browser.clickVisible(Selectors.GlobalWrites.ShardKeyFormSubmitButton); +} + +async function waitForGlobalWritesStatus( + browser: CompassBrowser, + nextStatus: GeoShardingStatus +) { + await browser.waitUntil( + async () => { + return await browser + .$(Selectors.GlobalWrites.tabStatus(nextStatus)) + .isDisplayed(); + }, + { + timeout: WEBDRIVER_TIMEOUT, + // Sharding is slow process, no need to check too often, just makes the + // logs hard to read + interval: 2_000, + } + ); +} + +describe('Global writes', function () { + // Sharding a collection takes a bit longer + this.timeout(MOCHA_TIMEOUT); + + let compass: Compass; + let browser: CompassBrowser; + + before(function () { + if (!isTestingAtlasCloudSandbox()) { + this.skip(); + } + }); + + beforeEach(async function () { + compass = await init(this.test?.fullTitle()); + browser = compass.browser; + await browser.setupDefaultConnections(); + }); + + afterEach(async function () { + await screenshotIfFailed(compass, this.currentTest); + await cleanup(compass); + }); + + it('should be able to shard an unsharded namespace and also unmanage it', async function () { + const collName = `global-writes-geospatial-${Date.now()}`; + + await createGeospatialCollection(collName); + await browser.connectToDefaults(); + await browser.navigateToCollectionTab( + DEFAULT_CONNECTION_NAMES[0], + 'test', + collName, + 'GlobalWrites' + ); + + // Initial state is loading + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + + await createGeoShardKey(browser, { + secondShardKey: 'country', + keyType: 'HASHED', + }); + + // Wait for the shard key to be correct. + await waitForGlobalWritesStatus(browser, 'SHARD_KEY_CORRECT'); + + // Expectations to see the shard key in the UI + const findingDocumentsText = await browser + .$(Selectors.GlobalWrites.SampleFindingDocuments) + .getText(); + + const insertedDocumentsText = await browser + .$(Selectors.GlobalWrites.SampleInsertingDocuments) + .getText(); + + expect(findingDocumentsText).to.include('country'); + expect(insertedDocumentsText).to.include('country'); + + // Unmanage the namespace + await browser.clickVisible(Selectors.GlobalWrites.UnmanageNamespaceButton); + + // It transitions to the unmanaging state + await waitForGlobalWritesStatus(browser, 'INCOMPLETE_SHARDING_SETUP'); + + // This time there should be a button to manage the namespace again, but not the form + await browser + .$(Selectors.GlobalWrites.ManageNamespaceButton) + .waitForDisplayed(); + await browser + .$(Selectors.GlobalWrites.ShardKeyFormSecondKeyInputCombobox) + .waitForDisplayed({ reverse: true }); + }); + + it('should be able to shard an unsharded namespace and cancel the operation', async function () { + const collName = `global-writes-geospatial-${Date.now()}`; + + await createGeospatialCollection(collName); + await browser.connectToDefaults(); + await browser.navigateToCollectionTab( + DEFAULT_CONNECTION_NAMES[0], + 'test', + collName, + 'GlobalWrites' + ); + + // Initial state is loading + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + + await createGeoShardKey(browser, { + secondShardKey: 'country', + keyType: 'UNIQUE', + }); + + // Wait for the shard key to be correct. + await waitForGlobalWritesStatus(browser, 'SHARDING'); + + // Cancel the sharding operation. + await browser.clickConfirmationAction( + Selectors.GlobalWrites.CancelShardingButton + ); + + // After its cancelled, it should transition back to the unsharded state + await waitForGlobalWritesStatus(browser, 'UNSHARDED'); + }); +}); diff --git a/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts b/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts index 4c2fa9aac5e..e3189ba7135 100644 --- a/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts +++ b/packages/compass-e2e-tests/tests/atlas-cloud/rolling-indexes.test.ts @@ -1,5 +1,10 @@ import type { Compass } from '../../helpers/compass'; -import { cleanup, init, Selectors } from '../../helpers/compass'; +import { + cleanup, + init, + screenshotIfFailed, + Selectors, +} from '../../helpers/compass'; import type { CompassBrowser } from '../../helpers/compass-browser'; import { createNumbersCollection } from '../../helpers/insert-data'; import { @@ -11,25 +16,26 @@ describe('Rolling indexes', function () { let compass: Compass; let browser: CompassBrowser; - before(async function () { - compass = await init(this.test?.fullTitle()); - browser = compass.browser; - await browser.setupDefaultConnections(); - }); - before(function () { if (!isTestingAtlasCloudSandbox()) { this.skip(); } }); - after(async function () { + beforeEach(async function () { + compass = await init(this.test?.fullTitle()); + browser = compass.browser; + await browser.setupDefaultConnections(); + }); + + afterEach(async function () { + await screenshotIfFailed(compass, this.currentTest); await cleanup(compass); }); it('should be able to create, list, and delete rolling indexes', async function () { // Building rolling indexes is a slow process - const extendedRollingIndexesTimeout = 1000 * 60 * 20; + const extendedRollingIndexesTimeout = 1000 * 60 * 10; this.timeout(extendedRollingIndexesTimeout * 1.2); @@ -68,7 +74,12 @@ describe('Rolling indexes', function () { await browser .$(Selectors.indexComponent(indexName)) .$('[data-testid="index-ready"]') - .waitForDisplayed({ timeout: extendedRollingIndexesTimeout }); + .waitForDisplayed({ + timeout: extendedRollingIndexesTimeout, + // Building a rolling index is a slow process, no need to check too + // often + interval: 2_000, + }); // Now that it's ready, delete it (it will also check that it's eventually // removed from the list) diff --git a/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts b/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts index 2dd52fbe505..f4db128dfd3 100644 --- a/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts +++ b/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts @@ -1011,13 +1011,7 @@ describe('Collection aggregations tab', function () { it('shows confirmation modal when create new pipeline is clicked and aggregation is modified', async function () { await browser.selectStageOperator(0, '$match'); - - await browser.clickVisible(Selectors.CreateNewPipelineButton); - const modalElement = await browser.$(Selectors.ConfirmationModal); - await modalElement.waitForDisplayed(); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await modalElement.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction(Selectors.CreateNewPipelineButton); }); describe('aggregation builder in text mode', function () { @@ -1258,14 +1252,9 @@ describe('Collection aggregations tab', function () { ); await browser.hover(Selectors.AggregationSavedPipelineCard(name)); - await browser.clickVisible( + await browser.clickConfirmationAction( Selectors.AggregationSavedPipelineCardOpenButton(name) ); - - const confirmOpenModal = await browser.$(Selectors.ConfirmationModal); - await confirmOpenModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await confirmOpenModal.waitForDisplayed({ reverse: true }); }); it('deletes an aggregation', async function () { @@ -1278,14 +1267,9 @@ describe('Collection aggregations tab', function () { ); await browser.hover(Selectors.AggregationSavedPipelineCard(name)); - await browser.clickVisible( + await browser.clickConfirmationAction( Selectors.AggregationSavedPipelineCardDeleteButton(name) ); - - const confirmDeleteModal = await browser.$(Selectors.ConfirmationModal); - await confirmDeleteModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await confirmDeleteModal.waitForDisplayed({ reverse: true }); }); }); diff --git a/packages/compass-e2e-tests/tests/connection-form.test.ts b/packages/compass-e2e-tests/tests/connection-form.test.ts index 111c074f761..98a53f17563 100644 --- a/packages/compass-e2e-tests/tests/connection-form.test.ts +++ b/packages/compass-e2e-tests/tests/connection-form.test.ts @@ -670,14 +670,7 @@ describe('Connection form', function () { // toggle the edit connection string toggle twice await browser.clickVisible(Selectors.EditConnectionStringToggle); expect(await toggle.getAttribute('aria-checked')).to.equal('false'); - await browser.clickVisible(Selectors.EditConnectionStringToggle); - - const confirmModal = await browser.$(Selectors.ConfirmationModal); - await confirmModal.waitForDisplayed(); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - - await confirmModal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction(Selectors.EditConnectionStringToggle); // the toggle should now be on expect(await toggle.getAttribute('aria-checked')).to.equal('true'); diff --git a/packages/compass-e2e-tests/tests/my-queries-tab.test.ts b/packages/compass-e2e-tests/tests/my-queries-tab.test.ts index 58d833dfdf1..2b57d35e2c1 100644 --- a/packages/compass-e2e-tests/tests/my-queries-tab.test.ts +++ b/packages/compass-e2e-tests/tests/my-queries-tab.test.ts @@ -301,11 +301,9 @@ describe('My Queries tab', function () { await openMenuForQueryItem(browser, newFavoriteQueryName); // delete it - await browser.clickVisible(Selectors.SavedItemMenuItemDelete); - const deleteModal = await browser.$(Selectors.ConfirmationModal); - await deleteModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await renameModal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction( + Selectors.SavedItemMenuItemDelete + ); }); it('opens a saved aggregation', async function () { diff --git a/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts b/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts index c20ebc3476f..69197382d29 100644 --- a/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts +++ b/packages/compass-e2e-tests/tests/protect-connection-strings.test.ts @@ -87,10 +87,7 @@ describe('protectConnectionStrings', function () { ); // Enter edit connection string mode - await browser.clickVisible(Selectors.EditConnectionStringToggle); - const confirmModal = await browser.$(Selectors.ConfirmationModal); - await confirmModal.waitForDisplayed(); - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); + await browser.clickConfirmationAction(Selectors.EditConnectionStringToggle); expect( await browser.getConnectFormConnectionString(), diff --git a/packages/compass-e2e-tests/tests/search-indexes.test.ts b/packages/compass-e2e-tests/tests/search-indexes.test.ts index dbe41df9ada..264ecbc40ec 100644 --- a/packages/compass-e2e-tests/tests/search-indexes.test.ts +++ b/packages/compass-e2e-tests/tests/search-indexes.test.ts @@ -108,15 +108,11 @@ async function dropSearchIndex(browser: CompassBrowser, indexName: string) { await indexRow.waitForDisplayed(); await browser.hover(indexRowSelector); - await browser.clickVisible(Selectors.searchIndexDropButton(indexName)); - const modal = await browser.$(Selectors.ConfirmationModal); - await modal.waitForDisplayed(); - - await browser.setValueVisible(Selectors.ConfirmationModalInput, indexName); - - await browser.clickVisible(Selectors.confirmationModalConfirmButton()); - await modal.waitForDisplayed({ reverse: true }); + await browser.clickConfirmationAction( + Selectors.searchIndexDropButton(indexName), + indexName + ); await indexRow.waitForExist({ reverse: true, diff --git a/packages/compass-editor/package.json b/packages/compass-editor/package.json index 85c2ef7f6c9..de0626507a9 100644 --- a/packages/compass-editor/package.json +++ b/packages/compass-editor/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.32.0", + "version": "0.33.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -72,7 +72,7 @@ "@codemirror/state": "^6.1.4", "@codemirror/view": "^6.7.1", "@lezer/highlight": "^1.2.0", - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "@mongodb-js/mongodb-constants": "^0.10.0", "mongodb-query-parser": "^4.2.3", "polished": "^4.2.2", diff --git a/packages/compass-editor/src/actions.tsx b/packages/compass-editor/src/action-button.tsx similarity index 86% rename from packages/compass-editor/src/actions.tsx rename to packages/compass-editor/src/action-button.tsx index 49e0b25eef5..cc483c910ec 100644 --- a/packages/compass-editor/src/actions.tsx +++ b/packages/compass-editor/src/action-button.tsx @@ -1,10 +1,25 @@ import { cx } from '@mongodb-js/compass-components'; import { css } from '@mongodb-js/compass-components'; -import { Button, Icon } from '@mongodb-js/compass-components'; +import { Button, Icon, type IconGlyph } from '@mongodb-js/compass-components'; import React, { useCallback, useEffect, useState } from 'react'; +import type { EditorView } from '@codemirror/view'; + +export type Action = { + icon: IconGlyph; + label: string; + action: (editor: EditorView) => boolean | void; +}; const actionButtonStyle = css({ flex: 'none', + pointerEvents: 'all', +}); + +const actionCompactButtonStyle = css({ + '& > div:has(svg)': { + paddingLeft: 3, + paddingRight: 3, + }, }); const actionButtonContentStyle = css({ @@ -45,7 +60,8 @@ export const ActionButton: React.FunctionComponent<{ ...args: Parameters> ) => boolean | void; 'data-testid'?: string; -}> = ({ label, icon, onClick, ...props }) => { + compact?: boolean; +}> = ({ label, icon, onClick, compact, ...props }) => { const [clickResult, setClickResult] = useState<'success' | 'error'>( 'success' ); @@ -82,7 +98,7 @@ export const ActionButton: React.FunctionComponent<{ aria-label={label} title={label} onClick={onButtonClick} - className={actionButtonStyle} + className={cx(actionButtonStyle, { [actionCompactButtonStyle]: compact })} data-testid={props['data-testid'] ?? `editor-action-${label}`} >
diff --git a/packages/compass-editor/src/actions-container.tsx b/packages/compass-editor/src/actions-container.tsx new file mode 100644 index 00000000000..dc9e439924b --- /dev/null +++ b/packages/compass-editor/src/actions-container.tsx @@ -0,0 +1,107 @@ +import React, { type RefObject } from 'react'; + +import { type Action, ActionButton, FormatIcon } from './action-button'; +import type { EditorRef } from './types'; +import { css, cx, spacing } from '@mongodb-js/compass-components'; + +type ActionsContainerProps = { + copyable: boolean; + formattable: boolean; + customActions?: Action[]; + className?: string; + editorRef: RefObject; + onExpand?: () => void; + expanded?: boolean; +}; + +const actionsContainerStyle = css({ + position: 'absolute', + top: spacing[100], + right: spacing[100], + left: spacing[100], + display: 'none', + gap: spacing[200], + pointerEvents: 'none', +}); + +const expandContainerStyle = css({ + position: 'relative', + top: -spacing[100], + left: -spacing[100], +}); + +const actionsGroupItemSeparator = css({ + flex: '1 0 auto', + pointerEvents: 'none', +}); + +export const ActionsContainer = ({ + copyable, + formattable, + customActions, + className, + editorRef, + onExpand, + expanded, +}: ActionsContainerProps) => { + return ( +
+ {onExpand && ( +
+ +
+ )} + + {copyable && ( + { + return editorRef.current?.copyAll() ?? false; + }} + > + )} + {formattable && ( + + } + onClick={() => { + return editorRef.current?.prettify() ?? false; + }} + > + )} + {customActions && + customActions.map((action) => { + return ( + { + if (!editorRef.current?.editor) { + return false; + } + return action.action(editorRef.current.editor); + }} + > + ); + })} +
+ ); +}; diff --git a/packages/compass-editor/src/editor.tsx b/packages/compass-editor/src/editor.tsx index e366503c54a..7bdb7e91eeb 100644 --- a/packages/compass-editor/src/editor.tsx +++ b/packages/compass-editor/src/editor.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useEffect, useLayoutEffect, - useMemo, useImperativeHandle, useRef, useState, @@ -50,7 +49,6 @@ import { snippetCompletion, startCompletion, } from '@codemirror/autocomplete'; -import type { IconGlyph } from '@mongodb-js/compass-components'; import { css, cx, @@ -74,7 +72,9 @@ import { tags as t } from '@lezer/highlight'; import { rgba } from 'polished'; import { prettify as _prettify } from './prettify'; -import { ActionButton, FormatIcon } from './actions'; +import type { Action } from './action-button'; +import { ActionsContainer } from './actions-container'; +import type { EditorRef } from './types'; // TODO(COMPASS-8453): Re-enable this once the linked tickets are resolved // https://github.com/codemirror/dev/issues/1458 @@ -697,19 +697,6 @@ function useCodemirrorExtensionCompartment( return initialExtensionRef.current; } -export type EditorRef = { - foldAll: () => boolean; - unfoldAll: () => boolean; - copyAll: () => boolean; - prettify: () => boolean; - applySnippet: (template: string) => boolean; - focus: () => boolean; - cursorDocEnd: () => boolean; - startCompletion: () => boolean; - readonly editorContents: string | null; - readonly editor: EditorView | null; -}; - const BaseEditor = React.forwardRef(function BaseEditor( { initialText: _initialText, @@ -1402,30 +1389,25 @@ const multilineEditorContainerWithActionsStyle = css({ minHeight: spacing[5] - 2, }); -const multilineEditorContainerDarkModeStyle = css({ - backgroundColor: editorPalette.dark.backgroundColor, +const multilineEditorContainerWithExpandStyle = css({ + ['& .cm-gutters']: { + // Offset to prevent the "expand" button from overlapping with fold / unfold icons + paddingLeft: spacing[500], + }, }); -const actionsContainerStyle = css({ - position: 'absolute', - top: spacing[1], - right: spacing[2], - display: 'none', - gap: spacing[2], +const multilineEditorContainerDarkModeStyle = css({ + backgroundColor: editorPalette.dark.backgroundColor, }); -export type Action = { - icon: IconGlyph; - label: string; - action: (editor: EditorView) => boolean | void; -}; - type MultilineEditorProps = EditorProps & { customActions?: Action[]; copyable?: boolean; formattable?: boolean; editorClassName?: string; actionsClassName?: string; + onExpand?: () => void; + expanded?: boolean; }; const MultilineEditor = React.forwardRef( @@ -1438,8 +1420,10 @@ const MultilineEditor = React.forwardRef( editorClassName, actionsClassName, darkMode: _darkMode, + onExpand, + expanded, ...props - }, + }: MultilineEditorProps, ref ) { const darkMode = useDarkMode(_darkMode); @@ -1485,50 +1469,8 @@ const MultilineEditor = React.forwardRef( [] ); - const actions = useMemo(() => { - return [ - copyable && ( - { - return editorRef.current?.copyAll() ?? false; - }} - > - ), - formattable && ( - - } - onClick={() => { - return editorRef.current?.prettify() ?? false; - }} - > - ), - ...(customActions ?? []).map((action) => { - return ( - { - if (!editorRef.current?.editor) { - return false; - } - return action.action(editorRef.current.editor); - }} - > - ); - }), - ]; - }, [copyable, formattable, customActions]); + const hasCustomActions = customActions && customActions.length > 0; + const hasActions = copyable || formattable || hasCustomActions; return ( // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions @@ -1537,7 +1479,8 @@ const MultilineEditor = React.forwardRef( className={cx( multilineEditorContainerStyle, darkMode && multilineEditorContainerDarkModeStyle, - !!actions.length && multilineEditorContainerWithActionsStyle, + hasActions && multilineEditorContainerWithActionsStyle, + onExpand && multilineEditorContainerWithExpandStyle, className )} // We want folks to be able to click into the container element @@ -1559,16 +1502,16 @@ const MultilineEditor = React.forwardRef( minLines={10} {...props} > - {actions.length > 0 && ( -
- {actions} -
+ {hasActions && ( + )}
); diff --git a/packages/compass-editor/src/index.ts b/packages/compass-editor/src/index.ts index f9a6a1876f8..5bc81f249f6 100644 --- a/packages/compass-editor/src/index.ts +++ b/packages/compass-editor/src/index.ts @@ -1,4 +1,4 @@ -export type { CompletionWithServerInfo } from './types'; +export type { CompletionWithServerInfo, EditorRef } from './types'; export { prettify } from './prettify'; export type { FormatOptions } from './prettify'; export { @@ -7,14 +7,8 @@ export { setCodemirrorEditorValue, getCodemirrorEditorValue, } from './editor'; -export type { - EditorView, - Command, - Annotation, - Action, - EditorRef, - Completer, -} from './editor'; +export type { EditorView, Command, Annotation, Completer } from './editor'; +export type { Action } from './action-button'; export { createDocumentAutocompleter } from './codemirror/document-autocompleter'; export { createValidationAutocompleter } from './codemirror/validation-autocompleter'; export { createQueryAutocompleter } from './codemirror/query-autocompleter'; diff --git a/packages/compass-editor/src/types.ts b/packages/compass-editor/src/types.ts index 039c5d6d514..f190b1d7833 100644 --- a/packages/compass-editor/src/types.ts +++ b/packages/compass-editor/src/types.ts @@ -1,3 +1,5 @@ +import type { EditorView } from '@codemirror/view'; + export type CompletionWithServerInfo = { name?: string; value?: string; @@ -14,3 +16,16 @@ export type CompletionWithServerInfo = { /** Optional completion description */ description?: string; }; + +export type EditorRef = { + foldAll: () => boolean; + unfoldAll: () => boolean; + copyAll: () => boolean; + prettify: () => boolean; + applySnippet: (template: string) => boolean; + focus: () => boolean; + cursorDocEnd: () => boolean; + startCompletion: () => boolean; + readonly editorContents: string | null; + readonly editor: EditorView | null; +}; diff --git a/packages/compass-explain-plan/package.json b/packages/compass-explain-plan/package.json index d6c35ca71f4..d1eb7e1e5dd 100644 --- a/packages/compass-explain-plan/package.json +++ b/packages/compass-explain-plan/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "6.45.0", + "version": "6.47.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -58,7 +58,7 @@ "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -69,14 +69,14 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/explain-plan-helper": "^1.2.4", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "d3": "^3.5.17", "d3-flextree": "^2.1.2", "d3-hierarchy": "^3.1.2", diff --git a/packages/compass-export-to-language/package.json b/packages/compass-export-to-language/package.json index 42813e88814..6013719b957 100644 --- a/packages/compass-export-to-language/package.json +++ b/packages/compass-export-to-language/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "9.21.0", + "version": "9.23.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,15 +48,15 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-editor": "^0.32.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.27.2", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-editor": "^0.33.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.28.0", + "@mongodb-js/compass-telemetry": "^1.2.3", "@mongodb-js/shell-bson-parser": "^1.1.2", "bson-transpilers": "^3.0.10", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "mongodb-ns": "^2.4.2", "react": "^17.0.2", diff --git a/packages/compass-field-store/package.json b/packages/compass-field-store/package.json index 07fbabb3a34..cd77a525040 100644 --- a/packages/compass-field-store/package.json +++ b/packages/compass-field-store/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "9.20.0", + "version": "9.22.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -69,8 +69,8 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", "mongodb-schema": "^12.2.0", diff --git a/packages/compass-find-in-page/package.json b/packages/compass-find-in-page/package.json index d75ec0a3d65..612d6b013dc 100644 --- a/packages/compass-find-in-page/package.json +++ b/packages/compass-find-in-page/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "4.32.0", + "version": "4.32.1", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -61,7 +61,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^32.2.2", + "electron": "^32.2.5", "electron-mocha": "^12.2.0", "eslint": "^7.25.0", "mocha": "^10.2.0", @@ -73,9 +73,9 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-components": "^1.31.0", + "@mongodb-js/compass-components": "^1.31.1", "hadron-app-registry": "^9.2.7", - "hadron-ipc": "^3.2.24", + "hadron-ipc": "^3.2.25", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", diff --git a/packages/compass-generative-ai/package.json b/packages/compass-generative-ai/package.json index bbf9b1142dc..b7a0114f514 100644 --- a/packages/compass-generative-ai/package.json +++ b/packages/compass-generative-ai/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.25.0", + "version": "0.27.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -52,18 +52,24 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-intercom": "^0.13.2", - "@mongodb-js/compass-logging": "^1.4.9", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-intercom": "^0.14.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-utils": "^0.6.14", "bson": "^6.8.0", - "compass-preferences-model": "^2.29.2", + "compass-preferences-model": "^2.30.0", "hadron-app-registry": "^9.2.7", "mongodb": "^6.9.0", "mongodb-schema": "^12.2.0", - "react": "^17.0.2" + "react": "^17.0.2", + "react-redux": "^8.1.3", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2" }, "devDependencies": { + "@mongodb-js/connection-info": "^0.9.3", "@mongodb-js/eslint-config-compass": "^1.1.7", "@mongodb-js/mocha-config-compass": "^1.4.2", "@mongodb-js/prettier-config-compass": "^1.0.2", diff --git a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts index b274e6d0ad7..ad904fb4a68 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.spec.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.spec.ts @@ -5,6 +5,7 @@ import type { PreferencesAccess } from 'compass-preferences-model'; import { createSandboxFromDefaultPreferences } from 'compass-preferences-model'; import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; import { ObjectId } from 'mongodb'; +import type { ConnectionInfo } from '@mongodb-js/connection-info'; const ATLAS_USER = { firstName: 'John', @@ -21,12 +22,28 @@ const PREFERENCES_USER = { const BASE_URL = 'http://example.com'; +const mockConnectionInfo: ConnectionInfo = { + id: 'TEST', + connectionOptions: { + connectionString: 'mongodb://localhost:27020', + }, + atlasMetadata: { + orgId: 'testOrg', + projectId: 'testProject', + clusterName: 'pineapple', + regionalBaseUrl: 'https://example.com', + metricsId: 'metricsId', + metricsType: 'replicaSet', + instanceSize: 'M10', + clusterType: 'REPLICASET', + clusterUniqueId: 'clusterUniqueId', + }, +}; + class MockAtlasService { getCurrentUser = () => Promise.resolve(ATLAS_USER); - adminApiEndpoint = (url: string, requestId?: string) => - `${[BASE_URL, url].join('/')}${ - requestId ? `?request_id=${requestId}` : '' - }`; + cloudEndpoint = (url: string) => `${['/cloud', url].join('/')}`; + adminApiEndpoint = (url: string) => `${[BASE_URL, url].join('/')}`; authenticatedFetch = (url: string, init: RequestInit) => { return fetch(url, init); }; @@ -45,7 +62,6 @@ function makeResponse(content: any) { describe('AtlasAiService', function () { let sandbox: Sinon.SinonSandbox; - let atlasAiService: AtlasAiService; let preferences: PreferencesAccess; const initialFetch = global.fetch; @@ -53,12 +69,6 @@ describe('AtlasAiService', function () { sandbox = Sinon.createSandbox(); preferences = await createSandboxFromDefaultPreferences(); preferences['getPreferencesUser'] = () => PREFERENCES_USER; - - atlasAiService = new AtlasAiService( - new MockAtlasService() as any, - preferences, - createNoopLogger() - ); }); afterEach(function () { @@ -66,278 +76,333 @@ describe('AtlasAiService', function () { global.fetch = initialFetch; }); - describe('ai api calls', function () { - beforeEach(async function () { - // Enable the AI feature - const fetchStub = sandbox.stub().resolves( - makeResponse({ - features: { - GEN_AI_COMPASS: { - enabled: true, - }, - }, - }) - ); - global.fetch = fetchStub; - await atlasAiService['setupAIAccess'](); - global.fetch = initialFetch; - }); - - const atlasAIServiceTests = [ - { - functionName: 'getQueryFromUserInput', - aiEndpoint: 'mql-query', - responses: { - success: { - content: { query: { filter: "{ test: 'pineapple' }" } }, - }, - invalid: [ - [undefined, 'internal server error'], - [{}, 'unexpected response'], - [{ countent: {} }, 'unexpected response'], - [{ content: { qooery: {} } }, 'unexpected keys'], - [ - { content: { query: { filter: { foo: 1 } } } }, - 'unexpected response', - ], - ], - }, + const endpointBasepathTests = [ + { + apiURLPreset: 'admin-api', + expectedEndpoints: { + 'user-access': 'http://example.com/unauth/ai/api/v1/hello/1234', + 'mql-aggregation': `http://example.com/ai/api/v1/mql-aggregation?request_id=abc`, + 'mql-query': `http://example.com/ai/api/v1/mql-query?request_id=abc`, }, - { - functionName: 'getAggregationFromUserInput', - aiEndpoint: 'mql-aggregation', - responses: { - success: { - content: { aggregation: { pipeline: "[{ test: 'pineapple' }]" } }, - }, - invalid: [ - [undefined, 'internal server error'], - [{}, 'unexpected response'], - [{ content: { aggregation: {} } }, 'unexpected response'], - [{ content: { aggrogation: {} } }, 'unexpected keys'], - [ - { content: { aggregation: { pipeline: true } } }, - 'unexpected response', - ], - ], - }, + }, + { + apiURLPreset: 'cloud', + expectedEndpoints: { + 'user-access': '/cloud/ai/v1/hello/1234', + 'mql-aggregation': + '/cloud/ai/v1/groups/testProject/mql-aggregation?request_id=abc', + 'mql-query': '/cloud/ai/v1/groups/testProject/mql-query?request_id=abc', }, - ] as const; - - for (const { functionName, aiEndpoint, responses } of atlasAIServiceTests) { - describe(functionName, function () { - it('makes a post request with the user input to the endpoint in the environment', async function () { - const fetchStub = sandbox - .stub() - .resolves(makeResponse(responses.success)); - global.fetch = fetchStub; - - const res = await atlasAiService[functionName]({ - userInput: 'test', - signal: new AbortController().signal, - collectionName: 'jam', - databaseName: 'peanut', - schema: { _id: { types: [{ bsonType: 'ObjectId' }] } }, - sampleDocuments: [ - { _id: new ObjectId('642d766b7300158b1f22e972') }, - ], - requestId: 'abc', - }); - - expect(fetchStub).to.have.been.calledOnce; - - const { args } = fetchStub.firstCall; + }, + ] as const; + + for (const { apiURLPreset, expectedEndpoints } of endpointBasepathTests) { + describe(`api URL Preset "${apiURLPreset}"`, function () { + let atlasAiService: AtlasAiService; + + beforeEach(function () { + const mockAtlasService = new MockAtlasService(); + atlasAiService = new AtlasAiService({ + apiURLPreset, + atlasService: mockAtlasService as any, + preferences, + logger: createNoopLogger(), + }); + }); - expect(args[0]).to.eq( - `http://example.com/ai/api/v1/${aiEndpoint}?request_id=abc` - ); - expect(args[1].body).to.eq( - '{"userInput":"test","collectionName":"jam","databaseName":"peanut","schema":{"_id":{"types":[{"bsonType":"ObjectId"}]}},"sampleDocuments":[{"_id":{"$oid":"642d766b7300158b1f22e972"}}]}' + describe('ai api calls', function () { + beforeEach(async function () { + // Enable the AI feature + const fetchStub = sandbox.stub().resolves( + makeResponse({ + features: { + GEN_AI_COMPASS: { + enabled: true, + }, + }, + }) ); - expect(res).to.deep.eq(responses.success); + global.fetch = fetchStub; + await atlasAiService['setupAIAccess'](); + global.fetch = initialFetch; }); - it('should fail when response is not matching expected schema', async function () { - for (const [res, error] of responses.invalid) { - const fetchStub = sandbox.stub().resolves(makeResponse(res)); - global.fetch = fetchStub; - - try { - await atlasAiService[functionName]({ - userInput: 'test', - collectionName: 'test', - databaseName: 'peanut', - requestId: 'abc', - signal: new AbortController().signal, - }); - expect.fail(`Expected ${functionName} to throw`); - } catch (err) { - expect((err as Error).message).to.match(new RegExp(error, 'i')); - } - } - }); + const atlasAIServiceTests = [ + { + functionName: 'getQueryFromUserInput', + aiEndpoint: 'mql-query', + responses: { + success: { + content: { query: { filter: "{ test: 'pineapple' }" } }, + }, + invalid: [ + [undefined, 'internal server error'], + [{}, 'unexpected response'], + [{ countent: {} }, 'unexpected response'], + [{ content: { qooery: {} } }, 'unexpected keys'], + [ + { content: { query: { filter: { foo: 1 } } } }, + 'unexpected response', + ], + ], + }, + }, + { + functionName: 'getAggregationFromUserInput', + aiEndpoint: 'mql-aggregation', + responses: { + success: { + content: { + aggregation: { pipeline: "[{ test: 'pineapple' }]" }, + }, + }, + invalid: [ + [undefined, 'internal server error'], + [{}, 'unexpected response'], + [{ content: { aggregation: {} } }, 'unexpected response'], + [{ content: { aggrogation: {} } }, 'unexpected keys'], + [ + { content: { aggregation: { pipeline: true } } }, + 'unexpected response', + ], + ], + }, + }, + ] as const; + + for (const { + functionName, + aiEndpoint, + responses, + } of atlasAIServiceTests) { + describe(functionName, function () { + it('makes a post request with the user input to the endpoint in the environment', async function () { + const fetchStub = sandbox + .stub() + .resolves(makeResponse(responses.success)); + global.fetch = fetchStub; + + const res = await atlasAiService[functionName]( + { + userInput: 'test', + signal: new AbortController().signal, + collectionName: 'jam', + databaseName: 'peanut', + schema: { _id: { types: [{ bsonType: 'ObjectId' }] } }, + sampleDocuments: [ + { _id: new ObjectId('642d766b7300158b1f22e972') }, + ], + requestId: 'abc', + }, + mockConnectionInfo + ); + + expect(fetchStub).to.have.been.calledOnce; + + const { args } = fetchStub.firstCall; + + expect(args[0]).to.eq(expectedEndpoints[aiEndpoint]); + expect(args[1].body).to.eq( + '{"userInput":"test","collectionName":"jam","databaseName":"peanut","schema":{"_id":{"types":[{"bsonType":"ObjectId"}]}},"sampleDocuments":[{"_id":{"$oid":"642d766b7300158b1f22e972"}}]}' + ); + expect(res).to.deep.eq(responses.success); + }); - it('throws if the request would be too much for the ai', async function () { - try { - await atlasAiService[functionName]({ - userInput: 'test', - collectionName: 'test', - databaseName: 'peanut', - sampleDocuments: [{ test: '4'.repeat(5120001) }], - requestId: 'abc', - signal: new AbortController().signal, + it('should fail when response is not matching expected schema', async function () { + for (const [res, error] of responses.invalid) { + const fetchStub = sandbox.stub().resolves(makeResponse(res)); + global.fetch = fetchStub; + + try { + await atlasAiService[functionName]( + { + userInput: 'test', + collectionName: 'test', + databaseName: 'peanut', + requestId: 'abc', + signal: new AbortController().signal, + }, + mockConnectionInfo + ); + expect.fail(`Expected ${functionName} to throw`); + } catch (err) { + expect((err as Error).message).to.match( + new RegExp(error, 'i') + ); + } + } }); - expect.fail(`Expected ${functionName} to throw`); - } catch (err) { - expect(err).to.have.property( - 'message', - 'Sorry, your request is too large. Please use a smaller prompt or try using this feature on a collection with smaller documents.' - ); - } - }); - it('passes fewer documents if the request would be too much for the ai with all of the documents', async function () { - const fetchStub = sandbox - .stub() - .resolves(makeResponse(responses.success)); - global.fetch = fetchStub; + it('throws if the request would be too much for the ai', async function () { + try { + await atlasAiService[functionName]( + { + userInput: 'test', + collectionName: 'test', + databaseName: 'peanut', + sampleDocuments: [{ test: '4'.repeat(5120001) }], + requestId: 'abc', + signal: new AbortController().signal, + }, + mockConnectionInfo + ); + expect.fail(`Expected ${functionName} to throw`); + } catch (err) { + expect(err).to.have.property( + 'message', + 'Sorry, your request is too large. Please use a smaller prompt or try using this feature on a collection with smaller documents.' + ); + } + }); - await atlasAiService[functionName]({ - userInput: 'test', - collectionName: 'test.test', - databaseName: 'peanut', - sampleDocuments: [ - { a: '1' }, - { a: '2' }, - { a: '3' }, - { a: '4'.repeat(5120001) }, - ], - requestId: 'abc', - signal: new AbortController().signal, + it('passes fewer documents if the request would be too much for the ai with all of the documents', async function () { + const fetchStub = sandbox + .stub() + .resolves(makeResponse(responses.success)); + global.fetch = fetchStub; + + await atlasAiService[functionName]( + { + userInput: 'test', + collectionName: 'test.test', + databaseName: 'peanut', + sampleDocuments: [ + { a: '1' }, + { a: '2' }, + { a: '3' }, + { a: '4'.repeat(5120001) }, + ], + requestId: 'abc', + signal: new AbortController().signal, + }, + mockConnectionInfo + ); + + const { args } = fetchStub.firstCall; + + expect(fetchStub).to.have.been.calledOnce; + expect(args[1].body).to.eq( + '{"userInput":"test","collectionName":"test.test","databaseName":"peanut","sampleDocuments":[{"a":"1"}]}' + ); + }); }); + } + }); - const { args } = fetchStub.firstCall; - - expect(fetchStub).to.have.been.calledOnce; - expect(args[1].body).to.eq( - '{"userInput":"test","collectionName":"test.test","databaseName":"peanut","sampleDocuments":[{"a":"1"}]}' - ); + describe('setupAIAccess', function () { + beforeEach(async function () { + await preferences.savePreferences({ + cloudFeatureRolloutAccess: undefined, + }); }); - }); - } - }); - describe('setupAIAccess', function () { - beforeEach(async function () { - await preferences.savePreferences({ - cloudFeatureRolloutAccess: undefined, - }); - }); + it('should set the cloudFeatureRolloutAccess true when returned true', async function () { + const fetchStub = sandbox.stub().resolves( + makeResponse({ + features: { + GEN_AI_COMPASS: { + enabled: true, + }, + }, + }) + ); + global.fetch = fetchStub; - it('should set the cloudFeatureRolloutAccess true when returned true', async function () { - const fetchStub = sandbox.stub().resolves( - makeResponse({ - features: { - GEN_AI_COMPASS: { - enabled: true, - }, - }, - }) - ); - global.fetch = fetchStub; + let currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.equal(undefined); - let currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.equal(undefined); + await atlasAiService['setupAIAccess'](); - await atlasAiService['setupAIAccess'](); + const { args } = fetchStub.firstCall; - const { args } = fetchStub.firstCall; + expect(fetchStub).to.have.been.calledOnce; - expect(fetchStub).to.have.been.calledOnce; - expect(args[0]).to.contain('ai/api/v1/hello/1234'); + expect(args[0]).to.equal(expectedEndpoints['user-access']); - currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.deep.equal({ - GEN_AI_COMPASS: true, - }); - }); + currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.deep.equal({ + GEN_AI_COMPASS: true, + }); + }); - it('should set the cloudFeatureRolloutAccess false when returned false', async function () { - const fetchStub = sandbox.stub().resolves( - makeResponse({ - features: { - GEN_AI_COMPASS: { - enabled: false, - }, - }, - }) - ); - global.fetch = fetchStub; + it('should set the cloudFeatureRolloutAccess false when returned false', async function () { + const fetchStub = sandbox.stub().resolves( + makeResponse({ + features: { + GEN_AI_COMPASS: { + enabled: false, + }, + }, + }) + ); + global.fetch = fetchStub; - let currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.equal(undefined); + let currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.equal(undefined); - await atlasAiService['setupAIAccess'](); + await atlasAiService['setupAIAccess'](); - const { args } = fetchStub.firstCall; + const { args } = fetchStub.firstCall; - expect(fetchStub).to.have.been.calledOnce; - expect(args[0]).to.contain('ai/api/v1/hello/1234'); + expect(fetchStub).to.have.been.calledOnce; + expect(args[0]).to.equal(expectedEndpoints['user-access']); - currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.deep.equal({ - GEN_AI_COMPASS: false, - }); - }); + currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.deep.equal({ + GEN_AI_COMPASS: false, + }); + }); - it('should set the cloudFeatureRolloutAccess false when returned null', async function () { - const fetchStub = sandbox.stub().resolves( - makeResponse({ - features: null, - }) - ); - global.fetch = fetchStub; + it('should set the cloudFeatureRolloutAccess false when returned null', async function () { + const fetchStub = sandbox.stub().resolves( + makeResponse({ + features: null, + }) + ); + global.fetch = fetchStub; - let currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.equal(undefined); + let currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.equal(undefined); - await atlasAiService['setupAIAccess'](); + await atlasAiService['setupAIAccess'](); - const { args } = fetchStub.firstCall; + const { args } = fetchStub.firstCall; - expect(fetchStub).to.have.been.calledOnce; - expect(args[0]).to.contain('ai/api/v1/hello/1234'); + expect(fetchStub).to.have.been.calledOnce; + expect(args[0]).to.equal(expectedEndpoints['user-access']); - currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.deep.equal({ - GEN_AI_COMPASS: false, - }); - }); + currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.deep.equal({ + GEN_AI_COMPASS: false, + }); + }); - it('should not set the cloudFeatureRolloutAccess false when returned false', async function () { - const fetchStub = sandbox.stub().throws(new Error('error')); - global.fetch = fetchStub; + it('should not set the cloudFeatureRolloutAccess false when returned false', async function () { + const fetchStub = sandbox.stub().throws(new Error('error')); + global.fetch = fetchStub; - let currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.equal(undefined); + let currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.equal(undefined); - await atlasAiService['setupAIAccess'](); + await atlasAiService['setupAIAccess'](); - const { args } = fetchStub.firstCall; + const { args } = fetchStub.firstCall; - expect(fetchStub).to.have.been.calledOnce; - expect(args[0]).to.contain('ai/api/v1/hello/1234'); + expect(fetchStub).to.have.been.calledOnce; + expect(args[0]).to.equal(expectedEndpoints['user-access']); - currentCloudFeatureRolloutAccess = - preferences.getPreferences().cloudFeatureRolloutAccess; - expect(currentCloudFeatureRolloutAccess).to.deep.equal(undefined); + currentCloudFeatureRolloutAccess = + preferences.getPreferences().cloudFeatureRolloutAccess; + expect(currentCloudFeatureRolloutAccess).to.deep.equal(undefined); + }); + }); }); - }); + } }); diff --git a/packages/compass-generative-ai/src/atlas-ai-service.ts b/packages/compass-generative-ai/src/atlas-ai-service.ts index 5cc49001be7..89cdccfaf8f 100644 --- a/packages/compass-generative-ai/src/atlas-ai-service.ts +++ b/packages/compass-generative-ai/src/atlas-ai-service.ts @@ -5,9 +5,12 @@ import { } from 'compass-preferences-model/provider'; import type { AtlasService } from '@mongodb-js/atlas-service/provider'; import { AtlasServiceError } from '@mongodb-js/atlas-service/renderer'; +import type { ConnectionInfo } from '@mongodb-js/compass-connections/provider'; import type { Document } from 'mongodb'; import type { Logger } from '@mongodb-js/compass-logging'; import { EJSON } from 'bson'; +import { signIntoAtlasWithModalPrompt } from './store/atlas-signin-reducer'; +import { getStore } from './store/atlas-signin-store'; type GenerativeAiInput = { userInput: string; @@ -23,9 +26,6 @@ type GenerativeAiInput = { // want to ensure we're not uploading massive documents (some folks have documents > 1mb). const AI_MAX_REQUEST_SIZE = 5120000; const AI_MIN_SAMPLE_DOCUMENTS = 1; -const USER_AI_URI = (userId: string) => `unauth/ai/api/v1/hello/${userId}`; -const AGGREGATION_URI = 'ai/api/v1/mql-aggregation'; -const QUERY_URI = 'ai/api/v1/mql-query'; type AIAggregation = { content: { @@ -192,17 +192,83 @@ export function validateAIAggregationResponse( } } +const aiURLConfig = { + // There are two different sets of endpoints we use for our requests. + // Down the line we'd like to only use the admin api, however, + // we cannot currently call that from the Atlas UI. Pending CLOUDP-251201 + 'admin-api': { + 'user-access': (userId: string) => `unauth/ai/api/v1/hello/${userId}`, + aggregation: 'ai/api/v1/mql-aggregation', + query: 'ai/api/v1/mql-query', + }, + cloud: { + 'user-access': (userId: string) => `ai/v1/hello/${userId}`, + aggregation: (groupId: string) => `ai/v1/groups/${groupId}/mql-aggregation`, + query: (groupId: string) => `ai/v1/groups/${groupId}/mql-query`, + }, +} as const; +type AIEndpoint = 'user-access' | 'query' | 'aggregation'; + export class AtlasAiService { private initPromise: Promise | null = null; - constructor( - private atlasService: AtlasService, - private preferences: PreferencesAccess, - private logger: Logger - ) { + private apiURLPreset: 'admin-api' | 'cloud'; + private atlasService: AtlasService; + private preferences: PreferencesAccess; + private logger: Logger; + + constructor({ + apiURLPreset, + atlasService, + preferences, + logger, + }: { + apiURLPreset: 'admin-api' | 'cloud'; + atlasService: AtlasService; + preferences: PreferencesAccess; + logger: Logger; + }) { + this.apiURLPreset = apiURLPreset; + this.atlasService = atlasService; + this.preferences = preferences; + this.logger = logger; + this.initPromise = this.setupAIAccess(); } + private getUrlForEndpoint( + urlId: AIEndpoint, + connectionInfo?: ConnectionInfo + ) { + if (this.apiURLPreset === 'cloud') { + if (urlId === 'user-access') { + return this.atlasService.cloudEndpoint( + aiURLConfig[this.apiURLPreset][urlId]( + this.preferences.getPreferencesUser().id + ) + ); + } + + const atlasMetadata = connectionInfo?.atlasMetadata; + if (!atlasMetadata) { + throw new Error( + "Can't perform generative ai request: atlasMetadata is not available" + ); + } + + return this.atlasService.cloudEndpoint( + aiURLConfig[this.apiURLPreset][urlId](atlasMetadata.projectId) + ); + } + const urlConfig = aiURLConfig[this.apiURLPreset][urlId]; + const urlPath = + typeof urlConfig === 'function' + ? urlConfig(this.preferences.getPreferencesUser().id) + : urlConfig; + + return this.atlasService.adminApiEndpoint(urlPath); + } + private throwIfAINotEnabled() { if (process.env.COMPASS_E2E_SKIP_ATLAS_SIGNIN === 'true') { return; @@ -215,8 +281,8 @@ export class AtlasAiService { } private async getAIFeatureEnablement(): Promise { - const userId = this.preferences.getPreferencesUser().id; - const url = this.atlasService.adminApiEndpoint(USER_AI_URI(userId)); + const url = this.getUrlForEndpoint('user-access'); + const res = await this.atlasService.fetch(url, { headers: { Accept: 'application/json', @@ -260,9 +326,23 @@ export class AtlasAiService { } } + async ensureAiFeatureAccess({ signal }: { signal?: AbortSignal } = {}) { + // When the ai feature is attempted to be opened we make sure + // the user is signed into Atlas and opted in. + return getStore().dispatch(signIntoAtlasWithModalPrompt({ signal })); + } + private getQueryOrAggregationFromUserInput = async ( - uri: string, - input: GenerativeAiInput, + { + urlId, + input, + connectionInfo, + }: { + urlId: 'query' | 'aggregation'; + input: GenerativeAiInput; + + connectionInfo?: ConnectionInfo; + }, validationFn: (res: any) => asserts res is T ): Promise => { await this.initPromise; @@ -271,7 +351,10 @@ export class AtlasAiService { const { signal, requestId, ...rest } = input; const msgBody = buildQueryOrAggregationMessageBody(rest); - const url = this.atlasService.adminApiEndpoint(uri, requestId); + const url = `${this.getUrlForEndpoint( + urlId, + connectionInfo + )}?request_id=${encodeURIComponent(requestId)}`; this.logger.log.info( this.logger.mongoLogId(1_001_000_308), @@ -326,18 +409,30 @@ export class AtlasAiService { return data; }; - async getAggregationFromUserInput(input: GenerativeAiInput) { + async getAggregationFromUserInput( + input: GenerativeAiInput, + connectionInfo: ConnectionInfo + ) { return this.getQueryOrAggregationFromUserInput( - AGGREGATION_URI, - input, + { + connectionInfo, + urlId: 'aggregation', + input, + }, validateAIAggregationResponse ); } - async getQueryFromUserInput(input: GenerativeAiInput) { + async getQueryFromUserInput( + input: GenerativeAiInput, + connectionInfo: ConnectionInfo + ) { return this.getQueryOrAggregationFromUserInput( - QUERY_URI, - input, + { + urlId: 'query', + input, + connectionInfo, + }, validateAIQueryResponse ); } diff --git a/packages/atlas-service/src/components/ai-signin-banner-image.tsx b/packages/compass-generative-ai/src/components/atlas-signin/ai-signin-banner-image.tsx similarity index 100% rename from packages/atlas-service/src/components/ai-signin-banner-image.tsx rename to packages/compass-generative-ai/src/components/atlas-signin/ai-signin-banner-image.tsx diff --git a/packages/atlas-service/src/components/ai-signin-modal.tsx b/packages/compass-generative-ai/src/components/atlas-signin/ai-signin-modal.tsx similarity index 95% rename from packages/atlas-service/src/components/ai-signin-modal.tsx rename to packages/compass-generative-ai/src/components/atlas-signin/ai-signin-modal.tsx index 464dc88a559..a199945b067 100644 --- a/packages/atlas-service/src/components/ai-signin-modal.tsx +++ b/packages/compass-generative-ai/src/components/atlas-signin/ai-signin-modal.tsx @@ -11,8 +11,8 @@ import { useDarkMode, } from '@mongodb-js/compass-components'; import { AISignInImageBanner } from './ai-signin-banner-image'; -import type { AtlasSignInState } from '../store/atlas-signin-reducer'; -import { closeSignInModal, signIn } from '../store/atlas-signin-reducer'; +import type { AtlasSignInState } from '../../store/atlas-signin-reducer'; +import { closeSignInModal, signIn } from '../../store/atlas-signin-reducer'; const GEN_AI_FAQ_LINK = 'https://www.mongodb.com/docs/generative-ai-faq/'; diff --git a/packages/atlas-service/src/components/index.tsx b/packages/compass-generative-ai/src/components/atlas-signin/index.tsx similarity index 100% rename from packages/atlas-service/src/components/index.tsx rename to packages/compass-generative-ai/src/components/atlas-signin/index.tsx diff --git a/packages/compass-generative-ai/src/components/index.ts b/packages/compass-generative-ai/src/components/index.ts index f2f97da4ac7..cc65c9df4f4 100644 --- a/packages/compass-generative-ai/src/components/index.ts +++ b/packages/compass-generative-ai/src/components/index.ts @@ -3,3 +3,4 @@ export { AIExperienceEntry, createAIPlaceholderHTMLPlaceholder, } from './ai-experience-entry'; +export { AtlasSignIn } from './atlas-signin'; diff --git a/packages/compass-generative-ai/src/index.ts b/packages/compass-generative-ai/src/index.ts index caf0b37a175..a6f55d1bbec 100644 --- a/packages/compass-generative-ai/src/index.ts +++ b/packages/compass-generative-ai/src/index.ts @@ -1,3 +1,20 @@ +import { registerHadronPlugin } from 'hadron-app-registry'; +import { atlasAuthServiceLocator } from '@mongodb-js/atlas-service/provider'; + +import { activatePlugin } from './store/atlas-signin-store'; +import { AtlasSignIn } from './components'; + +export const CompassGenerativeAIPlugin = registerHadronPlugin( + { + name: 'CompassGenerativeAI', + component: AtlasSignIn, + activate: activatePlugin, + }, + { + atlasAuthService: atlasAuthServiceLocator, + } +); + export { AIExperienceEntry, GenerativeAIInput, diff --git a/packages/compass-generative-ai/src/provider.tsx b/packages/compass-generative-ai/src/provider.tsx index 6df896c8439..05f3bd58db6 100644 --- a/packages/compass-generative-ai/src/provider.tsx +++ b/packages/compass-generative-ai/src/provider.tsx @@ -10,23 +10,31 @@ import { const AtlasAiServiceContext = createContext(null); -export const AtlasAiServiceProvider: React.FC = createServiceProvider( - function AtlasAiServiceProvider({ children }) { - const logger = useLogger('ATLAS-AI-SERVICE'); - const preferences = preferencesLocator(); - const atlasService = atlasServiceLocator(); +export const AtlasAiServiceProvider: React.FC<{ + apiURLPreset: 'admin-api' | 'cloud'; +}> = createServiceProvider(function AtlasAiServiceProvider({ + apiURLPreset, + children, +}) { + const logger = useLogger('ATLAS-AI-SERVICE'); + const preferences = preferencesLocator(); + const atlasService = atlasServiceLocator(); - const aiService = useMemo(() => { - return new AtlasAiService(atlasService, preferences, logger); - }, [preferences, logger, atlasService]); + const aiService = useMemo(() => { + return new AtlasAiService({ + apiURLPreset, + atlasService, + preferences, + logger, + }); + }, [apiURLPreset, preferences, logger, atlasService]); - return ( - - {children} - - ); - } -); + return ( + + {children} + + ); +}); function useAtlasAiServiceContext(): AtlasAiService { const service = useContext(AtlasAiServiceContext); diff --git a/packages/compass-generative-ai/src/store/atlas-signin-reducer.spec.ts b/packages/compass-generative-ai/src/store/atlas-signin-reducer.spec.ts new file mode 100644 index 00000000000..3a036cb536c --- /dev/null +++ b/packages/compass-generative-ai/src/store/atlas-signin-reducer.spec.ts @@ -0,0 +1,189 @@ +import Sinon from 'sinon'; +import { expect } from 'chai'; + +import { + signIn, + cancelSignIn, + attemptId, + AttemptStateMap, + signIntoAtlasWithModalPrompt, + closeSignInModal, + atlasServiceSignedIn, +} from './atlas-signin-reducer'; +import { configureStore } from './atlas-signin-store'; + +describe('atlasSignInReducer', function () { + const sandbox = Sinon.createSandbox(); + + afterEach(function () { + sandbox.reset(); + }); + + describe('signIn', function () { + it('should check authenticated state and set state to success if already authenticated', async function () { + const mockAtlasService = { + signIn: sandbox.stub().resolves({ sub: '1234' }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + expect(store.getState()).to.have.nested.property('state', 'initial'); + void store.dispatch(atlasServiceSignedIn()); + await store.dispatch(signIn()); + expect(mockAtlasService.signIn).not.to.have.been.called; + expect(store.getState()).to.have.nested.property('state', 'success'); + }); + + it('should start sign in, and set state to success', async function () { + const mockAtlasService = { + signIn: sandbox.stub().resolves({ sub: '1234' }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + expect(store.getState()).to.have.nested.property('state', 'initial'); + void store.dispatch(signIntoAtlasWithModalPrompt()).catch(() => {}); + await store.dispatch(signIn()); + expect(mockAtlasService.signIn).to.have.been.calledOnce; + expect(store.getState()).to.have.nested.property('state', 'success'); + }); + + it('should fail sign in if sign in failed', async function () { + const mockAtlasService = { + signIn: sandbox.stub().rejects(new Error('Pineapples!')), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + void store.dispatch(signIntoAtlasWithModalPrompt()).catch(() => {}); + const signInPromise = store.dispatch(signIn()); + // Avoid unhandled rejections. + AttemptStateMap.get(attemptId)?.promise.catch(() => {}); + await signInPromise; + expect(mockAtlasService.signIn).to.have.been.calledOnce; + expect(store.getState()).to.have.nested.property('state', 'error'); + }); + }); + + describe('cancelSignIn', function () { + it('should do nothing if no sign in is in progress', function () { + const store = configureStore({ + atlasAuthService: {} as any, + }); + expect(store.getState()).to.have.nested.property('state', 'initial'); + store.dispatch(cancelSignIn()); + expect(store.getState()).to.have.nested.property('state', 'initial'); + }); + + it('should cancel sign in if sign in is in progress', async function () { + const mockAtlasService = { + signIn: sandbox + .stub() + .callsFake(({ signal }: { signal: AbortSignal }) => { + return new Promise((resolve, reject) => { + signal.addEventListener('abort', () => { + reject(signal.reason); + }); + }); + }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + void store.dispatch(signIntoAtlasWithModalPrompt()).catch(() => {}); + + await Promise.all([ + store.dispatch(signIn()), + store.dispatch(cancelSignIn()), + ]); + expect(store.getState()).to.have.nested.property('state', 'canceled'); + }); + }); + + describe('signIntoAtlasWithModalPrompt', function () { + it('should resolve when user finishes sign in with prompt flow', async function () { + const mockAtlasService = { + signIn: sandbox.stub().resolves({ sub: '1234' }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + const signInPromise = store.dispatch(signIntoAtlasWithModalPrompt()); + await store.dispatch(signIn()); + await signInPromise; + + expect(store.getState()).to.have.property('state', 'success'); + }); + + it('should reject if sign in flow fails', async function () { + const mockAtlasService = { + signIn: sandbox.stub().rejects(new Error('Whoops!')), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + const signInPromise = store.dispatch(signIntoAtlasWithModalPrompt()); + await store.dispatch(signIn()); + + try { + await signInPromise; + throw new Error('Expected signInPromise to throw'); + } catch (err) { + expect(err).to.have.property('message', 'Whoops!'); + } + + expect(store.getState()).to.have.property('state', 'error'); + }); + + it('should reject if user dismissed the modal', async function () { + const mockAtlasService = { + signIn: sandbox.stub().resolves({ sub: '1234' }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + const signInPromise = store.dispatch(signIntoAtlasWithModalPrompt()); + store.dispatch(closeSignInModal(new Error('This operation was aborted'))); + + try { + await signInPromise; + throw new Error('Expected signInPromise to throw'); + } catch (err) { + expect(err).to.have.property('message', 'This operation was aborted'); + } + + expect(store.getState()).to.have.property('state', 'canceled'); + }); + + it('should reject if provided signal was aborted', async function () { + const mockAtlasService = { + signIn: sandbox.stub().resolves({ sub: '1234' }), + }; + const store = configureStore({ + atlasAuthService: mockAtlasService as any, + }); + + const c = new AbortController(); + const signInPromise = store.dispatch( + signIntoAtlasWithModalPrompt({ signal: c.signal }) + ); + c.abort(new Error('Aborted from outside')); + + try { + await signInPromise; + throw new Error('Expected signInPromise to throw'); + } catch (err) { + expect(err).to.have.property('message', 'Aborted from outside'); + } + + expect(store.getState()).to.have.property('state', 'canceled'); + }); + }); +}); diff --git a/packages/compass-generative-ai/src/store/atlas-signin-reducer.ts b/packages/compass-generative-ai/src/store/atlas-signin-reducer.ts new file mode 100644 index 00000000000..52b15b96920 --- /dev/null +++ b/packages/compass-generative-ai/src/store/atlas-signin-reducer.ts @@ -0,0 +1,357 @@ +import type { Action, AnyAction, Reducer } from 'redux'; +import type { ThunkAction } from 'redux-thunk'; +import type { AtlasAuthService } from '@mongodb-js/atlas-service/provider'; +import { throwIfAborted } from '@mongodb-js/compass-utils'; + +function isAction
( + action: AnyAction, + type: A['type'] +): action is A { + return action.type === type; +} + +type AttemptState = { + id: number; + controller: AbortController; + promise: Promise; + resolve: () => void; + reject: (reason?: any) => void; +}; + +export type AtlasSignInState = { + error: string | null; + isModalOpen: boolean; + attemptId: number | null; +} & ( + | { + state: 'initial' | 'in-progress' | 'error' | 'canceled'; + } + | { state: 'success' } +); + +export type GenAIAtlasSignInThunkAction< + R, + A extends AnyAction = AnyAction +> = ThunkAction; + +export const enum AtlasSignInActions { + OpenSignInModal = 'compass-generative-ai/atlas-signin/OpenSignInModal', + CloseSignInModal = 'compass-generative-ai/atlas-signin/CloseSignInModal', + AttemptStart = 'compass-generative-ai/atlas-signin/AttemptStart', + AttemptEnd = 'compass-generative-ai/atlas-signin/AttemptEnd', + Start = 'compass-generative-ai/atlas-signin/AtlasSignInStart', + Success = 'compass-generative-ai/atlas-signin/AtlasSignInSuccess', + Error = 'compass-generative-ai/atlas-signin/AtlasSignInError', + Cancel = 'compass-generative-ai/atlas-signin/AtlasSignInCancel', + TokenRefreshFailed = 'compass-generative-ai/atlas-signin/TokenRefreshFailed', + SignedOut = 'compass-generative-ai/atlas-signin/SignedOut', +} + +export type AtlasSignInOpenModalAction = { + type: AtlasSignInActions.OpenSignInModal; +}; + +export type AtlasSignInCloseModalAction = { + type: AtlasSignInActions.CloseSignInModal; +}; + +export type AtlasSignInAttemptStartAction = { + type: AtlasSignInActions.AttemptStart; + attemptId: number; +}; + +export type AtlasSignInAttemptEndAction = { + type: AtlasSignInActions.AttemptEnd; + attemptId: number; +}; + +export type AtlasSignInStartAction = { + type: AtlasSignInActions.Start; +}; + +export type AtlasSignInSuccessAction = { + type: AtlasSignInActions.Success; +}; + +export type AtlasSignInErrorAction = { + type: AtlasSignInActions.Error; + error: string; +}; + +export type AtlasSignInTokenRefreshFailedAction = { + type: AtlasSignInActions.TokenRefreshFailed; +}; + +export type AtlasSignInSignedOutAction = { + type: AtlasSignInActions.SignedOut; +}; + +export type AtlasSignInCancelAction = { type: AtlasSignInActions.Cancel }; + +const INITIAL_STATE = { + state: 'initial' as const, + error: null, + isModalOpen: false, + attemptId: null, +}; + +// Exported for testing purposes only. +export const AttemptStateMap = new Map(); + +export let attemptId = 0; + +export function getAttempt(id?: number | null): AttemptState { + if (!id) { + id = ++attemptId; + const controller = new AbortController(); + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + if (resolve && reject) { + AttemptStateMap.set(id, { + id, + controller, + promise, + resolve: resolve, + reject: reject, + }); + } + } + const attemptState = AttemptStateMap.get(id); + if (!attemptState) { + throw new Error( + 'Trying to get the state for a non-existing sign in attempt' + ); + } + return attemptState; +} + +const reducer: Reducer = ( + state = { ...INITIAL_STATE }, + action +) => { + if ( + isAction( + action, + AtlasSignInActions.AttemptStart + ) + ) { + return { + ...state, + attemptId: action.attemptId, + }; + } + + if ( + isAction(action, AtlasSignInActions.AttemptEnd) + ) { + return { + ...state, + attemptId: null, + }; + } + + if (isAction(action, AtlasSignInActions.Start)) { + return { ...state, state: 'in-progress' }; + } + + if (isAction(action, AtlasSignInActions.Success)) { + return { + ...state, + state: 'success', + error: null, + isModalOpen: false, + }; + } + + if (isAction(action, AtlasSignInActions.Error)) { + return { + ...state, + state: 'error', + error: action.error, + isModalOpen: false, + }; + } + + if (isAction(action, AtlasSignInActions.Cancel)) { + return { ...INITIAL_STATE, state: 'canceled' }; + } + + if ( + isAction( + action, + AtlasSignInActions.OpenSignInModal + ) + ) { + return { ...state, isModalOpen: true }; + } + + if ( + isAction( + action, + AtlasSignInActions.CloseSignInModal + ) + ) { + return { ...state, isModalOpen: false }; + } + + if ( + isAction( + action, + AtlasSignInActions.TokenRefreshFailed + ) + ) { + // Only reset state on refresh failed when we are currently successfully + // signed in. All other cases mean that either there is a sign in already + // in progress or something else already failed: no need to update either + // way + if (state.state !== 'success') { + return state; + } + return { ...INITIAL_STATE, state: 'error' }; + } + + if ( + isAction(action, AtlasSignInActions.SignedOut) + ) { + return { ...INITIAL_STATE }; + } + + return state; +}; + +const startAttempt = ( + fn: () => void +): GenAIAtlasSignInThunkAction => { + return (dispatch, getState) => { + if (getState().attemptId) { + throw new Error( + "Can't start sign in with prompt while another sign in attempt is in progress" + ); + } + const attempt = getAttempt(); + dispatch({ type: AtlasSignInActions.AttemptStart, attemptId: attempt.id }); + attempt.promise + .finally(() => { + dispatch({ + type: AtlasSignInActions.AttemptEnd, + attemptId: attempt.id, + }); + }) + .catch(() => { + // noop for the promise created by `finally`, original promise rejection + // should be handled by the service user + }); + setTimeout(fn); + return attempt; + }; +}; + +export const signIntoAtlasWithModalPrompt = ({ + signal, +}: { signal?: AbortSignal } = {}): GenAIAtlasSignInThunkAction< + Promise +> => { + return (dispatch, getState) => { + // Nothing to do if we already signed in. + const { state } = getState(); + if (state === 'success') { + return Promise.resolve(); + } + const attempt = dispatch( + startAttempt(() => { + dispatch(openSignInModal()); + }) + ); + signal?.addEventListener('abort', () => { + dispatch(closeSignInModal(signal.reason)); + }); + return attempt.promise; + }; +}; + +export const signIn = (): GenAIAtlasSignInThunkAction> => { + return async (dispatch, getState, { atlasAuthService }) => { + if (['in-progress', 'authenticated'].includes(getState().state)) { + return; + } + const { attemptId } = getState(); + if (attemptId === null) { + return; + } + const { + controller: { signal }, + resolve, + reject, + } = getAttempt(getState().attemptId); + dispatch({ + type: AtlasSignInActions.Start, + }); + + try { + throwIfAborted(signal); + + await atlasAuthService.signIn({ + signal, + promptType: 'none', + }); + dispatch(atlasServiceSignedIn()); + resolve(); + } catch (err) { + if (signal.aborted) { + return; + } + dispatch({ + type: AtlasSignInActions.Error, + error: (err as Error).message, + }); + reject(err); + } + }; +}; + +export const openSignInModal = () => { + return { type: AtlasSignInActions.OpenSignInModal }; +}; + +export const closeSignInModal = ( + reason?: any +): GenAIAtlasSignInThunkAction => { + return (dispatch) => { + dispatch(cancelSignIn(reason)); + dispatch({ type: AtlasSignInActions.CloseSignInModal }); + }; +}; + +export const cancelSignIn = ( + reason?: any +): GenAIAtlasSignInThunkAction => { + return (dispatch, getState) => { + // Can't cancel sign in after the flow was finished indicated by current + // attempt id being set to null. + if (getState().attemptId === null) { + return; + } + const attempt = getAttempt(getState().attemptId); + attempt.controller.abort(); + attempt.reject(reason ?? attempt.controller.signal.reason); + dispatch({ type: AtlasSignInActions.Cancel }); + }; +}; + +export const atlasServiceTokenRefreshFailed = () => ({ + type: AtlasSignInActions.TokenRefreshFailed, +}); + +export const atlasServiceSignedOut = () => ({ + type: AtlasSignInActions.SignedOut, +}); + +export const atlasServiceSignedIn = () => ({ + type: AtlasSignInActions.Success, +}); + +export default reducer; diff --git a/packages/compass-generative-ai/src/store/atlas-signin-store.ts b/packages/compass-generative-ai/src/store/atlas-signin-store.ts new file mode 100644 index 00000000000..389a92549bd --- /dev/null +++ b/packages/compass-generative-ai/src/store/atlas-signin-store.ts @@ -0,0 +1,54 @@ +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; +import reducer, { + atlasServiceSignedOut, + atlasServiceSignedIn, + atlasServiceTokenRefreshFailed, +} from './atlas-signin-reducer'; +import type { AtlasAuthService } from '@mongodb-js/atlas-service/provider'; +import type { ActivateHelpers } from 'hadron-app-registry'; + +let store: CompassGenerativeAIServiceStore; +export function getStore() { + if (!store) { + throw new Error('CompassGenerativeAIPlugin not activated'); + } + return store; +} + +export type CompassGenerativeAIPluginServices = { + atlasAuthService: AtlasAuthService; +}; +export function activatePlugin( + _: Record, + services: CompassGenerativeAIPluginServices, + { cleanup }: ActivateHelpers +) { + store = configureStore(services); + + services.atlasAuthService.on('signed-in', () => { + void store.dispatch(atlasServiceSignedIn()); + }); + + services.atlasAuthService.on('signed-out', () => { + void store.dispatch(atlasServiceSignedOut()); + }); + + services.atlasAuthService.on('token-refresh-failed', () => { + void store.dispatch(atlasServiceTokenRefreshFailed()); + }); + + return { store, deactivate: cleanup }; +} + +export function configureStore({ + atlasAuthService, +}: CompassGenerativeAIPluginServices) { + const store = createStore( + reducer, + applyMiddleware(thunk.withExtraArgument({ atlasAuthService })) + ); + return store; +} + +export type CompassGenerativeAIServiceStore = ReturnType; diff --git a/packages/compass-global-writes/package.json b/packages/compass-global-writes/package.json index 4d49e7b09ec..e7eb1fa76ad 100644 --- a/packages/compass-global-writes/package.json +++ b/packages/compass-global-writes/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.4.0", + "version": "1.6.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,15 +49,15 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/atlas-service": "^0.31.0", - "@mongodb-js/compass-collection": "^4.44.0", - "@mongodb-js/compass-components": "^1.31.0", - "@mongodb-js/compass-connections": "^1.45.0", - "@mongodb-js/compass-logging": "^1.4.9", - "@mongodb-js/compass-telemetry": "^1.2.2", + "@mongodb-js/atlas-service": "^0.32.0", + "@mongodb-js/compass-collection": "^4.46.0", + "@mongodb-js/compass-components": "^1.31.1", + "@mongodb-js/compass-connections": "^1.47.0", + "@mongodb-js/compass-logging": "^1.4.10", + "@mongodb-js/compass-telemetry": "^1.2.3", "hadron-app-registry": "^9.2.7", "lodash": "^4.17.21", - "@mongodb-js/compass-field-store": "^9.20.0", + "@mongodb-js/compass-field-store": "^9.22.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", diff --git a/packages/compass-global-writes/src/components/common-styles.ts b/packages/compass-global-writes/src/components/common-styles.ts index b9ec0bd7e84..a73a688af02 100644 --- a/packages/compass-global-writes/src/components/common-styles.ts +++ b/packages/compass-global-writes/src/components/common-styles.ts @@ -17,3 +17,8 @@ export const containerStyles = css({ marginBottom: spacing[400], textAlign: 'justify', }); + +export const bannerBtnStyles = css({ + float: 'right', + height: `${spacing[600]}px`, +}); diff --git a/packages/compass-global-writes/src/components/create-shard-key-form.tsx b/packages/compass-global-writes/src/components/create-shard-key-form.tsx index 19c801e7b1d..98e504e6d8e 100644 --- a/packages/compass-global-writes/src/components/create-shard-key-form.tsx +++ b/packages/compass-global-writes/src/components/create-shard-key-form.tsx @@ -21,7 +21,6 @@ import { import { createShardKey, type RootState, - ShardingStatuses, type CreateShardKeyData, } from '../store/reducer'; import { useAutocompleteFields } from '@mongodb-js/compass-field-store'; @@ -190,6 +189,7 @@ export function CreateShardKeyForm({ @@ -255,6 +256,7 @@ export function CreateShardKeyForm({ @@ -317,19 +319,11 @@ export function CreateShardKeyForm({ } export default connect( - (state: RootState) => { - return { - namespace: state.namespace, - isSubmittingForSharding: [ - ShardingStatuses.SUBMITTING_FOR_SHARDING, - ShardingStatuses.SUBMITTING_FOR_SHARDING_ERROR, - ].includes(state.status), - isCancellingSharding: [ - ShardingStatuses.CANCELLING_SHARDING, - ShardingStatuses.CANCELLING_SHARDING_ERROR, - ].includes(state.status), - }; - }, + (state: RootState) => ({ + namespace: state.namespace, + isSubmittingForSharding: state.userActionInProgress === 'submitForSharding', + isCancellingSharding: state.userActionInProgress === 'cancelSharding', + }), { onCreateShardKey: createShardKey, } diff --git a/packages/compass-global-writes/src/components/example-commands-markup.spec.tsx b/packages/compass-global-writes/src/components/example-commands-markup.spec.tsx new file mode 100644 index 00000000000..77cc92ed53e --- /dev/null +++ b/packages/compass-global-writes/src/components/example-commands-markup.spec.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { renderWithStore } from '../../tests/create-store'; +import { expect } from 'chai'; +import { screen } from '@mongodb-js/testing-library-compass'; +import ExampleCommandsMarkup, { + type ExampleCommandsMarkupProps, +} from './example-commands-markup'; +import { type ShardKey } from '../store/reducer'; + +describe('ExampleCommandsMarkup', function () { + const db = 'db1'; + const coll = 'coll1'; + const namespace = `${db}.${coll}`; + const shardKey: ShardKey = { + fields: [ + { type: 'RANGE', name: 'location' }, + { type: 'HASHED', name: 'secondary' }, + ], + isUnique: false, + }; + + function renderWithProps(props?: Partial) { + return renderWithStore( + + ); + } + + it('Contains sample codes', async function () { + await renderWithProps(); + + const findingDocumentsSample = await screen.findByTestId( + 'sample-finding-documents' + ); + expect(findingDocumentsSample).to.be.visible; + expect(findingDocumentsSample.textContent).to.contain( + `use db1db["coll1"].find({"location": "US-NY", "secondary": ""})` + ); + + const insertingDocumentsSample = await screen.findByTestId( + 'sample-inserting-documents' + ); + expect(insertingDocumentsSample).to.be.visible; + expect(insertingDocumentsSample.textContent).to.contain( + `use db1db["coll1"].insertOne({"location": "US-NY", "secondary": "",...})` + ); + }); +}); diff --git a/packages/compass-global-writes/src/components/example-commands-markup.tsx b/packages/compass-global-writes/src/components/example-commands-markup.tsx new file mode 100644 index 00000000000..5171c3ecc5d --- /dev/null +++ b/packages/compass-global-writes/src/components/example-commands-markup.tsx @@ -0,0 +1,99 @@ +import { + Body, + Code, + css, + Label, + Link, + spacing, + Subtitle, +} from '@mongodb-js/compass-components'; +import React, { useMemo } from 'react'; +import type { ShardKey } from '../store/reducer'; +import toNS from 'mongodb-ns'; + +const codeBlockContainerStyles = css({ + display: 'flex', + flexDirection: 'column', + gap: spacing[100], +}); + +export interface ExampleCommandsMarkupProps { + shardKey: ShardKey; + namespace: string; + showMetaData?: boolean; + type?: 'requested' | 'existing'; +} + +const paragraphStyles = css({ + display: 'flex', + flexDirection: 'column', + gap: spacing[100], +}); + +export function ExampleCommandsMarkup({ + namespace, + shardKey, +}: ExampleCommandsMarkupProps) { + const customShardKeyField = useMemo(() => { + return shardKey.fields[1].name; + }, [shardKey]); + + const sampleCodes = useMemo(() => { + const { collection, database } = toNS(namespace); + return { + findingDocuments: `use ${database}\ndb[${JSON.stringify( + collection + )}].find({"location": "US-NY", "${customShardKeyField}": ""})`, + insertingDocuments: `use ${database}\ndb[${JSON.stringify( + collection + )}].insertOne({"location": "US-NY", "${customShardKeyField}": "",...})`, + }; + }, [namespace, customShardKeyField]); + + return ( + <> + Example commands +
+ + Start querying your database with some of the most{' '} + + common commands + {' '} + for Global Writes. + + + Replace the text to perform operations on different documents. US-NY + is an ISO 3166 location code referring to New York, United States. You + can look up other ISO 3166 location codes below. + +
+ +
+ + + {sampleCodes.findingDocuments} + +
+ +
+ + + {sampleCodes.insertingDocuments} + +
+ + ); +} + +export default ExampleCommandsMarkup; diff --git a/packages/compass-global-writes/src/components/index.spec.tsx b/packages/compass-global-writes/src/components/index.spec.tsx index 4aff0336345..c5ab3f89791 100644 --- a/packages/compass-global-writes/src/components/index.spec.tsx +++ b/packages/compass-global-writes/src/components/index.spec.tsx @@ -15,13 +15,6 @@ describe('Compass GlobalWrites Plugin', function () { expect(screen.getByTestId('shard-collection-button')).to.exist; }); - it('renders plugin in SUBMITTING_FOR_SHARDING state', async function () { - await renderWithStore( - - ); - expect(screen.getByTestId('shard-collection-button')).to.exist; - }); - it('renders plugin in SHARDING state', async function () { await renderWithStore(); expect(screen.getByText(/sharding your collection/i)).to.exist; diff --git a/packages/compass-global-writes/src/components/index.tsx b/packages/compass-global-writes/src/components/index.tsx index f27f9c2a989..87396d02b50 100644 --- a/packages/compass-global-writes/src/components/index.tsx +++ b/packages/compass-global-writes/src/components/index.tsx @@ -15,25 +15,24 @@ import ShardKeyCorrect from './states/shard-key-correct'; import ShardKeyInvalid from './states/shard-key-invalid'; import ShardKeyMismatch from './states/shard-key-mismatch'; import ShardingError from './states/sharding-error'; +import IncompleteShardingSetup from './states/incomplete-sharding-setup'; +import LoadingError from './states/loading-error'; const containerStyles = css({ - paddingLeft: spacing[400], - paddingRight: spacing[400], display: 'flex', width: '100%', - height: '100%', - maxWidth: '700px', -}); - -const workspaceContentStyles = css({ paddingTop: spacing[400], + paddingLeft: spacing[400], + paddingRight: spacing[400], + maxWidth: '700px', }); -const centeredContent = css({ +const loaderStyles = css({ display: 'flex', + alignItems: 'flex-start', justifyContent: 'center', - alignItems: 'center', - height: '100%', + width: '100%', + marginTop: spacing[1800] * 2, }); type GlobalWritesProps = { @@ -43,42 +42,21 @@ type GlobalWritesProps = { function ShardingStateView({ shardingStatus, }: { - shardingStatus: ShardingStatus; + shardingStatus: Exclude; }) { - if (shardingStatus === ShardingStatuses.NOT_READY) { - return ( -
- -
- ); - } - - if ( - shardingStatus === ShardingStatuses.UNSHARDED || - shardingStatus === ShardingStatuses.SUBMITTING_FOR_SHARDING - ) { + if (shardingStatus === ShardingStatuses.UNSHARDED) { return ; } - if ( - shardingStatus === ShardingStatuses.SHARDING || - shardingStatus === ShardingStatuses.CANCELLING_SHARDING - ) { + if (shardingStatus === ShardingStatuses.SHARDING) { return ; } - if ( - shardingStatus === ShardingStatuses.SHARDING_ERROR || - shardingStatus === ShardingStatuses.CANCELLING_SHARDING_ERROR || - shardingStatus === ShardingStatuses.SUBMITTING_FOR_SHARDING_ERROR - ) { + if (shardingStatus === ShardingStatuses.SHARDING_ERROR) { return ; } - if ( - shardingStatus === ShardingStatuses.SHARD_KEY_CORRECT || - shardingStatus === ShardingStatuses.UNMANAGING_NAMESPACE - ) { + if (shardingStatus === ShardingStatuses.SHARD_KEY_CORRECT) { return ; } @@ -86,25 +64,38 @@ function ShardingStateView({ return ; } - if ( - shardingStatus === ShardingStatuses.SHARD_KEY_MISMATCH || - shardingStatus === ShardingStatuses.UNMANAGING_NAMESPACE_MISMATCH - ) { + if (shardingStatus === ShardingStatuses.SHARD_KEY_MISMATCH) { return ; } + if (shardingStatus === ShardingStatuses.INCOMPLETE_SHARDING_SETUP) { + return ; + } + + if (shardingStatus === ShardingStatuses.LOADING_ERROR) { + return ; + } + return null; } export function GlobalWrites({ shardingStatus }: GlobalWritesProps) { + if (shardingStatus === ShardingStatuses.NOT_READY) { + return ( +
+ +
+ ); + } + return ( -
- - + + +
- - -
+
+ + ); } export default connect((state: RootState) => ({ diff --git a/packages/compass-global-writes/src/components/shard-zones-description.tsx b/packages/compass-global-writes/src/components/shard-zones-description.tsx new file mode 100644 index 00000000000..0e3d7e395ed --- /dev/null +++ b/packages/compass-global-writes/src/components/shard-zones-description.tsx @@ -0,0 +1,53 @@ +import { + Body, + css, + Link, + spacing, + Subtitle, +} from '@mongodb-js/compass-components'; +import { useConnectionInfo } from '@mongodb-js/compass-connections/provider'; +import React from 'react'; + +const paragraphStyles = css({ + display: 'flex', + flexDirection: 'column', + gap: spacing[100], +}); + +export function ShardZonesDescription() { + const { atlasMetadata } = useConnectionInfo(); + return ( + <> + Location Codes +
+ + Each document’s first field should include an ISO 3166-1 Alpha-2 code + for the location it belongs to. + + + We also support ISO 3166-2 subdivision codes for countries containing + a cloud provider data center (both ISO 3166-1 and ISO 3166-2 codes may + be used for these countries). All valid country codes and the zones to + which they map are listed in the table below. Additionally, you can + view a list of all location codes{' '} + here. + + + {atlasMetadata?.projectId && atlasMetadata?.clusterName && ( + <> + Locations’ zone mapping can be changed by navigating to this + clusters{' '} + + Edit Configuration + {' '} + page and clicking the Configure Location Mappings’ link above the + map. + + )} + +
+ + ); +} diff --git a/packages/compass-global-writes/src/components/shard-zones-descripton.spec.tsx b/packages/compass-global-writes/src/components/shard-zones-descripton.spec.tsx new file mode 100644 index 00000000000..fe58b3819d0 --- /dev/null +++ b/packages/compass-global-writes/src/components/shard-zones-descripton.spec.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { expect } from 'chai'; +import { screen } from '@mongodb-js/testing-library-compass'; +import type { ConnectionInfo } from '@mongodb-js/compass-connections/provider'; +import { renderWithStore } from '../../tests/create-store'; +import { ShardZonesDescription } from './shard-zones-description'; + +describe('ShardZonesDescription', () => { + it('Provides link to Edit Configuration', async function () { + const connectionInfo = { + id: 'testConnection', + connectionOptions: { + connectionString: 'mongodb://test', + }, + atlasMetadata: { + projectId: 'project1', + clusterName: 'myCluster', + } as ConnectionInfo['atlasMetadata'], + }; + await renderWithStore(, { + connectionInfo, + }); + + const link = await screen.findByRole('link', { + name: /Edit Configuration/, + }); + const expectedHref = `/v2/${connectionInfo.atlasMetadata?.projectId}#/clusters/edit/${connectionInfo.atlasMetadata?.clusterName}`; + + expect(link).to.be.visible; + expect(link).to.have.attribute('href', expectedHref); + }); +}); diff --git a/packages/compass-global-writes/src/components/shard-zones-table.tsx b/packages/compass-global-writes/src/components/shard-zones-table.tsx index 6d3952235d0..f30352f4c44 100644 --- a/packages/compass-global-writes/src/components/shard-zones-table.tsx +++ b/packages/compass-global-writes/src/components/shard-zones-table.tsx @@ -19,6 +19,7 @@ import { type LgTableRowType, } from '@mongodb-js/compass-components'; import type { ShardZoneData } from '../store/reducer'; +import { ShardZonesDescription } from './shard-zones-description'; const containerStyles = css({ height: '400px', @@ -131,6 +132,7 @@ export function ShardZonesTable({ return ( <> + {}, + }; + + const connectionInfo = { + id: 'testConnection', + connectionOptions: { + connectionString: 'mongodb://test', + }, + atlasMetadata: { + projectId: 'project1', + clusterName: 'myCluster', + } as ConnectionInfo['atlasMetadata'], + }; + + function renderWithProps( + props?: Partial, + options?: Parameters[1] + ) { + return renderWithStore( + , + { + connectionInfo, + ...options, + } + ); + } + + it('Shows description', async function () { + await renderWithProps(); + + expect(screen.findByText(/your configuration is incomplete/)).to.be.exist; + expect(screen.findByText(/Please enable Global Writes/)).to.be.exist; + }); + + it('Provides button to resume managed namespace', async function () { + const onResume = Sinon.spy(); + await renderWithProps({ onResume }); + + const btn = await screen.findByRole('button', { + name: /Enable Global Writes/, + }); + expect(btn).to.be.visible; + + userEvent.click(btn); + + expect(onResume).to.have.been.calledOnce; + }); + + it('Manage btn is disabled when the action is in progress', async function () { + const onResume = Sinon.spy(); + await renderWithProps({ onResume, isSubmittingForSharding: true }); + + const btn = await screen.findByTestId( + 'manage-collection-button' + ); + expect(btn).to.be.visible; + expect(btn.getAttribute('aria-disabled')).to.equal('true'); + + userEvent.click(btn); + + expect(onResume).not.to.have.been.called; + }); + + it('Describes the shardKey', async function () { + await renderWithProps(); + + const title = await screen.findByTestId( + 'existing-shardkey-description-title' + ); + expect(title).to.be.visible; + expect(title.textContent).to.equal( + `${baseProps.namespace} is configured with the following shard key:` + ); + const list = await screen.findByTestId( + 'existing-shardkey-description-content' + ); + expect(list).to.be.visible; + expect(list.textContent).to.contain(`"location", "secondary"`); + }); + + it('Includes code examples', async function () { + await renderWithProps(); + + const example = await screen.findByText(/Example commands/); + expect(example).to.be.visible; + }); +}); diff --git a/packages/compass-global-writes/src/components/states/incomplete-sharding-setup.tsx b/packages/compass-global-writes/src/components/states/incomplete-sharding-setup.tsx new file mode 100644 index 00000000000..e45e0ac135d --- /dev/null +++ b/packages/compass-global-writes/src/components/states/incomplete-sharding-setup.tsx @@ -0,0 +1,98 @@ +import { + Banner, + BannerVariant, + Button, + spacing, + css, + ButtonVariant, + Link, + SpinLoader, +} from '@mongodb-js/compass-components'; +import React from 'react'; +import ShardKeyMarkup from '../shard-key-markup'; +import { + resumeManagedNamespace, + type ShardZoneData, + type RootState, + type ShardKey, +} from '../../store/reducer'; +import { connect } from 'react-redux'; +import ExampleCommandsMarkup from '../example-commands-markup'; +import { ShardZonesTable } from '../shard-zones-table'; +import { bannerBtnStyles } from '../common-styles'; + +const containerStyles = css({ + display: 'flex', + flexDirection: 'column', + gap: spacing[400], + marginBottom: spacing[400], +}); + +export interface IncompleteShardingSetupProps { + shardKey: ShardKey; + shardZones: ShardZoneData[]; + namespace: string; + isSubmittingForSharding: boolean; + onResume: () => void; +} + +export function IncompleteShardingSetup({ + shardKey, + shardZones, + namespace, + onResume, + isSubmittingForSharding, +}: IncompleteShardingSetupProps) { + return ( +
+ + + It looks like you've chosen a Global Writes shard key for this + collection, but your configuration is incomplete. + {' '} + Please enable Global Writes for this collection to ensure that documents + are associated with the appropriate zone.  + + Read more about Global Writes + +
+ +
+
+ + + +
+ ); +} + +export default connect( + (state: RootState) => { + if (!state.shardKey) { + throw new Error('Shard key not found in IncompleteShardingSetup'); + } + return { + namespace: state.namespace, + shardKey: state.shardKey, + shardZones: state.shardZones, + isSubmittingForSharding: + state.userActionInProgress === 'submitForSharding', + }; + }, + { + onResume: resumeManagedNamespace, + } +)(IncompleteShardingSetup); diff --git a/packages/compass-global-writes/src/components/states/loading-error.spec.tsx b/packages/compass-global-writes/src/components/states/loading-error.spec.tsx new file mode 100644 index 00000000000..2ed220dd9bd --- /dev/null +++ b/packages/compass-global-writes/src/components/states/loading-error.spec.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { expect } from 'chai'; +import { screen } from '@mongodb-js/testing-library-compass'; +import { LoadingError } from './loading-error'; +import { renderWithStore } from '../../../tests/create-store'; + +const error = 'Test failure'; + +function renderWithProps( + props?: Partial> +) { + return renderWithStore(); +} + +describe('LoadingError', function () { + it('renders the error', async function () { + await renderWithProps(); + expect(screen.getByText(error)).to.exist; + }); +}); diff --git a/packages/compass-global-writes/src/components/states/loading-error.tsx b/packages/compass-global-writes/src/components/states/loading-error.tsx new file mode 100644 index 00000000000..8a508c38316 --- /dev/null +++ b/packages/compass-global-writes/src/components/states/loading-error.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { ErrorSummary } from '@mongodb-js/compass-components'; +import { connect } from 'react-redux'; +import { type RootState, ShardingStatuses } from '../../store/reducer'; +import { containerStyles } from '../common-styles'; + +interface LoadingErrorProps { + error: string; +} + +export function LoadingError({ error }: LoadingErrorProps) { + return ( +
+ +
+ ); +} + +export default connect((state: RootState) => { + if (state.status !== ShardingStatuses.LOADING_ERROR) { + throw new Error('Error not found in LoadingError'); + } + return { + error: state.loadingError, + }; +})(LoadingError); diff --git a/packages/compass-global-writes/src/components/states/shard-key-correct.spec.tsx b/packages/compass-global-writes/src/components/states/shard-key-correct.spec.tsx index 504db736e4e..72728148cd1 100644 --- a/packages/compass-global-writes/src/components/states/shard-key-correct.spec.tsx +++ b/packages/compass-global-writes/src/components/states/shard-key-correct.spec.tsx @@ -8,9 +8,8 @@ import { import { type ShardZoneData } from '../../store/reducer'; import Sinon from 'sinon'; import { renderWithStore } from '../../../tests/create-store'; -import { type ConnectionInfo } from '@mongodb-js/compass-connections/provider'; -describe('Compass GlobalWrites Plugin', function () { +describe('ShardKeyCorrect', function () { const shardZones: ShardZoneData[] = [ { zoneId: '45893084', @@ -76,30 +75,6 @@ describe('Compass GlobalWrites Plugin', function () { expect(onUnmanageNamespace).not.to.have.been.called; }); - it('Provides link to Edit Configuration', async function () { - const connectionInfo = { - id: 'testConnection', - connectionOptions: { - connectionString: 'mongodb://test', - }, - atlasMetadata: { - projectId: 'project1', - clusterName: 'myCluster', - } as ConnectionInfo['atlasMetadata'], - }; - await renderWithProps(undefined, { - connectionInfo, - }); - - const link = await screen.findByRole('link', { - name: /Edit Configuration/, - }); - const expectedHref = `/v2/${connectionInfo.atlasMetadata?.projectId}#/clusters/edit/${connectionInfo.atlasMetadata?.clusterName}`; - - expect(link).to.be.visible; - expect(link).to.have.attribute('href', expectedHref); - }); - it('Describes the shardKey', async function () { await renderWithProps(); @@ -117,23 +92,10 @@ describe('Compass GlobalWrites Plugin', function () { expect(list.textContent).to.contain(`"location", "secondary"`); }); - it('Contains sample codes', async function () { + it('Includes code examples', async function () { await renderWithProps(); - const findingDocumentsSample = await screen.findByTestId( - 'sample-finding-documents' - ); - expect(findingDocumentsSample).to.be.visible; - expect(findingDocumentsSample.textContent).to.contain( - `use db1db["coll1"].find({"location": "US-NY", "secondary": ""})` - ); - - const insertingDocumentsSample = await screen.findByTestId( - 'sample-inserting-documents' - ); - expect(insertingDocumentsSample).to.be.visible; - expect(insertingDocumentsSample.textContent).to.contain( - `use db1db["coll1"].insertOne({"location": "US-NY", "secondary": "",...})` - ); + const example = await screen.findByText(/Example commands/); + expect(example).to.be.visible; }); }); diff --git a/packages/compass-global-writes/src/components/states/shard-key-correct.tsx b/packages/compass-global-writes/src/components/states/shard-key-correct.tsx index 12e7f64f313..3608de29d5e 100644 --- a/packages/compass-global-writes/src/components/states/shard-key-correct.tsx +++ b/packages/compass-global-writes/src/components/states/shard-key-correct.tsx @@ -3,42 +3,25 @@ import { Banner, BannerVariant, Body, - css, - Link, - spacing, - Code, Subtitle, - Label, Button, ButtonVariant, SpinLoader, } from '@mongodb-js/compass-components'; import { connect } from 'react-redux'; import { - ShardingStatuses, unmanageNamespace, type RootState, type ShardKey, type ShardZoneData, } from '../../store/reducer'; -import toNS from 'mongodb-ns'; import { ShardZonesTable } from '../shard-zones-table'; -import { useConnectionInfo } from '@mongodb-js/compass-connections/provider'; import ShardKeyMarkup from '../shard-key-markup'; -import { - containerStyles, - paragraphStyles, - bannerStyles, -} from '../common-styles'; +import { containerStyles, bannerStyles } from '../common-styles'; +import ExampleCommandsMarkup from '../example-commands-markup'; const nbsp = '\u00a0'; -const codeBlockContainerStyles = css({ - display: 'flex', - flexDirection: 'column', - gap: spacing[100], -}); - export type ShardKeyCorrectProps = { namespace: string; shardKey: ShardKey; @@ -58,20 +41,6 @@ export function ShardKeyCorrect({ return shardKey.fields[1].name; }, [shardKey]); - const { atlasMetadata } = useConnectionInfo(); - - const sampleCodes = useMemo(() => { - const { collection, database } = toNS(namespace); - return { - findingDocuments: `use ${database}\ndb[${JSON.stringify( - collection - )}].find({"location": "US-NY", "${customShardKeyField}": ""})`, - insertingDocuments: `use ${database}\ndb[${JSON.stringify( - collection - )}].insertOne({"location": "US-NY", "${customShardKeyField}": "",...})`, - }; - }, [namespace, customShardKeyField]); - return (
@@ -83,77 +52,7 @@ export function ShardKeyCorrect({ {nbsp}We have included a table for reference below. - Example commands -
- - Start querying your database with some of the most{' '} - - common commands - {' '} - for Global Writes. - - - Replace the text to perform operations on different documents. US-NY - is an ISO 3166 location code referring to New York, United States. You - can look up other ISO 3166 location codes below. - -
- -
- - - {sampleCodes.findingDocuments} - -
- -
- - - {sampleCodes.insertingDocuments} - -
- - Location Codes -
- - Each document’s first field should include an ISO 3166-1 Alpha-2 code - for the location it belongs to. - - - We also support ISO 3166-2 subdivision codes for countries containing - a cloud provider data center (both ISO 3166-1 and ISO 3166-2 codes may - be used for these countries). All valid country codes and the zones to - which they map are listed in the table below. Additionally, you can - view a list of all location codes{' '} - here. - - - {atlasMetadata?.projectId && atlasMetadata?.clusterName && ( - <> - Locations’ zone mapping can be changed by navigating to this - clusters{' '} - - Edit Configuration - {' '} - page and clicking the Configure Location Mappings’ link above the - map. - - )} - -
+ @@ -186,8 +85,7 @@ export default connect( namespace: state.namespace, shardKey: state.shardKey, shardZones: state.shardZones, - isUnmanagingNamespace: - state.status === ShardingStatuses.UNMANAGING_NAMESPACE, + isUnmanagingNamespace: state.userActionInProgress === 'unmanageNamespace', }; }, { diff --git a/packages/compass-global-writes/src/components/states/shard-key-invalid.spec.tsx b/packages/compass-global-writes/src/components/states/shard-key-invalid.spec.tsx index 84fc8829e7e..acc8c775e7a 100644 --- a/packages/compass-global-writes/src/components/states/shard-key-invalid.spec.tsx +++ b/packages/compass-global-writes/src/components/states/shard-key-invalid.spec.tsx @@ -7,7 +7,7 @@ import { } from './shard-key-invalid'; import { renderWithStore } from '../../../tests/create-store'; -describe('Compass GlobalWrites Plugin', function () { +describe('ShardKeyInvalid', function () { const baseProps: ShardKeyInvalidProps = { namespace: 'db1.coll1', shardKey: { diff --git a/packages/compass-global-writes/src/components/states/shard-key-mismatch.spec.tsx b/packages/compass-global-writes/src/components/states/shard-key-mismatch.spec.tsx index 25bf89f7193..67dbf52bd75 100644 --- a/packages/compass-global-writes/src/components/states/shard-key-mismatch.spec.tsx +++ b/packages/compass-global-writes/src/components/states/shard-key-mismatch.spec.tsx @@ -8,7 +8,7 @@ import { import { renderWithStore } from '../../../tests/create-store'; import Sinon from 'sinon'; -describe('Compass GlobalWrites Plugin', function () { +describe('ShardKeyMismatch', function () { const baseProps: ShardKeyMismatchProps = { namespace: 'db1.coll1', shardKey: { diff --git a/packages/compass-global-writes/src/components/states/shard-key-mismatch.tsx b/packages/compass-global-writes/src/components/states/shard-key-mismatch.tsx index 33d3b87be2d..5f6cbde240d 100644 --- a/packages/compass-global-writes/src/components/states/shard-key-mismatch.tsx +++ b/packages/compass-global-writes/src/components/states/shard-key-mismatch.tsx @@ -2,26 +2,23 @@ import { Banner, BannerVariant, Button, - spacing, - css, ButtonVariant, SpinLoader, } from '@mongodb-js/compass-components'; import React from 'react'; import ShardKeyMarkup from '../shard-key-markup'; import { - ShardingStatuses, unmanageNamespace, type RootState, type ShardKey, } from '../../store/reducer'; import { connect } from 'react-redux'; import type { ManagedNamespace } from '../../services/atlas-global-writes-service'; -import { containerStyles, bannerStyles } from '../common-styles'; - -const unmanageBtnStyles = css({ - marginTop: spacing[100], -}); +import { + containerStyles, + bannerStyles, + bannerBtnStyles, +} from '../common-styles'; const getRequestedShardKey = ( managedNamespace: ManagedNamespace @@ -71,7 +68,7 @@ export function ShardKeyMismatch({ variant={ButtonVariant.Default} isLoading={isUnmanagingNamespace} loadingIndicator={} - className={unmanageBtnStyles} + className={bannerBtnStyles} > Unmanage collection @@ -104,8 +101,7 @@ export default connect( shardKey: state.shardKey, requestedShardKey: state.managedNamespace && getRequestedShardKey(state.managedNamespace), - isUnmanagingNamespace: - state.status === ShardingStatuses.UNMANAGING_NAMESPACE_MISMATCH, + isUnmanagingNamespace: state.userActionInProgress === 'unmanageNamespace', }; }, { diff --git a/packages/compass-global-writes/src/components/states/sharding-error.tsx b/packages/compass-global-writes/src/components/states/sharding-error.tsx index a71c2d583b6..ead1e46c98f 100644 --- a/packages/compass-global-writes/src/components/states/sharding-error.tsx +++ b/packages/compass-global-writes/src/components/states/sharding-error.tsx @@ -8,18 +8,13 @@ import { SpinLoader, } from '@mongodb-js/compass-components'; import { connect } from 'react-redux'; -import { - cancelSharding, - type RootState, - ShardingStatuses, -} from '../../store/reducer'; +import { cancelSharding, type RootState } from '../../store/reducer'; import CreateShardKeyForm from '../create-shard-key-form'; -import { containerStyles, bannerStyles } from '../common-styles'; - -const btnStyles = css({ - float: 'right', - height: spacing[600], -}); +import { + containerStyles, + bannerStyles, + bannerBtnStyles, +} from '../common-styles'; const errorStyles = css({ marginTop: spacing[200], @@ -47,7 +42,7 @@ export function ShardingError({ make any necessary changes to your collection, and try again.
{shardingError}