diff --git a/.evergreen/functions.yml b/.evergreen/functions.yml index 1751577ac93..b3cd496e3c2 100644 --- a/.evergreen/functions.yml +++ b/.evergreen/functions.yml @@ -747,8 +747,8 @@ functions: MCLI_PROJECT_ID: ${e2e_tests_mcli_project_id} MCLI_OPS_MANAGER_URL: ${e2e_tests_mcli_ops_manager_url} # CCS connection / op running time is slower than allowed timeouts - COMPASS_E2E_MOCHA_TIMEOUT: '720000' # 12 min - COMPASS_E2E_WEBDRIVER_WAITFOR_TIMEOUT: '360000' # 6 min + COMPASS_E2E_MOCHA_TIMEOUT: '1440000' # 24 min + COMPASS_E2E_WEBDRIVER_WAITFOR_TIMEOUT: '960000' # 16 min script: | set -e # Load environment variables diff --git a/AUTHORS b/AUTHORS index 30357f4f7ff..e0ea8fa15d1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -108,3 +108,5 @@ Raymond Lo Moses Yang Moses Yang Jimmy Choi <150958139+JimmyChoiMDB@users.noreply.github.com> +Jacob Lu <43422771+jcobis@users.noreply.github.com> +Nataly Carbonell diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index e062a9238be..35051877a5d 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 Wed Jul 23 2025. +This document was automatically generated on Thu Aug 07 2025. ## List of dependencies @@ -228,7 +228,7 @@ This document was automatically generated on Wed Jul 23 2025. | **[dunder-proto](#390fd69f2035b583e461890d5b0a3230f4adb33b042e6f0d1472dd911bc1de98)** | 1.0.1 | MIT | | **[ee-first](#e2746902c758ae8a6f91ffb9618cd53717f936cb33c6323e65b6b7b24f7ebefe)** | 1.1.1 | MIT | | **[electron-dl](#e97e034c7b93c63e7a433d75f6f1de3e0668764225ebbd61dbde8d1b55d6f3b7)** | 3.5.0 | MIT | -| **[electron](#13106dc4731439f2d21284fcd1e9f7363c38e0671b23818c0e3397fb780e6eac)** | 37.2.2 | MIT | +| **[electron](#1327750d12492f42942fd3f95f07d0669748ed9a8a8cc5f182921fe22cf39761)** | 37.2.5 | MIT | | **[encodeurl](#177948a319ae0aeebbd65742c53c62b37c75ec1d021afa5a188d10a7ceae6623)** | 2.0.0 | MIT | | **[end-of-stream](#fadc10994f5fa767d06fb25cfff35fb17a895daf3bc3477c782907668ed16563)** | 1.4.4 | MIT | | **[ensure-error](#3b1eba5276d89414cef21a1007e85c4f1d6749bf57b300e082ab23975a41dbc9)** | 3.0.1 | MIT | @@ -18618,9 +18618,9 @@ License files: 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. - + -### [electron](https://www.npmjs.com/package/electron) (version 37.2.2) +### [electron](https://www.npmjs.com/package/electron) (version 37.2.5) License tags: MIT diff --git a/configs/eslint-config-compass/package.json b/configs/eslint-config-compass/package.json index e1f5470a173..78aaa4b6515 100644 --- a/configs/eslint-config-compass/package.json +++ b/configs/eslint-config-compass/package.json @@ -1,6 +1,6 @@ { "name": "@mongodb-js/eslint-config-compass", - "version": "1.4.4", + "version": "1.4.5", "description": "Shared Compass eslint configuration", "license": "SSPL", "main": "index.js", @@ -18,8 +18,8 @@ "@babel/eslint-parser": "^7.14.3", "@mongodb-js/eslint-config-devtools": "^0.9.9", "@mongodb-js/eslint-plugin-compass": "^1.2.13", - "@typescript-eslint/eslint-plugin": "^8.37.0", - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-chai-friendly": "^1.1.0", diff --git a/configs/testing-library-compass/package.json b/configs/testing-library-compass/package.json index cbaa4a56e0c..4220d16816b 100644 --- a/configs/testing-library-compass/package.json +++ b/configs/testing-library-compass/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.3.7", + "version": "1.3.8", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -45,7 +45,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/configs/webpack-config-compass/package.json b/configs/webpack-config-compass/package.json index 28f4c1348d5..dbd925353c1 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.9.2", + "version": "1.9.4", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -45,7 +45,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/cli-progress": "^3.9.2", @@ -71,7 +71,7 @@ "cli-progress": "^3.9.1", "core-js": "^3.17.3", "css-loader": "^4.3.0", - "electron": "^37.2.2", + "electron": "^37.2.5", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", "less-loader": "^10.0.1", diff --git a/docs/tracking-plan.md b/docs/tracking-plan.md index a9e79bada3a..5c3dd4ea223 100644 --- a/docs/tracking-plan.md +++ b/docs/tracking-plan.md @@ -6,7 +6,7 @@ > the tracking plan for the specific Compass version you can use the following > URL: `https://github.com/mongodb-js/compass/blob//docs/tracking-plan.md` -Generated on Wed, Jul 23, 2025 +Generated on Thu, Aug 7, 2025 ## Table of Contents @@ -77,6 +77,10 @@ Generated on Wed, Jul 23, 2025 - [Data Modeling Diagram Created](#event--DataModelingDiagramCreated) - [Data Modeling Diagram Exported](#event--DataModelingDiagramExported) +- [Data Modeling Diagram Imported](#event--DataModelingDiagramImported) +- [Data Modeling Relationship Added](#event--DataModelingDiagramRelationshipAdded) +- [Data Modeling Relationship Form Opened](#event--DataModelingDiagramRelationshipEdited) +- [Data Modeling Relationship Deleted](#event--DataModelingDiagramRelationshipDeleted) ### Database / Collection List @@ -860,6 +864,9 @@ This event is fired when a connection attempt fails. - The error code (if available). - **error_name** (required): `string` - The error name. +- **error_code_cause_chain** (optional): `{} | undefined` + - The error codes (or code names) from the error's cause chain. + The driver and the OIDC library we use are two places that use cause chains. - **auth_type** (optional): `string | undefined` - Desktop only. The authentication type used in the connection. - **tunnel** (optional): `string | undefined` @@ -1003,7 +1010,41 @@ This event is fired when user exports data modeling diagram. **Properties**: -- **format** (required): `"json" | "png"` +- **format** (required): `"json" | "png" | "diagram"` +- **is_compass_web** (optional): `true | undefined` + + + +### Data Modeling Diagram Imported + +This event is fired when user imports data modeling diagram. + + + +### Data Modeling Relationship Added + +This event is fired when user adds a new relationship to a data modeling diagram. + +**Properties**: + +- **num_relationships** (required): `number` +- **is_compass_web** (optional): `true | undefined` + + + +### Data Modeling Relationship Form Opened + +This event is fired when user edits a relationship in a data modeling diagram. + + + +### Data Modeling Relationship Deleted + +This event is fired when user deletes a relationship from a data modeling diagram. + +**Properties**: + +- **num_relationships** (required): `number` - **is_compass_web** (optional): `true | undefined` ## Database / Collection List diff --git a/package-lock.json b/package-lock.json index 112aed677fb..e05c4ccb994 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,15 +28,15 @@ }, "configs/eslint-config-compass": { "name": "@mongodb-js/eslint-config-compass", - "version": "1.4.4", + "version": "1.4.5", "license": "SSPL", "dependencies": { "@babel/core": "^7.24.3", "@babel/eslint-parser": "^7.14.3", "@mongodb-js/eslint-config-devtools": "^0.9.9", "@mongodb-js/eslint-plugin-compass": "^1.2.13", - "@typescript-eslint/eslint-plugin": "^8.37.0", - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-chai-friendly": "^1.1.0", @@ -324,7 +324,7 @@ }, "configs/testing-library-compass": { "name": "@mongodb-js/testing-library-compass", - "version": "1.3.7", + "version": "1.3.8", "license": "SSPL", "dependencies": { "@testing-library/react": "^12.1.5", @@ -336,7 +336,7 @@ "sinon": "^17.0.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -439,7 +439,7 @@ }, "configs/webpack-config-compass": { "name": "@mongodb-js/webpack-config-compass", - "version": "1.9.2", + "version": "1.9.4", "license": "SSPL", "dependencies": { "@babel/core": "^7.24.3", @@ -458,7 +458,7 @@ "cli-progress": "^3.9.1", "core-js": "^3.17.3", "css-loader": "^4.3.0", - "electron": "^37.2.2", + "electron": "^37.2.5", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", "less-loader": "^10.0.1", @@ -480,7 +480,7 @@ "webpack-compass": "bin/webpack.js" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/cli-progress": "^3.9.2", @@ -8755,6 +8755,20 @@ "resolved": "packages/explain-plan-helper", "link": true }, + "node_modules/@mongodb-js/mdb-experiment-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/mdb-experiment-js/-/mdb-experiment-js-1.9.0.tgz", + "integrity": "sha512-4JcsdyjmbUxzBRADGCPWH9ySif5nda7JW6wNChqd7gYagEK7+I76p24sd4rTo9Ub8+JVkNyfB+eeF9CHuM4y3Q==", + "license": "Apache-2.0", + "dependencies": { + "deepmerge": "^4.2.2", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2" + } + }, "node_modules/@mongodb-js/mocha-config-compass": { "resolved": "configs/mocha-config-compass", "link": true @@ -14709,15 +14723,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", - "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", + "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/type-utils": "8.37.0", - "@typescript-eslint/utils": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/type-utils": "8.39.0", + "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -14731,9 +14745,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -14746,14 +14760,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", - "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", - "dependencies": { - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", + "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4" }, "engines": { @@ -14765,16 +14779,16 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", - "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", + "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.37.0", - "@typescript-eslint/types": "^8.37.0", + "@typescript-eslint/tsconfig-utils": "^8.39.0", + "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" }, "engines": { @@ -14785,16 +14799,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", - "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", + "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0" + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14805,9 +14819,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", - "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", + "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -14816,17 +14830,17 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", - "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", + "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -14839,13 +14853,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", - "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -14855,14 +14869,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", - "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", - "dependencies": { - "@typescript-eslint/project-service": "8.37.0", - "@typescript-eslint/tsconfig-utils": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", + "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "dependencies": { + "@typescript-eslint/project-service": "8.39.0", + "@typescript-eslint/tsconfig-utils": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -14878,7 +14892,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -14904,14 +14918,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", - "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", + "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0" + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14922,15 +14936,15 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", - "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", "dependencies": { - "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -20359,6 +20373,15 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge-ts": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.4.tgz", @@ -21547,9 +21570,9 @@ } }, "node_modules/electron": { - "version": "37.2.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.2.tgz", - "integrity": "sha512-qEIUs+3elu7wOfzLEtLz4Innfe+8nQyhLh9qjrJY0d0MxdRolLMDUD9QwAQ743vDZ+bUg+gqwigzP7kV78S3hA==", + "version": "37.2.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.5.tgz", + "integrity": "sha512-719ZqEp43rj6xDJMICm4CIXl8keFFgvVNO9Ix6OtjNjrh9HtYlP/1WiYeRohnXj06aLyGx5NCzrHbG7j3BxO9w==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -21880,9 +21903,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.185", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.185.tgz", - "integrity": "sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==" + "version": "1.5.195", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.195.tgz", + "integrity": "sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==" }, "node_modules/electron-window": { "version": "0.8.1", @@ -43650,32 +43673,32 @@ }, "packages/atlas-service": { "name": "@mongodb-js/atlas-service", - "version": "0.52.0", + "version": "0.54.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-proxy-support": "^0.5.1", "@mongodb-js/oidc-plugin": "^2.0.1", - "compass-preferences-model": "^2.47.0", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "compass-preferences-model": "^2.49.0", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "react": "^17.0.2", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -43740,7 +43763,7 @@ } }, "packages/bson-transpilers": { - "version": "3.2.15", + "version": "3.2.16", "license": "SSPL", "dependencies": { "antlr4": "4.7.2", @@ -43748,7 +43771,7 @@ "js-yaml": "^3.13.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.3.4", "depcheck": "^1.4.1", "mocha": "^10.2.0" @@ -43776,16 +43799,16 @@ }, "packages/collection-model": { "name": "mongodb-collection-model", - "version": "5.30.2", + "version": "5.31.0", "license": "SSPL", "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", @@ -43812,78 +43835,78 @@ "devDependencies": { "@electron/rebuild": "^4.0.1", "@electron/remote": "^2.1.3", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-find-in-page": "^4.46.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-import-export": "^7.66.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-saved-aggregations-queries": "^1.67.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-serverstats": "^16.66.0", - "@mongodb-js/compass-settings": "^0.65.0", - "@mongodb-js/compass-shell": "^3.66.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-find-in-page": "^4.48.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-import-export": "^7.68.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-saved-aggregations-queries": "^1.69.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-serverstats": "^16.68.0", + "@mongodb-js/compass-settings": "^0.67.0", + "@mongodb-js/compass-shell": "^3.68.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/get-os-info": "^0.4.0", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-downloader": "^0.3.7", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/sbom-tools": "^0.7.2", "@mongodb-js/signing-utils": "^0.3.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@segment/analytics-node": "^1.1.4", "@types/minimatch": "^5.1.2", "bson": "^6.10.4", "chai": "^4.3.4", "chalk": "^4.1.2", "clean-stack": "^2.0.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-devtools-installer": "^3.2.0", "electron-dl": "^3.5.0", "electron-mocha": "^12.2.0", "ensure-error": "^3.0.1", "glob": "^10.2.5", - "hadron-build": "^25.8.7", - "hadron-ipc": "^3.5.7", + "hadron-build": "^25.8.9", + "hadron-ipc": "^3.5.9", "make-fetch-happen": "^10.2.1", "minimatch": "^10.0.1", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -43903,7 +43926,7 @@ }, "packages/compass-aggregations": { "name": "@mongodb-js/compass-aggregations", - "version": "9.69.0", + "version": "9.71.0", "license": "SSPL", "dependencies": { "@babel/generator": "^7.19.5", @@ -43912,34 +43935,34 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/explain-plan-helper": "^1.4.15", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/shell-bson-parser": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "compass-preferences-model": "^2.49.0", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", @@ -43952,10 +43975,10 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/babel__generator": "^7.6.8", "@types/lodash": "^4.14.188", @@ -44048,7 +44071,7 @@ }, "packages/compass-app-registry": { "name": "@mongodb-js/compass-app-registry", - "version": "9.4.17", + "version": "9.4.18", "license": "SSPL", "dependencies": { "eventemitter3": "^4.0.0", @@ -44058,10 +44081,10 @@ "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -44105,26 +44128,26 @@ }, "packages/compass-app-stores": { "name": "@mongodb-js/compass-app-stores", - "version": "7.53.0", + "version": "7.55.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/connection-info": "^0.16.2", - "compass-preferences-model": "^2.47.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/connection-info": "^0.17.0", + "compass-preferences-model": "^2.49.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -44168,20 +44191,20 @@ }, "packages/compass-collection": { "name": "@mongodb-js/compass-collection", - "version": "4.66.0", + "version": "4.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "compass-preferences-model": "^2.47.0", - "mongodb-collection-model": "^5.30.2", + "compass-preferences-model": "^2.49.0", + "mongodb-collection-model": "^5.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -44189,10 +44212,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -44261,7 +44284,7 @@ }, "packages/compass-components": { "name": "@mongodb-js/compass-components", - "version": "1.45.0", + "version": "1.47.0", "license": "SSPL", "dependencies": { "@dnd-kit/core": "^6.0.7", @@ -44310,20 +44333,21 @@ "@leafygreen-ui/tokens": "^2.11.3", "@leafygreen-ui/tooltip": "^13.0.13", "@leafygreen-ui/typography": "^20.0.2", - "@mongodb-js/compass-context-menu": "^0.2.3", + "@mongodb-js/compass-context-menu": "^0.2.4", "@react-aria/interactions": "^3.9.1", "@react-aria/utils": "^3.13.1", "@react-aria/visually-hidden": "^3.3.1", "@tanstack/table-core": "^8.14.0", "bson": "^6.10.4", "focus-trap-react": "^9.0.2", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "is-electron-renderer": "^2.0.1", "lodash": "^4.17.21", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "polished": "^4.2.2", "react": "^17.0.2", + "react-dom": "^17.0.2", "react-hotkeys-hook": "^4.3.7", "react-intersection-observer": "^8.34.0", "react-virtualized-auto-sizer": "^1.0.6", @@ -44331,10 +44355,10 @@ }, "devDependencies": { "@emotion/css": "^11.11.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -44343,7 +44367,6 @@ "chai": "^4.3.4", "mocha": "^10.2.0", "nyc": "^15.1.0", - "react-dom": "^17.0.2", "sinon": "^9.0.0", "typescript": "^5.8.3" } @@ -44653,21 +44676,21 @@ }, "packages/compass-connection-import-export": { "name": "@mongodb-js/compass-connection-import-export", - "version": "0.63.0", + "version": "0.65.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/connection-storage": "^0.42.0", - "compass-preferences-model": "^2.47.0", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/connection-storage": "^0.44.0", + "compass-preferences-model": "^2.49.0", + "hadron-ipc": "^3.5.9", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -44712,24 +44735,24 @@ }, "packages/compass-connections": { "name": "@mongodb-js/compass-connections", - "version": "1.67.0", + "version": "1.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", @@ -44737,10 +44760,10 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -44761,26 +44784,26 @@ }, "packages/compass-connections-navigation": { "name": "@mongodb-js/compass-connections-navigation", - "version": "1.66.0", + "version": "1.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-context-menu": "^0.2.3", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-context-menu": "^0.2.4", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "compass-preferences-model": "^2.49.0", "mongodb-build-info": "^1.7.2", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", "react-window": "^1.8.6" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -44855,16 +44878,16 @@ }, "packages/compass-context-menu": { "name": "@mongodb-js/compass-context-menu", - "version": "0.2.3", + "version": "0.2.4", "license": "SSPL", "dependencies": { "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -44911,34 +44934,34 @@ }, "packages/compass-crud": { "name": "@mongodb-js/compass-crud", - "version": "13.67.0", + "version": "13.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/explain-plan-helper": "^1.4.15", - "@mongodb-js/my-queries-storage": "^0.34.0", - "@mongodb-js/reflux-state-mixin": "^1.2.15", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", + "@mongodb-js/my-queries-storage": "^0.36.0", + "@mongodb-js/reflux-state-mixin": "^1.2.16", "@mongodb-js/shell-bson-parser": "^1.2.0", "ag-grid-community": "^20.2.0", "ag-grid-react": "^20.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "compass-preferences-model": "^2.49.0", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "numeral": "^2.0.6", @@ -44948,22 +44971,22 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/enzyme": "^3.10.14", "@types/reflux": "^6.4.3", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^17.0.1", @@ -45096,21 +45119,21 @@ }, "packages/compass-data-modeling": { "name": "@mongodb-js/compass-data-modeling", - "version": "1.18.0", + "version": "1.20.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/diagramming": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "html-to-image": "1.11.11", "lodash": "^4.17.21", "mongodb": "^6.17.0", @@ -45123,10 +45146,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -45269,12 +45292,13 @@ } }, "packages/compass-e2e-tests": { - "version": "1.39.0", + "version": "1.40.1", "devDependencies": { "@electron/rebuild": "^4.0.1", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.46.0", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/oidc-mock-provider": "^0.11.3", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -45286,15 +45310,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", - "electron-to-chromium": "^1.5.185", + "electron": "^37.2.5", + "electron-to-chromium": "^1.5.195", "glob": "^10.2.5", "globals": "^15.14.0", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", @@ -45693,7 +45717,7 @@ }, "packages/compass-editor": { "name": "@mongodb-js/compass-editor", - "version": "0.47.0", + "version": "0.49.0", "license": "SSPL", "dependencies": { "@codemirror/autocomplete": "^6.18.6", @@ -45705,7 +45729,7 @@ "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.38.0", "@lezer/highlight": "^1.2.1", - "@mongodb-js/compass-components": "^1.45.0", + "@mongodb-js/compass-components": "^1.47.0", "@mongodb-js/mongodb-constants": "^0.12.2", "mongodb-query-parser": "^4.3.0", "polished": "^4.2.2", @@ -45713,10 +45737,10 @@ "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -45807,18 +45831,18 @@ }, "packages/compass-explain-plan": { "name": "@mongodb-js/compass-explain-plan", - "version": "6.67.0", + "version": "6.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/explain-plan-helper": "^1.4.15", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", + "compass-preferences-model": "^2.49.0", "d3": "^3.5.17", "d3-flextree": "^2.1.2", "d3-hierarchy": "^3.1.2", @@ -45830,17 +45854,17 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "@types/d3-flextree": "^2.1.0", "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -45885,29 +45909,29 @@ }, "packages/compass-export-to-language": { "name": "@mongodb-js/compass-export-to-language", - "version": "9.43.0", + "version": "9.45.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", "@mongodb-js/shell-bson-parser": "^1.2.0", - "bson-transpilers": "^3.2.15", - "compass-preferences-model": "^2.47.0", + "bson-transpilers": "^3.2.16", + "compass-preferences-model": "^2.49.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.3.6", "depcheck": "^1.4.1", @@ -45959,12 +45983,12 @@ }, "packages/compass-field-store": { "name": "@mongodb-js/compass-field-store", - "version": "9.42.0", + "version": "9.44.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", "lodash": "^4.17.21", "mongodb-schema": "^12.6.2", "react": "^17.0.2", @@ -45973,10 +45997,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -46020,22 +46044,22 @@ }, "packages/compass-find-in-page": { "name": "@mongodb-js/compass-find-in-page", - "version": "4.46.0", + "version": "4.48.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "hadron-ipc": "^3.5.9", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -46045,7 +46069,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -46084,19 +46108,19 @@ }, "packages/compass-generative-ai": { "name": "@mongodb-js/compass-generative-ai", - "version": "0.47.0", + "version": "0.49.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "mongodb": "^6.17.0", "mongodb-schema": "^12.6.2", "react": "^17.0.2", @@ -46105,11 +46129,11 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -46190,17 +46214,17 @@ }, "packages/compass-global-writes": { "name": "@mongodb-js/compass-global-writes", - "version": "1.26.0", + "version": "1.28.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", "lodash": "^4.17.21", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -46209,10 +46233,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -46382,27 +46406,27 @@ }, "packages/compass-import-export": { "name": "@mongodb-js/compass-import-export", - "version": "7.66.0", + "version": "7.68.0", "license": "SSPL", "dependencies": { "@electron/remote": "^2.1.3", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "debug": "^4.3.4", - "electron": "^37.2.2", - "hadron-document": "^8.9.3", - "hadron-ipc": "^3.5.7", + "electron": "^37.2.5", + "hadron-document": "^8.9.4", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", @@ -46415,11 +46439,11 @@ "strip-bom-stream": "^4.0.0" }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-as-promised": "^7.1.4", @@ -46501,27 +46525,27 @@ }, "packages/compass-indexes": { "name": "@mongodb-js/compass-indexes", - "version": "5.66.0", + "version": "5.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/shell-bson-parser": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", "mongodb-mql-engines": "^0.0.4", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", @@ -46533,15 +46557,15 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/numeral": "^2.0.5", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -46678,14 +46702,14 @@ }, "packages/compass-intercom": { "name": "@mongodb-js/compass-intercom", - "version": "0.31.0", + "version": "0.33.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "compass-preferences-model": "^2.47.0" + "@mongodb-js/compass-logging": "^1.7.10", + "compass-preferences-model": "^2.49.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -46783,18 +46807,18 @@ }, "packages/compass-logging": { "name": "@mongodb-js/compass-logging", - "version": "1.7.8", + "version": "1.7.10", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", + "@mongodb-js/compass-app-registry": "^9.4.18", "debug": "^4.3.4", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "is-electron-renderer": "^2.0.1", "mongodb-log-writer": "^2.3.4", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -46839,14 +46863,14 @@ }, "packages/compass-maybe-protect-connection-string": { "name": "@mongodb-js/compass-maybe-protect-connection-string", - "version": "0.45.0", + "version": "0.47.0", "license": "SSPL", "dependencies": { - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "mongodb-connection-string-url": "^3.0.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -46890,25 +46914,25 @@ } }, "packages/compass-preferences-model": { - "version": "2.47.0", + "version": "2.49.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-user-data": "^0.8.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-user-data": "^0.8.4", "@mongodb-js/devtools-proxy-support": "^0.5.1", "bson": "^6.10.4", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "react": "^17.0.2", "yargs-parser": "^21.1.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/js-yaml": "^4.0.5", "@types/yargs-parser": "21.0.0", @@ -46955,30 +46979,30 @@ }, "packages/compass-query-bar": { "name": "@mongodb-js/compass-query-bar", - "version": "8.68.0", + "version": "8.70.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -46986,14 +47010,14 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -47080,21 +47104,21 @@ }, "packages/compass-saved-aggregations-queries": { "name": "@mongodb-js/compass-saved-aggregations-queries", - "version": "1.67.0", + "version": "1.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "fuse.js": "^6.5.3", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -47103,10 +47127,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -47154,29 +47178,29 @@ }, "packages/compass-schema": { "name": "@mongodb-js/compass-schema", - "version": "6.68.0", + "version": "6.70.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/connection-storage": "^0.44.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "d3": "^3.5.17", - "hadron-document": "^8.9.3", + "hadron-document": "^8.9.4", "leaflet": "^1.5.1", "leaflet-defaulticon-compatibility": "^0.1.1", "leaflet-draw": "^1.0.4", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "numeral": "^1.5.6", "prop-types": "^15.7.2", @@ -47188,11 +47212,11 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/leaflet": "^1.9.8", @@ -47213,24 +47237,24 @@ }, "packages/compass-schema-validation": { "name": "@mongodb-js/compass-schema-validation", - "version": "6.67.0", + "version": "6.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/mongodb-constants": "^0.12.2", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "javascript-stringify": "^2.0.1", "lodash": "^4.17.21", "mongodb": "^6.17.0", @@ -47243,18 +47267,18 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^8.1.1", @@ -47338,15 +47362,15 @@ }, "packages/compass-serverstats": { "name": "@mongodb-js/compass-serverstats", - "version": "16.66.0", + "version": "16.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "d3": "^3.5.17", "d3-timer": "^1.0.3", "debug": "^4.3.4", @@ -47357,10 +47381,10 @@ "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "chai": "^4.1.2", @@ -47386,26 +47410,26 @@ }, "packages/compass-settings": { "name": "@mongodb-js/compass-settings", - "version": "0.65.0", + "version": "0.67.0", "license": "SSPL", "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "compass-preferences-model": "^2.47.0", - "hadron-ipc": "^3.5.7", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "compass-preferences-model": "^2.49.0", + "hadron-ipc": "^3.5.9", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -47453,37 +47477,37 @@ }, "packages/compass-shell": { "name": "@mongodb-js/compass-shell", - "version": "3.66.0", + "version": "3.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongosh/browser-repl": "^3.16.4", "@mongosh/logging": "^3.9.2", "@mongosh/node-runtime-worker-thread": "^3.3.18", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -47493,25 +47517,25 @@ }, "packages/compass-sidebar": { "name": "@mongodb-js/compass-sidebar", - "version": "5.67.0", + "version": "5.69.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-connections-navigation": "^1.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-connections-navigation": "^1.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -47519,10 +47543,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -47534,7 +47558,7 @@ "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^9.2.3", @@ -47592,18 +47616,18 @@ }, "packages/compass-smoke-tests": { "name": "@mongodb-js/compass-smoke-tests", - "version": "1.1.27", + "version": "1.1.29", "license": "SSPL", "devDependencies": { "@actions/github": "^6.0.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/node": "^20", - "compass-e2e-tests": "^1.39.0", + "compass-e2e-tests": "^1.40.1", "debug": "^4.3.4", "depcheck": "^1.4.1", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "typescript": "^5.8.3", "yargs": "^17.7.2" @@ -47678,16 +47702,17 @@ }, "packages/compass-telemetry": { "name": "@mongodb-js/compass-telemetry", - "version": "1.10.6", + "version": "1.12.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-logging": "^1.7.8", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/mdb-experiment-js": "1.9.0", + "hadron-ipc": "^3.5.9", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -47786,13 +47811,13 @@ }, "packages/compass-test-server": { "name": "@mongodb-js/compass-test-server", - "version": "0.3.15", + "version": "0.3.16", "license": "SSPL", "dependencies": { "mongodb-runner": "^5.8.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -47835,16 +47860,16 @@ }, "packages/compass-user-data": { "name": "@mongodb-js/compass-user-data", - "version": "0.8.2", + "version": "0.8.4", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-utils": "^0.9.9", "write-file-atomic": "^5.0.1", "zod": "^3.25.17" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -47922,14 +47947,14 @@ }, "packages/compass-utils": { "name": "@mongodb-js/compass-utils", - "version": "0.9.7", + "version": "0.9.9", "license": "SSPL", "dependencies": { "@electron/remote": "^2.1.3", - "electron": "^37.2.2" + "electron": "^37.2.5" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -47974,41 +47999,41 @@ }, "packages/compass-web": { "name": "@mongodb-js/compass-web", - "version": "0.19.2", + "version": "0.20.0", "license": "SSPL", "devDependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", "@types/express-http-proxy": "^1.6.6", @@ -48020,12 +48045,12 @@ "bson": "^6.10.4", "buffer": "^6.0.3", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.4", "depcheck": "^1.4.1", "dns-query": "^0.11.2", - "electron": "^37.2.2", + "electron": "^37.2.5", "events": "^3.3.0", "express": "^4.21.1", "express-http-proxy": "^2.0.0", @@ -48033,7 +48058,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", @@ -48231,25 +48256,25 @@ }, "packages/compass-welcome": { "name": "@mongodb-js/compass-welcome", - "version": "0.65.0", + "version": "0.67.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "compass-preferences-model": "^2.49.0", "react": "^17.0.2", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -48295,19 +48320,19 @@ }, "packages/compass-workspaces": { "name": "@mongodb-js/compass-workspaces", - "version": "0.48.0", + "version": "0.50.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -48315,10 +48340,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -48606,26 +48631,26 @@ }, "packages/connection-form": { "name": "@mongodb-js/connection-form", - "version": "1.59.0", + "version": "1.61.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/shell-bson-parser": "^1.2.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-query-parser": "^4.3.0", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -48698,16 +48723,16 @@ }, "packages/connection-info": { "name": "@mongodb-js/connection-info", - "version": "0.16.2", + "version": "0.17.0", "license": "SSPL", "dependencies": { "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2" + "mongodb-data-service": "^22.30.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -48822,26 +48847,26 @@ }, "packages/connection-storage": { "name": "@mongodb-js/connection-storage", - "version": "0.42.0", + "version": "0.44.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "compass-preferences-model": "^2.49.0", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "keytar": "^7.9.0", "lodash": "^4.17.21", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -48885,11 +48910,11 @@ }, "packages/data-service": { "name": "mongodb-data-service", - "version": "22.29.2", + "version": "22.30.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-utils": "^0.9.9", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-proxy-support": "^0.5.1", "bson": "^6.10.4", @@ -48900,9 +48925,9 @@ "mongodb-ns": "^2.4.2" }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", + "@mongodb-js/compass-test-server": "^0.3.16", "@mongodb-js/devtools-docker-test-envs": "^1.3.3", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/oidc-plugin": "^2.0.1", "@mongodb-js/prettier-config-compass": "^1.2.8", @@ -49091,16 +49116,16 @@ }, "packages/database-model": { "name": "mongodb-database-model", - "version": "2.30.2", + "version": "2.31.0", "license": "SSPL", "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2" + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "depcheck": "^1.4.1", "mocha": "^10.2.0" @@ -49157,24 +49182,24 @@ }, "packages/databases-collections": { "name": "@mongodb-js/compass-databases-collections", - "version": "1.66.0", + "version": "1.68.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/databases-collections-list": "^1.64.0", - "@mongodb-js/my-queries-storage": "^0.34.0", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/databases-collections-list": "^1.66.0", + "@mongodb-js/my-queries-storage": "^0.36.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "prop-types": "^15.7.2", @@ -49185,10 +49210,10 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "bson": "^6.10.4", "chai": "^4.2.0", @@ -49203,25 +49228,25 @@ }, "packages/databases-collections-list": { "name": "@mongodb-js/databases-collections-list", - "version": "1.64.0", + "version": "1.66.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "compass-preferences-model": "^2.47.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "compass-preferences-model": "^2.49.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -49347,14 +49372,14 @@ }, "packages/explain-plan-helper": { "name": "@mongodb-js/explain-plan-helper", - "version": "1.4.15", + "version": "1.4.16", "license": "SSPL", "dependencies": { "@mongodb-js/shell-bson-parser": "^1.2.0", - "mongodb-explain-compat": "^3.3.15" + "mongodb-explain-compat": "^3.3.16" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -49463,7 +49488,7 @@ } }, "packages/hadron-build": { - "version": "25.8.7", + "version": "25.8.9", "hasInstallScript": true, "license": "SSPL", "dependencies": { @@ -49480,7 +49505,7 @@ "debug": "^4.3.4", "del": "^2.0.2", "download": "^8.0.0", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-packager": "^15.5.1", "electron-packager-plugin-non-proprietary-codecs-ffmpeg": "^1.0.2", "flatnest": "^1.0.0", @@ -49508,7 +49533,7 @@ "hadron-build": "cli.js" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.2.0", "depcheck": "^1.4.1", "eslint-plugin-mocha": "^8.0.0", @@ -50207,17 +50232,17 @@ } }, "packages/hadron-document": { - "version": "8.9.3", + "version": "8.9.4", "license": "SSPL", "dependencies": { "bson": "^6.10.4", "eventemitter3": "^4.0.0", - "hadron-type-checker": "^7.4.15", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mongodb": "^6.17.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -50325,15 +50350,15 @@ } }, "packages/hadron-ipc": { - "version": "3.5.7", + "version": "3.5.9", "license": "SSPL", "dependencies": { "debug": "^4.3.4", - "electron": "^37.2.2", + "electron": "^37.2.5", "is-electron-renderer": "^2.0.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -50378,14 +50403,14 @@ } }, "packages/hadron-type-checker": { - "version": "7.4.15", + "version": "7.4.16", "license": "SSPL", "dependencies": { "bson": "^6.10.4", "lodash": "^4.17.21" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.2.0", "depcheck": "^1.4.1", "mocha": "^10.2.0" @@ -50393,17 +50418,17 @@ }, "packages/instance-model": { "name": "mongodb-instance-model", - "version": "12.39.0", + "version": "12.41.0", "license": "SSPL", "dependencies": { "ampersand-model": "^8.0.1", - "compass-preferences-model": "^2.47.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2" + "compass-preferences-model": "^2.49.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "chai": "^4.3.4", "depcheck": "^1.4.1", @@ -50411,24 +50436,24 @@ } }, "packages/mongodb-explain-compat": { - "version": "3.3.15", + "version": "3.3.16", "license": "SSPL", "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", "nyc": "^15.1.0" } }, "packages/mongodb-query-util": { - "version": "2.5.3", + "version": "2.5.4", "license": "SSPL", "dependencies": { "bson": "^6.10.4", "lodash": "^4.17.21" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -50473,17 +50498,17 @@ }, "packages/my-queries-storage": { "name": "@mongodb-js/my-queries-storage", - "version": "0.34.0", + "version": "0.36.0", "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-user-data": "^0.8.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-user-data": "^0.8.4", "bson": "^6.10.4", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -50549,13 +50574,13 @@ }, "packages/reflux-state-mixin": { "name": "@mongodb-js/reflux-state-mixin", - "version": "1.2.15", + "version": "1.2.16", "license": "SSPL", "dependencies": { "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -50637,7 +50662,7 @@ }, "scripts": { "name": "@mongodb-js/compass-scripts", - "version": "0.19.8", + "version": "0.19.9", "license": "SSPL", "dependencies": { "@babel/core": "^7.24.3", @@ -50656,7 +50681,7 @@ "compass-scripts": "cli.js" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "depcheck": "^1.4.1" @@ -56407,29 +56432,29 @@ "@mongodb-js/atlas-service": { "version": "file:packages/atlas-service", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/oidc-plugin": "^2.0.1", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -56487,46 +56512,46 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", - "@mongodb-js/explain-plan-helper": "^1.4.15", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", + "@mongodb-js/explain-plan-helper": "^1.4.16", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/shell-bson-parser": "^1.2.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/babel__generator": "^7.6.8", "@types/lodash": "^4.14.188", "@types/semver": "^7.3.9", "bson": "^6.10.4", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", @@ -56601,10 +56626,10 @@ "@mongodb-js/compass-app-registry": { "version": "file:packages/compass-app-registry", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -56646,27 +56671,27 @@ "@mongodb-js/compass-app-stores": { "version": "file:packages/compass-app-stores", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -56700,19 +56725,19 @@ "@mongodb-js/compass-collection": { "version": "file:packages/compass-collection", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -56721,11 +56746,11 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", + "mongodb-collection-model": "^5.31.0", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -56823,11 +56848,11 @@ "@leafygreen-ui/tokens": "^2.11.3", "@leafygreen-ui/tooltip": "^13.0.13", "@leafygreen-ui/typography": "^20.0.2", - "@mongodb-js/compass-context-menu": "^0.2.3", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-context-menu": "^0.2.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@react-aria/interactions": "^3.9.1", "@react-aria/utils": "^3.13.1", @@ -56840,12 +56865,12 @@ "bson": "^6.10.4", "chai": "^4.3.4", "focus-trap-react": "^9.0.2", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "is-electron-renderer": "^2.0.1", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "nyc": "^15.1.0", "polished": "^4.2.2", "react": "^17.0.2", @@ -57108,13 +57133,13 @@ "@mongodb-js/compass-connection-import-export": { "version": "file:packages/compass-connection-import-export", "requires": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/connection-storage": "^0.42.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/connection-storage": "^0.44.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -57122,10 +57147,10 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "gen-esm-wrapper": "^1.1.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", "nyc": "^15.1.0", "react": "^17.0.2", @@ -57160,18 +57185,18 @@ "@mongodb-js/compass-connections": { "version": "file:packages/compass-connections", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -57182,7 +57207,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", @@ -57190,7 +57215,7 @@ "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "nyc": "^15.1.0", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -57229,16 +57254,16 @@ "@mongodb-js/compass-connections-navigation": { "version": "file:packages/compass-connections-navigation", "requires": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-context-menu": "^0.2.3", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-context-menu": "^0.2.4", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -57249,7 +57274,7 @@ "@types/react-window": "^1.8.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "mocha": "^10.2.0", "mongodb-build-info": "^1.7.2", @@ -57289,10 +57314,10 @@ "@mongodb-js/compass-context-menu": { "version": "file:packages/compass-context-menu", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -57333,26 +57358,26 @@ "@mongodb-js/compass-crud": { "version": "file:packages/compass-crud", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", - "@mongodb-js/explain-plan-helper": "^1.4.15", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", + "@mongodb-js/explain-plan-helper": "^1.4.16", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/reflux-state-mixin": "^1.2.15", + "@mongodb-js/reflux-state-mixin": "^1.2.16", "@mongodb-js/shell-bson-parser": "^1.2.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/enzyme": "^3.10.14", "@types/reflux": "^6.4.3", @@ -57361,19 +57386,19 @@ "bson": "^6.10.4", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-data-service": "^22.30.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "numeral": "^2.0.6", @@ -57492,20 +57517,20 @@ "@mongodb-js/compass-data-modeling": { "version": "file:packages/compass-data-modeling", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/diagramming": "^1.2.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -57515,7 +57540,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "html-to-image": "1.11.11", "lodash": "^4.17.21", @@ -57615,31 +57640,31 @@ "@mongodb-js/compass-databases-collections": { "version": "file:packages/databases-collections", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/databases-collections-list": "^1.64.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/databases-collections-list": "^1.66.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "bson": "^6.10.4", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "enzyme": "^3.11.0", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "nyc": "^15.1.0", @@ -57707,12 +57732,12 @@ "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.38.0", "@lezer/highlight": "^1.2.1", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -57789,29 +57814,29 @@ "@mongodb-js/compass-explain-plan": { "version": "file:packages/compass-explain-plan", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/eslint-config-compass": "^1.4.4", - "@mongodb-js/explain-plan-helper": "^1.4.15", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", + "@mongodb-js/explain-plan-helper": "^1.4.16", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "@types/d3-flextree": "^2.1.0", "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "d3": "^3.5.17", "d3-flextree": "^2.1.2", "d3-hierarchy": "^3.1.2", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", "mocha": "^10.2.0", @@ -57858,22 +57883,22 @@ "@mongodb-js/compass-export-to-language": { "version": "file:packages/compass-export-to-language", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/shell-bson-parser": "^1.2.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "bson-transpilers": "^3.2.15", + "bson-transpilers": "^3.2.16", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "mocha": "^10.2.0", "mongodb-ns": "^2.4.2", @@ -57921,13 +57946,13 @@ "@mongodb-js/compass-field-store": { "version": "file:packages/compass-field-store", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -57973,12 +57998,12 @@ "@mongodb-js/compass-find-in-page": { "version": "file:packages/compass-find-in-page", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -57988,9 +58013,9 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", "nyc": "^15.1.0", "react": "^17.0.2", @@ -58030,19 +58055,19 @@ "@mongodb-js/compass-generative-ai": { "version": "file:packages/compass-generative-ai", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -58051,7 +58076,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", @@ -58115,18 +58140,18 @@ "@mongodb-js/compass-global-writes": { "version": "file:packages/compass-global-writes", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -58231,19 +58256,19 @@ "version": "file:packages/compass-import-export", "requires": { "@electron/remote": "^2.1.3", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-as-promised": "^7.1.4", @@ -58258,17 +58283,17 @@ "bson": "^6.10.4", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", - "hadron-document": "^8.9.3", - "hadron-ipc": "^3.5.7", + "hadron-document": "^8.9.4", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", @@ -58332,35 +58357,35 @@ "@mongodb-js/compass-indexes": { "version": "file:packages/compass-indexes", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/shell-bson-parser": "^1.2.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/numeral": "^2.0.5", "bson": "^6.10.4", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", "mongodb-mql-engines": "^0.0.4", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", @@ -58441,8 +58466,8 @@ "@mongodb-js/compass-intercom": { "version": "file:packages/compass-intercom", "requires": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -58450,7 +58475,7 @@ "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "gen-esm-wrapper": "^1.1.0", "nyc": "^15.1.0", @@ -58542,8 +58567,8 @@ "@mongodb-js/compass-logging": { "version": "file:packages/compass-logging", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -58554,7 +58579,7 @@ "chai": "^4.3.4", "debug": "^4.3.4", "depcheck": "^1.4.1", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "is-electron-renderer": "^2.0.1", "mocha": "^10.2.0", "mongodb-log-writer": "^2.3.4", @@ -58591,7 +58616,7 @@ "@mongodb-js/compass-maybe-protect-connection-string": { "version": "file:packages/compass-maybe-protect-connection-string", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -58599,7 +58624,7 @@ "@types/mocha": "^9.0.0", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", @@ -58636,37 +58661,37 @@ "@mongodb-js/compass-query-bar": { "version": "file:packages/compass-query-bar", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "bson": "^6.10.4", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -58736,20 +58761,20 @@ "@mongodb-js/compass-saved-aggregations-queries": { "version": "file:packages/compass-saved-aggregations-queries", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -58759,7 +58784,7 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "fuse.js": "^6.5.3", @@ -58803,21 +58828,21 @@ "@mongodb-js/compass-schema": { "version": "file:packages/compass-schema", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/connection-storage": "^0.42.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/connection-storage": "^0.44.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/leaflet": "^1.9.8", @@ -58827,18 +58852,18 @@ "@types/react-dom": "^17.0.10", "bson": "^6.10.4", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "d3": "^3.5.17", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", - "hadron-document": "^8.9.3", + "hadron-document": "^8.9.4", "leaflet": "^1.5.1", "leaflet-defaulticon-compatibility": "^0.1.1", "leaflet-draw": "^1.0.4", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "numeral": "^1.5.6", "nyc": "^15.1.0", @@ -58880,36 +58905,36 @@ "@mongodb-js/compass-schema-validation": { "version": "file:packages/compass-schema-validation", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "bson": "^6.10.4", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "javascript-stringify": "^2.0.1", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "nyc": "^15.1.0", @@ -58961,7 +58986,7 @@ "version": "file:scripts", "requires": { "@babel/core": "^7.24.3", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/monorepo-tools": "^1.1.16", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -59116,16 +59141,16 @@ "@mongodb-js/compass-serverstats": { "version": "file:packages/compass-serverstats", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "chai": "^4.1.2", @@ -59162,15 +59187,15 @@ "@mongodb-js/compass-settings": { "version": "file:packages/compass-settings", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -59179,10 +59204,10 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", "nyc": "^15.1.0", "react": "^17.0.2", @@ -59222,28 +59247,28 @@ "@mongodb-js/compass-shell": { "version": "file:packages/compass-shell", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@mongosh/browser-repl": "^3.16.4", "@mongosh/logging": "^3.9.2", "@mongosh/node-runtime-worker-thread": "^3.3.18", "bson": "^6.10.4", "chai": "^4.2.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -59258,22 +59283,22 @@ "@mongodb-js/compass-sidebar": { "version": "file:packages/compass-sidebar", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-connections-navigation": "^1.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-connections-navigation": "^1.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -59282,14 +59307,14 @@ "@types/react-dom": "^17.0.10", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-data-service": "^22.30.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -59343,14 +59368,14 @@ "version": "file:packages/compass-smoke-tests", "requires": { "@actions/github": "^6.0.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/node": "^20", - "compass-e2e-tests": "^1.39.0", + "compass-e2e-tests": "^1.40.1", "debug": "^4.3.4", "depcheck": "^1.4.1", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "typescript": "^5.8.3", "yargs": "^17.7.2" @@ -59408,9 +59433,10 @@ "@mongodb-js/compass-telemetry": { "version": "file:packages/compass-telemetry", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/eslint-config-compass": "^1.4.5", + "@mongodb-js/mdb-experiment-js": "1.9.0", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -59420,7 +59446,7 @@ "chai": "^4.3.6", "depcheck": "^1.4.1", "gen-esm-wrapper": "^1.1.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", "nyc": "^15.1.0", "react": "^17.0.2", @@ -59512,7 +59538,7 @@ "@mongodb-js/compass-test-server": { "version": "file:packages/compass-test-server", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -59552,9 +59578,9 @@ "@mongodb-js/compass-user-data": { "version": "file:packages/compass-user-data", "requires": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -59618,7 +59644,7 @@ "version": "file:packages/compass-utils", "requires": { "@electron/remote": "^2.1.3", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -59627,7 +59653,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -59662,38 +59688,38 @@ "@mongodb-js/compass-web": { "version": "file:packages/compass-web", "requires": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", "@types/express-http-proxy": "^1.6.6", @@ -59705,12 +59731,12 @@ "bson": "^6.10.4", "buffer": "^6.0.3", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.4", "depcheck": "^1.4.1", "dns-query": "^0.11.2", - "electron": "^37.2.2", + "electron": "^37.2.5", "events": "^3.3.0", "express": "^4.21.1", "express-http-proxy": "^2.0.0", @@ -59718,7 +59744,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", @@ -59888,16 +59914,16 @@ "@mongodb-js/compass-welcome": { "version": "file:packages/compass-welcome", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -59905,7 +59931,7 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", @@ -59945,15 +59971,15 @@ "@mongodb-js/compass-workspaces": { "version": "file:packages/compass-workspaces", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -59963,13 +59989,13 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "lodash": "^4.17.21", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -60085,14 +60111,14 @@ "@mongodb-js/connection-form": { "version": "file:packages/connection-form", "requires": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/shell-bson-parser": "^1.2.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -60108,7 +60134,7 @@ "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-query-parser": "^4.3.0", "nyc": "^15.1.0", "react": "^17.0.2", @@ -60162,7 +60188,7 @@ "@mongodb-js/connection-info": { "version": "file:packages/connection-info", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -60177,7 +60203,7 @@ "mocha": "^10.2.0", "mongodb": "^6.17.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "nyc": "^15.1.0", "sinon": "^17.0.1", "typescript": "^5.8.3" @@ -60286,13 +60312,13 @@ "@mongodb-js/connection-storage": { "version": "file:packages/connection-storage", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -60301,10 +60327,10 @@ "@types/sinon-chai": "^3.2.5", "bson": "^6.10.4", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "keytar": "^7.9.0", "lodash": "^4.17.21", "mocha": "^10.2.0", @@ -60340,15 +60366,15 @@ "@mongodb-js/databases-collections-list": { "version": "file:packages/databases-collections-list", "requires": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -60356,11 +60382,11 @@ "@types/react": "^17.0.5", "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", "react": "^17.0.2", @@ -60602,8 +60628,8 @@ "@babel/eslint-parser": "^7.14.3", "@mongodb-js/eslint-config-devtools": "^0.9.9", "@mongodb-js/eslint-plugin-compass": "^1.2.13", - "@typescript-eslint/eslint-plugin": "^8.37.0", - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-chai-friendly": "^1.1.0", @@ -60623,8 +60649,8 @@ "@babel/eslint-parser": "^7.22.7", "@babel/preset-env": "^7.22.7", "@babel/preset-react": "^7.22.5", - "@typescript-eslint/eslint-plugin": "^8.37.0", - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-filename-rules": "^1.2.0", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -60647,7 +60673,7 @@ "@mongodb-js/explain-plan-helper": { "version": "file:packages/explain-plan-helper", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/shell-bson-parser": "^1.2.0", @@ -60658,7 +60684,7 @@ "chai": "^4.3.4", "depcheck": "^1.4.1", "mocha": "^10.2.0", - "mongodb-explain-compat": "^3.3.15", + "mongodb-explain-compat": "^3.3.16", "nyc": "^15.1.0", "sinon": "^9.2.3", "typescript": "^5.8.3" @@ -60696,6 +60722,15 @@ } } }, + "@mongodb-js/mdb-experiment-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/mdb-experiment-js/-/mdb-experiment-js-1.9.0.tgz", + "integrity": "sha512-4JcsdyjmbUxzBRADGCPWH9ySif5nda7JW6wNChqd7gYagEK7+I76p24sd4rTo9Ub8+JVkNyfB+eeF9CHuM4y3Q==", + "requires": { + "deepmerge": "^4.2.2", + "use-sync-external-store": "^1.2.0" + } + }, "@mongodb-js/mocha-config-compass": { "version": "file:configs/mocha-config-compass", "requires": { @@ -61054,10 +61089,10 @@ "@mongodb-js/my-queries-storage": { "version": "file:packages/my-queries-storage", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -61430,7 +61465,7 @@ "@mongodb-js/reflux-state-mixin": { "version": "file:packages/reflux-state-mixin", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -61652,7 +61687,7 @@ "@mongodb-js/testing-library-compass": { "version": "file:configs/testing-library-compass", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -61790,7 +61825,7 @@ "@babel/preset-typescript": "^7.21.4", "@babel/runtime": "^7.21.0", "@cerner/duplicate-package-checker-webpack-plugin": "^2.1.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", @@ -61805,7 +61840,7 @@ "core-js": "^3.17.3", "css-loader": "^4.3.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "html-webpack-plugin": "^5.6.0", "less": "^3.13.1", "less-loader": "^10.0.1", @@ -65969,15 +66004,15 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", - "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", + "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/type-utils": "8.37.0", - "@typescript-eslint/utils": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/type-utils": "8.39.0", + "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -65992,68 +66027,68 @@ } }, "@typescript-eslint/parser": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", - "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", - "requires": { - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", + "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "requires": { + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4" } }, "@typescript-eslint/project-service": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", - "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", + "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", "requires": { - "@typescript-eslint/tsconfig-utils": "^8.37.0", - "@typescript-eslint/types": "^8.37.0", + "@typescript-eslint/tsconfig-utils": "^8.39.0", + "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", - "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", + "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", "requires": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0" + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", - "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", + "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", "requires": {} }, "@typescript-eslint/type-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", - "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", + "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", "requires": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0", + "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" } }, "@typescript-eslint/types": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", - "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==" + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", + "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==" }, "@typescript-eslint/typescript-estree": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", - "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", - "requires": { - "@typescript-eslint/project-service": "8.37.0", - "@typescript-eslint/tsconfig-utils": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", + "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "requires": { + "@typescript-eslint/project-service": "8.39.0", + "@typescript-eslint/tsconfig-utils": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -66081,22 +66116,22 @@ } }, "@typescript-eslint/utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", - "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", + "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0" + "@typescript-eslint/scope-manager": "8.39.0", + "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/typescript-estree": "8.39.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", - "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", + "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", "requires": { - "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" }, "dependencies": { @@ -68322,7 +68357,7 @@ "bson-transpilers": { "version": "file:packages/bson-transpilers", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "antlr4": "4.7.2", "bson": "^6.10.4", "chai": "^4.3.4", @@ -69047,9 +69082,10 @@ "version": "file:packages/compass-e2e-tests", "requires": { "@electron/rebuild": "^4.0.1", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.46.0", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/oidc-mock-provider": "^0.11.3", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -69061,15 +69097,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", - "electron-to-chromium": "^1.5.185", + "electron": "^37.2.5", + "electron-to-chromium": "^1.5.195", "glob": "^10.2.5", "globals": "^15.14.0", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", @@ -69356,21 +69392,21 @@ "compass-preferences-model": { "version": "file:packages/compass-preferences-model", "requires": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-user-data": "^0.8.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-user-data": "^0.8.4", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/js-yaml": "^4.0.5", "@types/yargs-parser": "21.0.0", "bson": "^6.10.4", "chai": "^4.3.6", "depcheck": "^1.4.1", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "mocha": "^10.2.0", @@ -70625,6 +70661,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, "deepmerge-ts": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.4.tgz", @@ -71532,9 +71573,9 @@ } }, "electron": { - "version": "37.2.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.2.tgz", - "integrity": "sha512-qEIUs+3elu7wOfzLEtLz4Innfe+8nQyhLh9qjrJY0d0MxdRolLMDUD9QwAQ743vDZ+bUg+gqwigzP7kV78S3hA==", + "version": "37.2.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.5.tgz", + "integrity": "sha512-719ZqEp43rj6xDJMICm4CIXl8keFFgvVNO9Ix6OtjNjrh9HtYlP/1WiYeRohnXj06aLyGx5NCzrHbG7j3BxO9w==", "requires": { "@electron/get": "^2.0.0", "@types/node": "^22.7.7", @@ -71885,9 +71926,9 @@ } }, "electron-to-chromium": { - "version": "1.5.185", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.185.tgz", - "integrity": "sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==" + "version": "1.5.195", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.195.tgz", + "integrity": "sha512-URclP0iIaDUzqcAyV1v2PgduJ9N0IdXmWsnPzPfelvBmjmZzEy6xJcjb1cXj+TbYqXgtLrjHEoaSIdTYhw4ezg==" }, "electron-window": { "version": "0.8.1", @@ -74480,7 +74521,7 @@ "@mongodb-js/devtools-github-repo": "^1.4.1", "@mongodb-js/dl-center": "^1.3.0", "@mongodb-js/electron-wix-msi": "^3.0.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/signing-utils": "^0.3.8", "@npmcli/arborist": "^6.2.0", "@octokit/rest": "^18.6.2", @@ -74492,7 +74533,7 @@ "del": "^2.0.2", "depcheck": "^1.4.1", "download": "^8.0.0", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-installer-debian": "^3.2.0", "electron-installer-dmg": "^5.0.1", "electron-installer-redhat": "^2.0.0", @@ -75078,7 +75119,7 @@ "hadron-document": { "version": "file:packages/hadron-document", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -75086,7 +75127,7 @@ "chai": "^4.2.0", "depcheck": "^1.4.1", "eventemitter3": "^4.0.0", - "hadron-type-checker": "^7.4.15", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mocha": "^10.2.0", "moment": "^2.29.4", @@ -75197,7 +75238,7 @@ "hadron-ipc": { "version": "file:packages/hadron-ipc", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -75208,7 +75249,7 @@ "chai": "^4.3.6", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "is-electron-renderer": "^2.0.1", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -75241,7 +75282,7 @@ "hadron-type-checker": { "version": "file:packages/hadron-type-checker", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "bson": "^6.10.4", "chai": "^4.2.0", "depcheck": "^1.4.1", @@ -79672,14 +79713,14 @@ "mongodb-collection-model": { "version": "file:packages/collection-model", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "xvfb-maybe": "^0.2.1" } @@ -79689,54 +79730,54 @@ "requires": { "@electron/rebuild": "^4.0.1", "@electron/remote": "^2.1.3", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-find-in-page": "^4.46.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-import-export": "^7.66.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-saved-aggregations-queries": "^1.67.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-serverstats": "^16.66.0", - "@mongodb-js/compass-settings": "^0.65.0", - "@mongodb-js/compass-shell": "^3.66.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-find-in-page": "^4.48.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-import-export": "^7.68.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-saved-aggregations-queries": "^1.69.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-serverstats": "^16.68.0", + "@mongodb-js/compass-settings": "^0.67.0", + "@mongodb-js/compass-shell": "^3.68.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/device-id": "^0.2.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/get-os-info": "^0.4.0", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-downloader": "^0.3.7", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/sbom-tools": "^0.7.2", "@mongodb-js/signing-utils": "^0.3.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@mongosh/node-runtime-worker-thread": "^3.3.18", "@segment/analytics-node": "^1.1.4", "@types/minimatch": "^5.1.2", @@ -79745,18 +79786,18 @@ "chalk": "^4.1.2", "clean-stack": "^2.0.0", "clipboard": "^2.0.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-devtools-installer": "^3.2.0", "electron-dl": "^3.5.0", "electron-mocha": "^12.2.0", "ensure-error": "^3.0.1", "glob": "^10.2.5", - "hadron-build": "^25.8.7", - "hadron-ipc": "^3.5.7", + "hadron-build": "^25.8.9", + "hadron-ipc": "^3.5.9", "kerberos": "^2.2.1", "keytar": "^7.9.0", "macos-export-certificate-and-key": "^1.1.2", @@ -79767,7 +79808,7 @@ "mongodb-client-encryption": "^6.3.0", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "native-machine-id": "^0.1.1", @@ -79919,13 +79960,13 @@ "mongodb-data-service": { "version": "file:packages/data-service", "requires": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/compass-utils": "^0.9.9", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-docker-test-envs": "^1.3.3", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/oidc-plugin": "^2.0.1", "@mongodb-js/prettier-config-compass": "^1.2.8", @@ -80080,14 +80121,14 @@ "mongodb-database-model": { "version": "file:packages/database-model", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", "depcheck": "^1.4.1", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2" + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0" } }, "mongodb-download-url": { @@ -80104,7 +80145,7 @@ "mongodb-explain-compat": { "version": "file:packages/mongodb-explain-compat", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", "nyc": "^15.1.0" @@ -80113,16 +80154,16 @@ "mongodb-instance-model": { "version": "file:packages/instance-model", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "ampersand-model": "^8.0.1", "chai": "^4.3.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "depcheck": "^1.4.1", "mocha": "^10.2.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2" + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0" } }, "mongodb-js-cli": { @@ -80390,7 +80431,7 @@ "mongodb-query-util": { "version": "file:packages/mongodb-query-util", "requires": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/package.json b/package.json index 73a0b694a79..29889cb1395 100644 --- a/package.json +++ b/package.json @@ -104,8 +104,8 @@ "cheerio": "1.0.0-rc.10" }, "@mongodb-js/eslint-config-devtools": { - "@typescript-eslint/eslint-plugin": "^8.37.0", - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.1", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", diff --git a/packages/atlas-service/package.json b/packages/atlas-service/package.json index 792c6298a8f..cdc6c786f99 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.52.0", + "version": "0.54.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -55,10 +55,10 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -71,19 +71,19 @@ "typescript": "^5.8.3" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-proxy-support": "^0.5.1", "@mongodb-js/oidc-plugin": "^2.0.1", - "compass-preferences-model": "^2.47.0", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "compass-preferences-model": "^2.49.0", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "react": "^17.0.2", "redux": "^4.2.1", diff --git a/packages/bson-transpilers/package.json b/packages/bson-transpilers/package.json index b0a076a99e4..37da0d49f36 100644 --- a/packages/bson-transpilers/package.json +++ b/packages/bson-transpilers/package.json @@ -1,6 +1,6 @@ { "name": "bson-transpilers", - "version": "3.2.15", + "version": "3.2.16", "apiVersion": "0.0.1", "description": "Source to source compilers using ANTLR", "contributors": [ @@ -32,7 +32,7 @@ }, "license": "SSPL", "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.3.4", "depcheck": "^1.4.1", "mocha": "^10.2.0" diff --git a/packages/collection-model/index.d.ts b/packages/collection-model/index.d.ts index f5e2b866268..6b5c7ffe43f 100644 --- a/packages/collection-model/index.d.ts +++ b/packages/collection-model/index.d.ts @@ -83,7 +83,7 @@ interface CollectionProps { sourceName: string | null; source: Collection; properties: { id: string; options?: Record }[]; - is_non_existent: boolean; + inferred_from_privileges: boolean; } type CollectionDataService = Pick< diff --git a/packages/collection-model/lib/model.js b/packages/collection-model/lib/model.js index 262102ca2a5..703ef095247 100644 --- a/packages/collection-model/lib/model.js +++ b/packages/collection-model/lib/model.js @@ -102,7 +102,7 @@ function pickCollectionInfo({ validation, clustered, fle2, - is_non_existent, + inferred_from_privileges, }) { return { type, @@ -113,7 +113,7 @@ function pickCollectionInfo({ validation, clustered, fle2, - is_non_existent, + inferred_from_privileges, }; } @@ -134,8 +134,8 @@ const CollectionModel = AmpersandModel.extend(debounceActions(['fetch']), { status: { type: 'string', default: 'initial' }, statusError: { type: 'string', default: null }, - // Normalized values from collectionInfo command - is_non_existent: 'boolean', + // Normalized values from collectionInfo method + inferred_from_privileges: 'boolean', readonly: 'boolean', clustered: 'boolean', fle2: 'boolean', @@ -269,7 +269,7 @@ const CollectionModel = AmpersandModel.extend(debounceActions(['fetch']), { const shouldFetchDbAndCollStats = getParentByType( this, 'Instance' - ).shouldFetchDbAndCollStats; + ).shouldFetchDbAndCollStats(); try { const newStatus = this.status === 'initial' ? 'fetching' : 'refreshing'; @@ -286,14 +286,14 @@ const CollectionModel = AmpersandModel.extend(debounceActions(['fetch']), { ...collStats, ...(collectionInfo && pickCollectionInfo(collectionInfo)), }); - // If the collection is not unprovisioned `is_non_existent` anymore, - // let's update the parent database model to reflect the change. - // This happens when a user tries to insert first document into a - // collection that doesn't exist yet or creates a new collection - // for an unprovisioned database. - if (!this.is_non_existent) { + // If the collection is not `inferred_from_privileges` anymore, let's + // update the parent database model to reflect the change. This happens + // when a user tries to insert first document into a collection that + // doesn't exist yet or creates a new collection for an unprovisioned + // database. + if (!this.inferred_from_privileges) { getParentByType(this, 'Database').set({ - is_non_existent: false, + inferred_from_privileges: false, }); } } catch (err) { @@ -385,6 +385,11 @@ const CollectionCollection = AmpersandCollection.extend( async fetch({ dataService }) { const databaseName = getParentByType(this, 'Database')?.getId(); + const shouldFetchNamespacesFromPrivileges = getParentByType( + this, + 'Instance' + ).shouldFetchNamespacesFromPrivileges(); + if (!databaseName) { throw new Error( `Trying to fetch ${this.modelType} that doesn't have the Database parent model` @@ -405,6 +410,7 @@ const CollectionCollection = AmpersandCollection.extend( { // Always fetch collections with info nameOnly: false, + fetchNamespacesFromPrivileges: shouldFetchNamespacesFromPrivileges, privileges: instanceModel.auth.privileges, } ); diff --git a/packages/collection-model/package.json b/packages/collection-model/package.json index b461b04a41a..bbbabfbe4c8 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.30.2", + "version": "5.31.0", "bugs": { "url": "https://jira.mongodb.org/projects/COMPASS/issues", "email": "compass@mongodb.com" @@ -31,11 +31,11 @@ "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", diff --git a/packages/compass-aggregations/package.json b/packages/compass-aggregations/package.json index 13258a09a6d..b3563f25526 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.69.0", + "version": "9.71.0", "main": "dist/index.js", "compass:main": "src/index.ts", "types": "dist/index.d.ts", @@ -32,10 +32,10 @@ }, "license": "SSPL", "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/babel__generator": "^7.6.8", "@types/lodash": "^4.14.188", @@ -57,34 +57,34 @@ "@dnd-kit/core": "^6.0.7", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/explain-plan-helper": "^1.4.15", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/shell-bson-parser": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "compass-preferences-model": "^2.49.0", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", diff --git a/packages/compass-app-registry/package.json b/packages/compass-app-registry/package.json index 3d9153472da..e92833c192a 100644 --- a/packages/compass-app-registry/package.json +++ b/packages/compass-app-registry/package.json @@ -13,7 +13,7 @@ "access": "public" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "9.4.17", + "version": "9.4.18", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -56,10 +56,10 @@ "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", diff --git a/packages/compass-app-stores/package.json b/packages/compass-app-stores/package.json index 7567f9ed544..1c10156fcc0 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.53.0", + "version": "7.55.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -53,10 +53,10 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -71,15 +71,15 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/compass-app-registry": "^9.4.17", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", - "mongodb-instance-model": "^12.39.0", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", + "mongodb-instance-model": "^12.41.0", + "compass-preferences-model": "^2.49.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, diff --git a/packages/compass-app-stores/src/stores/instance-store.ts b/packages/compass-app-stores/src/stores/instance-store.ts index e89aa50ad42..a2ff56123d6 100644 --- a/packages/compass-app-stores/src/stores/instance-store.ts +++ b/packages/compass-app-stores/src/stores/instance-store.ts @@ -286,6 +286,15 @@ export function createInstancesStore( } ); + preferences.onPreferenceValueChanged('inferNamespacesFromPrivileges', () => { + const connectedConnectionIds = Array.from( + instancesManager.listMongoDBInstances().keys() + ); + for (const connectionId of connectedConnectionIds) { + void refreshDatabases({ connectionId }); + } + }); + on(connections, 'disconnected', function (connectionInfoId: string) { try { const instance = diff --git a/packages/compass-collection/package.json b/packages/compass-collection/package.json index 80f01acbdb3..5fefe25c6c4 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.66.0", + "version": "4.68.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.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "compass-preferences-model": "^2.47.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "mongodb-collection-model": "^5.30.2", + "compass-preferences-model": "^2.49.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "mongodb-collection-model": "^5.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -66,10 +66,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/constants.ts b/packages/compass-collection/src/components/mock-data-generator-modal/constants.ts new file mode 100644 index 00000000000..5057ee5946a --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/constants.ts @@ -0,0 +1,10 @@ +import { MockDataGeneratorStep } from './types'; + +export const StepButtonLabelMap = { + [MockDataGeneratorStep.AI_DISCLAIMER]: 'Use Natural Language', + [MockDataGeneratorStep.SCHEMA_CONFIRMATION]: 'Confirm', + [MockDataGeneratorStep.SCHEMA_EDITOR]: 'Next', + [MockDataGeneratorStep.DOCUMENT_COUNT]: 'Next', + [MockDataGeneratorStep.PREVIEW_DATA]: 'Generate Script', + [MockDataGeneratorStep.GENERATE_DATA]: 'Done', +} as const; diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.spec.tsx b/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.spec.tsx new file mode 100644 index 00000000000..88d94c6e778 --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.spec.tsx @@ -0,0 +1,92 @@ +import { expect } from 'chai'; +import React from 'react'; +import { render, screen } from '@mongodb-js/testing-library-compass'; +import Sinon from 'sinon'; +import MockDataGeneratorModal from './mock-data-generator-modal'; +import { MockDataGeneratorStep } from './types'; +import { StepButtonLabelMap } from './constants'; + +describe('MockDataGeneratorModal', () => { + const sandbox = Sinon.createSandbox(); + let onOpenChange: Sinon.SinonSpy; + + beforeEach(() => { + onOpenChange = sandbox.spy(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + function renderModal({ + isOpen = true, + currentStep = MockDataGeneratorStep.AI_DISCLAIMER, + } = {}) { + function MockDataGeneratorModalWrapper() { + const [currentStepStateMock, onCurrentStepChangeStateMock] = + React.useState(currentStep); + return ( + { + onCurrentStepChangeStateMock(step); + }} + /> + ); + } + return render(); + } + + it('renders the modal when isOpen is true', () => { + renderModal(); + + expect(screen.getByTestId('generate-mock-data-modal')).to.exist; + }); + + it('does not render the modal when isOpen is false', () => { + renderModal({ isOpen: false }); + + expect(screen.queryByTestId('generate-mock-data-modal')).to.not.exist; + }); + + it('calls onOpenChange(false) when the modal is closed', () => { + renderModal(); + + screen.getByLabelText('Close modal').click(); + + expect(onOpenChange.calledOnceWith(false)).to.be.true; + }); + + it('calls onOpenChange(false) when the cancel button is clicked', () => { + renderModal(); + + screen.getByText('Cancel').click(); + + expect(onOpenChange.calledOnceWith(false)).to.be.true; + }); + + it('disables the Back button on the first step', () => { + renderModal(); + + expect( + screen.getByRole('button', { name: 'Back' }).getAttribute('aria-disabled') + ).to.equal('true'); + }); + + describe('when rendering the modal in a specific step', () => { + const steps = Object.keys( + StepButtonLabelMap + ) as unknown as MockDataGeneratorStep[]; + + steps.forEach((currentStep) => { + it(`renders the button with the correct label when the user is in step "${currentStep}"`, () => { + renderModal({ currentStep }); + expect(screen.getByTestId('next-step-button')).to.have.text( + StepButtonLabelMap[currentStep] + ); + }); + }); + }); +}); diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.tsx b/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.tsx new file mode 100644 index 00000000000..b7723530d61 --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/mock-data-generator-modal.tsx @@ -0,0 +1,91 @@ +import React from 'react'; + +import { + css, + ModalBody, + ModalHeader, + spacing, +} from '@mongodb-js/compass-components'; + +import { + Button, + Modal, + ModalFooter, + ButtonVariant, +} from '@mongodb-js/compass-components'; +import { MockDataGeneratorStep } from './types'; +import { StepButtonLabelMap } from './constants'; +import { getNextStep, getPreviousStep } from './utils'; + +const footerStyles = css` + flex-direction: row; + justify-content: space-between; +`; + +const rightButtonsStyles = css` + display: flex; + gap: ${spacing[200]}px; + flex-direction: row; +`; + +interface Props { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; + currentStep: MockDataGeneratorStep; + onCurrentStepChange: (step: MockDataGeneratorStep) => void; +} + +const MockDataGeneratorModal = ({ + isOpen, + onOpenChange, + currentStep, + onCurrentStepChange, +}: Props) => { + const onNext = () => { + const nextStep = getNextStep(currentStep); + onCurrentStepChange(nextStep); + }; + + const onBack = () => { + const previousStep = getPreviousStep(currentStep); + onCurrentStepChange(previousStep); + }; + + const onCancel = () => { + onOpenChange(false); + }; + + return ( + onOpenChange(open)} + data-testid="generate-mock-data-modal" + > + + + {/* TODO: Render actual step content here based on currentStep. (CLOUDP-333851) */} +
+ + + +
+ + +
+
+ + ); +}; + +export default MockDataGeneratorModal; diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/types.ts b/packages/compass-collection/src/components/mock-data-generator-modal/types.ts new file mode 100644 index 00000000000..6394dc25e2d --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/types.ts @@ -0,0 +1,8 @@ +export enum MockDataGeneratorStep { + AI_DISCLAIMER = 'AI_DISCLAIMER', + SCHEMA_CONFIRMATION = 'SCHEMA_CONFIRMATION', + SCHEMA_EDITOR = 'SCHEMA_EDITOR', + DOCUMENT_COUNT = 'DOCUMENT_COUNT', + PREVIEW_DATA = 'PREVIEW_DATA', + GENERATE_DATA = 'GENERATE_DATA', +} diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/utils.spec.ts b/packages/compass-collection/src/components/mock-data-generator-modal/utils.spec.ts new file mode 100644 index 00000000000..239d3ed2d1e --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/utils.spec.ts @@ -0,0 +1,81 @@ +import { expect } from 'chai'; +import { getNextStep, getPreviousStep } from './utils'; +import { MockDataGeneratorStep } from './types'; + +describe('Mock Data Generator Modal Utils', () => { + describe('getNextStep', () => { + it('should go from AI_DISCLAIMER to SCHEMA_CONFIRMATION', () => { + expect(getNextStep(MockDataGeneratorStep.AI_DISCLAIMER)).to.equal( + MockDataGeneratorStep.SCHEMA_CONFIRMATION + ); + }); + + it('should go from SCHEMA_CONFIRMATION to SCHEMA_EDITOR', () => { + expect(getNextStep(MockDataGeneratorStep.SCHEMA_CONFIRMATION)).to.equal( + MockDataGeneratorStep.SCHEMA_EDITOR + ); + }); + + it('should go from SCHEMA_EDITOR to DOCUMENT_COUNT', () => { + expect(getNextStep(MockDataGeneratorStep.SCHEMA_EDITOR)).to.equal( + MockDataGeneratorStep.DOCUMENT_COUNT + ); + }); + + it('should go from DOCUMENT_COUNT to PREVIEW_DATA', () => { + expect(getNextStep(MockDataGeneratorStep.DOCUMENT_COUNT)).to.equal( + MockDataGeneratorStep.PREVIEW_DATA + ); + }); + + it('should go from PREVIEW_DATA to GENERATE_DATA', () => { + expect(getNextStep(MockDataGeneratorStep.PREVIEW_DATA)).to.equal( + MockDataGeneratorStep.GENERATE_DATA + ); + }); + + it('should stay on GENERATE_DATA if already at GENERATE_DATA', () => { + expect(getNextStep(MockDataGeneratorStep.GENERATE_DATA)).to.equal( + MockDataGeneratorStep.GENERATE_DATA + ); + }); + }); + + describe('getPreviousStep', () => { + it('should stay on AI_DISCLAIMER if already at AI_DISCLAIMER', () => { + expect(getPreviousStep(MockDataGeneratorStep.AI_DISCLAIMER)).to.equal( + MockDataGeneratorStep.AI_DISCLAIMER + ); + }); + + it('should go from SCHEMA_CONFIRMATION to AI_DISCLAIMER', () => { + expect( + getPreviousStep(MockDataGeneratorStep.SCHEMA_CONFIRMATION) + ).to.equal(MockDataGeneratorStep.AI_DISCLAIMER); + }); + + it('should go from SCHEMA_EDITOR to SCHEMA_CONFIRMATION', () => { + expect(getPreviousStep(MockDataGeneratorStep.SCHEMA_EDITOR)).to.equal( + MockDataGeneratorStep.SCHEMA_CONFIRMATION + ); + }); + + it('should go from DOCUMENT_COUNT to SCHEMA_EDITOR', () => { + expect(getPreviousStep(MockDataGeneratorStep.DOCUMENT_COUNT)).to.equal( + MockDataGeneratorStep.SCHEMA_EDITOR + ); + }); + + it('should go from PREVIEW_DATA to DOCUMENT_COUNT', () => { + expect(getPreviousStep(MockDataGeneratorStep.PREVIEW_DATA)).to.equal( + MockDataGeneratorStep.DOCUMENT_COUNT + ); + }); + + it('should go from GENERATE_DATA to PREVIEW_DATA', () => { + expect(getPreviousStep(MockDataGeneratorStep.GENERATE_DATA)).to.equal( + MockDataGeneratorStep.PREVIEW_DATA + ); + }); + }); +}); diff --git a/packages/compass-collection/src/components/mock-data-generator-modal/utils.ts b/packages/compass-collection/src/components/mock-data-generator-modal/utils.ts new file mode 100644 index 00000000000..bc273c07dfc --- /dev/null +++ b/packages/compass-collection/src/components/mock-data-generator-modal/utils.ts @@ -0,0 +1,41 @@ +import { MockDataGeneratorStep } from './types'; + +export const getNextStep = ( + currentStep: MockDataGeneratorStep +): MockDataGeneratorStep => { + switch (currentStep) { + case MockDataGeneratorStep.AI_DISCLAIMER: + return MockDataGeneratorStep.SCHEMA_CONFIRMATION; + case MockDataGeneratorStep.SCHEMA_CONFIRMATION: + return MockDataGeneratorStep.SCHEMA_EDITOR; + case MockDataGeneratorStep.SCHEMA_EDITOR: + return MockDataGeneratorStep.DOCUMENT_COUNT; + case MockDataGeneratorStep.DOCUMENT_COUNT: + return MockDataGeneratorStep.PREVIEW_DATA; + case MockDataGeneratorStep.PREVIEW_DATA: + return MockDataGeneratorStep.GENERATE_DATA; + case MockDataGeneratorStep.GENERATE_DATA: + // No next step after data generation + return currentStep; + } +}; + +export const getPreviousStep = ( + currentStep: MockDataGeneratorStep +): MockDataGeneratorStep => { + switch (currentStep) { + case MockDataGeneratorStep.AI_DISCLAIMER: + // No previous step from AI disclaimer + return currentStep; + case MockDataGeneratorStep.SCHEMA_CONFIRMATION: + return MockDataGeneratorStep.AI_DISCLAIMER; + case MockDataGeneratorStep.SCHEMA_EDITOR: + return MockDataGeneratorStep.SCHEMA_CONFIRMATION; + case MockDataGeneratorStep.DOCUMENT_COUNT: + return MockDataGeneratorStep.SCHEMA_EDITOR; + case MockDataGeneratorStep.PREVIEW_DATA: + return MockDataGeneratorStep.DOCUMENT_COUNT; + case MockDataGeneratorStep.GENERATE_DATA: + return MockDataGeneratorStep.PREVIEW_DATA; + } +}; diff --git a/packages/compass-collection/src/index.ts b/packages/compass-collection/src/index.ts index dc087a96e0b..90f8281e51c 100644 --- a/packages/compass-collection/src/index.ts +++ b/packages/compass-collection/src/index.ts @@ -6,10 +6,14 @@ import { dataServiceLocator, type DataServiceLocator, type DataService, + connectionInfoRefLocator, } from '@mongodb-js/compass-connections/provider'; import { collectionModelLocator } from '@mongodb-js/compass-app-stores/provider'; import type { WorkspacePlugin } from '@mongodb-js/compass-workspaces'; import { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; +import { experimentationServiceLocator } from '@mongodb-js/compass-telemetry/provider'; +import { createLoggerLocator } from '@mongodb-js/compass-logging/provider'; +import { preferencesLocator } from 'compass-preferences-model/provider'; import { CollectionWorkspaceTitle, CollectionPluginTitleComponent, @@ -29,6 +33,10 @@ export const WorkspaceTab: WorkspacePlugin = { dataService: dataServiceLocator as DataServiceLocator, collection: collectionModelLocator, workspaces: workspacesServiceLocator, + experimentationServices: experimentationServiceLocator, + connectionInfoRef: connectionInfoRefLocator, + logger: createLoggerLocator('COMPASS-COLLECTION'), + preferences: preferencesLocator, } ), content: CollectionTab, diff --git a/packages/compass-collection/src/modules/collection-tab.ts b/packages/compass-collection/src/modules/collection-tab.ts index cfa162fd848..12655bc0dce 100644 --- a/packages/compass-collection/src/modules/collection-tab.ts +++ b/packages/compass-collection/src/modules/collection-tab.ts @@ -5,6 +5,7 @@ import type AppRegistry from '@mongodb-js/compass-app-registry'; import type { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; import type { CollectionSubtab } from '@mongodb-js/compass-workspaces'; import type { DataService } from '@mongodb-js/compass-connections/provider'; +import type { experimentationServiceLocator } from '@mongodb-js/compass-telemetry/provider'; function isAction( action: AnyAction, @@ -20,6 +21,7 @@ type CollectionThunkAction = ThunkAction< localAppRegistry: AppRegistry; dataService: DataService; workspaces: ReturnType; + experimentationServices: ReturnType; }, A >; diff --git a/packages/compass-collection/src/plugin-tab-title.tsx b/packages/compass-collection/src/plugin-tab-title.tsx index f12bf03406a..a625a2862b3 100644 --- a/packages/compass-collection/src/plugin-tab-title.tsx +++ b/packages/compass-collection/src/plugin-tab-title.tsx @@ -24,7 +24,7 @@ type PluginTitleProps = { function PluginTitle({ editViewName, - isNonExistent, + inferredFromPrivileges, isReadonly, isTimeSeries, sourceName, @@ -68,12 +68,12 @@ function PluginTitle({ ? 'Visibility' : collectionType === 'timeseries' ? 'TimeSeries' - : isNonExistent + : inferredFromPrivileges ? 'EmptyFolder' : 'Folder' } data-namespace={ns} - isNonExistent={isNonExistent} + inferredFromPrivileges={inferredFromPrivileges} /> ); } diff --git a/packages/compass-collection/src/stores/collection-tab.spec.ts b/packages/compass-collection/src/stores/collection-tab.spec.ts index 69bc0ff56e5..6a5394bdef9 100644 --- a/packages/compass-collection/src/stores/collection-tab.spec.ts +++ b/packages/compass-collection/src/stores/collection-tab.spec.ts @@ -6,6 +6,11 @@ import Sinon from 'sinon'; import AppRegistry from '@mongodb-js/compass-app-registry'; import { expect } from 'chai'; import type { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; +import type { experimentationServiceLocator } from '@mongodb-js/compass-telemetry'; +import type { connectionInfoRefLocator } from '@mongodb-js/compass-connections/provider'; +import { createNoopLogger } from '@mongodb-js/compass-logging/provider'; +import { ReadOnlyPreferenceAccess } from 'compass-preferences-model/provider'; +import { ExperimentTestName } from '@mongodb-js/compass-telemetry/provider'; const defaultMetadata = { namespace: 'test.foo', @@ -32,6 +37,32 @@ const mockCollection = { }, }; +const mockAtlasConnectionInfo = { + current: { + id: 'test-connection', + title: 'Test Connection', + connectionOptions: { + connectionString: 'mongodb://localhost:27017', + }, + atlasMetadata: { + clusterName: 'test-cluster', + projectId: 'test-project', + orgId: 'test-org', + clusterUniqueId: 'test-cluster-unique-id', + clusterType: 'REPLICASET' as const, + clusterState: 'IDLE' as const, + metricsId: 'test-metrics-id', + metricsType: 'replicaSet' as const, + regionalBaseUrl: null, + instanceSize: 'M10', + supports: { + globalWrites: false, + rollingIndexes: true, + }, + }, + }, +}; + describe('Collection Tab Content store', function () { const sandbox = Sinon.createSandbox(); @@ -42,7 +73,19 @@ describe('Collection Tab Content store', function () { const configureStore = async ( options: Partial = {}, - workspaces: Partial> = {} + workspaces: Partial> = {}, + experimentationServices: Partial< + ReturnType + > = {}, + connectionInfoRef: Partial< + ReturnType + > = {}, + logger = createNoopLogger('COMPASS-COLLECTION-TEST'), + preferences = new ReadOnlyPreferenceAccess({ + enableGenAIFeatures: true, + enableGenAIFeaturesAtlasOrg: true, + cloudFeatureRolloutAccess: { GEN_AI_COMPASS: true }, + }) ) => { ({ store, deactivate } = activatePlugin( { @@ -54,6 +97,10 @@ describe('Collection Tab Content store', function () { localAppRegistry, collection: mockCollection as any, workspaces: workspaces as any, + experimentationServices: experimentationServices as any, + connectionInfoRef: connectionInfoRef as any, + logger, + preferences, }, { on() {}, cleanup() {} } as any )); @@ -76,11 +123,112 @@ describe('Collection Tab Content store', function () { const store = await configureStore(undefined, { openCollectionWorkspaceSubtab, }); - store.dispatch(selectTab('Documents')); + store.dispatch(selectTab('Documents') as any); expect(openCollectionWorkspaceSubtab).to.have.been.calledWith( 'workspace-tab-id', 'Documents' ); }); }); + + describe('experimentation integration', function () { + it('should assign experiment when Atlas metadata is available', async function () { + const assignExperiment = sandbox.spy(() => Promise.resolve(null)); + + await configureStore( + undefined, + {}, + { assignExperiment }, + mockAtlasConnectionInfo + ); + + await waitFor(() => { + expect(assignExperiment).to.have.been.calledOnceWith( + ExperimentTestName.mockDataGenerator, + { + team: 'Atlas Growth', + } + ); + }); + }); + + it('should not assign experiment when Atlas metadata is missing', async function () { + const assignExperiment = sandbox.spy(() => Promise.resolve(null)); + const mockConnectionInfoRef = { + current: { + id: 'test-connection', + title: 'Test Connection', + connectionOptions: { + connectionString: 'mongodb://localhost:27017', + }, + // No atlasMetadata + }, + }; + + await configureStore( + undefined, + {}, + { assignExperiment }, + mockConnectionInfoRef + ); + + // Wait a bit to ensure assignment would have happened if it was going to + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(assignExperiment).to.not.have.been.called; + }); + + it('should not assign experiment when AI features are disabled at the org level', async function () { + const assignExperiment = sandbox.spy(() => Promise.resolve(null)); + + const mockPreferences = new ReadOnlyPreferenceAccess({ + enableGenAIFeatures: true, + enableGenAIFeaturesAtlasOrg: false, // Disabled at org level + cloudFeatureRolloutAccess: { GEN_AI_COMPASS: true }, + }); + + const store = await configureStore( + undefined, + {}, + { assignExperiment }, + mockAtlasConnectionInfo, + undefined, + mockPreferences + ); + + // Wait a bit to ensure assignment would have happened if it was going to + await new Promise((resolve) => setTimeout(resolve, 50)); + expect(assignExperiment).to.not.have.been.called; + + // Store should still be functional + await waitFor(() => { + expect(store.getState()) + .to.have.property('metadata') + .deep.eq(defaultMetadata); + }); + }); + + it('should handle assignment errors gracefully', async function () { + const assignExperiment = sandbox.spy(() => + Promise.reject(new Error('Assignment failed')) + ); + + await configureStore( + undefined, + {}, + { assignExperiment }, + mockAtlasConnectionInfo + ); + + await waitFor(() => { + expect(assignExperiment).to.have.been.calledOnce; + }); + + // Store should still be functional despite assignment error + await waitFor(() => { + expect(store.getState()) + .to.have.property('metadata') + .deep.eq(defaultMetadata); + }); + }); + }); }); diff --git a/packages/compass-collection/src/stores/collection-tab.ts b/packages/compass-collection/src/stores/collection-tab.ts index d04359af108..925572bf7e3 100644 --- a/packages/compass-collection/src/stores/collection-tab.ts +++ b/packages/compass-collection/src/stores/collection-tab.ts @@ -9,6 +9,14 @@ import reducer, { import type { Collection } from '@mongodb-js/compass-app-stores/provider'; import type { ActivateHelpers } from '@mongodb-js/compass-app-registry'; import type { workspacesServiceLocator } from '@mongodb-js/compass-workspaces/provider'; +import type { experimentationServiceLocator } from '@mongodb-js/compass-telemetry/provider'; +import type { connectionInfoRefLocator } from '@mongodb-js/compass-connections/provider'; +import type { Logger } from '@mongodb-js/compass-logging/provider'; +import { + isAIFeatureEnabled, + type PreferencesAccess, +} from 'compass-preferences-model/provider'; +import { ExperimentTestName } from '@mongodb-js/compass-telemetry/provider'; export type CollectionTabOptions = { /** @@ -31,18 +39,29 @@ export type CollectionTabServices = { collection: Collection; localAppRegistry: AppRegistry; workspaces: ReturnType; + experimentationServices: ReturnType; + connectionInfoRef: ReturnType; + logger: Logger; + preferences: PreferencesAccess; }; export function activatePlugin( { namespace, editViewName, tabId }: CollectionTabOptions, services: CollectionTabServices, { on, cleanup }: ActivateHelpers -) { +): { + store: ReturnType; + deactivate: () => void; +} { const { dataService, collection: collectionModel, localAppRegistry, workspaces, + experimentationServices, + connectionInfoRef, + logger, + preferences, } = services; if (!collectionModel) { @@ -64,6 +83,7 @@ export function activatePlugin( dataService, workspaces, localAppRegistry, + experimentationServices, }) ) ); @@ -86,6 +106,25 @@ export function activatePlugin( void collectionModel.fetchMetadata({ dataService }).then((metadata) => { store.dispatch(collectionMetadataFetched(metadata)); + + // Assign experiment for Mock Data Generator + // Only assign when we're connected to Atlas and the org-level setting for AI features is enabled + if ( + connectionInfoRef.current?.atlasMetadata?.clusterName && // Ensures we only assign in Atlas + isAIFeatureEnabled(preferences.getPreferences()) // Ensures org-level AI features setting is enabled + ) { + void experimentationServices + .assignExperiment(ExperimentTestName.mockDataGenerator, { + team: 'Atlas Growth', + }) + .catch((error) => { + logger.debug('Mock Data Generator experiment assignment failed', { + experiment: ExperimentTestName.mockDataGenerator, + namespace: namespace, + error: error instanceof Error ? error.message : String(error), + }); + }); + } }); return { diff --git a/packages/compass-components/package.json b/packages/compass-components/package.json index a03a0c56ddc..bae9aeb67fa 100644 --- a/packages/compass-components/package.json +++ b/packages/compass-components/package.json @@ -1,6 +1,6 @@ { "name": "@mongodb-js/compass-components", - "version": "1.45.0", + "version": "1.47.0", "description": "React Components used in Compass", "license": "SSPL", "main": "lib/index.js", @@ -77,20 +77,21 @@ "@leafygreen-ui/tokens": "^2.11.3", "@leafygreen-ui/tooltip": "^13.0.13", "@leafygreen-ui/typography": "^20.0.2", - "@mongodb-js/compass-context-menu": "^0.2.3", + "@mongodb-js/compass-context-menu": "^0.2.4", "@react-aria/interactions": "^3.9.1", "@react-aria/utils": "^3.13.1", "@react-aria/visually-hidden": "^3.3.1", "@tanstack/table-core": "^8.14.0", "bson": "^6.10.4", "focus-trap-react": "^9.0.2", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "is-electron-renderer": "^2.0.1", "lodash": "^4.17.21", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "polished": "^4.2.2", "react": "^17.0.2", + "react-dom": "^17.0.2", "react-hotkeys-hook": "^4.3.7", "react-intersection-observer": "^8.34.0", "react-virtualized-auto-sizer": "^1.0.6", @@ -98,10 +99,10 @@ }, "devDependencies": { "@emotion/css": "^11.11.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -110,7 +111,6 @@ "chai": "^4.3.4", "mocha": "^10.2.0", "nyc": "^15.1.0", - "react-dom": "^17.0.2", "sinon": "^9.0.0", "typescript": "^5.8.3" }, diff --git a/packages/compass-components/src/components/accordion.spec.tsx b/packages/compass-components/src/components/accordion.spec.tsx index 815f66564c1..878bc04d5f8 100644 --- a/packages/compass-components/src/components/accordion.spec.tsx +++ b/packages/compass-components/src/components/accordion.spec.tsx @@ -1,12 +1,7 @@ import React from 'react'; import { expect } from 'chai'; -import { - fireEvent, - render, - screen, - cleanup, -} from '@mongodb-js/testing-library-compass'; +import { userEvent, render, screen } from '@mongodb-js/testing-library-compass'; import { Accordion } from './accordion'; @@ -21,15 +16,26 @@ function renderAccordion( } describe('Accordion Component', function () { - afterEach(cleanup); - it('should open the accordion on click', function () { renderAccordion(); expect(screen.getByTestId('my-test-id')).to.exist; const button = screen.getByText('Accordion Test'); - fireEvent.click(button); + userEvent.click(button); + expect(screen.getByText('Hello World')).to.be.visible; + }); + + it('should close the accordion on click - default open', function () { + renderAccordion({ + defaultOpen: true, + }); + + expect(screen.getByTestId('my-test-id')).to.exist; + const button = screen.getByText('Accordion Test'); expect(screen.getByText('Hello World')).to.be.visible; + userEvent.click(button); + + expect(screen.queryByText('Hello World')).not.to.exist; }); it('should close the accordion after clicking to open then close', function () { @@ -37,9 +43,9 @@ describe('Accordion Component', function () { expect(screen.getByTestId('my-test-id')).to.exist; const button = screen.getByText('Accordion Test'); - fireEvent.click(button); + userEvent.click(button); expect(screen.getByText('Hello World')).to.be.visible; - fireEvent.click(button); + userEvent.click(button); expect(screen.queryByText('Hello World')).to.not.exist; }); diff --git a/packages/compass-components/src/components/accordion.tsx b/packages/compass-components/src/components/accordion.tsx index eb8f894e5c2..9b8f2a247b8 100644 --- a/packages/compass-components/src/components/accordion.tsx +++ b/packages/compass-components/src/components/accordion.tsx @@ -9,9 +9,8 @@ import { Description, Icon } from './leafygreen'; const buttonStyles = css({ fontWeight: 'bold', - fontSize: '14px', display: 'flex', - alignItems: 'flex-start', + alignItems: 'center', paddingLeft: 0, paddingRight: 0, border: 'none', @@ -28,40 +27,73 @@ const buttonStyles = css({ }, }); +const buttonVariantStyles = { + default: css({ + fontSize: 14, + lineHeight: `${spacing[500]}px`, + }), + small: css({ + fontSize: spacing[300], + lineHeight: `${spacing[500]}px`, + }), +}; + +const iconVariantSizes = { + default: spacing[400], + small: 14, +}; + const buttonLightThemeStyles = css({ color: palette.gray.dark2, }); + const buttonDarkThemeStyles = css({ color: palette.white, }); + const buttonIconContainerStyles = css({ - padding: spacing[100] / 2, // matches the line-height (16 + 4) - paddingLeft: 0, + fontSize: 0, + lineHeight: 0, + padding: 0, + paddingRight: spacing[150], }); + const buttonTextStyles = css({ textAlign: 'left', }); + const buttonHintStyles = css({ margin: 0, marginLeft: spacing[100], padding: 0, display: 'inline', }); -interface AccordionProps extends React.HTMLProps { + +interface AccordionProps + extends Omit, 'size'> { text: string | React.ReactNode; hintText?: string; + textClassName?: string; + buttonTextClassName?: string; open?: boolean; + defaultOpen?: boolean; setOpen?: (newValue: boolean) => void; + size?: 'default' | 'small'; } + function Accordion({ text, hintText, + textClassName, + buttonTextClassName, open: _open, setOpen: _setOpen, + defaultOpen = false, + size = 'default', ...props }: React.PropsWithChildren): React.ReactElement { const darkMode = useDarkMode(); - const [localOpen, setLocalOpen] = useState(_open ?? false); + const [localOpen, setLocalOpen] = useState(_open ?? defaultOpen); const setOpenRef = useRef(_setOpen); setOpenRef.current = _setOpen; const onOpenChange = useCallback(() => { @@ -80,7 +112,9 @@ function Accordion({ {...props} className={cx( darkMode ? buttonDarkThemeStyles : buttonLightThemeStyles, - buttonStyles + buttonStyles, + buttonVariantStyles[size], + textClassName )} id={labelId} type="button" @@ -89,10 +123,13 @@ function Accordion({ onClick={onOpenChange} > - + -
+
{text} {hintText && ( {hintText} diff --git a/packages/compass-components/src/components/compass-components-provider.tsx b/packages/compass-components/src/components/compass-components-provider.tsx index 88912779b56..ad648ea378c 100644 --- a/packages/compass-components/src/components/compass-components-provider.tsx +++ b/packages/compass-components/src/components/compass-components-provider.tsx @@ -7,6 +7,7 @@ import { SignalHooksProvider } from './signal-popover'; import { RequiredURLSearchParamsProvider } from './links/link'; import { StackedComponentProvider } from '../hooks/use-stacked-component'; import { ContextMenuProvider } from './context-menu'; +import { DrawerContentProvider } from './drawer-portal'; type GuideCueProviderProps = React.ComponentProps; @@ -131,33 +132,35 @@ export const CompassComponentsProvider = ({ darkMode={darkMode} popoverPortalContainer={popoverPortalContainer} > - - - + + - - - - - {typeof children === 'function' - ? children({ - darkMode, - portalContainerRef: setPortalContainer, - scrollContainerRef: setScrollContainer, - }) - : children} - - - - - - - + + + + + + {typeof children === 'function' + ? children({ + darkMode, + portalContainerRef: setPortalContainer, + scrollContainerRef: setScrollContainer, + }) + : children} + + + + + + + + ); }; diff --git a/packages/compass-components/src/components/context-menu.spec.tsx b/packages/compass-components/src/components/context-menu.spec.tsx index 6319d9c07cc..ac6a2b23882 100644 --- a/packages/compass-components/src/components/context-menu.spec.tsx +++ b/packages/compass-components/src/components/context-menu.spec.tsx @@ -3,8 +3,11 @@ import { render, screen, userEvent } from '@mongodb-js/testing-library-compass'; import { expect } from 'chai'; import sinon from 'sinon'; import { ContextMenuProvider } from '@mongodb-js/compass-context-menu'; -import { useContextMenuItems, ContextMenu } from './context-menu'; -import type { ContextMenuItem } from '@mongodb-js/compass-context-menu'; +import { + useContextMenuItems, + ContextMenu, + type ContextMenuItem, +} from './context-menu'; describe('useContextMenuItems', function () { const menuTestTriggerId = 'test-trigger'; diff --git a/packages/compass-components/src/components/context-menu.tsx b/packages/compass-components/src/components/context-menu.tsx index e1931bdab1c..65f67a64f5b 100644 --- a/packages/compass-components/src/components/context-menu.tsx +++ b/packages/compass-components/src/components/context-menu.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useRef } from 'react'; import { Menu, MenuItem, MenuSeparator } from './leafygreen'; -import { css } from '@leafygreen-ui/emotion'; +import { css, cx } from '@leafygreen-ui/emotion'; import { spacing } from '@leafygreen-ui/tokens'; import { @@ -9,6 +9,7 @@ import { type ContextMenuItem, type ContextMenuItemGroup, type ContextMenuWrapperProps, + contextMenuClassName, } from '@mongodb-js/compass-context-menu'; export type { @@ -76,7 +77,7 @@ export function ContextMenu({ menu }: ContextMenuWrapperProps) { open={menu.isOpen} setOpen={menu.close} justify="start" - className={menuStyles} + className={cx(menuStyles, contextMenuClassName)} maxHeight={Number.MAX_SAFE_INTEGER} > {itemGroups.map((items: ContextMenuItemGroup, groupIndex: number) => { @@ -117,22 +118,41 @@ export function ContextMenu({ menu }: ContextMenuWrapperProps) { ); } +/** Registers context menu items - items that are `undefined` will get filtered. */ export function useContextMenuItems( - getItems: () => ContextMenuItem[], + getItems: () => (ContextMenuItem | undefined)[], dependencies: React.DependencyList | undefined ): React.RefCallback { - // eslint-disable-next-line react-hooks/exhaustive-deps - const memoizedItems = useMemo(getItems, dependencies); + const memoizedItems = useMemo( + () => + getItems().filter((item): item is ContextMenuItem => item !== undefined), + // eslint-disable-next-line react-hooks/exhaustive-deps + dependencies + ); const contextMenu = useContextMenu(); return contextMenu.registerItems(memoizedItems); } +/** Registers context menu groups - groups and items that are `undefined` will get filtered. */ export function useContextMenuGroups( - getGroups: () => ContextMenuItemGroup[], + getGroups: () => ((ContextMenuItem | undefined)[] | undefined)[], dependencies: React.DependencyList | undefined ): React.RefCallback { - // eslint-disable-next-line react-hooks/exhaustive-deps - const memoizedGroups = useMemo(getGroups, dependencies); + const memoizedGroups: ContextMenuItem[][] = useMemo( + () => { + const groups = getGroups(); + // Cleanup all undefined fields across items and groups which is used + // for conditional displaying of groups and items. + return groups + .filter( + (groupItems): groupItems is ContextMenuItem[] => + groupItems !== undefined && groupItems.length > 0 + ) + .map((groupItems) => groupItems.filter((item) => item !== undefined)); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + dependencies + ); const contextMenu = useContextMenu(); return contextMenu.registerItems(...memoizedGroups); } diff --git a/packages/compass-components/src/components/document-list/element.tsx b/packages/compass-components/src/components/document-list/element.tsx index d3f07e63cee..83973ce71d5 100644 --- a/packages/compass-components/src/components/document-list/element.tsx +++ b/packages/compass-components/src/components/document-list/element.tsx @@ -501,24 +501,22 @@ export const HadronElement: React.FunctionComponent<{ // Add context menu hook for the field const fieldContextMenuRef = useContextMenuItems( () => [ - ...(onUpdateQuery - ? [ - { - label: isFieldInQuery( + onUpdateQuery + ? { + label: isFieldInQuery( + getNestedKeyPathForElement(element), + element.generateObject() + ) + ? 'Remove from query' + : 'Add to query', + onAction: () => { + onUpdateQuery( getNestedKeyPathForElement(element), element.generateObject() - ) - ? 'Remove from query' - : 'Add to query', - onAction: () => { - onUpdateQuery( - getNestedKeyPathForElement(element), - element.generateObject() - ); - }, + ); }, - ] - : []), + } + : undefined, { label: 'Copy field & value', onAction: () => { @@ -527,16 +525,14 @@ export const HadronElement: React.FunctionComponent<{ ); }, }, - ...(type.value === 'String' && isValidUrl(value.value) - ? [ - { - label: 'Open URL in browser', - onAction: () => { - window.open(value.value, '_blank', 'noopener'); - }, + type.value === 'String' && isValidUrl(value.value) + ? { + label: 'Open URL in browser', + onAction: () => { + window.open(value.value, '_blank', 'noopener'); }, - ] - : []), + } + : undefined, ], [element, key.value, value.value, type.value, onUpdateQuery, isFieldInQuery] ); diff --git a/packages/compass-components/src/components/drawer-portal.tsx b/packages/compass-components/src/components/drawer-portal.tsx new file mode 100644 index 00000000000..71ae368d1ed --- /dev/null +++ b/packages/compass-components/src/components/drawer-portal.tsx @@ -0,0 +1,307 @@ +import ReactDOM from 'react-dom'; +import React, { + useContext, + useEffect, + useLayoutEffect, + useMemo, + useRef, + useState, +} from 'react'; + +import { + DrawerLayout, + DisplayMode as DrawerDisplayMode, + useDrawerToolbarContext, + type DrawerLayoutProps, +} from './drawer'; +import { css, cx } from '@leafygreen-ui/emotion'; +import { isEqual } from 'lodash'; +import { rafraf } from '../utils/rafraf'; + +type SectionData = Required['toolbarData'][number]; + +type DrawerSectionProps = Omit & { + /** + * If `true` will automatically open the section when first mounted. Default: `false` + */ + autoOpen?: boolean; + /** + * Allows to control item oder in the drawer toolbar, items without the order + * provided will stay unordered at the bottom of the list + */ + order?: number; +}; + +type DrawerActionsContextValue = { + current: { + openDrawer: (id: string) => void; + closeDrawer: () => void; + updateToolbarData: (data: DrawerSectionProps) => void; + removeToolbarData: (id: string) => void; + }; +}; + +const DrawerStateContext = React.createContext([]); + +const DrawerActionsContext = React.createContext({ + current: { + openDrawer: () => undefined, + closeDrawer: () => undefined, + updateToolbarData: () => undefined, + removeToolbarData: () => undefined, + }, +}); + +/** + * Drawer component that keeps track of drawer rendering state and provides + * context to all places that require it. Separating it from DrawerAnchor and + * DrawerSection allows to freely move the actual drawer around while allowing + * the whole application access to the Drawer state, not only parts of it + * wrapped in the Drawer + * + * @example + * + * function App() { + * return ( + * + * + * + * + * + * ) + * } + * + * function Content() { + * const [showDrawerSection, setShowDrawerSection] = useState(false); + * return ( + * <> + * + * {showDrawerSection && + * + * This will be rendered inside the drawer + * + * )} + * + * ) + * } + */ +export const DrawerContentProvider: React.FunctionComponent = ({ + children, +}) => { + const [drawerState, setDrawerState] = useState([]); + const drawerActions = useRef({ + openDrawer: () => undefined, + closeDrawer: () => undefined, + updateToolbarData: (data: DrawerSectionProps) => { + setDrawerState((prevState) => { + const itemIndex = prevState.findIndex((item) => { + return item.id === data.id; + }); + if (itemIndex === -1) { + return [...prevState, data]; + } + const newState = [...prevState]; + newState[itemIndex] = data; + return newState; + }); + }, + removeToolbarData: (id: string) => { + setDrawerState((prevState) => { + return prevState.filter((data) => { + return data.id !== id; + }); + }); + }, + }); + + return ( + + + {children} + + + ); +}; + +const DrawerContextGrabber: React.FunctionComponent = ({ children }) => { + const drawerToolbarContext = useDrawerToolbarContext(); + const actions = useContext(DrawerActionsContext); + actions.current.openDrawer = drawerToolbarContext.openDrawer; + actions.current.closeDrawer = drawerToolbarContext.closeDrawer; + return <>{children}; +}; + +// Leafygreen Drawer gets right in the middle of our layout messing up most of +// the expectations for the workspace layouting. We override those to make them +// more flexible +const drawerLayoutFixesStyles = css({ + // content section + '& > div:nth-child(1)': { + display: 'flex', + alignItems: 'stretch', + overflow: 'auto', + }, + + // drawer section + '& > div:nth-child(2)': { + marginTop: -1, // hiding the top border as we already have one in the place where the Anchor is currently rendered + }, +}); + +const emptyDrawerLayoutFixesStyles = css({ + // Otherwise causes a weird content animation when the drawer becomes empty, + // the only way not to have this oterwise is to always keep the drawer toolbar + // on the screen and this eats up precious screen space + transition: 'none', + // Leafygreen removes areas when there are no drawer sections and this just + // completely breaks the grid and messes up the layout + gridTemplateAreas: '"content drawer"', + // Bug in leafygreen where if `toolbarData` becomes empty while the drawer is + // open, it never resets this value to the one that would allow drawer section + // to collapse + gridTemplateColumns: 'auto 0 !important', + + // template-columns 0 doesn't do anything if the content actually takes space, + // so we override the values to hide the drawer toolbar when there's nothing + // to show + '& > div:nth-child(2)': { + width: '0 !important', + overflow: 'hidden', + }, +}); + +const drawerSectionPortalStyles = css({ + minWidth: '100%', + minHeight: '100%', +}); + +/** + * DrawerAnchor component will render the drawer in any place it is rendered. + * This component has to wrap any content that Drawer will be shown near + */ +export const DrawerAnchor: React.FunctionComponent<{ + displayMode?: DrawerDisplayMode; +}> = ({ displayMode, children }) => { + const actions = useContext(DrawerActionsContext); + const drawerSectionItems = useContext(DrawerStateContext); + const prevDrawerSectionItems = useRef([]); + useEffect(() => { + const prevIds = new Set( + prevDrawerSectionItems.current.map((data) => { + return data.id; + }) + ); + for (const item of drawerSectionItems) { + if (!prevIds.has(item.id) && item.autoOpen) { + rafraf(() => { + actions.current.openDrawer(item.id); + }); + } + } + prevDrawerSectionItems.current = drawerSectionItems; + }, [actions, drawerSectionItems]); + const toolbarData = useMemo(() => { + return drawerSectionItems + .map((data) => { + return { + ...data, + content: ( +
+ ), + }; + }) + .sort(({ order: orderA = Infinity }, { order: orderB = Infinity }) => { + return orderB < orderA ? 1 : orderB > orderA ? -1 : 0; + }); + }, [drawerSectionItems]); + return ( + + {children} + + ); +}; + +/** + * DrawerSection allows to declaratively render sections inside the drawer + * independantly from the Drawer itself + */ +export const DrawerSection: React.FunctionComponent = ({ + children, + ...props +}) => { + const [portalNode, setPortalNode] = useState(null); + const actions = useContext(DrawerActionsContext); + const prevProps = useRef(); + useEffect(() => { + if (!isEqual(prevProps.current, props)) { + actions.current.updateToolbarData({ autoOpen: false, ...props }); + prevProps.current = props; + } + }); + useLayoutEffect(() => { + const drawerEl = document.querySelector( + '.compass-drawer-anchor > div:nth-child(2)' + ); + if (!drawerEl) { + throw new Error( + 'Can not use DrawerSection without DrawerAnchor being mounted on the page' + ); + } + setPortalNode( + document.querySelector(`[data-drawer-section="${props.id}"]`) + ); + const mutationObserver = new MutationObserver((mutations) => { + for (const mutation of mutations) { + for (const node of Array.from(mutation.addedNodes) as HTMLElement[]) { + if (node.dataset && node.dataset.drawerSection === props.id) { + setPortalNode(node); + } + } + } + }); + mutationObserver.observe(drawerEl, { + subtree: true, + childList: true, + }); + return () => { + mutationObserver.disconnect(); + }; + }, [actions, props.id]); + useEffect(() => { + return () => { + actions.current.removeToolbarData(props.id); + }; + }, [actions, props.id]); + if (portalNode) { + return ReactDOM.createPortal(children, portalNode); + } + return null; +}; + +export { DrawerDisplayMode }; + +export function useDrawerActions() { + const actions = useContext(DrawerActionsContext); + const stableActions = useRef({ + openDrawer: (id: string) => { + actions.current.openDrawer(id); + }, + closeDrawer: () => { + actions.current.closeDrawer(); + }, + }); + return stableActions.current; +} diff --git a/packages/compass-components/src/components/icons/png-icon.tsx b/packages/compass-components/src/components/icons/png-icon.tsx new file mode 100644 index 00000000000..e2b58d9f53d --- /dev/null +++ b/packages/compass-components/src/components/icons/png-icon.tsx @@ -0,0 +1,27 @@ +import React, { useMemo } from 'react'; +import { useDarkMode } from '../../hooks/use-theme'; +import { palette } from '@leafygreen-ui/palette'; + +export function PngIcon() { + const darkMode = useDarkMode(); + + const fillColor = useMemo( + () => (darkMode ? palette.white : palette.black), + [darkMode] + ); + + return ( + + + + ); +} diff --git a/packages/compass-components/src/components/leafygreen.tsx b/packages/compass-components/src/components/leafygreen.tsx index 01fb30c4892..e9474dc726a 100644 --- a/packages/compass-components/src/components/leafygreen.tsx +++ b/packages/compass-components/src/components/leafygreen.tsx @@ -92,6 +92,8 @@ import { ComboboxGroup, } from '@leafygreen-ui/combobox'; +export { getLgIds as getDrawerIds } from './drawer'; + // 2. Wrap and make any changes/workaround to leafygreen components. const Icon = ({ size, @@ -134,16 +136,6 @@ const TextInput: typeof LeafyGreenTextInput = React.forwardRef( TextInput.displayName = 'TextInput'; -export { - Drawer, - DrawerLayout, - DisplayMode as DrawerDisplayMode, - DrawerStackProvider, - useDrawerStackContext, - useDrawerToolbarContext, - type DrawerLayoutProps, -} from './drawer'; - // 3. Export the leafygreen components. export { AtlasNavGraphic, diff --git a/packages/compass-components/src/components/workspace-tabs/tab.tsx b/packages/compass-components/src/components/workspace-tabs/tab.tsx index 29519be412b..a24ed4c6f7b 100644 --- a/packages/compass-components/src/components/workspace-tabs/tab.tsx +++ b/packages/compass-components/src/components/workspace-tabs/tab.tsx @@ -138,7 +138,7 @@ const draggingTabStyles = css({ cursor: 'grabbing !important', }); -const nonExistentStyles = css({ +const inferredFromPrivilegesStyles = css({ color: palette.gray.base, }); @@ -184,7 +184,7 @@ export type WorkspaceTabPluginProps = { connectionName?: string; type: string; title: React.ReactNode; - isNonExistent?: boolean; + inferredFromPrivileges?: boolean; iconGlyph: GlyphName | 'Logo' | 'Server'; tooltip?: [string, string][]; }; @@ -206,7 +206,7 @@ function Tab({ type, title, tooltip, - isNonExistent, + inferredFromPrivileges, isSelected, isDragging, onSelect, @@ -271,7 +271,7 @@ function Tab({ className={cx( tabStyles, themeClass, - isNonExistent && nonExistentStyles, + inferredFromPrivileges && inferredFromPrivilegesStyles, isSelected && selectedTabStyles, isSelected && tabTheme && selectedThemedTabStyles, isDragging && draggingTabStyles, diff --git a/packages/compass-components/src/index.ts b/packages/compass-components/src/index.ts index 8981d156a29..da7dce70fb2 100644 --- a/packages/compass-components/src/index.ts +++ b/packages/compass-components/src/index.ts @@ -69,6 +69,7 @@ export { DocumentIcon } from './components/icons/document-icon'; export { FavoriteIcon } from './components/icons/favorite-icon'; export { ServerIcon } from './components/icons/server-icon'; export { NoSavedItemsIcon } from './components/icons/no-saved-items-icon'; +export { PngIcon } from './components/icons/png-icon'; export { GuideCue as LGGuideCue } from '@leafygreen-ui/guide-cue'; export { Variant as BadgeVariant } from '@leafygreen-ui/badge'; export { Variant as BannerVariant } from '@leafygreen-ui/banner'; @@ -81,7 +82,7 @@ export { SplitButton } from '@leafygreen-ui/split-button'; export { default as LeafyGreenProvider } from '@leafygreen-ui/leafygreen-provider'; export { palette } from '@leafygreen-ui/palette'; -export { rgba, lighten } from 'polished'; +export { rgba, lighten, transparentize } from 'polished'; export { default as Portal } from '@leafygreen-ui/portal'; export { Size as RadioBoxSize } from '@leafygreen-ui/radio-box-group'; export { Size as SelectSize } from '@leafygreen-ui/select'; @@ -219,4 +220,5 @@ export { export { SelectList } from './components/select-list'; export { ParagraphSkeleton } from '@leafygreen-ui/skeleton-loader'; export { InsightsChip } from './components/insights-chip'; +export * from './components/drawer-portal'; export { FileSelector } from './components/file-selector'; diff --git a/packages/compass-connection-import-export/package.json b/packages/compass-connection-import-export/package.json index de13e1421ca..a601be1a7b4 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.63.0", + "version": "0.65.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -51,18 +51,18 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/connection-storage": "^0.42.0", - "compass-preferences-model": "^2.47.0", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/connection-storage": "^0.44.0", + "compass-preferences-model": "^2.49.0", + "hadron-ipc": "^3.5.9", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-connections-navigation/package.json b/packages/compass-connections-navigation/package.json index f79d917b491..5bb7c1e5a2c 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.66.0", + "version": "1.68.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,23 +49,23 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-context-menu": "^0.2.3", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-context-menu": "^0.2.4", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "compass-preferences-model": "^2.49.0", "mongodb-build-info": "^1.7.2", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", "react-window": "^1.8.6" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-connections-navigation/src/connections-navigation-tree.spec.tsx b/packages/compass-connections-navigation/src/connections-navigation-tree.spec.tsx index 7cb214b3d7a..4a53f839043 100644 --- a/packages/compass-connections-navigation/src/connections-navigation-tree.spec.tsx +++ b/packages/compass-connections-navigation/src/connections-navigation-tree.spec.tsx @@ -43,7 +43,7 @@ const connections: Connection[] = [ collectionsStatus: 'initial', collectionsLength: 5, collections: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'db_ready', @@ -57,7 +57,7 @@ const connections: Connection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'db_ready.woof', @@ -65,7 +65,7 @@ const connections: Connection[] = [ type: 'timeseries', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'db_ready.bwok', @@ -73,10 +73,10 @@ const connections: Connection[] = [ type: 'view', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, ], - isNonExistent: false, + inferredFromPrivileges: false, }, ], isReady: true, diff --git a/packages/compass-connections-navigation/src/navigation-item-icon.tsx b/packages/compass-connections-navigation/src/navigation-item-icon.tsx index 1dd55b8b34b..4080b3ecc92 100644 --- a/packages/compass-connections-navigation/src/navigation-item-icon.tsx +++ b/packages/compass-connections-navigation/src/navigation-item-icon.tsx @@ -5,8 +5,8 @@ import type { GlyphName } from '@mongodb-js/compass-components'; import { WithStatusMarker } from './with-status-marker'; import { isLocalhost } from 'mongodb-build-info'; -const NON_EXISTANT_NAMESPACE_TEXT = - 'Your privileges grant you access to this namespace, but it does not currently exist'; +const INFERRED_FROM_PRIVILEGES_TEXT = + 'Your privileges grant you access to this namespace, but it might not currently exist'; const tooltipTriggerStyles = css({ display: 'flex', @@ -35,10 +35,10 @@ const IconWithTooltip = ({ export const NavigationItemIcon = ({ item }: { item: SidebarTreeItem }) => { if (item.type === 'database') { - if (item.isNonExistent) { + if (item.inferredFromPrivileges) { return ( ); @@ -46,10 +46,10 @@ export const NavigationItemIcon = ({ item }: { item: SidebarTreeItem }) => { return ; } if (item.type === 'collection') { - if (item.isNonExistent) { + if (item.inferredFromPrivileges) { return ( ); diff --git a/packages/compass-connections-navigation/src/styled-navigation-item.tsx b/packages/compass-connections-navigation/src/styled-navigation-item.tsx index 0fdc7912110..8c9043c50e0 100644 --- a/packages/compass-connections-navigation/src/styled-navigation-item.tsx +++ b/packages/compass-connections-navigation/src/styled-navigation-item.tsx @@ -41,9 +41,9 @@ export default function StyledNavigationItem({ !showDisabledConnections || getConnectable(connectionId); const isDisconnectedConnection = item.type === 'connection' && item.connectionStatus !== 'connected'; - const isNonExistentNamespace = + const inferredFromPrivilegesNamespace = (item.type === 'database' || item.type === 'collection') && - item.isNonExistent; + item.inferredFromPrivileges; if (colorCode && colorCode !== DefaultColorCode) { style['--item-bg-color'] = connectionColorToHex(colorCode); @@ -51,12 +51,16 @@ export default function StyledNavigationItem({ style['--item-bg-color-active'] = connectionColorToHexActive(colorCode); } - if (isDisconnectedConnection || isNonExistentNamespace || !isConnectable) { + if ( + isDisconnectedConnection || + inferredFromPrivilegesNamespace || + !isConnectable + ) { style['--item-color'] = inactiveColor; } // We always show these as inactive - if (isNonExistentNamespace || !isConnectable) { + if (inferredFromPrivilegesNamespace || !isConnectable) { style['--item-color-active'] = inactiveColor; } return style; diff --git a/packages/compass-connections-navigation/src/tree-data.ts b/packages/compass-connections-navigation/src/tree-data.ts index 21575a219db..f8a2a65cc5a 100644 --- a/packages/compass-connections-navigation/src/tree-data.ts +++ b/packages/compass-connections-navigation/src/tree-data.ts @@ -54,7 +54,7 @@ export type Database = { collectionsStatus: DatabaseOrCollectionStatus; collectionsLength: number; collections: Collection[]; - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; type PlaceholderTreeItem = VirtualPlaceholderItem & { @@ -68,7 +68,7 @@ export type Collection = { type: 'view' | 'collection' | 'timeseries'; sourceName: string | null; pipeline: unknown[]; - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; export type NotConnectedConnectionTreeItem = VirtualTreeItem & { @@ -103,7 +103,7 @@ export type DatabaseTreeItem = VirtualTreeItem & { connectionItem: ConnectedConnectionTreeItem; dbName: string; hasWriteActionsDisabled: boolean; - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; export type CollectionTreeItem = VirtualTreeItem & { @@ -115,7 +115,7 @@ export type CollectionTreeItem = VirtualTreeItem & { databaseItem: DatabaseTreeItem; namespace: string; hasWriteActionsDisabled: boolean; - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; export type SidebarActionableItem = @@ -262,7 +262,7 @@ const databaseToItems = ({ collections, collectionsLength, collectionsStatus, - isNonExistent, + inferredFromPrivileges, }, connectionId, connectionItem, @@ -298,7 +298,7 @@ const databaseToItems = ({ dbName: id, isExpandable: true, hasWriteActionsDisabled, - isNonExistent, + inferredFromPrivileges, }; const sidebarData: SidebarTreeItem[] = [databaseTI]; @@ -327,7 +327,7 @@ const databaseToItems = ({ return sidebarData.concat( collections.map( - ({ _id: id, name, type, isNonExistent }, collectionIndex) => ({ + ({ _id: id, name, type, inferredFromPrivileges }, collectionIndex) => ({ id: `${connectionId}.${id}`, // id is the namespace of the collection, so includes db as well level: level + 1, name, @@ -340,7 +340,7 @@ const databaseToItems = ({ namespace: id, hasWriteActionsDisabled, isExpandable: false, - isNonExistent, + inferredFromPrivileges, }) ) ); diff --git a/packages/compass-connections/package.json b/packages/compass-connections/package.json index 72db308c181..b9a5466035a 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.67.0", + "version": "1.69.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-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", @@ -73,10 +73,10 @@ "semver": "^7.6.3" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-connections/src/stores/connections-store-redux.ts b/packages/compass-connections/src/stores/connections-store-redux.ts index 700cdf17e32..eeb259f906f 100644 --- a/packages/compass-connections/src/stores/connections-store-redux.ts +++ b/packages/compass-connections/src/stores/connections-store-redux.ts @@ -40,6 +40,7 @@ import { isEndOfLifeVersion, } from '../utils/end-of-life-server'; import type { ImportConnectionOptions } from '@mongodb-js/connection-storage/provider'; +import { getErrorCodeCauseChain } from '../utils/telemetry'; export type ConnectionsEventMap = { connected: ( @@ -1278,6 +1279,7 @@ const connectionAttemptError = ( async () => { const trackParams = { error_code: err.code, + error_code_cause_chain: getErrorCodeCauseChain(err), error_name: err.codeName ?? err.name, }; if (connectionInfo) { diff --git a/packages/compass-connections/src/utils/telemetry.spec.tsx b/packages/compass-connections/src/utils/telemetry.spec.tsx index 87b010e9f4e..a06cd0ac565 100644 --- a/packages/compass-connections/src/utils/telemetry.spec.tsx +++ b/packages/compass-connections/src/utils/telemetry.spec.tsx @@ -3,6 +3,7 @@ import { trackConnectionDisconnectedEvent, trackConnectionCreatedEvent, trackConnectionRemovedEvent, + getErrorCodeCauseChain, } from './telemetry'; import { expect } from 'chai'; import type { ConnectionInfo } from '@mongodb-js/connection-storage/renderer'; @@ -64,4 +65,47 @@ describe('Connections telemetry', function () { expect(event).to.equal('Connection Removed'); expect(properties).to.deep.equal(expected); }); + + describe('#getErrorCodeCauseChain', function () { + it('should return undefined when no error', function () { + const result = getErrorCodeCauseChain(undefined); + expect(result).to.be.undefined; + }); + + it('should return undefined when there are no error codes', function () { + const result = getErrorCodeCauseChain({}); + expect(result).to.be.undefined; + }); + + it('should return an array with the error code', function () { + const error: any = new Error('Test error'); + error.code = 123; + + const result = getErrorCodeCauseChain(error); + expect(result).to.deep.equal([123]); + }); + + it('should return an array of error codes from the cause chain', function () { + const error: Error & { code?: number } = new Error('Test error'); + error.code = 123; + + // No code / codeName on error two. + const errorTwo = new Error('Test error two'); + + const errorThree: Error & { codeName?: string } = new Error( + 'Test error three' + ); + errorThree.codeName = 'PINEAPPLE'; + + const errorFour: Error & { code?: number } = new Error('Test error four'); + errorFour.code = 1111; + + error.cause = errorTwo; + errorTwo.cause = errorThree; + errorThree.cause = errorFour; + + const result = getErrorCodeCauseChain(error); + expect(result).to.deep.equal([123, 'PINEAPPLE', 1111]); + }); + }); }); diff --git a/packages/compass-connections/src/utils/telemetry.tsx b/packages/compass-connections/src/utils/telemetry.tsx index 8c2b632f8af..8bfebf519d0 100644 --- a/packages/compass-connections/src/utils/telemetry.tsx +++ b/packages/compass-connections/src/utils/telemetry.tsx @@ -27,3 +27,25 @@ export function trackConnectionRemovedEvent( ): void { track('Connection Removed', {}, connectionInfo); } + +export function getErrorCodeCauseChain( + err: unknown +): (string | number)[] | undefined { + const errorCodesInCauseChain: (string | number)[] = []; + let current = err; + + while (current && typeof current === 'object') { + if ('code' in current && current.code) { + errorCodesInCauseChain.push(current.code as string | number); + } else if ('codeName' in current && current.codeName) { + errorCodesInCauseChain.push(current.codeName as string | number); + } + current = (current as { cause?: unknown }).cause; + } + + if (errorCodesInCauseChain.length === 0) { + return undefined; + } + + return errorCodesInCauseChain; +} diff --git a/packages/compass-context-menu/package.json b/packages/compass-context-menu/package.json index 24fae24ab6a..ec5ee0629af 100644 --- a/packages/compass-context-menu/package.json +++ b/packages/compass-context-menu/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.2.3", + "version": "0.2.4", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -53,10 +53,10 @@ "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", diff --git a/packages/compass-context-menu/src/consts.ts b/packages/compass-context-menu/src/consts.ts new file mode 100644 index 00000000000..a3b0d4a5ec5 --- /dev/null +++ b/packages/compass-context-menu/src/consts.ts @@ -0,0 +1 @@ +export const contextMenuClassName = 'compass-context-menu'; diff --git a/packages/compass-context-menu/src/context-menu-provider.tsx b/packages/compass-context-menu/src/context-menu-provider.tsx index c2217bd9cfd..b0c82d8ba2f 100644 --- a/packages/compass-context-menu/src/context-menu-provider.tsx +++ b/packages/compass-context-menu/src/context-menu-provider.tsx @@ -12,6 +12,7 @@ import { getContextMenuContent, type EnhancedMouseEvent, } from './context-menu-content'; +import { contextMenuClassName } from './consts'; export const ContextMenuContext = createContext( null @@ -76,7 +77,16 @@ export function ContextMenuProvider({ document.addEventListener('contextmenu', handleContextMenu); window.addEventListener('resize', handleClosingEvent); - window.addEventListener('scroll', handleClosingEvent, { capture: true }); + window.addEventListener( + 'scroll', + (e) => { + const isCompassContextMenu = + e.target instanceof HTMLElement && + e.target.classList.contains(contextMenuClassName); + if (!isCompassContextMenu) handleClosingEvent(e); + }, + { capture: true } + ); return () => { document.removeEventListener('contextmenu', handleContextMenu); diff --git a/packages/compass-context-menu/src/index.ts b/packages/compass-context-menu/src/index.ts index 75d933ef767..dbb51599e3f 100644 --- a/packages/compass-context-menu/src/index.ts +++ b/packages/compass-context-menu/src/index.ts @@ -5,3 +5,4 @@ export type { ContextMenuItemGroup, ContextMenuWrapperProps, } from './types'; +export { contextMenuClassName } from './consts'; diff --git a/packages/compass-crud/package.json b/packages/compass-crud/package.json index fff0a43afef..b8f3bb137b8 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.67.0", + "version": "13.69.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,53 +48,53 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/enzyme": "^3.10.14", "@types/reflux": "^6.4.3", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "enzyme": "^3.11.0", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^17.0.1", "typescript": "^5.8.3" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/explain-plan-helper": "^1.4.15", - "@mongodb-js/my-queries-storage": "^0.34.0", - "@mongodb-js/reflux-state-mixin": "^1.2.15", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", + "@mongodb-js/my-queries-storage": "^0.36.0", + "@mongodb-js/reflux-state-mixin": "^1.2.16", "@mongodb-js/shell-bson-parser": "^1.2.0", "ag-grid-community": "^20.2.0", "ag-grid-react": "^20.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "hadron-document": "^8.9.3", - "hadron-type-checker": "^7.4.15", + "compass-preferences-model": "^2.49.0", + "hadron-document": "^8.9.4", + "hadron-type-checker": "^7.4.16", "jsondiffpatch": "^0.5.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "numeral": "^2.0.6", diff --git a/packages/compass-crud/src/components/crud-toolbar.tsx b/packages/compass-crud/src/components/crud-toolbar.tsx index 84ce2603d39..e1d56e389d8 100644 --- a/packages/compass-crud/src/components/crud-toolbar.tsx +++ b/packages/compass-crud/src/components/crud-toolbar.tsx @@ -217,26 +217,22 @@ const CrudToolbar: React.FunctionComponent = ({ onCollapseAllClicked(); }, }, - ...(isImportExportEnabled - ? [ - { - label: 'Import JSON or CSV file', - onAction: () => { - insertDataHandler('import-file'); - }, + isImportExportEnabled + ? { + label: 'Import JSON or CSV file', + onAction: () => { + insertDataHandler('import-file'); }, - ] - : []), - ...(!readonly - ? [ - { - label: 'Insert document...', - onAction: () => { - insertDataHandler('insert-document'); - }, + } + : undefined, + !readonly + ? { + label: 'Insert document...', + onAction: () => { + insertDataHandler('insert-document'); }, - ] - : []), + } + : undefined, ...(isImportExportEnabled ? [ { diff --git a/packages/compass-crud/src/components/insert-document-dialog.tsx b/packages/compass-crud/src/components/insert-document-dialog.tsx index c12deeb8f79..c7227ae9d8c 100644 --- a/packages/compass-crud/src/components/insert-document-dialog.tsx +++ b/packages/compass-crud/src/components/insert-document-dialog.tsx @@ -194,6 +194,8 @@ const InsertDocumentDialog: React.FC = ({ setInvalidElements((invalidElements) => without(invalidElements, el.uuid) ); + } else { + setInvalidElements([]); } }, [hasErrors, setInvalidElements] diff --git a/packages/compass-crud/src/components/use-document-item-context-menu.tsx b/packages/compass-crud/src/components/use-document-item-context-menu.tsx index 67d9689ee1c..db3c9c547d0 100644 --- a/packages/compass-crud/src/components/use-document-item-context-menu.tsx +++ b/packages/compass-crud/src/components/use-document-item-context-menu.tsx @@ -15,24 +15,23 @@ export function useDocumentItemContextMenu({ openInsertDocumentDialog, }: UseDocumentItemContextMenuProps) { const { expanded: isExpanded, editing: isEditing } = doc; + return useContextMenuGroups( () => [ - [ - ...(isEditable - ? [ - { - label: isEditing ? 'Cancel editing' : 'Edit document', - onAction: () => { - if (isEditing) { - doc.finishEditing(); - } else { - doc.startEditing(); - } - }, + isEditable + ? [ + { + label: isEditing ? 'Cancel editing' : 'Edit document', + onAction: () => { + if (isEditing) { + doc.finishEditing(); + } else { + doc.startEditing(); + } }, - ] - : []), - ], + }, + ] + : undefined, [ { label: isExpanded ? 'Collapse all fields' : 'Expand all fields', diff --git a/packages/compass-data-modeling/package.json b/packages/compass-data-modeling/package.json index 29e8fd817fb..2fefc7f9892 100644 --- a/packages/compass-data-modeling/package.json +++ b/packages/compass-data-modeling/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.18.0", + "version": "1.20.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -54,18 +54,18 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/diagramming": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "html-to-image": "1.11.11", "lodash": "^4.17.21", "mongodb": "^6.17.0", @@ -78,10 +78,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-data-modeling/src/components/collection-drawer-content.tsx b/packages/compass-data-modeling/src/components/collection-drawer-content.tsx deleted file mode 100644 index 60bc33e9875..00000000000 --- a/packages/compass-data-modeling/src/components/collection-drawer-content.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import type { Relationship } from '../services/data-model-storage'; -import { Button, H3 } from '@mongodb-js/compass-components'; -import { - createNewRelationship, - deleteRelationship, - getCurrentDiagramFromState, - selectCurrentModel, - selectRelationship, -} from '../store/diagram'; -import type { DataModelingState } from '../store/reducer'; - -type CollectionDrawerContentProps = { - namespace: string; - relationships: Relationship[]; - shouldShowRelationshipEditingForm?: boolean; - onCreateNewRelationshipClick: (namespace: string) => void; - onEditRelationshipClick: (rId: string) => void; - onDeleteRelationshipClick: (rId: string) => void; -}; - -const CollectionDrawerContent: React.FunctionComponent< - CollectionDrawerContentProps -> = ({ - namespace, - relationships, - onCreateNewRelationshipClick, - onEditRelationshipClick, - onDeleteRelationshipClick, -}) => { - return ( - <> -

{namespace}

-
    - {relationships.map((r) => { - return ( -
  • - {r.relationship[0].fields?.join('.')} ->  - {r.relationship[1].fields?.join('.')} - - -
  • - ); - })} -
- - - ); -}; - -export default connect( - (state: DataModelingState, ownProps: { namespace: string }) => { - return { - relationships: selectCurrentModel( - getCurrentDiagramFromState(state).edits - ).relationships.filter((r) => { - const [local, foreign] = r.relationship; - return ( - local.ns === ownProps.namespace || foreign.ns === ownProps.namespace - ); - }), - }; - }, - { - onCreateNewRelationshipClick: createNewRelationship, - onEditRelationshipClick: selectRelationship, - onDeleteRelationshipClick: deleteRelationship, - } -)(CollectionDrawerContent); diff --git a/packages/compass-data-modeling/src/components/data-modeling.tsx b/packages/compass-data-modeling/src/components/data-modeling.tsx index a6eac583895..6db1f08d592 100644 --- a/packages/compass-data-modeling/src/components/data-modeling.tsx +++ b/packages/compass-data-modeling/src/components/data-modeling.tsx @@ -5,7 +5,7 @@ import SavedDiagramsList from './saved-diagrams-list'; import NewDiagramFormModal from './new-diagram-form'; import type { DataModelingState } from '../store/reducer'; import { DiagramProvider } from '@mongodb-js/diagramming'; -import DiagramEditorSidePanel from './diagram-editor-side-panel'; +import DiagramEditorSidePanel from './drawer/diagram-editor-side-panel'; type DataModelingProps = { showList: boolean; diff --git a/packages/compass-data-modeling/src/components/diagram-editor-side-panel.spec.tsx b/packages/compass-data-modeling/src/components/diagram-editor-side-panel.spec.tsx deleted file mode 100644 index dcc8e8b32ad..00000000000 --- a/packages/compass-data-modeling/src/components/diagram-editor-side-panel.spec.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import React from 'react'; -import { expect } from 'chai'; -import { - createPluginTestHelpers, - screen, - waitFor, - userEvent, - within, -} from '@mongodb-js/testing-library-compass'; -import { DataModelingWorkspaceTab } from '../index'; -import DiagramEditorSidePanel from './diagram-editor-side-panel'; -import { - getCurrentDiagramFromState, - openDiagram, - selectCollection, - selectCurrentModel, - selectRelationship, -} from '../store/diagram'; -import dataModel from '../../test/fixtures/data-model-with-relationships.json'; -import type { MongoDBDataModelDescription } from '../services/data-model-storage'; - -async function comboboxSelectItem( - label: string, - value: string, - visibleLabel = value -) { - userEvent.click(screen.getByRole('textbox', { name: label })); - await waitFor(() => { - screen.getByRole('option', { name: visibleLabel }); - }); - userEvent.click(screen.getByRole('option', { name: visibleLabel })); - await waitFor(() => { - expect(screen.getByRole('textbox', { name: label })).to.have.attribute( - 'value', - value - ); - }); -} - -describe('DiagramEditorSidePanel', function () { - function renderDrawer() { - const { renderWithConnections } = createPluginTestHelpers( - DataModelingWorkspaceTab.provider.withMockServices({}) - ); - const result = renderWithConnections( - - ); - result.plugin.store.dispatch( - openDiagram(dataModel as MongoDBDataModelDescription) - ); - return result; - } - - it('should not render if no items are selected', function () { - renderDrawer(); - expect(screen.queryByTestId('data-modeling-drawer')).to.eq(null); - }); - - it('should render a collection context drawer when collection is clicked', function () { - const result = renderDrawer(); - result.plugin.store.dispatch(selectCollection('flights.airlines')); - expect(screen.getByText('flights.airlines')).to.be.visible; - }); - - it('should render a relationship context drawer when relations is clicked', function () { - const result = renderDrawer(); - result.plugin.store.dispatch( - selectRelationship('204b1fc0-601f-4d62-bba3-38fade71e049') - ); - expect(screen.getByText('Edit Relationship')).to.be.visible; - expect( - document.querySelector( - '[data-relationship-id="204b1fc0-601f-4d62-bba3-38fade71e049"]' - ) - ).to.be.visible; - }); - - it('should change the content of the drawer when selecting different items', function () { - const result = renderDrawer(); - - result.plugin.store.dispatch(selectCollection('flights.airlines')); - expect(screen.getByText('flights.airlines')).to.be.visible; - - result.plugin.store.dispatch( - selectCollection('flights.airports_coordinates_for_schema') - ); - expect(screen.getByText('flights.airports_coordinates_for_schema')).to.be - .visible; - - result.plugin.store.dispatch( - selectRelationship('204b1fc0-601f-4d62-bba3-38fade71e049') - ); - expect( - document.querySelector( - '[data-relationship-id="204b1fc0-601f-4d62-bba3-38fade71e049"]' - ) - ).to.be.visible; - - result.plugin.store.dispatch( - selectRelationship('6f776467-4c98-476b-9b71-1f8a724e6c2c') - ); - expect( - document.querySelector( - '[data-relationship-id="6f776467-4c98-476b-9b71-1f8a724e6c2c"]' - ) - ).to.be.visible; - - result.plugin.store.dispatch(selectCollection('flights.planes')); - expect(screen.getByText('flights.planes')).to.be.visible; - }); - - it('should open and edit relationship starting from collection', async function () { - const result = renderDrawer(); - result.plugin.store.dispatch(selectCollection('flights.countries')); - - // Open relationshipt editing form - const relationshipCard = document.querySelector( - '[data-relationship-id="204b1fc0-601f-4d62-bba3-38fade71e049"]' - ); - userEvent.click( - within(relationshipCard!).getByRole('button', { name: 'Edit' }) - ); - expect(screen.getByText('Edit Relationship')).to.be.visible; - - // Select new values - await comboboxSelectItem('Local collection', 'planes'); - await comboboxSelectItem('Local field', 'name'); - await comboboxSelectItem('Foreign collection', 'countries'); - await comboboxSelectItem('Foreign field', 'iso_code'); - - // We should be testing through rendered UI but as it's really hard to make - // diagram rendering in tests property, we are just validating the final - // model here - const modifiedRelationship = selectCurrentModel( - getCurrentDiagramFromState(result.plugin.store.getState()).edits - ).relationships.find((r) => { - return r.id === '204b1fc0-601f-4d62-bba3-38fade71e049'; - }); - - expect(modifiedRelationship) - .to.have.property('relationship') - .deep.eq([ - { - ns: 'flights.planes', - fields: ['name'], - cardinality: 1, - }, - { - ns: 'flights.countries', - fields: ['iso_code'], - cardinality: 1, - }, - ]); - }); -}); diff --git a/packages/compass-data-modeling/src/components/diagram-editor-side-panel.tsx b/packages/compass-data-modeling/src/components/diagram-editor-side-panel.tsx deleted file mode 100644 index 956d3f3e1a8..00000000000 --- a/packages/compass-data-modeling/src/components/diagram-editor-side-panel.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import type { DataModelingState } from '../store/reducer'; -import { - Button, - css, - cx, - palette, - useDarkMode, -} from '@mongodb-js/compass-components'; -import CollectionDrawerContent from './collection-drawer-content'; -import RelationshipDrawerContent from './relationship-drawer-content'; -import { closeDrawer } from '../store/diagram'; - -const containerStyles = css({ - width: '400px', - height: '100%', - borderLeft: `1px solid ${palette.gray.light2}`, -}); - -const darkModeContainerStyles = css({ - borderLeftColor: palette.gray.dark2, -}); - -type DiagramEditorSidePanelProps = { - selectedItems: { type: 'relationship' | 'collection'; id: string } | null; - onClose: () => void; -}; - -function DiagmramEditorSidePanel({ - selectedItems, - onClose, -}: DiagramEditorSidePanelProps) { - const isDarkMode = useDarkMode(); - - if (!selectedItems) { - return null; - } - - let content; - - if (selectedItems.type === 'collection') { - content = ( - - ); - } else if (selectedItems.type === 'relationship') { - content = ( - - ); - } - - return ( -
- {content} - -
- ); -} - -export default connect( - (state: DataModelingState) => { - return { - selectedItems: state.diagram?.selectedItems ?? null, - }; - }, - { - onClose: closeDrawer, - } -)(DiagmramEditorSidePanel); diff --git a/packages/compass-data-modeling/src/components/diagram-editor-toolbar.spec.tsx b/packages/compass-data-modeling/src/components/diagram-editor-toolbar.spec.tsx index 34f42cd79dc..36c9b2f4734 100644 --- a/packages/compass-data-modeling/src/components/diagram-editor-toolbar.spec.tsx +++ b/packages/compass-data-modeling/src/components/diagram-editor-toolbar.spec.tsx @@ -12,10 +12,11 @@ function renderDiagramEditorToolbar( step="EDITING" hasUndo={true} hasRedo={true} - onDownloadClick={() => {}} + isInRelationshipDrawingMode={false} onUndoClick={() => {}} onRedoClick={() => {}} onExportClick={() => {}} + onRelationshipDrawingToggle={() => {}} {...props} /> ); @@ -64,6 +65,36 @@ describe('DiagramEditorToolbar', function () { }); }); + context('add relationship button', function () { + it('renders it active if isInRelationshipDrawingMode is true', function () { + renderDiagramEditorToolbar({ isInRelationshipDrawingMode: true }); + const addButton = screen.getByRole('button', { + name: 'Exit Relationship Drawing Mode', + }); + expect(addButton).to.have.attribute('aria-pressed', 'true'); + }); + + it('does not render it active if isInRelationshipDrawingMode is false', function () { + renderDiagramEditorToolbar({ isInRelationshipDrawingMode: false }); + const addButton = screen.getByRole('button', { + name: 'Add Relationship', + }); + expect(addButton).to.have.attribute('aria-pressed', 'false'); + }); + + it('clicking on it calls onRelationshipDrawingToggle', function () { + const relationshipDrawingToggleSpy = sinon.spy(); + renderDiagramEditorToolbar({ + onRelationshipDrawingToggle: relationshipDrawingToggleSpy, + }); + const addRelationshipButton = screen.getByRole('button', { + name: 'Add Relationship', + }); + userEvent.click(addRelationshipButton); + expect(relationshipDrawingToggleSpy).to.have.been.calledOnce; + }); + }); + it('renders export button and calls onExportClick', function () { const exportSpy = sinon.spy(); renderDiagramEditorToolbar({ onExportClick: exportSpy }); @@ -72,13 +103,4 @@ describe('DiagramEditorToolbar', function () { userEvent.click(exportButton); expect(exportSpy).to.have.been.calledOnce; }); - - it('renders download button and calls onDownloadClick', function () { - const downloadSpy = sinon.spy(); - renderDiagramEditorToolbar({ onDownloadClick: downloadSpy }); - const downloadButton = screen.getByRole('button', { name: 'Download' }); - expect(downloadButton).to.exist; - userEvent.click(downloadButton); - expect(downloadSpy).to.have.been.calledOnce; - }); }); diff --git a/packages/compass-data-modeling/src/components/diagram-editor-toolbar.tsx b/packages/compass-data-modeling/src/components/diagram-editor-toolbar.tsx index 98fb73b068d..00ed0fcc1ba 100644 --- a/packages/compass-data-modeling/src/components/diagram-editor-toolbar.tsx +++ b/packages/compass-data-modeling/src/components/diagram-editor-toolbar.tsx @@ -1,18 +1,55 @@ import React from 'react'; import { connect } from 'react-redux'; import type { DataModelingState } from '../store/reducer'; -import { saveDiagram, redoEdit, undoEdit } from '../store/diagram'; +import { redoEdit, undoEdit } from '../store/diagram'; import { showExportModal } from '../store/export-diagram'; -import { Icon, IconButton } from '@mongodb-js/compass-components'; +import { + Button, + css, + cx, + Icon, + IconButton, + palette, + spacing, + useDarkMode, + transparentize, + Tooltip, +} from '@mongodb-js/compass-components'; + +const containerStyles = css({ + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + padding: `${spacing[150]}px ${spacing[200]}px`, + backgroundColor: palette.gray.light3, + borderBottom: `1px solid ${palette.gray.light2}`, + marginBottom: spacing[50], + boxShadow: `0px ${spacing[50]}px ${spacing[100]}px -${ + spacing[25] + }px ${transparentize(0.85, palette.black)}`, +}); + +const containerDarkStyles = css({ + backgroundColor: palette.gray.dark3, + borderBottom: `1px solid ${palette.gray.dark2}`, + boxShadow: `0px ${spacing[50]}px ${spacing[100]}px -${ + spacing[25] + }px ${transparentize(0.85, palette.white)}`, +}); + +const toolbarGroupStyles = css({ + display: 'flex', +}); export const DiagramEditorToolbar: React.FunctionComponent<{ step: DataModelingState['step']; hasUndo: boolean; hasRedo: boolean; - onDownloadClick: () => void; + isInRelationshipDrawingMode: boolean; onUndoClick: () => void; onRedoClick: () => void; onExportClick: () => void; + onRelationshipDrawingToggle: () => void; }> = ({ step, hasUndo, @@ -20,25 +57,49 @@ export const DiagramEditorToolbar: React.FunctionComponent<{ hasRedo, onRedoClick, onExportClick, - onDownloadClick, + onRelationshipDrawingToggle, + isInRelationshipDrawingMode, }) => { + const darkmode = useDarkMode(); if (step !== 'EDITING') { return null; } return ( -
- - - - - - - - - - - - +
+
+ + + + } + > + Drag from one collection to another to create a relationship. + + + + + + + +
+
+ +
); }; @@ -56,6 +117,5 @@ export default connect( onUndoClick: undoEdit, onRedoClick: redoEdit, onExportClick: showExportModal, - onDownloadClick: saveDiagram, } )(DiagramEditorToolbar); diff --git a/packages/compass-data-modeling/src/components/diagram-editor.spec.tsx b/packages/compass-data-modeling/src/components/diagram-editor.spec.tsx index 9e12dc73a37..b8699fffc51 100644 --- a/packages/compass-data-modeling/src/components/diagram-editor.spec.tsx +++ b/packages/compass-data-modeling/src/components/diagram-editor.spec.tsx @@ -4,10 +4,8 @@ import { createPluginTestHelpers, screen, waitFor, - render, - userEvent, } from '@mongodb-js/testing-library-compass'; -import DiagramEditor, { getFieldsFromSchema } from './diagram-editor'; +import DiagramEditor from './diagram-editor'; import type { DataModelingStore } from '../../test/setup-store'; import type { Edit, @@ -68,14 +66,14 @@ const storageItems: MongoDBDataModelDescription[] = [ { ns: 'db1.collection1', indexes: [], - displayPosition: [NaN, NaN], + displayPosition: [0, 0], shardKey: {}, jsonSchema: { bsonType: 'object' }, }, { ns: 'db1.collection2', indexes: [], - displayPosition: [NaN, NaN], + displayPosition: [0, 0], shardKey: {}, jsonSchema: { bsonType: 'object' }, }, @@ -165,37 +163,6 @@ describe('DiagramEditor', function () { .callsFake(mockDiagramming.applyLayout as any); }); - context('with initial diagram', function () { - beforeEach(async function () { - const result = renderDiagramEditor({ - renderedItem: storageItems[1], - }); - store = result.store; - - // wait till the editor is loaded - await waitFor(() => { - expect(screen.getByTestId('model-preview')).to.be.visible; - }); - }); - - it('applies the initial layout to unpositioned nodes', function () { - const state = store.getState(); - - expect(state.diagram?.edits.current).to.have.lengthOf(1); - expect(state.diagram?.edits.current[0].type).to.equal('SetModel'); - const initialEdit = state.diagram?.edits.current[0] as Extract< - Edit, - { type: 'SetModel' } - >; - expect(initialEdit.model?.collections[0].displayPosition).to.deep.equal([ - 100, 100, - ]); - expect(initialEdit.model?.collections[1].displayPosition).to.deep.equal([ - 200, 200, - ]); - }); - }); - context('with existing diagram', function () { beforeEach(async function () { const result = renderDiagramEditor({ @@ -231,182 +198,3 @@ describe('DiagramEditor', function () { }); }); }); - -describe('getFieldsFromSchema', function () { - const validateMixedType = async ( - type: React.ReactNode, - expectedTooltip: RegExp - ) => { - render(<>{type}); - const mixed = screen.getByText('(mixed)'); - expect(mixed).to.be.visible; - expect(screen.queryByText(expectedTooltip)).to.not.exist; - userEvent.hover(mixed); - await waitFor(() => { - expect(screen.getByText(expectedTooltip)).to.be.visible; - }); - }; - - describe('flat schema', function () { - it('return empty array for empty schema', function () { - const result = getFieldsFromSchema({}); - expect(result).to.deep.equal([]); - }); - - it('returns fields for a simple schema', function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - name: { bsonType: 'string' }, - age: { bsonType: 'int' }, - }, - }); - expect(result).to.deep.equal([ - { name: 'name', type: 'string', depth: 0, glyphs: [] }, - { name: 'age', type: 'int', depth: 0, glyphs: [] }, - ]); - }); - - it('returns mixed fields with tooltip on hover', async function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - age: { bsonType: ['int', 'string'] }, - }, - }); - expect(result[0]).to.deep.include({ name: 'age', depth: 0, glyphs: [] }); - await validateMixedType(result[0].type, /int, string/); - }); - }); - - describe('nested schema', function () { - it('returns fields for a nested schema', function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - person: { - bsonType: 'object', - properties: { - name: { bsonType: 'string' }, - address: { - bsonType: 'object', - properties: { - street: { bsonType: 'string' }, - city: { bsonType: 'string' }, - }, - }, - }, - }, - }, - }); - expect(result).to.deep.equal([ - { name: 'person', type: 'object', depth: 0, glyphs: [] }, - { name: 'name', type: 'string', depth: 1, glyphs: [] }, - { name: 'address', type: 'object', depth: 1, glyphs: [] }, - { name: 'street', type: 'string', depth: 2, glyphs: [] }, - { name: 'city', type: 'string', depth: 2, glyphs: [] }, - ]); - }); - - it('returns [] for array', function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - tags: { - bsonType: 'array', - items: { bsonType: 'string' }, - }, - }, - }); - expect(result).to.deep.equal([ - { name: 'tags', type: '[]', depth: 0, glyphs: [] }, - ]); - }); - - it('returns fields for an array of objects', function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - todos: { - bsonType: 'array', - items: { - bsonType: 'object', - properties: { - title: { bsonType: 'string' }, - completed: { bsonType: 'boolean' }, - }, - }, - }, - }, - }); - expect(result).to.deep.equal([ - { name: 'todos', type: '[]', depth: 0, glyphs: [] }, - { name: 'title', type: 'string', depth: 1, glyphs: [] }, - { name: 'completed', type: 'boolean', depth: 1, glyphs: [] }, - ]); - }); - - it('returns fields for a mixed schema with objects', async function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - name: { - anyOf: [ - { bsonType: 'string' }, - { - bsonType: 'object', - properties: { - first: { bsonType: 'string' }, - last: { bsonType: 'string' }, - }, - }, - ], - }, - }, - }); - expect(result).to.have.lengthOf(3); - expect(result[0]).to.deep.include({ name: 'name', depth: 0, glyphs: [] }); - await validateMixedType(result[0].type, /string, object/); - expect(result[1]).to.deep.equal({ - name: 'first', - type: 'string', - depth: 1, - glyphs: [], - }); - expect(result[2]).to.deep.equal({ - name: 'last', - type: 'string', - depth: 1, - glyphs: [], - }); - }); - - it('returns fields for an array of mixed (including objects)', function () { - const result = getFieldsFromSchema({ - bsonType: 'object', - properties: { - todos: { - bsonType: 'array', - items: { - anyOf: [ - { - bsonType: 'object', - properties: { - title: { bsonType: 'string' }, - completed: { bsonType: 'boolean' }, - }, - }, - { bsonType: 'string' }, - ], - }, - }, - }, - }); - expect(result).to.deep.equal([ - { name: 'todos', type: '[]', depth: 0, glyphs: [] }, - { name: 'title', type: 'string', depth: 1, glyphs: [] }, - { name: 'completed', type: 'boolean', depth: 1, glyphs: [] }, - ]); - }); - }); -}); diff --git a/packages/compass-data-modeling/src/components/diagram-editor.tsx b/packages/compass-data-modeling/src/components/diagram-editor.tsx index a3f1b43652e..fb68e312c7b 100644 --- a/packages/compass-data-modeling/src/components/diagram-editor.tsx +++ b/packages/compass-data-modeling/src/components/diagram-editor.tsx @@ -1,33 +1,31 @@ import React, { useCallback, + useEffect, useMemo, useRef, - useEffect, useState, } from 'react'; import { connect } from 'react-redux'; -import toNS from 'mongodb-ns'; -import type { MongoDBJSONSchema } from 'mongodb-schema'; import type { DataModelingState } from '../store/reducer'; import { - applyInitialLayout, moveCollection, - getCurrentDiagramFromState, - selectCurrentModel, selectCollection, selectRelationship, selectBackground, + type DiagramState, + selectCurrentModelFromState, + createNewRelationship, } from '../store/diagram'; import { Banner, - Body, CancelLoader, WorkspaceContainer, css, spacing, Button, useDarkMode, - InlineDefinition, + useDrawerActions, + rafraf, } from '@mongodb-js/compass-components'; import { cancelAnalysis, retryAnalysis } from '../store/analysis-process'; import { @@ -35,12 +33,16 @@ import { type NodeProps, type EdgeProps, useDiagram, - applyLayout, } from '@mongodb-js/diagramming'; import type { StaticModel } from '../services/data-model-storage'; import DiagramEditorToolbar from './diagram-editor-toolbar'; import ExportDiagramModal from './export-diagram-modal'; -import { useLogger } from '@mongodb-js/compass-logging/provider'; +import { DATA_MODELING_DRAWER_ID } from './drawer/diagram-editor-side-panel'; +import { + collectionToDiagramNode, + getSelectedFields, + relationshipToDiagramEdge, +} from '../utils/nodes-and-edges'; const loadingContainerStyles = css({ width: '100%', @@ -63,12 +65,6 @@ const bannerButtonStyles = css({ marginLeft: 'auto', }); -const mixedTypeTooltipContentStyles = css({ - overflowWrap: 'anywhere', - textWrap: 'wrap', - textAlign: 'left', -}); - const ErrorBannerWithRetry: React.FunctionComponent<{ onRetryClick: () => void; }> = ({ children, onRetryClick }) => { @@ -86,90 +82,6 @@ const ErrorBannerWithRetry: React.FunctionComponent<{ ); }; -function getBsonTypeName(bsonType: string) { - switch (bsonType) { - case 'array': - return '[]'; - default: - return bsonType; - } -} - -function getFieldTypeDisplay(bsonTypes: string[]) { - if (bsonTypes.length === 0) { - return 'unknown'; - } - - if (bsonTypes.length === 1) { - return getBsonTypeName(bsonTypes[0]); - } - - const typesString = bsonTypes - .map((bsonType) => getBsonTypeName(bsonType)) - .join(', '); - - // We show `mixed` with a tooltip when multiple bsonTypes were found. - return ( - - Multiple types found in sample: {typesString} - - } - > -
(mixed)
-
- ); -} - -export const getFieldsFromSchema = ( - jsonSchema: MongoDBJSONSchema, - depth = 0 -): NodeProps['fields'] => { - if (!jsonSchema || !jsonSchema.properties) { - return []; - } - let fields: NodeProps['fields'] = []; - for (const [name, field] of Object.entries(jsonSchema.properties)) { - // field has types, properties and (optional) children - // types are either direct, or from anyof - // children are either direct (properties), from anyOf, items or items.anyOf - const types: (string | string[])[] = []; - const children = []; - if (field.bsonType) types.push(field.bsonType); - if (field.properties) children.push(field); - if (field.items) - children.push((field.items as MongoDBJSONSchema).anyOf || field.items); - if (field.anyOf) { - for (const variant of field.anyOf) { - if (variant.bsonType) types.push(variant.bsonType); - if (variant.properties) { - children.push(variant); - } - if (variant.items) children.push(variant.items); - } - } - - fields.push({ - name, - type: getFieldTypeDisplay(types.flat()), - depth: depth, - glyphs: types.length === 1 && types[0] === 'objectId' ? ['key'] : [], - }); - - if (children.length > 0) { - fields = [ - ...fields, - ...children - .flat() - .flatMap((child) => getFieldsFromSchema(child, depth + 1)), - ]; - } - } - - return fields; -}; - const modelPreviewContainerStyles = css({ display: 'grid', gridTemplateColumns: '100%', @@ -180,131 +92,187 @@ const modelPreviewContainerStyles = css({ const modelPreviewStyles = css({ minHeight: 0, + + /** reactflow handles this normally, but there is a `* { userSelect: 'text' }` in this project, + * which overrides inherited userSelect */ + ['.connectablestart']: { + userSelect: 'none', + }, }); -const DiagramEditor: React.FunctionComponent<{ +type SelectedItems = NonNullable['selectedItems']; + +const DiagramContent: React.FunctionComponent<{ diagramLabel: string; - step: DataModelingState['step']; model: StaticModel | null; + isInRelationshipDrawingMode: boolean; editErrors?: string[]; - onRetryClick: () => void; - onCancelClick: () => void; - onApplyInitialLayout: (positions: Record) => void; onMoveCollection: (ns: string, newPosition: [number, number]) => void; onCollectionSelect: (namespace: string) => void; onRelationshipSelect: (rId: string) => void; onDiagramBackgroundClicked: () => void; - selectedItems: { type: 'relationship' | 'collection'; id: string } | null; + selectedItems: SelectedItems; + onCreateNewRelationship: (source: string, target: string) => void; + onRelationshipDrawn: () => void; }> = ({ diagramLabel, - step, model, - onRetryClick, - onCancelClick, - onApplyInitialLayout, + isInRelationshipDrawingMode, onMoveCollection, onCollectionSelect, onRelationshipSelect, onDiagramBackgroundClicked, + onCreateNewRelationship, + onRelationshipDrawn, selectedItems, }) => { - const { log, mongoLogId } = useLogger('COMPASS-DATA-MODELING-DIAGRAM-EDITOR'); const isDarkMode = useDarkMode(); - const diagramContainerRef = useRef(null); - const diagram = useDiagram(); - const [areNodesReady, setAreNodesReady] = useState(false); + const diagram = useRef(useDiagram()); + const { openDrawer } = useDrawerActions(); - const setDiagramContainerRef = useCallback( - (ref: HTMLDivElement | null) => { - if (ref) { - // For debugging purposes, we attach the diagram to the ref. - (ref as any)._diagram = diagram; - } - diagramContainerRef.current = ref; - }, - [diagram] - ); + const setDiagramContainerRef = useCallback((ref: HTMLDivElement | null) => { + if (ref) { + // For debugging purposes, we attach the diagram to the ref. + (ref as any)._diagram = diagram.current; + } + }, []); - const edges = useMemo(() => { - return (model?.relationships ?? []).map((relationship): EdgeProps => { - const [source, target] = relationship.relationship; - return { - id: relationship.id, - source: source.ns ?? '', - target: target.ns ?? '', - markerStart: source.cardinality === 1 ? 'one' : 'many', - markerEnd: target.cardinality === 1 ? 'one' : 'many', - selected: - !!selectedItems && - selectedItems.type === 'relationship' && - selectedItems.id === relationship.id, - }; + const edges = useMemo(() => { + return (model?.relationships ?? []).map((relationship) => { + const selected = + !!selectedItems && + selectedItems.type === 'relationship' && + selectedItems.id === relationship.id; + return relationshipToDiagramEdge(relationship, selected); }); }, [model?.relationships, selectedItems]); const nodes = useMemo(() => { - return (model?.collections ?? []).map( - (coll): NodeProps => ({ - id: coll.ns, - type: 'collection', - position: { - x: coll.displayPosition[0], - y: coll.displayPosition[1], - }, - title: toNS(coll.ns).collection, - fields: getFieldsFromSchema(coll.jsonSchema), - selected: - !!selectedItems && - selectedItems.type === 'collection' && - selectedItems.id === coll.ns, - }) + const selectedFields = getSelectedFields( + selectedItems, + model?.relationships ); - }, [model?.collections, selectedItems]); - - const applyInitialLayout = useCallback(async () => { - try { - const { nodes: positionedNodes } = await applyLayout( - nodes, - edges, - 'LEFT_RIGHT' - ); - onApplyInitialLayout( - Object.fromEntries( - positionedNodes.map((node) => [ - node.id, - [node.position.x, node.position.y], - ]) - ) - ); - } catch (err) { - log.error( - mongoLogId(1_001_000_361), - 'DiagramEditor', - 'Error applying layout:', - err - ); - } - }, [edges, log, nodes, mongoLogId, onApplyInitialLayout]); + return (model?.collections ?? []).map((coll) => { + const selected = + !!selectedItems && + selectedItems.type === 'collection' && + selectedItems.id === coll.ns; + return collectionToDiagramNode(coll, { + selectedFields, + selected, + isInRelationshipDrawingMode, + }); + }); + }, [ + model?.collections, + model?.relationships, + selectedItems, + isInRelationshipDrawingMode, + ]); + // Fit to view on initial mount useEffect(() => { - if (nodes.length === 0) return; - const isInitialState = nodes.some( - (node) => isNaN(node.position.x) || isNaN(node.position.y) - ); - if (isInitialState) { - void applyInitialLayout(); - return; - } - if (!areNodesReady) { - setAreNodesReady(true); - setTimeout(() => { - void diagram.fitView(); - }); - } - }, [areNodesReady, nodes, diagram, applyInitialLayout]); + // Schedule the fitView call to make sure that diagramming package had a + // chance to set initial nodes, edges state + // TODO: react-flow documentation suggests that we should be able to do this + // without unrelyable scheduling by calling the fitView after initial state + // is set, but for this we will need to make some changes to the diagramming + // package first + return rafraf(() => { + void diagram.current.fitView(); + }); + }, []); + + const handleNodesConnect = useCallback( + (source: string, target: string) => { + onCreateNewRelationship(source, target); + onRelationshipDrawn(); + }, + [onRelationshipDrawn, onCreateNewRelationship] + ); + + return ( +
+
+ { + if (node.type !== 'collection') { + return; + } + onCollectionSelect(node.id); + openDrawer(DATA_MODELING_DRAWER_ID); + }} + onPaneClick={onDiagramBackgroundClicked} + onEdgeClick={(_evt, edge) => { + onRelationshipSelect(edge.id); + openDrawer(DATA_MODELING_DRAWER_ID); + }} + fitViewOptions={{ + maxZoom: 1, + minZoom: 0.25, + }} + onNodeDragStop={(evt, node) => { + onMoveCollection(node.id, [node.position.x, node.position.y]); + }} + onConnect={({ source, target }) => { + handleNodesConnect(source, target); + }} + /> +
+
+ ); +}; +const ConnectedDiagramContent = connect( + (state: DataModelingState) => { + const { diagram } = state; + return { + model: diagram ? selectCurrentModelFromState(state) : null, + diagramLabel: diagram?.name || 'Schema Preview', + selectedItems: state.diagram?.selectedItems ?? null, + }; + }, + { + onMoveCollection: moveCollection, + onCollectionSelect: selectCollection, + onRelationshipSelect: selectRelationship, + onDiagramBackgroundClicked: selectBackground, + onCreateNewRelationship: createNewRelationship, + } +)(DiagramContent); + +const DiagramEditor: React.FunctionComponent<{ + step: DataModelingState['step']; + diagramId?: string; + onRetryClick: () => void; + onCancelClick: () => void; +}> = ({ step, diagramId, onRetryClick, onCancelClick }) => { let content; + const [isInRelationshipDrawingMode, setIsInRelationshipDrawingMode] = + useState(false); + + const handleRelationshipDrawingToggle = useCallback(() => { + setIsInRelationshipDrawingMode((prev) => !prev); + }, []); + + const onRelationshipDrawn = useCallback(() => { + setIsInRelationshipDrawingMode(false); + }, []); + if (step === 'NO_DIAGRAM_SELECTED') { return null; } @@ -338,49 +306,25 @@ const DiagramEditor: React.FunctionComponent<{ ); } - if (step === 'EDITING') { + if (step === 'EDITING' && diagramId) { content = ( -
-
- { - if (node.type !== 'collection') { - return; - } - onCollectionSelect(node.id); - }} - onPaneClick={onDiagramBackgroundClicked} - onEdgeClick={(_evt, edge) => { - onRelationshipSelect(edge.id); - }} - fitViewOptions={{ - maxZoom: 1, - minZoom: 0.25, - }} - onNodeDragStop={(evt, node) => { - onMoveCollection(node.id, [node.position.x, node.position.y]); - }} - /> -
-
+ ); } return ( - }> + + } + > {content} @@ -392,21 +336,12 @@ export default connect( const { diagram, step } = state; return { step: step, - model: diagram - ? selectCurrentModel(getCurrentDiagramFromState(state).edits) - : null, editErrors: diagram?.editErrors, - diagramLabel: diagram?.name || 'Schema Preview', - selectedItems: state.diagram?.selectedItems ?? null, + diagramId: diagram?.id, }; }, { onRetryClick: retryAnalysis, onCancelClick: cancelAnalysis, - onApplyInitialLayout: applyInitialLayout, - onMoveCollection: moveCollection, - onCollectionSelect: selectCollection, - onRelationshipSelect: selectRelationship, - onDiagramBackgroundClicked: selectBackground, } )(DiagramEditor); diff --git a/packages/compass-data-modeling/src/components/drawer/collection-drawer-content.tsx b/packages/compass-data-modeling/src/components/drawer/collection-drawer-content.tsx new file mode 100644 index 00000000000..fe5d0522cd2 --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/collection-drawer-content.tsx @@ -0,0 +1,192 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import type { Relationship } from '../../services/data-model-storage'; +import { + Badge, + Button, + IconButton, + css, + palette, + spacing, + TextInput, + Icon, + TextArea, +} from '@mongodb-js/compass-components'; +import { + createNewRelationship, + deleteRelationship, + selectCurrentModelFromState, + selectRelationship, + updateCollectionNote, +} from '../../store/diagram'; +import type { DataModelingState } from '../../store/reducer'; +import { getDefaultRelationshipName } from '../../utils'; +import { + DMDrawerSection, + DMFormFieldContainer, +} from './drawer-section-components'; +import { useChangeOnBlur } from './use-change-on-blur'; + +type CollectionDrawerContentProps = { + namespace: string; + relationships: Relationship[]; + onCreateNewRelationshipClick: (namespace: string) => void; + onEditRelationshipClick: (rId: string) => void; + onDeleteRelationshipClick: (rId: string) => void; + note?: string; + onNoteChange: (namespace: string, note: string) => void; +}; + +const titleBtnStyles = css({ + marginLeft: 'auto', + maxHeight: 20, // To match accordion line height +}); + +const emptyRelationshipMessageStyles = css({ + color: palette.gray.dark1, +}); + +const relationshipsListStyles = css({ + display: 'flex', + flexDirection: 'column', + gap: spacing[200], +}); + +const relationshipItemStyles = css({ + display: 'flex', + alignItems: 'center', +}); + +const relationshipNameStyles = css({ + flexGrow: 1, + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + minWidth: 0, + paddingRight: spacing[200], +}); + +const relationshipContentStyles = css({ + marginTop: spacing[400], +}); + +const CollectionDrawerContent: React.FunctionComponent< + CollectionDrawerContentProps +> = ({ + namespace, + relationships, + onCreateNewRelationshipClick, + onEditRelationshipClick, + onDeleteRelationshipClick, + note = '', + onNoteChange, +}) => { + const noteInputProps = useChangeOnBlur(note, (newNote) => { + onNoteChange(namespace, newNote); + }); + + return ( + <> + + + + + + + + Relationships  + {relationships.length} + + + } + > +
+ {!relationships.length ? ( +
+ This collection does not have any relationships yet. +
+ ) : ( +
    + {relationships.map((r) => { + return ( +
  • + + {getDefaultRelationshipName(r.relationship)} + + { + onEditRelationshipClick(r.id); + }} + > + + + { + onDeleteRelationshipClick(r.id); + }} + > + + +
  • + ); + })} +
+ )} +
+
+ + + + + + + + ); +}; + +export default connect( + (state: DataModelingState, ownProps: { namespace: string }) => { + const model = selectCurrentModelFromState(state); + return { + note: + model.collections.find((collection) => { + return collection.ns === ownProps.namespace; + })?.note ?? '', + relationships: model.relationships.filter((r) => { + const [local, foreign] = r.relationship; + return ( + local.ns === ownProps.namespace || foreign.ns === ownProps.namespace + ); + }), + }; + }, + { + onCreateNewRelationshipClick: createNewRelationship, + onEditRelationshipClick: selectRelationship, + onDeleteRelationshipClick: deleteRelationship, + onNoteChange: updateCollectionNote, + } +)(CollectionDrawerContent); diff --git a/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.spec.tsx b/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.spec.tsx new file mode 100644 index 00000000000..71414751b06 --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.spec.tsx @@ -0,0 +1,271 @@ +import React from 'react'; +import { expect } from 'chai'; +import { + createPluginTestHelpers, + screen, + waitFor, + userEvent, + within, +} from '@mongodb-js/testing-library-compass'; +import { DataModelingWorkspaceTab } from '../../index'; +import DiagramEditorSidePanel from './diagram-editor-side-panel'; +import { + openDiagram, + selectCollection, + selectCurrentModelFromState, + selectRelationship, +} from '../../store/diagram'; +import dataModel from '../../../test/fixtures/data-model-with-relationships.json'; +import type { + MongoDBDataModelDescription, + Relationship, +} from '../../services/data-model-storage'; +import { DrawerAnchor } from '@mongodb-js/compass-components'; + +async function comboboxSelectItem( + label: string, + value: string, + visibleLabel = value +) { + userEvent.click(screen.getByRole('textbox', { name: label })); + await waitFor(() => { + screen.getByRole('option', { name: visibleLabel }); + }); + userEvent.click(screen.getByRole('option', { name: visibleLabel })); + await waitFor(() => { + expect(screen.getByRole('textbox', { name: label })).to.have.attribute( + 'value', + value + ); + }); +} + +describe('DiagramEditorSidePanel', function () { + before(function () { + // TODO(COMPASS-9618): skip in electron runtime for now, drawer has issues rendering + if ((process as any).type === 'renderer') { + this.skip(); + } + }); + + function renderDrawer() { + const { renderWithConnections } = createPluginTestHelpers( + DataModelingWorkspaceTab.provider.withMockServices({}) + ); + const result = renderWithConnections( + + + + ); + result.plugin.store.dispatch( + openDiagram(dataModel as MongoDBDataModelDescription) + ); + return result; + } + + it('should not render if no items are selected', function () { + renderDrawer(); + expect(screen.queryByTestId('data-modeling-drawer')).to.eq(null); + }); + + it('should render and edit a collection in collection context drawer when collection is clicked', async function () { + const result = renderDrawer(); + result.plugin.store.dispatch(selectCollection('flights.airlines')); + + await waitFor(() => { + const nameInput = screen.getByLabelText('Name'); + expect(nameInput).to.be.visible; + expect(nameInput).to.have.value('flights.airlines'); + }); + + userEvent.click(screen.getByRole('textbox', { name: 'Notes' })); + userEvent.type( + screen.getByRole('textbox', { name: 'Notes' }), + 'Note about the collection' + ); + userEvent.tab(); + + const modifiedCollection = selectCurrentModelFromState( + result.plugin.store.getState() + ).collections.find((coll) => { + return coll.ns === 'flights.airlines'; + }); + + expect(modifiedCollection).to.have.property( + 'note', + 'Note about the collection' + ); + }); + + it('should render a relationship context drawer when relations is clicked', async function () { + const result = renderDrawer(); + result.plugin.store.dispatch( + selectRelationship('204b1fc0-601f-4d62-bba3-38fade71e049') + ); + + await waitFor(() => { + const section = screen.getByText('Relationship properties'); + expect(section).to.be.visible; + }); + + const localCollectionInput = screen.getByLabelText('Local collection'); + expect(localCollectionInput).to.be.visible; + expect(localCollectionInput).to.have.value('countries'); + + const foreignCollectionInput = screen.getByLabelText('Foreign collection'); + expect(foreignCollectionInput).to.be.visible; + expect(foreignCollectionInput).to.have.value('airports'); + + const localFieldInput = screen.getByLabelText('Local field'); + expect(localFieldInput).to.be.visible; + expect(localFieldInput).to.have.value('name'); + + const foreignFieldInput = screen.getByLabelText('Foreign field'); + expect(foreignFieldInput).to.be.visible; + expect(foreignFieldInput).to.have.value('Country'); + + const localCardinalityInput = screen.getByLabelText('Local cardinality'); + expect(localCardinalityInput).to.be.visible; + expect(localCardinalityInput).to.have.value('1'); + + const foreignCardinalityInput = screen.getByLabelText( + 'Foreign cardinality' + ); + expect(foreignCardinalityInput).to.be.visible; + expect(foreignCardinalityInput).to.have.value('100'); + + expect( + document.querySelector( + '[data-relationship-id="204b1fc0-601f-4d62-bba3-38fade71e049"]' + ) + ).to.be.visible; + }); + + it('should change the content of the drawer when selecting different items', async function () { + const result = renderDrawer(); + + result.plugin.store.dispatch(selectCollection('flights.airlines')); + + await waitFor(() => { + expect(screen.getByLabelText('Name')).to.have.value('flights.airlines'); + }); + + result.plugin.store.dispatch( + selectCollection('flights.airports_coordinates_for_schema') + ); + expect(screen.getByLabelText('Name')).to.have.value( + 'flights.airports_coordinates_for_schema' + ); + + result.plugin.store.dispatch( + selectRelationship('204b1fc0-601f-4d62-bba3-38fade71e049') + ); + expect( + document.querySelector( + '[data-relationship-id="204b1fc0-601f-4d62-bba3-38fade71e049"]' + ) + ).to.be.visible; + + result.plugin.store.dispatch( + selectRelationship('6f776467-4c98-476b-9b71-1f8a724e6c2c') + ); + expect( + document.querySelector( + '[data-relationship-id="6f776467-4c98-476b-9b71-1f8a724e6c2c"]' + ) + ).to.be.visible; + + result.plugin.store.dispatch(selectCollection('flights.planes')); + expect(screen.getByLabelText('Name')).to.have.value('flights.planes'); + }); + + it('should open and edit relationship starting from collection', async function () { + const result = renderDrawer(); + result.plugin.store.dispatch(selectCollection('flights.countries')); + + await waitFor(() => { + expect(screen.getByLabelText('Name')).to.have.value('flights.countries'); + }); + + // Open relationshipt editing form + const relationshipItem = screen + .getByText('countries.name → airports.Country') + .closest('li'); + expect(relationshipItem).to.be.visible; + userEvent.click( + within(relationshipItem!).getByRole('button', { + name: 'Edit relationship', + }) + ); + expect(screen.getByLabelText('Local field')).to.be.visible; + + // Select new values + await comboboxSelectItem('Local collection', 'planes'); + await comboboxSelectItem('Local field', 'name'); + await comboboxSelectItem('Foreign collection', 'countries'); + await comboboxSelectItem('Foreign field', 'iso_code'); + + userEvent.click(screen.getByRole('textbox', { name: 'Notes' })); + userEvent.type( + screen.getByRole('textbox', { name: 'Notes' }), + 'Note about the relationship' + ); + userEvent.tab(); + + // We should be testing through rendered UI but as it's really hard to make + // diagram rendering in tests property, we are just validating the final + // model here + const modifiedRelationship = selectCurrentModelFromState( + result.plugin.store.getState() + ).relationships.find((r: Relationship) => { + return r.id === '204b1fc0-601f-4d62-bba3-38fade71e049'; + }); + + expect(modifiedRelationship) + .to.have.property('relationship') + .deep.eq([ + { + ns: 'flights.planes', + fields: ['name'], + cardinality: 1, + }, + { + ns: 'flights.countries', + fields: ['iso_code'], + cardinality: 100, + }, + ]); + + expect(modifiedRelationship).to.have.property( + 'note', + 'Note about the relationship' + ); + }); + + it('should delete a relationship from collection', async function () { + const result = renderDrawer(); + result.plugin.store.dispatch(selectCollection('flights.countries')); + + await waitFor(() => { + expect(screen.getByLabelText('Name')).to.have.value('flights.countries'); + }); + + // Find the relationhip item + const relationshipItem = screen + .getByText('countries.name → airports.Country') + .closest('li'); + expect(relationshipItem).to.be.visible; + + // Delete relationship + userEvent.click( + within(relationshipItem!).getByRole('button', { + name: 'Delete relationship', + }) + ); + + await waitFor(() => { + expect(screen.queryByText('countries.name → airports.Country')).not.to + .exist; + }); + }); +}); diff --git a/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.tsx b/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.tsx new file mode 100644 index 00000000000..0bf14d2eb09 --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/diagram-editor-side-panel.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import type { DataModelingState } from '../../store/reducer'; +import { DrawerSection } from '@mongodb-js/compass-components'; +import CollectionDrawerContent from './collection-drawer-content'; +import RelationshipDrawerContent from './relationship-drawer-content'; +export const DATA_MODELING_DRAWER_ID = 'data-modeling-drawer'; + +type DiagramEditorSidePanelProps = { + selectedItems: { type: 'relationship' | 'collection'; id: string } | null; +}; + +function DiagramEditorSidePanel({ + selectedItems, +}: DiagramEditorSidePanelProps) { + if (!selectedItems) { + return null; + } + + let content; + + if (selectedItems.type === 'collection') { + content = ( + + ); + } else if (selectedItems.type === 'relationship') { + content = ( + + ); + } + + return ( + + {content} + + ); +} + +export default connect((state: DataModelingState) => { + return { + selectedItems: state.diagram?.selectedItems ?? null, + }; +})(DiagramEditorSidePanel); diff --git a/packages/compass-data-modeling/src/components/drawer/drawer-section-components.tsx b/packages/compass-data-modeling/src/components/drawer/drawer-section-components.tsx new file mode 100644 index 00000000000..51bcb369801 --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/drawer-section-components.tsx @@ -0,0 +1,78 @@ +import { + Accordion, + css, + palette, + spacing, + cx, + useDarkMode, + FormFieldContainer, +} from '@mongodb-js/compass-components'; +import React from 'react'; + +const containerStyles = css({ + '&:first-child': { + marginTop: `-${spacing[400]}px`, + }, + borderBottom: `1px solid ${palette.gray.light2}`, + marginLeft: `-${spacing[400]}px`, + marginRight: `-${spacing[400]}px`, + padding: spacing[400], +}); + +const darkModeContainerStyles = css({ + borderBottom: `1px solid ${palette.gray.dark2}`, +}); + +const accordionTitleStyles = css({ + width: '100%', + textTransform: 'uppercase', + marginBottom: spacing[400], +}); + +const buttonStyles = css({ + width: '100%', + display: 'flex', + alignItems: 'center', +}); + +export const DMDrawerSection: React.FC<{ + label: React.ReactNode; +}> = ({ label, children }) => { + const darkMode = useDarkMode(); + return ( +
+ + {children} + +
+ ); +}; + +const formFieldContainerStyles = css({ + marginBottom: spacing[400], + marginTop: spacing[400], + '&:first-child': { + marginTop: 0, + }, + '&:last-child': { + marginBottom: 0, + }, +}); + +export const DMFormFieldContainer: typeof FormFieldContainer = ({ + className, + ...props +}) => { + return ( + + ); +}; diff --git a/packages/compass-data-modeling/src/components/drawer/relationship-drawer-content.tsx b/packages/compass-data-modeling/src/components/drawer/relationship-drawer-content.tsx new file mode 100644 index 00000000000..c453d137b8d --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/relationship-drawer-content.tsx @@ -0,0 +1,394 @@ +import React, { useCallback, useMemo, useRef } from 'react'; +import { connect } from 'react-redux'; +import type { DataModelingState } from '../../store/reducer'; +import { + Combobox, + ComboboxOption, + Select, + Option, + spacing, + css, + palette, + Button, + Icon, + TextArea, +} from '@mongodb-js/compass-components'; +import { + deleteRelationship, + getCurrentDiagramFromState, + getRelationshipForCurrentModel, + selectFieldsForCurrentModel, + updateRelationship, +} from '../../store/diagram'; +import toNS from 'mongodb-ns'; +import type { Relationship } from '../../services/data-model-storage'; +import { cloneDeep } from 'lodash'; +import { + DMDrawerSection, + DMFormFieldContainer, +} from './drawer-section-components'; +import { useChangeOnBlur } from './use-change-on-blur'; + +type RelationshipDrawerContentProps = { + relationshipId: string; + relationship: Relationship; + fields: Record; + onRelationshipUpdate: (relationship: Relationship) => void; + onDeleteRelationshipClick: (rId: string) => void; +}; + +type RelationshipFormFields = { + localCollection: string; + localField: string; + localCardinality: string; + foreignCollection: string; + foreignField: string; + foreignCardinality: string; + note: string; +}; + +const titleBtnStyles = css({ + marginLeft: 'auto', + maxHeight: 20, // to make sure we're matching accordion line height +}); + +const FIELD_DIVIDER = '~~##$$##~~'; + +function useRelationshipFormFields( + relationship: Relationship, + onRelationshipChange: (relationship: Relationship) => void +): RelationshipFormFields & { + onFieldChange: (key: keyof RelationshipFormFields, value: string) => void; +} { + const onRelationshipChangeRef = useRef(onRelationshipChange); + onRelationshipChangeRef.current = onRelationshipChange; + const [local, foreign] = relationship.relationship; + const localCollection = local.ns ?? ''; + // Leafygreen select / combobox only supports string fields, so we stringify + // the value for the form, and then will convert it back on update + const localField = local.fields?.join(FIELD_DIVIDER) ?? ''; + const localCardinality = String(local.cardinality); + const foreignCollection = foreign.ns ?? ''; + const foreignField = foreign.fields?.join(FIELD_DIVIDER) ?? ''; + const foreignCardinality = String(foreign.cardinality); + const onFieldChange = useCallback( + (key: keyof RelationshipFormFields, value: string) => { + const newRelationship = cloneDeep(relationship); + switch (key) { + case 'localCollection': + newRelationship.relationship[0].ns = value; + newRelationship.relationship[0].fields = null; + break; + case 'localField': + newRelationship.relationship[0].fields = value.split(FIELD_DIVIDER); + break; + case 'localCardinality': + newRelationship.relationship[0].cardinality = Number(value); + break; + case 'foreignCollection': + newRelationship.relationship[1].ns = value; + newRelationship.relationship[1].fields = null; + break; + case 'foreignField': + newRelationship.relationship[1].fields = value.split(FIELD_DIVIDER); + break; + case 'foreignCardinality': + newRelationship.relationship[1].cardinality = Number(value); + break; + case 'note': + newRelationship.note = value; + break; + } + onRelationshipChangeRef.current(newRelationship); + }, + [relationship] + ); + return { + localCollection, + localField, + localCardinality, + foreignCollection, + foreignField, + foreignCardinality, + onFieldChange, + note: relationship.note ?? '', + }; +} + +const cardinalityTagStyle = css({ + color: palette.gray.base, + fontWeight: 'bold', +}); + +const CardinalityLabel: React.FunctionComponent<{ + value: number; + tag: string; +}> = ({ value, tag }) => ( + <> + {tag} {value} + +); + +const CARDINALITY_OPTIONS = [ + { tag: 'One', value: 1 }, + { tag: 'Many', value: 10 }, + { tag: 'Many', value: 100 }, + { tag: 'Many', value: 1000 }, +]; + +const configurationContainerStyles = css({ + width: '100%', + display: 'grid', + gridTemplateAreas: ` + "local foreign" + `, + gridTemplateColumns: '1fr 1fr', + gap: spacing[400], +}); + +const configurationLocalFieldStyles = css({ + gridArea: 'local', +}); + +const configurationForeignFieldStyles = css({ + gridArea: 'foreign', +}); + +const RelationshipDrawerContent: React.FunctionComponent< + RelationshipDrawerContentProps +> = ({ + relationshipId, + relationship, + fields, + onRelationshipUpdate, + onDeleteRelationshipClick, +}) => { + const collections = useMemo(() => { + return Object.keys(fields); + }, [fields]); + + const { + localCollection, + localField, + localCardinality, + foreignCollection, + foreignField, + foreignCardinality, + onFieldChange, + note, + } = useRelationshipFormFields(relationship, onRelationshipUpdate); + + const noteInputProps = useChangeOnBlur(note, (newNote) => { + onFieldChange('note', newNote); + }); + + const localFieldOptions = useMemo(() => { + return fields[localCollection] ?? []; + }, [fields, localCollection]); + + const foreignFieldOptions = useMemo(() => { + return fields[foreignCollection] ?? []; + }, [fields, foreignCollection]); + + return ( +
+ + Relationship properties + + + + } + > +
+
+ + { + if (val) { + onFieldChange('localCollection', val); + } + }} + multiselect={false} + clearable={false} + > + {collections.map((ns) => { + return ( + + ); + })} + + + + + { + if (val) { + onFieldChange('localField', val); + } + }} + multiselect={false} + clearable={false} + > + {localFieldOptions.map((field) => { + return ( + + ); + })} + + + + + +
+ +
+ + { + if (val) { + onFieldChange('foreignCollection', val); + } + }} + multiselect={false} + clearable={false} + > + {collections.map((ns) => { + return ( + + ); + })} + + + + + { + if (val) { + onFieldChange('foreignField', val); + } + }} + multiselect={false} + clearable={false} + > + {foreignFieldOptions.map((field) => { + return ( + + ); + })} + + + + + + +
+
+
+ + + + + + +
+ ); +}; + +export default connect( + (state: DataModelingState, ownProps: { relationshipId: string }) => { + const diagram = getCurrentDiagramFromState(state); + const relationship = getRelationshipForCurrentModel( + diagram.edits, + ownProps.relationshipId + ); + if (!relationship) { + throw new Error( + `Can not find relationship with ${ownProps.relationshipId}` + ); + } + return { + relationship, + fields: selectFieldsForCurrentModel(diagram.edits), + }; + }, + { + onRelationshipUpdate: updateRelationship, + onDeleteRelationshipClick: deleteRelationship, + } +)(RelationshipDrawerContent); diff --git a/packages/compass-data-modeling/src/components/drawer/use-change-on-blur.tsx b/packages/compass-data-modeling/src/components/drawer/use-change-on-blur.tsx new file mode 100644 index 00000000000..46d8e0aff19 --- /dev/null +++ b/packages/compass-data-modeling/src/components/drawer/use-change-on-blur.tsx @@ -0,0 +1,26 @@ +import { useState, useLayoutEffect } from 'react'; + +export function useChangeOnBlur( + value: string, + onChange: (newVal: string) => void +): { + value: string; + onChange: React.ChangeEventHandler; + onBlur: React.FocusEventHandler; +} { + const [_value, setValue] = useState(value); + useLayoutEffect(() => { + // Usually this is in sync with local value, but if it's changed externally, + // we run an effect and sync it back + setValue(value); + }, [value]); + return { + value: _value, + onChange: (evt) => { + setValue(evt.currentTarget.value); + }, + onBlur: () => { + onChange(_value); + }, + }; +} diff --git a/packages/compass-data-modeling/src/components/export-diagram-modal.tsx b/packages/compass-data-modeling/src/components/export-diagram-modal.tsx index f91890aab63..52eaba1788e 100644 --- a/packages/compass-data-modeling/src/components/export-diagram-modal.tsx +++ b/packages/compass-data-modeling/src/components/export-diagram-modal.tsx @@ -4,7 +4,6 @@ import { css, Icon, Label, - Link, Modal, ModalBody, ModalFooter, @@ -13,6 +12,7 @@ import { RadioGroup, spacing, SpinLoader, + PngIcon, } from '@mongodb-js/compass-components'; import type { ExportDiagramFormat } from '../store/export-diagram'; import { @@ -25,8 +25,6 @@ import type { DataModelingState } from '../store/reducer'; import { useDiagram } from '@mongodb-js/diagramming'; import type { DiagramInstance } from '@mongodb-js/diagramming'; -const nbsp = '\u00a0'; - const modelBodyStyles = css({ paddingTop: spacing[600], }); @@ -39,8 +37,10 @@ const contentContainerStyles = css({ const radioItemStyles = css({ display: 'flex', - alignItems: 'center', gap: spacing[200], + '> svg': { + marginTop: spacing[50], + }, }); const footerStyles = css({ @@ -73,34 +73,33 @@ const ExportDiagramModal = ({ setOpen={onCloseClick} data-testid="export-diagram-modal" > - - Export your data model as either an image or JSON file. - {nbsp} - - Learn more - -
- } - /> +
- + + onSelectFormat('diagram')} + size="small" + description="Importable into Compass so teammates can collaborate." + > + Diagram File + +
+
+ onSelectFormat('png')} size="small" + description="Shareable image for documentation or presentations." > PNG @@ -113,6 +112,7 @@ const ExportDiagramModal = ({ aria-label="JSON" onClick={() => onSelectFormat('json')} size="small" + description="Raw schema data for programmatic use." > JSON diff --git a/packages/compass-data-modeling/src/components/import-diagram-button.tsx b/packages/compass-data-modeling/src/components/import-diagram-button.tsx index 6632569b9da..cf925eac25f 100644 --- a/packages/compass-data-modeling/src/components/import-diagram-button.tsx +++ b/packages/compass-data-modeling/src/components/import-diagram-button.tsx @@ -17,7 +17,7 @@ export const ImportDiagramButton = ({ id="import-diagram-file-input" data-testid="import-diagram-file-input" multiple={false} - accept=".compass" + accept=".mdm" onSelect={(files) => { if (files.length === 0) { return; diff --git a/packages/compass-data-modeling/src/components/relationship-drawer-content.tsx b/packages/compass-data-modeling/src/components/relationship-drawer-content.tsx deleted file mode 100644 index 3ed64961f80..00000000000 --- a/packages/compass-data-modeling/src/components/relationship-drawer-content.tsx +++ /dev/null @@ -1,309 +0,0 @@ -import React, { useCallback, useMemo, useRef } from 'react'; -import { connect } from 'react-redux'; -import type { DataModelingState } from '../store/reducer'; -import { - Button, - Combobox, - FormFieldContainer, - H3, - ComboboxOption, - Select, - Option, -} from '@mongodb-js/compass-components'; -import { - deleteRelationship, - getCurrentDiagramFromState, - getRelationshipForCurrentModel, - selectFieldsForCurrentModel, - updateRelationship, -} from '../store/diagram'; -import toNS from 'mongodb-ns'; -import type { Relationship } from '../services/data-model-storage'; -import { cloneDeep } from 'lodash'; - -type RelationshipDrawerContentProps = { - relationshipId: string; - relationship: Relationship; - fields: Record; - onRelationshipUpdate: (relationship: Relationship) => void; - onDeleteRelationshipClick: (rId: string) => void; -}; - -type RelationshipFormFields = { - localCollection: string; - localField: string; - foreignCollection: string; - foreignField: string; - localCardinality: string; - foreignCardinality: string; -}; - -const FIELD_DIVIDER = '~~##$$##~~'; - -function useRelationshipFormFields( - relationship: Relationship, - onRelationshipChange: (relationship: Relationship) => void -): RelationshipFormFields & { - onFieldChange: (key: keyof RelationshipFormFields, value: string) => void; -} { - const onRelationshipChangeRef = useRef(onRelationshipChange); - onRelationshipChangeRef.current = onRelationshipChange; - const [local, foreign] = relationship.relationship; - const localCollection = local.ns ?? ''; - // Leafygreen select / combobox only supports string fields, so we stringify - // the value for the form, and then will convert it back on update - const localField = local.fields?.join(FIELD_DIVIDER) ?? ''; - const localCardinality = String(local.cardinality); - const foreignCollection = foreign.ns ?? ''; - const foreignField = foreign.fields?.join(FIELD_DIVIDER) ?? ''; - const foreignCardinality = String(foreign.cardinality); - const onFieldChange = useCallback( - (key: keyof RelationshipFormFields, value: string) => { - const newRelationship = cloneDeep(relationship); - switch (key) { - case 'localCollection': - newRelationship.relationship[0].ns = value; - newRelationship.relationship[0].fields = null; - break; - case 'localField': - newRelationship.relationship[0].fields = value.split(FIELD_DIVIDER); - break; - case 'localCardinality': - newRelationship.relationship[0].cardinality = Number(value); - break; - case 'foreignCollection': - newRelationship.relationship[1].ns = value; - newRelationship.relationship[1].fields = null; - break; - case 'foreignField': - newRelationship.relationship[1].fields = value.split(FIELD_DIVIDER); - break; - case 'foreignCardinality': - newRelationship.relationship[1].cardinality = Number(value); - break; - } - onRelationshipChangeRef.current(newRelationship); - }, - [relationship] - ); - return { - localCollection, - localField, - localCardinality, - foreignCollection, - foreignField, - foreignCardinality, - onFieldChange, - }; -} - -const CARDINALITY_OPTIONS = [1, 10, 100, 1000]; - -const RelationshipDrawerContent: React.FunctionComponent< - RelationshipDrawerContentProps -> = ({ - relationshipId, - relationship, - fields, - onRelationshipUpdate, - onDeleteRelationshipClick, -}) => { - const collections = useMemo(() => { - return Object.keys(fields); - }, [fields]); - - const { - localCollection, - localField, - localCardinality, - foreignCollection, - foreignField, - foreignCardinality, - onFieldChange, - } = useRelationshipFormFields(relationship, onRelationshipUpdate); - - const localFieldOptions = useMemo(() => { - return fields[localCollection] ?? []; - }, [fields, localCollection]); - - const foreignFieldOptions = useMemo(() => { - return fields[foreignCollection] ?? []; - }, [fields, foreignCollection]); - - return ( -
-

Edit Relationship

- - - { - if (val) { - onFieldChange('localCollection', val); - } - }} - multiselect={false} - clearable={false} - > - {collections.map((ns) => { - return ( - - ); - })} - - - - - { - if (val) { - onFieldChange('localField', val); - } - }} - multiselect={false} - clearable={false} - > - {localFieldOptions.map((field) => { - return ( - - ); - })} - - - - - { - if (val) { - onFieldChange('foreignCollection', val); - } - }} - multiselect={false} - clearable={false} - > - {collections.map((ns) => { - return ( - - ); - })} - - - - - { - if (val) { - onFieldChange('foreignField', val); - } - }} - multiselect={false} - clearable={false} - > - {foreignFieldOptions.map((field) => { - return ( - - ); - })} - - - - - - - - - - - - - - -
- ); -}; - -export default connect( - (state: DataModelingState, ownProps: { relationshipId: string }) => { - const diagram = getCurrentDiagramFromState(state); - const relationship = getRelationshipForCurrentModel( - diagram.edits, - ownProps.relationshipId - ); - if (!relationship) { - throw new Error( - `Can not find relationship with ${ownProps.relationshipId}` - ); - } - return { - relationship, - fields: selectFieldsForCurrentModel(diagram.edits), - }; - }, - { - onRelationshipUpdate: updateRelationship, - onDeleteRelationshipClick: deleteRelationship, - } -)(RelationshipDrawerContent); diff --git a/packages/compass-data-modeling/src/services/data-model-storage.ts b/packages/compass-data-modeling/src/services/data-model-storage.ts index 4924fe957f8..82ce6d3ba42 100644 --- a/packages/compass-data-modeling/src/services/data-model-storage.ts +++ b/packages/compass-data-modeling/src/services/data-model-storage.ts @@ -13,25 +13,27 @@ export const RelationshipSchema = z.object({ id: z.string().uuid(), relationship: z.tuple([RelationshipSideSchema, RelationshipSideSchema]), isInferred: z.boolean(), + note: z.string().optional(), }); export type Relationship = z.output; +const CollectionSchema = z.object({ + ns: z.string(), + jsonSchema: z.custom((value) => { + const isObject = typeof value === 'object' && value !== null; + return isObject && 'bsonType' in value; + }), + indexes: z.array(z.record(z.unknown())), + shardKey: z.record(z.unknown()).optional(), + displayPosition: z.tuple([z.number(), z.number()]), + note: z.string().optional(), +}); + +export type DataModelCollection = z.output; + export const StaticModelSchema = z.object({ - collections: z.array( - z.object({ - ns: z.string(), - jsonSchema: z.custom((value) => { - const isObject = typeof value === 'object' && value !== null; - return isObject && 'bsonType' in value; - }), - indexes: z.array(z.record(z.unknown())), - shardKey: z.record(z.unknown()).optional(), - displayPosition: z - .tuple([z.number(), z.number()]) - .or(z.tuple([z.nan(), z.nan()])), - }) - ), + collections: z.array(CollectionSchema), relationships: z.array(RelationshipSchema), }); @@ -64,9 +66,15 @@ const EditSchemaVariants = z.discriminatedUnion('type', [ ns: z.string(), newPosition: z.tuple([z.number(), z.number()]), }), + z.object({ + type: z.literal('UpdateCollectionNote'), + ns: z.string(), + note: z.string(), + }), ]); export const EditSchema = z.intersection(EditSchemaBase, EditSchemaVariants); + export const EditListSchema = z .array(EditSchema) .nonempty() diff --git a/packages/compass-data-modeling/src/services/open-and-download-diagram.ts b/packages/compass-data-modeling/src/services/open-and-download-diagram.ts index 9d21a4343df..3add9f83edd 100644 --- a/packages/compass-data-modeling/src/services/open-and-download-diagram.ts +++ b/packages/compass-data-modeling/src/services/open-and-download-diagram.ts @@ -14,7 +14,7 @@ export function downloadDiagram(fileName: string, edits: Edit[]) { } ); const url = window.URL.createObjectURL(blob); - downloadFile(url, `${fileName}.compass`, () => { + downloadFile(url, `${fileName}.mdm`, () => { window.URL.revokeObjectURL(url); }); } diff --git a/packages/compass-data-modeling/src/store/analysis-process.ts b/packages/compass-data-modeling/src/store/analysis-process.ts index a13740354f6..48cbec31c19 100644 --- a/packages/compass-data-modeling/src/store/analysis-process.ts +++ b/packages/compass-data-modeling/src/store/analysis-process.ts @@ -6,6 +6,8 @@ import { getCurrentDiagramFromState } from './diagram'; import type { Document } from 'bson'; import type { AggregationCursor } from 'mongodb'; import type { Relationship } from '../services/data-model-storage'; +import { applyLayout } from '@mongodb-js/diagramming'; +import { collectionToDiagramNode } from '../utils/nodes-and-edges'; export type AnalysisProcessState = { currentAnalysisOptions: @@ -62,7 +64,11 @@ export type AnalysisFinishedAction = { type: AnalysisProcessActionTypes.ANALYSIS_FINISHED; name: string; connectionId: string; - collections: { ns: string; schema: MongoDBJSONSchema }[]; + collections: { + ns: string; + schema: MongoDBJSONSchema; + position: { x: number; y: number }; + }[]; relations: Relationship[]; }; @@ -191,17 +197,38 @@ export function startAnalysis( return { ns, schema }; }) ); + if (options.automaticallyInferRelations) { // TODO } + if (cancelController.signal.aborted) { throw cancelController.signal.reason; } + + const positioned = await applyLayout( + collections.map((coll) => { + return collectionToDiagramNode({ + ns: coll.ns, + jsonSchema: coll.schema, + displayPosition: [0, 0], + }); + }), + [], + 'LEFT_RIGHT' + ); + dispatch({ type: AnalysisProcessActionTypes.ANALYSIS_FINISHED, name, connectionId, - collections, + collections: collections.map((coll) => { + const node = positioned.nodes.find((node) => { + return node.id === coll.ns; + }); + const position = node ? node.position : { x: 0, y: 0 }; + return { ...coll, position }; + }), relations: [], }); diff --git a/packages/compass-data-modeling/src/store/diagram.spec.ts b/packages/compass-data-modeling/src/store/diagram.spec.ts index 08ff588a9c3..5f88c90c6e9 100644 --- a/packages/compass-data-modeling/src/store/diagram.spec.ts +++ b/packages/compass-data-modeling/src/store/diagram.spec.ts @@ -2,12 +2,12 @@ import { expect } from 'chai'; import { type DataModelingStore, setupStore } from '../../test/setup-store'; import { applyEdit, - applyInitialLayout, getCurrentDiagramFromState, getCurrentModel, openDiagram, redoEdit, undoEdit, + selectFieldsForCurrentModel, } from './diagram'; import type { Edit, @@ -76,8 +76,16 @@ describe('Data Modeling store', function () { name: 'New Diagram', connectionId: 'connection-id', collections: [ - { ns: 'collection1', schema: model.collections[0].jsonSchema }, - { ns: 'collection2', schema: model.collections[1].jsonSchema }, + { + ns: 'collection1', + schema: model.collections[0].jsonSchema, + position: { x: 0, y: 0 }, + }, + { + ns: 'collection2', + schema: model.collections[1].jsonSchema, + position: { x: 0, y: 0 }, + }, ], relations: model.relationships, }; @@ -98,46 +106,16 @@ describe('Data Modeling store', function () { expect(initialEdit.model.collections[0]).to.deep.include({ ns: newDiagram.collections[0].ns, jsonSchema: newDiagram.collections[0].schema, - displayPosition: [NaN, NaN], + displayPosition: [0, 0], }); expect(initialEdit.model.collections[1]).to.deep.include({ ns: newDiagram.collections[1].ns, jsonSchema: newDiagram.collections[1].schema, - displayPosition: [NaN, NaN], + displayPosition: [0, 0], }); expect(initialEdit.model.relationships).to.deep.equal( newDiagram.relations ); - - // INITIAL LAYOUT - const positions: Record = { - [newDiagram.collections[0].ns]: [10, 10], - [newDiagram.collections[1].ns]: [50, 50], - }; - store.dispatch(applyInitialLayout(positions)); - - const diagramWithLayout = getCurrentDiagramFromState(store.getState()); - expect(diagramWithLayout.name).to.equal(newDiagram.name); - expect(diagramWithLayout.connectionId).to.equal(newDiagram.connectionId); - expect(diagramWithLayout.edits).to.have.length(1); - expect(diagramWithLayout.edits[0].type).to.equal('SetModel'); - const initialEditWithPositions = diagramWithLayout.edits[0] as Extract< - Edit, - { type: 'SetModel' } - >; - expect(initialEditWithPositions.model.collections[0]).to.deep.include({ - ns: newDiagram.collections[0].ns, - jsonSchema: newDiagram.collections[0].schema, - displayPosition: positions[newDiagram.collections[0].ns], - }); - expect(initialEditWithPositions.model.collections[1]).to.deep.include({ - ns: newDiagram.collections[1].ns, - jsonSchema: newDiagram.collections[1].schema, - displayPosition: positions[newDiagram.collections[1].ns], - }); - expect(initialEditWithPositions.model.relationships).to.deep.equal( - newDiagram.relations - ); }); }); @@ -318,4 +296,150 @@ describe('Data Modeling store', function () { expect(diagramAfterRedo.edits[0]).to.deep.include(loadedDiagram.edits[0]); expect(diagramAfterRedo.edits[1]).to.deep.include(edit); }); + + describe('selectFieldsForCurrentModel', function () { + it('should select fields from a flat schema', function () { + const edits: MongoDBDataModelDescription['edits'] = [ + { + id: 'first-edit', + timestamp: new Date().toISOString(), + type: 'SetModel', + model: { + collections: [ + { + ns: 'collection1', + indexes: [], + displayPosition: [0, 0], + shardKey: {}, + jsonSchema: { + bsonType: 'object', + properties: { + field1: { bsonType: 'string' }, + field2: { bsonType: 'int' }, + field3: { bsonType: 'int' }, + }, + }, + }, + ], + relationships: [], + }, + }, + ]; + const selectedFields = selectFieldsForCurrentModel(edits); + + expect(selectedFields).to.deep.equal({ + collection1: [['field1'], ['field2'], ['field3']], + }); + }); + + it('should select fields from a nested schema', function () { + const edits: MongoDBDataModelDescription['edits'] = [ + { + id: 'first-edit', + timestamp: new Date().toISOString(), + type: 'SetModel', + model: { + collections: [ + { + ns: 'collection1', + indexes: [], + displayPosition: [0, 0], + shardKey: {}, + jsonSchema: { + bsonType: 'object', + properties: { + prop1: { bsonType: 'string' }, + // Deeply nested properties + prop2: { + bsonType: 'object', + properties: { + prop2A: { bsonType: 'string' }, + prop2B: { + bsonType: 'object', + properties: { + prop2B1: { bsonType: 'string' }, + prop2B2: { bsonType: 'int' }, + }, + }, + }, + }, + // Array of objects + prop3: { + bsonType: 'array', + items: { + bsonType: 'object', + properties: { + prop3A: { bsonType: 'string' }, + }, + }, + }, + // Mixed type with objects + prop4: { + anyOf: [ + { + bsonType: 'object', + properties: { + prop4A: { bsonType: 'string' }, + }, + }, + { + bsonType: 'object', + properties: { + prop4B: { bsonType: 'string' }, + }, + }, + ], + }, + // Mixed array with objects + prop5: { + bsonType: 'array', + items: [ + { + bsonType: 'object', + properties: { + prop5A: { bsonType: 'string' }, + }, + }, + { + bsonType: 'object', + properties: { + prop5B: { bsonType: 'number' }, + }, + }, + ], + }, + }, + }, + }, + ], + relationships: [], + }, + }, + ]; + const selectedFields = selectFieldsForCurrentModel(edits); + + expect(selectedFields).to.have.property('collection1'); + expect(selectedFields.collection1).to.deep.include(['prop1']); + expect(selectedFields.collection1).to.deep.include(['prop2']); + expect(selectedFields.collection1).to.deep.include(['prop2', 'prop2A']); + expect(selectedFields.collection1).to.deep.include([ + 'prop2', + 'prop2B', + 'prop2B1', + ]); + expect(selectedFields.collection1).to.deep.include([ + 'prop2', + 'prop2B', + 'prop2B2', + ]); + expect(selectedFields.collection1).to.deep.include(['prop3']); + expect(selectedFields.collection1).to.deep.include(['prop3', 'prop3A']); + expect(selectedFields.collection1).to.deep.include(['prop4']); + expect(selectedFields.collection1).to.deep.include(['prop4', 'prop4A']); + expect(selectedFields.collection1).to.deep.include(['prop4', 'prop4B']); + expect(selectedFields.collection1).to.deep.include(['prop5']); + expect(selectedFields.collection1).to.deep.include(['prop5', 'prop5A']); + expect(selectedFields.collection1).to.deep.include(['prop5', 'prop5B']); + }); + }); }); diff --git a/packages/compass-data-modeling/src/store/diagram.ts b/packages/compass-data-modeling/src/store/diagram.ts index ce940c709ff..4b94f44ed58 100644 --- a/packages/compass-data-modeling/src/store/diagram.ts +++ b/packages/compass-data-modeling/src/store/diagram.ts @@ -17,7 +17,6 @@ import { showPrompt, } from '@mongodb-js/compass-components'; import { - downloadDiagram, getDiagramContentsFromFile, getDiagramName, } from '../services/open-and-download-diagram'; @@ -27,6 +26,8 @@ function isNonEmptyArray(arr: T[]): arr is [T, ...T[]] { return Array.isArray(arr) && arr.length > 0; } +export type SelectedItems = { type: 'collection' | 'relationship'; id: string }; + export type DiagramState = | (Omit & { edits: { @@ -35,7 +36,7 @@ export type DiagramState = next: Edit[][]; }; editErrors?: string[]; - selectedItems: { type: 'collection' | 'relationship'; id: string } | null; + selectedItems: SelectedItems | null; }) | null; // null when no diagram is currently open @@ -51,7 +52,6 @@ export enum DiagramActionTypes { COLLECTION_SELECTED = 'data-modeling/diagram/COLLECTION_SELECTED', RELATIONSHIP_SELECTED = 'data-modeling/diagram/RELATIONSHIP_SELECTED', DIAGRAM_BACKGROUND_SELECTED = 'data-modeling/diagram/DIAGRAM_BACKGROUND_SELECTED', - DRAWER_CLOSED = 'data-modeling/diagram/DRAWER_CLOSED', } export type OpenDiagramAction = { @@ -70,11 +70,6 @@ export type RenameDiagramAction = { name: string; }; -export type ApplyInitialLayoutAction = { - type: DiagramActionTypes.APPLY_INITIAL_LAYOUT; - positions: Record; -}; - export type ApplyEditAction = { type: DiagramActionTypes.APPLY_EDIT; edit: Edit; @@ -107,23 +102,17 @@ export type DiagramBackgroundSelectedAction = { type: DiagramActionTypes.DIAGRAM_BACKGROUND_SELECTED; }; -export type DrawerClosedAction = { - type: DiagramActionTypes.DRAWER_CLOSED; -}; - export type DiagramActions = | OpenDiagramAction | DeleteDiagramAction | RenameDiagramAction - | ApplyInitialLayoutAction | ApplyEditAction | ApplyEditFailedAction | UndoEditAction | RedoEditAction | CollectionSelectedAction | RelationSelectedAction - | DiagramBackgroundSelectedAction - | DrawerClosedAction; + | DiagramBackgroundSelectedAction; const INITIAL_STATE: DiagramState = null; @@ -164,8 +153,7 @@ export const diagramReducer: Reducer = ( collections: action.collections.map((collection) => ({ ns: collection.ns, jsonSchema: collection.schema, - displayPosition: [NaN, NaN], - // TODO + displayPosition: [collection.position.x, collection.position.y], indexes: [], shardKey: undefined, })), @@ -191,30 +179,6 @@ export const diagramReducer: Reducer = ( updatedAt: new Date().toISOString(), }; } - if (isAction(action, DiagramActionTypes.APPLY_INITIAL_LAYOUT)) { - const initialEdit = state.edits.current[0]; - if (!initialEdit || initialEdit.type !== 'SetModel') { - throw new Error('No initial model edit found to apply layout to'); - } - return { - ...state, - edits: { - ...state.edits, - current: [ - { - ...initialEdit, - model: { - ...initialEdit.model, - collections: initialEdit.model.collections.map((collection) => ({ - ...collection, - displayPosition: action.positions[collection.ns] || [NaN, NaN], - })), - }, - }, - ], - }, - }; - } if (isAction(action, DiagramActionTypes.APPLY_EDIT)) { const newState = { ...state, @@ -288,10 +252,7 @@ export const diagramReducer: Reducer = ( }, }; } - if ( - isAction(action, DiagramActionTypes.DIAGRAM_BACKGROUND_SELECTED) || - isAction(action, DiagramActionTypes.DRAWER_CLOSED) - ) { + if (isAction(action, DiagramActionTypes.DIAGRAM_BACKGROUND_SELECTED)) { return { ...state, selectedItems: null, @@ -306,10 +267,13 @@ export function selectCollection(namespace: string): CollectionSelectedAction { export function selectRelationship( relationshipId: string -): RelationSelectedAction { - return { - type: DiagramActionTypes.RELATIONSHIP_SELECTED, - relationshipId, +): DataModelingThunkAction { + return (dispatch, getState, { track }) => { + dispatch({ + type: DiagramActionTypes.RELATIONSHIP_SELECTED, + relationshipId, + }); + track('Data Modeling Relationship Form Opened', {}); }; } @@ -320,18 +284,22 @@ export function selectBackground(): DiagramBackgroundSelectedAction { } export function createNewRelationship( - namespace: string + localNamespace: string, + foreignNamespace: string | null = null ): DataModelingThunkAction { - return (dispatch) => { + return (dispatch, getState, { track }) => { const relationshipId = new UUID().toString(); + const currentNumberOfRelationships = getCurrentNumberOfRelationships( + getState() + ); dispatch( applyEdit({ type: 'AddRelationship', relationship: { id: relationshipId, relationship: [ - { ns: namespace, cardinality: 1, fields: null }, - { ns: null, cardinality: 1, fields: null }, + { ns: localNamespace, cardinality: 1, fields: null }, + { ns: foreignNamespace, cardinality: 1, fields: null }, ], isInferred: false, }, @@ -341,6 +309,9 @@ export function createNewRelationship( type: DiagramActionTypes.RELATIONSHIP_SELECTED, relationshipId, }); + track('Data Modeling Relationship Added', { + num_relationships: currentNumberOfRelationships + 1, + }); }; } @@ -399,18 +370,6 @@ export function applyEdit( }; } -export function applyInitialLayout( - positions: Record -): DataModelingThunkAction { - return (dispatch, getState, { dataModelStorage }) => { - dispatch({ - type: DiagramActionTypes.APPLY_INITIAL_LAYOUT, - positions, - }); - void dataModelStorage.save(getCurrentDiagramFromState(getState())); - }; -} - export function openDiagram( diagram: MongoDBDataModelDescription ): OpenDiagramAction { @@ -435,16 +394,6 @@ export function deleteDiagram( }; } -export function saveDiagram(): DataModelingThunkAction { - return (_dispatch, getState) => { - const { diagram } = getState(); - if (!diagram) { - return; - } - downloadDiagram(diagram.name, diagram.edits.current); - }; -} - export function renameDiagram( id: string // TODO maybe pass the whole thing here, we always have it when calling this, then we don't need to re-load storage ): DataModelingThunkAction, RenameDiagramAction> { @@ -473,7 +422,7 @@ export function renameDiagram( export function openDiagramFromFile( file: File ): DataModelingThunkAction, OpenDiagramAction> { - return async (dispatch, getState, { dataModelStorage }) => { + return async (dispatch, getState, { dataModelStorage, track }) => { try { const { name, edits } = await getDiagramContentsFromFile(file); @@ -490,6 +439,7 @@ export function openDiagramFromFile( edits, }; dispatch(openDiagram(diagram)); + track('Data Modeling Diagram Imported', {}); void dataModelStorage.save(diagram); } catch (error) { openToast('data-modeling-file-read-error', { @@ -510,12 +460,30 @@ export function updateRelationship( }); } -export function deleteRelationship(relationshipId: string) { - return applyEdit({ type: 'RemoveRelationship', relationshipId }); +export function deleteRelationship( + relationshipId: string +): DataModelingThunkAction { + return (dispatch, getState, { track }) => { + const currentNumberOfRelationships = getCurrentNumberOfRelationships( + getState() + ); + dispatch( + applyEdit({ + type: 'RemoveRelationship', + relationshipId, + }) + ); + track('Data Modeling Relationship Deleted', { + num_relationships: currentNumberOfRelationships - 1, + }); + }; } -export function closeDrawer(): DrawerClosedAction { - return { type: DiagramActionTypes.DRAWER_CLOSED }; +export function updateCollectionNote( + ns: string, + note: string +): DataModelingThunkAction { + return applyEdit({ type: 'UpdateCollectionNote', ns, note }); } function _applyEdit(edit: Edit, model?: StaticModel): StaticModel { @@ -568,6 +536,20 @@ function _applyEdit(edit: Edit, model?: StaticModel): StaticModel { }), }; } + case 'UpdateCollectionNote': { + return { + ...model, + collections: model.collections.map((collection) => { + if (collection.ns === edit.ns) { + return { + ...collection, + note: edit.note, + }; + } + return collection; + }), + }; + } default: { return model; } @@ -575,8 +557,8 @@ function _applyEdit(edit: Edit, model?: StaticModel): StaticModel { } /** - * @internal Exported for testing purposes only, use `selectCurrentModel` - * instead + * @internal Exported for testing purposes only, use `selectCurrentModel` or + * `selectCurrentModelFromState` instead */ export function getCurrentModel( edits: MongoDBDataModelDescription['edits'] @@ -627,16 +609,35 @@ export function getCurrentDiagramFromState( return { id, connectionId, name, edits, createdAt, updatedAt }; } +const selectCurrentDiagramFromState = memoize(getCurrentDiagramFromState); + /** * Memoised method to return computed model */ export const selectCurrentModel = memoize(getCurrentModel); +export const selectCurrentModelFromState = (state: DataModelingState) => { + return selectCurrentModel(selectCurrentDiagramFromState(state).edits); +}; + function extractFields( parentSchema: MongoDBJSONSchema, parentKey?: string[], fields: string[][] = [] ) { + if ('anyOf' in parentSchema && parentSchema.anyOf) { + for (const schema of parentSchema.anyOf) { + extractFields(schema, parentKey, fields); + } + } + if ('items' in parentSchema && parentSchema.items) { + const items = Array.isArray(parentSchema.items) + ? parentSchema.items + : [parentSchema.items]; + for (const schema of items) { + extractFields(schema, parentKey, fields); + } + } if ('properties' in parentSchema && parentSchema.properties) { for (const [key, value] of Object.entries(parentSchema.properties)) { const fullKey = parentKey ? [...parentKey, key] : [key]; @@ -669,3 +670,7 @@ export function getRelationshipForCurrentModel( (r) => r.id === relationshipId ); } + +function getCurrentNumberOfRelationships(state: DataModelingState): number { + return selectCurrentModelFromState(state).relationships.length; +} diff --git a/packages/compass-data-modeling/src/store/export-diagram.ts b/packages/compass-data-modeling/src/store/export-diagram.ts index 31e5034388c..d3d957b96d8 100644 --- a/packages/compass-data-modeling/src/store/export-diagram.ts +++ b/packages/compass-data-modeling/src/store/export-diagram.ts @@ -2,12 +2,13 @@ import type { Reducer } from 'redux'; import { isAction } from './util'; import type { DataModelingThunkAction } from './reducer'; import { exportToJson, exportToPng } from '../services/export-diagram'; -import { getCurrentDiagramFromState, selectCurrentModel } from './diagram'; +import { selectCurrentModelFromState } from './diagram'; import { openToast } from '@mongodb-js/compass-components'; import { isCancelError } from '@mongodb-js/compass-utils'; import type { DiagramInstance } from '@mongodb-js/diagramming'; +import { downloadDiagram } from '../services/open-and-download-diagram'; -export type ExportDiagramFormat = 'png' | 'json'; +export type ExportDiagramFormat = 'png' | 'json' | 'diagram'; export type ExportDiagramState = { isModalOpen: boolean; @@ -119,9 +120,7 @@ export function exportDiagram( new AbortController()); if (exportFormat === 'json') { - const model = selectCurrentModel( - getCurrentDiagramFromState(getState()).edits - ); + const model = selectCurrentModelFromState(getState()); exportToJson(diagram.name, model); } else if (exportFormat === 'png') { await exportToPng( @@ -129,6 +128,10 @@ export function exportDiagram( diagramInstance, cancelController.signal ); + } else if (exportFormat === 'diagram') { + downloadDiagram(diagram.name, diagram.edits.current); + } else { + throw new Error(`Unsupported export format: ${exportFormat}`); } track('Data Modeling Diagram Exported', { format: exportFormat, diff --git a/packages/compass-data-modeling/src/utils.ts b/packages/compass-data-modeling/src/utils.ts new file mode 100644 index 00000000000..8a7a933422a --- /dev/null +++ b/packages/compass-data-modeling/src/utils.ts @@ -0,0 +1,23 @@ +import toNS from 'mongodb-ns'; +import type { Relationship } from './services/data-model-storage'; + +export function getDefaultRelationshipName( + relationship: Relationship['relationship'] +): string { + const [local, foreign] = relationship; + let localLabel = ''; + let foreignLabel = ''; + if (local.ns) { + localLabel += toNS(local.ns).collection; + if (local.fields && local.fields.length) { + localLabel += `.${local.fields.join('.')}`; + } + } + if (foreign.ns) { + foreignLabel += toNS(foreign.ns).collection; + if (foreign.fields && foreign.fields.length) { + foreignLabel += `.${foreign.fields.join('.')}`; + } + } + return [localLabel, foreignLabel].join(` \u2192 `).trim(); +} diff --git a/packages/compass-data-modeling/src/utils/nodes-and-edges.spec.tsx b/packages/compass-data-modeling/src/utils/nodes-and-edges.spec.tsx new file mode 100644 index 00000000000..0d1b98e5c27 --- /dev/null +++ b/packages/compass-data-modeling/src/utils/nodes-and-edges.spec.tsx @@ -0,0 +1,475 @@ +import React from 'react'; +import { expect } from 'chai'; +import { + screen, + waitFor, + render, + userEvent, +} from '@mongodb-js/testing-library-compass'; +import { getFieldsFromSchema } from '../utils/nodes-and-edges'; + +describe('getFieldsFromSchema', function () { + const validateMixedType = async ( + type: React.ReactNode, + expectedTooltip: RegExp + ) => { + render(<>{type}); + const mixed = screen.getByText('(mixed)'); + expect(mixed).to.be.visible; + expect(screen.queryByText(expectedTooltip)).to.not.exist; + userEvent.hover(mixed); + await waitFor(() => { + expect(screen.getByText(expectedTooltip)).to.be.visible; + }); + }; + + describe('flat schema', function () { + it('return empty array for empty schema', function () { + const result = getFieldsFromSchema({}); + expect(result).to.deep.equal([]); + }); + + it('returns fields for a simple schema', function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + age: { bsonType: 'int' }, + }, + }); + expect(result).to.deep.equal([ + { + name: 'name', + type: 'string', + depth: 0, + glyphs: [], + variant: undefined, + }, + { name: 'age', type: 'int', depth: 0, glyphs: [], variant: undefined }, + ]); + }); + + it('returns mixed fields with tooltip on hover', async function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + age: { bsonType: ['int', 'string'] }, + }, + }); + expect(result[0]).to.deep.include({ + name: 'age', + depth: 0, + glyphs: [], + variant: undefined, + }); + await validateMixedType(result[0].type, /int, string/); + }); + + it('highlights the correct field', function () { + const result = getFieldsFromSchema( + { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + age: { bsonType: 'int' }, + profession: { bsonType: 'string' }, + }, + }, + [['age']] + ); + expect(result).to.deep.equal([ + { + name: 'name', + type: 'string', + depth: 0, + glyphs: [], + variant: undefined, + }, + { name: 'age', type: 'int', depth: 0, glyphs: [], variant: 'preview' }, + { + name: 'profession', + type: 'string', + depth: 0, + glyphs: [], + variant: undefined, + }, + ]); + }); + + it('highlights multiple fields', function () { + const result = getFieldsFromSchema( + { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + age: { bsonType: 'int' }, + profession: { bsonType: 'string' }, + }, + }, + [['age'], ['profession']] + ); + expect(result).to.deep.equal([ + { + name: 'name', + type: 'string', + depth: 0, + glyphs: [], + variant: undefined, + }, + { name: 'age', type: 'int', depth: 0, glyphs: [], variant: 'preview' }, + { + name: 'profession', + type: 'string', + depth: 0, + glyphs: [], + variant: 'preview', + }, + ]); + }); + }); + + describe('nested schema', function () { + it('returns fields for a nested schema', function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + person: { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + address: { + bsonType: 'object', + properties: { + street: { bsonType: 'string' }, + city: { bsonType: 'string' }, + }, + }, + }, + }, + }, + }); + expect(result).to.deep.equal([ + { + name: 'person', + type: 'object', + depth: 0, + glyphs: [], + variant: undefined, + }, + { + name: 'name', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'address', + type: 'object', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'street', + type: 'string', + depth: 2, + glyphs: [], + variant: undefined, + }, + { + name: 'city', + type: 'string', + depth: 2, + glyphs: [], + variant: undefined, + }, + ]); + }); + + it('highlights a field for a nested schema', function () { + const result = getFieldsFromSchema( + { + bsonType: 'object', + properties: { + person: { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + address: { + bsonType: 'object', + properties: { + street: { bsonType: 'string' }, + city: { bsonType: 'string' }, + }, + }, + }, + }, + }, + }, + [['person', 'address', 'street']] + ); + expect(result).to.deep.equal([ + { + name: 'person', + type: 'object', + depth: 0, + glyphs: [], + variant: undefined, + }, + { + name: 'name', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'address', + type: 'object', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'street', + type: 'string', + depth: 2, + glyphs: [], + variant: 'preview', + }, + { + name: 'city', + type: 'string', + depth: 2, + glyphs: [], + variant: undefined, + }, + ]); + }); + + it('highlights multiple fields for a nested schema', function () { + const result = getFieldsFromSchema( + { + bsonType: 'object', + properties: { + person: { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + address: { + bsonType: 'object', + properties: { + street: { bsonType: 'string' }, + city: { bsonType: 'string' }, + }, + }, + billingAddress: { + bsonType: 'object', + properties: { + street: { bsonType: 'string' }, + city: { bsonType: 'string' }, + }, + }, + }, + }, + }, + }, + [ + ['person', 'address', 'street'], + ['person', 'billingAddress', 'city'], + ] + ); + expect(result).to.deep.equal([ + { + name: 'person', + type: 'object', + depth: 0, + glyphs: [], + variant: undefined, + }, + { + name: 'name', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'address', + type: 'object', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'street', + type: 'string', + depth: 2, + glyphs: [], + variant: 'preview', + }, + { + name: 'city', + type: 'string', + depth: 2, + glyphs: [], + variant: undefined, + }, + { + name: 'billingAddress', + type: 'object', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'street', + type: 'string', + depth: 2, + glyphs: [], + variant: undefined, + }, + { + name: 'city', + type: 'string', + depth: 2, + glyphs: [], + variant: 'preview', + }, + ]); + }); + + it('returns [] for array', function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + tags: { + bsonType: 'array', + items: { bsonType: 'string' }, + }, + }, + }); + expect(result).to.deep.equal([ + { name: 'tags', type: '[]', depth: 0, glyphs: [], variant: undefined }, + ]); + }); + + it('returns fields for an array of objects', function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + todos: { + bsonType: 'array', + items: { + bsonType: 'object', + properties: { + title: { bsonType: 'string' }, + completed: { bsonType: 'boolean' }, + }, + }, + }, + }, + }); + expect(result).to.deep.equal([ + { name: 'todos', type: '[]', depth: 0, glyphs: [], variant: undefined }, + { + name: 'title', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'completed', + type: 'boolean', + depth: 1, + glyphs: [], + variant: undefined, + }, + ]); + }); + + it('returns fields for a mixed schema with objects', async function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + name: { + anyOf: [ + { bsonType: 'string' }, + { + bsonType: 'object', + properties: { + first: { bsonType: 'string' }, + last: { bsonType: 'string' }, + }, + }, + ], + }, + }, + }); + expect(result).to.have.lengthOf(3); + expect(result[0]).to.deep.include({ + name: 'name', + depth: 0, + glyphs: [], + variant: undefined, + }); + await validateMixedType(result[0].type, /string, object/); + expect(result[1]).to.deep.equal({ + name: 'first', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }); + expect(result[2]).to.deep.equal({ + name: 'last', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }); + }); + + it('returns fields for an array of mixed (including objects)', function () { + const result = getFieldsFromSchema({ + bsonType: 'object', + properties: { + todos: { + bsonType: 'array', + items: { + anyOf: [ + { + bsonType: 'object', + properties: { + title: { bsonType: 'string' }, + completed: { bsonType: 'boolean' }, + }, + }, + { bsonType: 'string' }, + ], + }, + }, + }, + }); + expect(result).to.deep.equal([ + { name: 'todos', type: '[]', depth: 0, glyphs: [], variant: undefined }, + { + name: 'title', + type: 'string', + depth: 1, + glyphs: [], + variant: undefined, + }, + { + name: 'completed', + type: 'boolean', + depth: 1, + glyphs: [], + variant: undefined, + }, + ]); + }); + }); +}); diff --git a/packages/compass-data-modeling/src/utils/nodes-and-edges.tsx b/packages/compass-data-modeling/src/utils/nodes-and-edges.tsx new file mode 100644 index 00000000000..30dbf336402 --- /dev/null +++ b/packages/compass-data-modeling/src/utils/nodes-and-edges.tsx @@ -0,0 +1,191 @@ +import React from 'react'; +import toNS from 'mongodb-ns'; +import { InlineDefinition, Body, css } from '@mongodb-js/compass-components'; +import type { NodeProps, EdgeProps } from '@mongodb-js/diagramming'; +import type { MongoDBJSONSchema } from 'mongodb-schema'; +import type { SelectedItems } from '../store/diagram'; +import type { + DataModelCollection, + Relationship, +} from '../services/data-model-storage'; + +function getBsonTypeName(bsonType: string) { + switch (bsonType) { + case 'array': + return '[]'; + default: + return bsonType; + } +} + +const mixedTypeTooltipContentStyles = css({ + overflowWrap: 'anywhere', + textWrap: 'wrap', + textAlign: 'left', +}); + +function getFieldTypeDisplay(bsonTypes: string[]) { + if (bsonTypes.length === 0) { + return 'unknown'; + } + + if (bsonTypes.length === 1) { + return getBsonTypeName(bsonTypes[0]); + } + + const typesString = bsonTypes + .map((bsonType) => getBsonTypeName(bsonType)) + .join(', '); + + // We show `mixed` with a tooltip when multiple bsonTypes were found. + return ( + + Multiple types found in sample: {typesString} + + } + > +
(mixed)
+
+ ); +} + +export const getSelectedFields = ( + selectedItems: SelectedItems | null, + relationships?: Relationship[] +): Record => { + if (!selectedItems || selectedItems.type !== 'relationship') return {}; + const { id } = selectedItems; + const { relationship } = relationships?.find((rel) => rel.id === id) ?? {}; + const selection: Record = {}; + if (relationship?.[0].ns && relationship?.[0].fields) { + selection[relationship[0].ns] = [relationship[0].fields]; + } + if (relationship?.[1].ns && relationship?.[1].fields) { + if (!selection[relationship[1].ns]) { + selection[relationship[1].ns] = []; + } + selection[relationship[1].ns]!.push(relationship[1].fields); + } + return selection; +}; + +export const getFieldsFromSchema = ( + jsonSchema: MongoDBJSONSchema, + highlightedFields: string[][] = [], + depth = 0 +): NodeProps['fields'] => { + if (!jsonSchema || !jsonSchema.properties) { + return []; + } + let fields: NodeProps['fields'] = []; + for (const [name, field] of Object.entries(jsonSchema.properties)) { + // field has types, properties and (optional) children + // types are either direct, or from anyof + // children are either direct (properties), from anyOf, items or items.anyOf + const types: (string | string[])[] = []; + const children: (MongoDBJSONSchema | MongoDBJSONSchema[])[] = []; + if (field.bsonType) { + types.push(field.bsonType); + } + if (field.properties) { + children.push(field); + } + if (field.items) { + children.push((field.items as MongoDBJSONSchema).anyOf || field.items); + } + if (field.anyOf) { + for (const variant of field.anyOf) { + if (variant.bsonType) { + types.push(variant.bsonType); + } + if (variant.properties) { + children.push(variant); + } + if (variant.items) { + children.push(variant.items); + } + } + } + + fields.push({ + name, + type: getFieldTypeDisplay(types.flat()), + depth: depth, + glyphs: types.length === 1 && types[0] === 'objectId' ? ['key'] : [], + variant: + highlightedFields.length && + highlightedFields.some( + (field) => field.length === 1 && field[0] === name + ) + ? 'preview' + : undefined, + }); + + if (children.length > 0) { + fields = [ + ...fields, + ...children.flat().flatMap((child) => + getFieldsFromSchema( + child, + highlightedFields + .filter((field) => field[0] === name) + .map((field) => field.slice(1)), + depth + 1 + ) + ), + ]; + } + } + + return fields; +}; + +export function collectionToDiagramNode( + coll: Pick, + options: { + selectedFields?: Record; + selected?: boolean; + isInRelationshipDrawingMode?: boolean; + } = {} +): NodeProps { + const { + selectedFields = {}, + selected = false, + isInRelationshipDrawingMode = false, + } = options; + + return { + id: coll.ns, + type: 'collection', + position: { + x: coll.displayPosition[0], + y: coll.displayPosition[1], + }, + title: toNS(coll.ns).collection, + fields: getFieldsFromSchema( + coll.jsonSchema, + selectedFields[coll.ns] ?? undefined, + 0 + ), + selected, + connectable: isInRelationshipDrawingMode, + draggable: !isInRelationshipDrawingMode, + }; +} + +export function relationshipToDiagramEdge( + relationship: Relationship, + selected = false +): EdgeProps { + const [source, target] = relationship.relationship; + return { + id: relationship.id, + source: source.ns ?? '', + target: target.ns ?? '', + markerStart: source.cardinality === 1 ? 'one' : 'many', + markerEnd: target.cardinality === 1 ? 'one' : 'many', + selected, + }; +} diff --git a/packages/compass-data-modeling/test/fixtures/data-model-with-relationships.json b/packages/compass-data-modeling/test/fixtures/data-model-with-relationships.json index 5b6a15ad07d..e76aa28a2bc 100644 --- a/packages/compass-data-modeling/test/fixtures/data-model-with-relationships.json +++ b/packages/compass-data-modeling/test/fixtures/data-model-with-relationships.json @@ -269,7 +269,7 @@ }, { "ns": "flights.airports", - "cardinality": 1, + "cardinality": 100, "fields": ["Country"] } ], diff --git a/packages/compass-e2e-tests/helpers/commands/connect-form.ts b/packages/compass-e2e-tests/helpers/commands/connect-form.ts index 1dcd2866f63..0ea156d1a39 100644 --- a/packages/compass-e2e-tests/helpers/commands/connect-form.ts +++ b/packages/compass-e2e-tests/helpers/commands/connect-form.ts @@ -498,10 +498,10 @@ export async function setConnectFormState( } if (state.connectionColor) { - await browser.selectOption( - Selectors.ConnectionFormConnectionColor, - colorValueToName(state.connectionColor) - ); + await browser.selectOption({ + selectSelector: Selectors.ConnectionFormConnectionColor, + optionText: colorValueToName(state.connectionColor), + }); } if (state.connectionFavorite) { diff --git a/packages/compass-e2e-tests/helpers/commands/get-input-by-label.ts b/packages/compass-e2e-tests/helpers/commands/get-input-by-label.ts new file mode 100644 index 00000000000..53150fbde44 --- /dev/null +++ b/packages/compass-e2e-tests/helpers/commands/get-input-by-label.ts @@ -0,0 +1,11 @@ +import type { ChainablePromiseElement } from 'webdriverio'; +import type { CompassBrowser } from '../compass-browser'; + +export async function getInputByLabel( + browser: CompassBrowser, + label: ChainablePromiseElement +): Promise { + await label.waitForDisplayed(); + const inputId = await label.getAttribute('for'); + return browser.$(`[id="${inputId}"]`); +} diff --git a/packages/compass-e2e-tests/helpers/commands/index.ts b/packages/compass-e2e-tests/helpers/commands/index.ts index 376e62d5fa2..3d08f092c1e 100644 --- a/packages/compass-e2e-tests/helpers/commands/index.ts +++ b/packages/compass-e2e-tests/helpers/commands/index.ts @@ -65,3 +65,4 @@ export * from './switch-pipeline-mode'; export * from './read-first-document-content'; export * from './read-stage-operators'; export * from './click-confirmation-action'; +export * from './get-input-by-label'; diff --git a/packages/compass-e2e-tests/helpers/commands/save-favorite.ts b/packages/compass-e2e-tests/helpers/commands/save-favorite.ts index 3635aaafd87..4b53e0ba15c 100644 --- a/packages/compass-e2e-tests/helpers/commands/save-favorite.ts +++ b/packages/compass-e2e-tests/helpers/commands/save-favorite.ts @@ -14,7 +14,10 @@ export async function saveFavorite( Selectors.ConnectionFormConnectionName, favoriteName ); - await browser.selectOption(Selectors.ConnectionFormConnectionColor, color); + await browser.selectOption({ + selectSelector: Selectors.ConnectionFormConnectionColor, + optionText: color, + }); await browser.clickVisible(Selectors.ConnectionModalSaveButton); await browser.$(Selectors.ConnectionModal).waitForExist({ reverse: true }); diff --git a/packages/compass-e2e-tests/helpers/commands/select-option.ts b/packages/compass-e2e-tests/helpers/commands/select-option.ts index daa3dbde13c..146827771f2 100644 --- a/packages/compass-e2e-tests/helpers/commands/select-option.ts +++ b/packages/compass-e2e-tests/helpers/commands/select-option.ts @@ -1,14 +1,25 @@ +import type { ChainablePromiseElement } from 'webdriverio'; import type { CompassBrowser } from '../compass-browser'; +type SelectOptionOptions = { + selectSelector: string | ChainablePromiseElement; +} & ( + | { + optionText: string; + optionSelector?: never; + } + | { + optionSelector: string; + optionText?: never; + } +); + export async function selectOption( browser: CompassBrowser, - // selector must match an element (like a div) that contains the leafygreen - // select we want to operate on - selector: string, - optionText: string + { selectSelector, optionText, optionSelector }: SelectOptionOptions ): Promise { // click the field's button - const selectButton = browser.$(`${selector}`); + const selectButton = browser.$(selectSelector); await selectButton.waitForDisplayed(); await selectButton.click(); @@ -26,9 +37,11 @@ export async function selectOption( await selectList.waitForDisplayed(); // click the option - const optionSpan = selectList.$(`span=${optionText}`); - await optionSpan.scrollIntoView(); - await optionSpan.click(); + const option = + optionText !== undefined + ? selectList.$(`span=${optionText}`) + : selectList.$(optionSelector); + await browser.clickVisible(option); // wait for the list to go away again await selectList.waitForDisplayed({ reverse: true }); diff --git a/packages/compass-e2e-tests/helpers/compass.ts b/packages/compass-e2e-tests/helpers/compass.ts index fc32b9e963d..8aa1f32765c 100644 --- a/packages/compass-e2e-tests/helpers/compass.ts +++ b/packages/compass-e2e-tests/helpers/compass.ts @@ -1223,7 +1223,7 @@ function redact(value: string): string { continue; } - const quoted = `'${process.env[field] as string}'`; + const quoted = `'${process.env[field]}'`; // /regex/s would be ideal, but we'd have to escape the value to not be // interpreted as a regex. while (value.indexOf(quoted) !== -1) { diff --git a/packages/compass-e2e-tests/helpers/selectors.ts b/packages/compass-e2e-tests/helpers/selectors.ts index 69a30fb2f47..18369d9b11e 100644 --- a/packages/compass-e2e-tests/helpers/selectors.ts +++ b/packages/compass-e2e-tests/helpers/selectors.ts @@ -1,3 +1,5 @@ +import { getDrawerIds } from '@mongodb-js/compass-components'; + export type WorkspaceTabSelectorOptions = { id?: string; connectionName?: string; @@ -730,6 +732,8 @@ export const HadronDocumentClickableKey = '[data-testid="hadron-document-clickable-key"]'; export const HadronDocumentKeyEditor = '[data-testid="hadron-document-key-editor"]'; +export const HadronDocumentTypeEditor = + '[data-testid="hadron-document-type-editor"]'; export const HadronDocumentValue = '[data-testid="hadron-document-element-value"]'; export const HadronDocumentValueEditor = @@ -1442,18 +1446,26 @@ export const CreateDataModelCollectionCheckbox = ( ): string => `${CreateDataModelModal} [data-testid="new-diagram-collection-checkbox-${collectionName}"]`; export const DataModelEditor = '[data-testid="diagram-editor-container"]'; +export const DataModelZoomOutButton = `${DataModelEditor} [aria-label="Minus Icon"]`; +export const DataModelZoomInButton = `${DataModelEditor} [aria-label="Plus Icon"]`; export const DataModelPreview = `${DataModelEditor} [data-testid="model-preview"]`; export const DataModelPreviewCollection = (collectionId: string) => - `${DataModelPreview} [data-nodeid="${collectionId}"]`; + `${DataModelPreview} [aria-roleDescription="node"][data-id="${collectionId}"]`; +export const DataModelPreviewRelationship = (relationshipId: string) => + `${DataModelPreview} [aria-roleDescription="edge"][data-id="${relationshipId}"]`; export const DataModelApplyEditor = `${DataModelEditor} [data-testid="apply-editor"]`; export const DataModelEditorApplyButton = `${DataModelApplyEditor} [data-testid="apply-button"]`; -export const DataModelDownloadButton = 'button[aria-label="Download"]'; export const DataModelUndoButton = 'button[aria-label="Undo"]'; export const DataModelRedoButton = 'button[aria-label="Redo"]'; +export const DataModelRelationshipDrawingButton = (isActive: boolean = false) => + `button[aria-label="${ + isActive ? 'Exit Relationship Drawing Mode' : 'Add Relationship' + }"]`; export const DataModelExportButton = 'button[aria-label="Export"]'; export const DataModelExportModal = '[data-testid="export-diagram-modal"]'; export const DataModelExportPngOption = `${DataModelExportModal} input[aria-label="PNG"]`; export const DataModelExportJsonOption = `${DataModelExportModal} input[aria-label="JSON"]`; +export const DataModelExportDiagramOption = `${DataModelExportModal} input[aria-label="Diagram File"]`; export const DataModelExportModalConfirmButton = '[data-testid="export-button"]'; export const DataModelsListItem = (diagramName?: string) => { @@ -1466,3 +1478,29 @@ export const DataModelsListItem = (diagramName?: string) => { export const DataModelsListItemActions = (diagramName: string) => `${DataModelsListItem(diagramName)} [aria-label="Show actions"]`; export const DataModelsListItemDeleteButton = `[data-action="delete"]`; +export const DataModelAddRelationshipBtn = 'aria/Add relationship'; +export const DataModelNameInput = '//label[text()="Name"]'; +export const DataModelRelationshipLocalCollectionSelect = + '//label[text()="Local collection"]'; +export const DataModelRelationshipLocalFieldSelect = + '//label[text()="Local field"]'; +export const DataModelRelationshipLocalCardinalitySelect = + '//label[text()="Local cardinality"]'; +export const DataModelRelationshipForeignCollectionSelect = + '//label[text()="Foreign collection"]'; +export const DataModelRelationshipForeignFieldSelect = + '//label[text()="Foreign field"]'; +export const DataModelRelationshipForeignCardinalitySelect = + '//label[text()="Foreign cardinality"]'; +export const DataModelRelationshipCardinalityOption = (value: string) => + `[role="option"][value="${value}"]`; +export const DataModelCollectionRelationshipItem = (relationshipId: string) => + `li[data-relationship-id="${relationshipId}"]`; +export const DataModelCollectionRelationshipItemEdit = `[aria-label="Edit relationship"]`; +export const DataModelCollectionRelationshipItemDelete = `[aria-label="Delete relationship"]`; + +// Side drawer +export const SideDrawer = `[data-testid="${getDrawerIds().root}"]`; +export const SideDrawerCloseButton = `[data-testid="${ + getDrawerIds().closeButton +}"]`; diff --git a/packages/compass-e2e-tests/package.json b/packages/compass-e2e-tests/package.json index da99d7bdbf9..b97bf7b43d0 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.39.0", + "version": "1.40.1", "private": true, "description": "E2E test suite for Compass app that follows smoke tests / feature testing matrix", "scripts": { @@ -32,9 +32,10 @@ }, "devDependencies": { "@electron/rebuild": "^4.0.1", - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-components": "^1.46.0", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/oidc-mock-provider": "^0.11.3", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -46,15 +47,15 @@ "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "clipboardy": "^2.3.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", - "electron-to-chromium": "^1.5.185", + "electron": "^37.2.5", + "electron-to-chromium": "^1.5.195", "glob": "^10.2.5", "globals": "^15.14.0", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", 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 f277b3a0da9..939c4944d36 100644 --- a/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts +++ b/packages/compass-e2e-tests/tests/collection-aggregations-tab.test.ts @@ -1596,10 +1596,12 @@ describe('Collection aggregations tab', function () { 'name' ); - await browser.selectOption( - `${Selectors.AggregationWizardSortFormDirectionSelect(0)} button`, - 'Ascending' - ); + await browser.selectOption({ + selectSelector: `${Selectors.AggregationWizardSortFormDirectionSelect( + 0 + )} button`, + optionText: 'Ascending', + }); await browser.clickVisible(Selectors.AggregationWizardApplyButton); diff --git a/packages/compass-e2e-tests/tests/collection-bulk-delete.test.ts b/packages/compass-e2e-tests/tests/collection-bulk-delete.test.ts index 385098ae8c5..297b9dee1a2 100644 --- a/packages/compass-e2e-tests/tests/collection-bulk-delete.test.ts +++ b/packages/compass-e2e-tests/tests/collection-bulk-delete.test.ts @@ -104,11 +104,14 @@ describe('Bulk Delete', function () { // The success toast is displayed await browser.$(Selectors.BulkDeleteSuccessToast).waitForDisplayed(); - const toastText = await browser - .$(Selectors.BulkDeleteSuccessToast) - .getText(); + await browser.waitUntil(async () => { + const toastText = await browser + .$(Selectors.BulkDeleteSuccessToast) + .getText(); + + return toastText.includes('1 document has been deleted.'); + }); - expect(toastText).to.contain('1 document has been deleted.'); // We close the toast await browser.clickVisible(Selectors.BulkDeleteSuccessToastDismissButton); diff --git a/packages/compass-e2e-tests/tests/collection-import.test.ts b/packages/compass-e2e-tests/tests/collection-import.test.ts index 58cdeeec56a..2c3087015f0 100644 --- a/packages/compass-e2e-tests/tests/collection-import.test.ts +++ b/packages/compass-e2e-tests/tests/collection-import.test.ts @@ -241,6 +241,20 @@ describe('Collection import', function () { `${Selectors.InsertDialog} ${Selectors.HadronDocumentAddSibling}` ); + // set the type to Date (this causes an error) + await browser + .$( + `${Selectors.InsertDialog} ${Selectors.HadronDocumentElement}:last-child ${Selectors.HadronDocumentTypeEditor}` + ) + .selectByAttribute('value', 'Date'); + + // set the type to String (this clears the error) + await browser + .$( + `${Selectors.InsertDialog} ${Selectors.HadronDocumentElement}:last-child ${Selectors.HadronDocumentTypeEditor}` + ) + .selectByAttribute('value', 'String'); + // Add field data await browser.setValueVisible( `${Selectors.InsertDialog} ${Selectors.HadronDocumentElement}:last-child ${Selectors.HadronDocumentKeyEditor}`, diff --git a/packages/compass-e2e-tests/tests/data-modeling-tab.test.ts b/packages/compass-e2e-tests/tests/data-modeling-tab.test.ts index e13543d242b..161a15503c4 100644 --- a/packages/compass-e2e-tests/tests/data-modeling-tab.test.ts +++ b/packages/compass-e2e-tests/tests/data-modeling-tab.test.ts @@ -27,8 +27,18 @@ interface Node { position: { x: number; y: number }; } +interface Edge { + id: string; + source: string; + target: string; + markerStart: string; + markerEnd: string; + selected: boolean; +} + type DiagramInstance = { getNodes: () => Array; + getEdges: () => Array; }; async function setupDiagram( @@ -52,17 +62,17 @@ async function setupDiagram( await browser.clickVisible(Selectors.CreateDataModelConfirmButton); // Select existing connection - await browser.selectOption( - Selectors.CreateDataModelConnectionSelector, - options.connectionName - ); + await browser.selectOption({ + selectSelector: Selectors.CreateDataModelConnectionSelector, + optionText: options.connectionName, + }); await browser.clickVisible(Selectors.CreateDataModelConfirmButton); // Select a database - await browser.selectOption( - Selectors.CreateDataModelDatabaseSelector, - options.databaseName - ); + await browser.selectOption({ + selectSelector: Selectors.CreateDataModelDatabaseSelector, + optionText: options.databaseName, + }); await browser.clickVisible(Selectors.CreateDataModelConfirmButton); // Ensure that all the collections are selected by default @@ -77,26 +87,83 @@ async function setupDiagram( await dataModelEditor.waitForDisplayed(); } -async function getDiagramNodes(browser: CompassBrowser): Promise { - const nodes = await browser.execute(function (selector) { - const node = document.querySelector(selector); - if (!node) { - throw new Error(`Element with selector ${selector} not found`); - } - return ( - node as Element & { _diagram: DiagramInstance } - )._diagram.getNodes(); - }, Selectors.DataModelEditor); +async function selectCollectionOnTheDiagram( + browser: CompassBrowser, + ns: string +) { + // If the drawer is open, close it + // Otherwise the drawer or the minimap can cover the collection node + const drawer = browser.$(Selectors.SideDrawer); + if (await drawer.isDisplayed()) { + await browser.clickVisible(Selectors.SideDrawerCloseButton); + await drawer.waitForDisplayed({ reverse: true }); + } + + // Click on the collection node to open the drawer + const collectionNode = browser.$(Selectors.DataModelPreviewCollection(ns)); + await collectionNode.waitForClickable(); + + await collectionNode.click(); + + await drawer.waitForDisplayed(); + + const collectionName = await browser.getInputByLabel( + drawer.$(Selectors.DataModelNameInput) + ); + expect(await collectionName.getValue()).to.equal(ns); +} + +async function getDiagramNodes( + browser: CompassBrowser, + expectedCount: number +): Promise { + let nodes: Node[] = []; + await browser.waitUntil(async () => { + nodes = await browser.execute(function (selector) { + const node = document.querySelector(selector); + if (!node) { + throw new Error(`Element with selector ${selector} not found`); + } + return ( + node as Element & { _diagram: DiagramInstance } + )._diagram.getNodes(); + }, Selectors.DataModelEditor); + return nodes.length === expectedCount; + }); return nodes; } +async function getDiagramEdges( + browser: CompassBrowser, + expectedCount: number +): Promise { + let edges: Edge[] = []; + await browser.waitUntil(async () => { + edges = await browser.execute(function (selector) { + const node = document.querySelector(selector); + if (!node) { + throw new Error(`Element with selector ${selector} not found`); + } + return ( + node as Element & { _diagram: DiagramInstance } + )._diagram.getEdges(); + }, Selectors.DataModelEditor); + return edges.length === expectedCount; + }); + return edges; +} + /** * Moves a node to the specified coordinates and returns its original position. */ -async function moveNode( +async function dragNode( browser: CompassBrowser, selector: string, - coordinates: { x: number; y: number } + pointerActionMoveParams: { + x: number; + y: number; + origin?: 'pointer' | 'viewport'; + } ) { const node = browser.$(selector); @@ -110,9 +177,9 @@ async function moveNode( y: Math.round(startPosition.y + nodeSize.height / 2), }) .down({ button: 0 }) // Left mouse button - .move({ ...coordinates, duration: 1000, origin: 'pointer' }) + .move({ duration: 1000, origin: 'pointer', ...pointerActionMoveParams }) .pause(1000) - .move({ ...coordinates, duration: 1000, origin: 'pointer' }) + .move({ duration: 1000, origin: 'pointer', ...pointerActionMoveParams }) .up({ button: 0 }) // Release the left mouse button .perform(); await browser.waitForAnimations(node); @@ -172,7 +239,7 @@ describe('Data Modeling tab', function () { const dataModelEditor = browser.$(Selectors.DataModelEditor); await dataModelEditor.waitForDisplayed(); - const nodes = await getDiagramNodes(browser); + const nodes = await getDiagramNodes(browser, 2); expect(nodes).to.have.lengthOf(2); expect(nodes[0].id).to.equal('test.testCollection-one'); expect(nodes[1].id).to.equal('test.testCollection-two'); @@ -184,7 +251,7 @@ describe('Data Modeling tab', function () { const testCollection1 = browser.$( Selectors.DataModelPreviewCollection('test.testCollection-one') ); - const startPosition = await moveNode( + const startPosition = await dragNode( browser, Selectors.DataModelPreviewCollection('test.testCollection-one'), { x: 100, y: 0 } @@ -215,7 +282,7 @@ describe('Data Modeling tab', function () { await browser.$(Selectors.DataModelEditor).waitForDisplayed(); // TODO: Verify that the diagram has the latest changes COMPASS-9479 - const savedNodes = await getDiagramNodes(browser); + const savedNodes = await getDiagramNodes(browser, 2); expect(savedNodes).to.have.lengthOf(2); // Open a new tab @@ -243,7 +310,7 @@ describe('Data Modeling tab', function () { const dataModelEditor = browser.$(Selectors.DataModelEditor); await dataModelEditor.waitForDisplayed(); - await moveNode( + await dragNode( browser, Selectors.DataModelPreviewCollection('test.testCollection-one'), { x: 100, y: 0 } @@ -386,9 +453,9 @@ describe('Data Modeling tab', function () { expect(text).to.include('String string'.toLowerCase()); }); - it('downloads the data model and opens it', async function () { + it('exports the data model to compass format and imports it back', async function () { const dataModelName = 'Test Export Model - Save-Open'; - exportFileName = `${dataModelName}.compass`; + exportFileName = `${dataModelName}.mdm`; await setupDiagram(browser, { diagramName: dataModelName, connectionName: DEFAULT_CONNECTION_NAME_1, @@ -398,7 +465,7 @@ describe('Data Modeling tab', function () { const dataModelEditor = browser.$(Selectors.DataModelEditor); await dataModelEditor.waitForDisplayed(); - await moveNode( + await dragNode( browser, Selectors.DataModelPreviewCollection('test.testCollection-one'), { x: 100, y: 0 } @@ -406,8 +473,12 @@ describe('Data Modeling tab', function () { await browser.waitForAnimations(dataModelEditor); - await browser.clickVisible(Selectors.DataModelDownloadButton); - await browser.waitForAnimations(dataModelEditor); + await browser.clickVisible(Selectors.DataModelExportButton); + const exportModal = browser.$(Selectors.DataModelExportModal); + await exportModal.waitForDisplayed(); + + await browser.clickParent(Selectors.DataModelExportDiagramOption); + await browser.clickVisible(Selectors.DataModelExportModalConfirmButton); const { fileExists, filePath } = await waitForFileDownload( exportFileName, @@ -433,7 +504,7 @@ describe('Data Modeling tab', function () { await browser.selectFile(Selectors.ImportDataModelInput, filePath); await browser.$(Selectors.DataModelEditor).waitForDisplayed(); - const savedNodes = await getDiagramNodes(browser); + const savedNodes = await getDiagramNodes(browser, 2); expect(savedNodes).to.have.lengthOf(2); expect(savedNodes[0].id).to.equal('test.testCollection-one'); @@ -452,4 +523,156 @@ describe('Data Modeling tab', function () { // The second one is the one we just opened expect(titles).to.include(`${dataModelName} (1)`); }); + + context('Drawer and Diagram interactions', function () { + it('allows relationship management via the sidebar', async function () { + const dataModelName = 'Test Add Relationship Manually'; + await setupDiagram(browser, { + diagramName: dataModelName, + connectionName: DEFAULT_CONNECTION_NAME_1, + databaseName: 'test', + }); + + const dataModelEditor = browser.$(Selectors.DataModelEditor); + await dataModelEditor.waitForDisplayed(); + + // There are no edges initially + await getDiagramEdges(browser, 0); + + // Click on the collection to open the drawer + await selectCollectionOnTheDiagram(browser, 'test.testCollection-one'); + + // Click the add relationship button + const drawer = browser.$(Selectors.SideDrawer); + + const addRelationshipBtn = browser.$( + Selectors.DataModelAddRelationshipBtn + ); + await addRelationshipBtn.waitForClickable(); + await addRelationshipBtn.click(); + + // Verify that the local collection is pre-selected + const localCollectionSelect = await browser.getInputByLabel( + drawer.$(Selectors.DataModelRelationshipLocalCollectionSelect) + ); + expect(await localCollectionSelect.getValue()).to.equal( + 'testCollection-one' + ); + + // Select the foreign collection + await browser.selectOption({ + selectSelector: await browser.getInputByLabel( + drawer.$(Selectors.DataModelRelationshipForeignCollectionSelect) + ), + optionText: 'testCollection-two', + }); + + // See the relationship on the diagram + const edges = await getDiagramEdges(browser, 1); + expect(edges).to.have.lengthOf(1); + expect(edges[0]).to.deep.include({ + source: 'test.testCollection-one', + target: 'test.testCollection-two', + markerStart: 'one', + markerEnd: 'one', + }); + const relationshipId = edges[0].id; + + // Select the other collection and see that the new relationship is listed + await selectCollectionOnTheDiagram(browser, 'test.testCollection-two'); + const relationshipItem = drawer.$( + Selectors.DataModelCollectionRelationshipItem(relationshipId) + ); + expect(await relationshipItem.isDisplayed()).to.be.true; + expect(await relationshipItem.getText()).to.include('testCollection-one'); + + // Edit the relationship + await relationshipItem.waitForDisplayed(); + await relationshipItem + .$(Selectors.DataModelCollectionRelationshipItemEdit) + .click(); + + await browser.selectOption({ + selectSelector: await browser.getInputByLabel( + drawer.$(Selectors.DataModelRelationshipForeignCardinalitySelect) + ), + optionSelector: Selectors.DataModelRelationshipCardinalityOption('100'), + }); + + // See the updated relationship on the diagram + const updatedEdges = await getDiagramEdges(browser, 1); + expect(updatedEdges).to.have.lengthOf(1); + expect(updatedEdges[0]).to.deep.include({ + source: 'test.testCollection-one', + target: 'test.testCollection-two', + markerStart: 'one', + markerEnd: 'many', + }); + + // Select the first collection again and delete the relationship + await selectCollectionOnTheDiagram(browser, 'test.testCollection-one'); + await relationshipItem.waitForDisplayed(); + await relationshipItem + .$(Selectors.DataModelCollectionRelationshipItemDelete) + .click(); + + // Verify that the relationship is removed from the list and the diagram + expect(await relationshipItem.isExisting()).to.be.false; + await getDiagramEdges(browser, 0); + }); + + it('adding relationship by drawing opens it in the sidebar', async function () { + const dataModelName = 'Test Relationship By Drawing'; + await setupDiagram(browser, { + diagramName: dataModelName, + connectionName: DEFAULT_CONNECTION_NAME_1, + databaseName: 'test', + }); + + await browser.clickVisible( + Selectors.DataModelRelationshipDrawingButton() + ); + + const targetNode = browser.$( + Selectors.DataModelPreviewCollection('test.testCollection-two') + ); + + const targetPosition = await targetNode.getLocation(); + const targetSize = await targetNode.getSize(); + + await dragNode( + browser, + Selectors.DataModelPreviewCollection('test.testCollection-one'), + { + x: Math.round(targetPosition.x + targetSize.width / 2), + y: Math.round(targetPosition.y + targetSize.height / 2), + origin: 'viewport', + } + ); + + const edges = await getDiagramEdges(browser, 1); + expect(edges).to.have.lengthOf(1); + expect(edges[0]).to.deep.include({ + source: 'test.testCollection-one', + target: 'test.testCollection-two', + markerStart: 'one', + markerEnd: 'one', + }); + + // Verify that the relationship is opened in the sidebar + const drawer = browser.$(Selectors.SideDrawer); + const localCollectionSelect = await browser.getInputByLabel( + drawer.$(Selectors.DataModelRelationshipLocalCollectionSelect) + ); + expect(await localCollectionSelect.getValue()).to.equal( + 'testCollection-one' + ); + const foreignCollectionSelect = await browser.getInputByLabel( + drawer.$(Selectors.DataModelRelationshipForeignCollectionSelect) + ); + expect(await foreignCollectionSelect.getValue()).to.equal( + 'testCollection-two' + ); + }); + }); }); 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 05660f653ea..cb4561df752 100644 --- a/packages/compass-e2e-tests/tests/my-queries-tab.test.ts +++ b/packages/compass-e2e-tests/tests/my-queries-tab.test.ts @@ -273,14 +273,14 @@ describe('My Queries tab', function () { // the open item modal - select a new collection const openModal = browser.$(Selectors.OpenSavedItemModal); await openModal.waitForDisplayed(); - await browser.selectOption( - `${Selectors.OpenSavedItemDatabaseField} button`, - 'test' - ); - await browser.selectOption( - `${Selectors.OpenSavedItemCollectionField} button`, - 'numbers-renamed' - ); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemDatabaseField} button`, + optionText: 'test', + }); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemCollectionField} button`, + optionText: 'numbers-renamed', + }); await browser.clickVisible(Selectors.OpenSavedItemModalConfirmButton); await openModal.waitForDisplayed({ reverse: true }); @@ -401,14 +401,14 @@ describe('My Queries tab', function () { // the open item modal - select a new collection const openModal = browser.$(Selectors.OpenSavedItemModal); await openModal.waitForDisplayed(); - await browser.selectOption( - `${Selectors.OpenSavedItemDatabaseField} button`, - 'test' - ); - await browser.selectOption( - `${Selectors.OpenSavedItemCollectionField} button`, - newCollectionName - ); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemDatabaseField} button`, + optionText: 'test', + }); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemCollectionField} button`, + optionText: newCollectionName, + }); await browser.clickParent( '[data-testid="update-query-aggregation-checkbox"]' @@ -515,18 +515,18 @@ describe('My Queries tab', function () { // the open item modal - select a new connection, database and collection const openModal = browser.$(Selectors.OpenSavedItemModal); await openModal.waitForDisplayed(); - await browser.selectOption( - `${Selectors.OpenSavedItemConnectionField} button`, - DEFAULT_CONNECTION_NAME_2 - ); - await browser.selectOption( - `${Selectors.OpenSavedItemDatabaseField} button`, - 'test' - ); - await browser.selectOption( - `${Selectors.OpenSavedItemCollectionField} button`, - newCollectionName - ); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemConnectionField} button`, + optionText: DEFAULT_CONNECTION_NAME_2, + }); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemDatabaseField} button`, + optionText: 'test', + }); + await browser.selectOption({ + selectSelector: `${Selectors.OpenSavedItemCollectionField} button`, + optionText: newCollectionName, + }); await browser.clickVisible(Selectors.OpenSavedItemModalConfirmButton); diff --git a/packages/compass-editor/package.json b/packages/compass-editor/package.json index 9c7d150eb1b..a8e21de9051 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.47.0", + "version": "0.49.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -46,10 +46,10 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -72,7 +72,7 @@ "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.38.0", "@lezer/highlight": "^1.2.1", - "@mongodb-js/compass-components": "^1.45.0", + "@mongodb-js/compass-components": "^1.47.0", "@mongodb-js/mongodb-constants": "^0.12.2", "mongodb-query-parser": "^4.3.0", "polished": "^4.2.2", diff --git a/packages/compass-explain-plan/package.json b/packages/compass-explain-plan/package.json index 6484de96c89..d48587dc39b 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.67.0", + "version": "6.69.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 ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "@types/d3-flextree": "^2.1.0", "@types/d3-hierarchy": "^3.1.2", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -68,15 +68,15 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/explain-plan-helper": "^1.4.15", - "compass-preferences-model": "^2.47.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/explain-plan-helper": "^1.4.16", + "compass-preferences-model": "^2.49.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 40fb2ff4c0a..a6357e7685c 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.43.0", + "version": "9.45.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,26 +48,26 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", "@mongodb-js/shell-bson-parser": "^1.2.0", - "bson-transpilers": "^3.2.15", - "compass-preferences-model": "^2.47.0", - "@mongodb-js/compass-app-registry": "^9.4.17", + "bson-transpilers": "^3.2.16", + "compass-preferences-model": "^2.49.0", + "@mongodb-js/compass-app-registry": "^9.4.18", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.3.6", "depcheck": "^1.4.1", diff --git a/packages/compass-field-store/package.json b/packages/compass-field-store/package.json index 9757b07a691..b15af6054f3 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.42.0", + "version": "9.44.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,10 +49,10 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/mocha": "^9.0.0", @@ -67,9 +67,9 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-app-registry": "^9.4.17", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-app-registry": "^9.4.18", "lodash": "^4.17.21", "mongodb-schema": "^12.6.2", "react": "^17.0.2", diff --git a/packages/compass-find-in-page/package.json b/packages/compass-find-in-page/package.json index d73da711f29..6fa1831519a 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.46.0", + "version": "4.48.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,10 +48,10 @@ }, "license": "SSPL", "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -61,7 +61,7 @@ "@types/sinon-chai": "^3.2.5", "chai": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -71,9 +71,9 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "hadron-ipc": "^3.5.9", "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 6db8fe99fe0..1a0b012acdd 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.47.0", + "version": "0.49.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -52,16 +52,16 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "mongodb": "^6.17.0", "mongodb-schema": "^12.6.2", "react": "^17.0.2", @@ -70,11 +70,11 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-global-writes/package.json b/packages/compass-global-writes/package.json index f75790f37e3..a74bb0c4fe0 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.26.0", + "version": "1.28.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.52.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-app-registry": "^9.4.17", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-app-registry": "^9.4.18", "lodash": "^4.17.21", - "@mongodb-js/compass-field-store": "^9.42.0", + "@mongodb-js/compass-field-store": "^9.44.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -65,10 +65,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-import-export/package.json b/packages/compass-import-export/package.json index f4974b58061..d9986204b26 100644 --- a/packages/compass-import-export/package.json +++ b/packages/compass-import-export/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "7.66.0", + "version": "7.68.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,23 +49,23 @@ }, "dependencies": { "@electron/remote": "^2.1.3", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "debug": "^4.3.4", - "electron": "^37.2.2", - "hadron-document": "^8.9.3", - "hadron-ipc": "^3.5.7", + "electron": "^37.2.5", + "hadron-document": "^8.9.4", + "hadron-ipc": "^3.5.9", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", "mongodb-schema": "^12.6.2", @@ -78,11 +78,11 @@ "strip-bom-stream": "^4.0.0" }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/compass-test-server": "^0.3.16", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-as-promised": "^7.1.4", diff --git a/packages/compass-indexes/package.json b/packages/compass-indexes/package.json index 920133d918c..27a0715de32 100644 --- a/packages/compass-indexes/package.json +++ b/packages/compass-indexes/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "5.66.0", + "version": "5.68.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 ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/numeral": "^2.0.5", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -66,24 +66,24 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/mongodb-constants": "^0.12.2", "@mongodb-js/shell-bson-parser": "^1.2.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", "mongodb-mql-engines": "^0.0.4", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", diff --git a/packages/compass-indexes/src/components/create-index-modal/create-index-modal.tsx b/packages/compass-indexes/src/components/create-index-modal/create-index-modal.tsx index b49fe7b8ae7..4cbf69711d1 100644 --- a/packages/compass-indexes/src/components/create-index-modal/create-index-modal.tsx +++ b/packages/compass-indexes/src/components/create-index-modal/create-index-modal.tsx @@ -24,7 +24,7 @@ import { useTrackOnChange, type TrackFunction, useFireExperimentViewed, - TestName, + ExperimentTestName, useTelemetry, } from '@mongodb-js/compass-telemetry/provider'; import { useConnectionInfoRef } from '@mongodb-js/compass-connections/provider'; @@ -91,7 +91,7 @@ function CreateIndexModal({ usePreference('showIndexesGuidanceVariant') && enableInIndexesGuidanceExp; useFireExperimentViewed({ - testName: TestName.earlyJourneyIndexesGuidance, + testName: ExperimentTestName.earlyJourneyIndexesGuidance, shouldFire: enableInIndexesGuidanceExp && isVisible, }); diff --git a/packages/compass-intercom/package.json b/packages/compass-intercom/package.json index dc4f11d4709..10bb1ea7fe3 100644 --- a/packages/compass-intercom/package.json +++ b/packages/compass-intercom/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.31.0", + "version": "0.33.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -50,7 +50,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -65,7 +65,7 @@ "typescript": "^5.8.3" }, "dependencies": { - "compass-preferences-model": "^2.47.0", - "@mongodb-js/compass-logging": "^1.7.8" + "compass-preferences-model": "^2.49.0", + "@mongodb-js/compass-logging": "^1.7.10" } } diff --git a/packages/compass-logging/package.json b/packages/compass-logging/package.json index f18e75719d7..64f15ae2d48 100644 --- a/packages/compass-logging/package.json +++ b/packages/compass-logging/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.7.8", + "version": "1.7.10", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -52,14 +52,14 @@ }, "dependencies": { "debug": "^4.3.4", - "@mongodb-js/compass-app-registry": "^9.4.17", - "hadron-ipc": "^3.5.7", + "@mongodb-js/compass-app-registry": "^9.4.18", + "hadron-ipc": "^3.5.9", "is-electron-renderer": "^2.0.1", "mongodb-log-writer": "^2.3.4", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/compass-maybe-protect-connection-string/package.json b/packages/compass-maybe-protect-connection-string/package.json index a6a99994705..e3377c1a97c 100644 --- a/packages/compass-maybe-protect-connection-string/package.json +++ b/packages/compass-maybe-protect-connection-string/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.45.0", + "version": "0.47.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -50,11 +50,11 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "mongodb-connection-string-url": "^3.0.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/compass-preferences-model/package.json b/packages/compass-preferences-model/package.json index b0021367049..46480f3adc4 100644 --- a/packages/compass-preferences-model/package.json +++ b/packages/compass-preferences-model/package.json @@ -2,7 +2,7 @@ "name": "compass-preferences-model", "description": "Compass preferences model", "author": "Lucas Hrabovsky ", - "version": "2.47.0", + "version": "2.49.0", "bugs": { "url": "https://jira.mongodb.org/projects/COMPASS/issues", "email": "compass@mongodb.com" @@ -49,22 +49,22 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-user-data": "^0.8.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-user-data": "^0.8.4", "@mongodb-js/devtools-proxy-support": "^0.5.1", "bson": "^6.10.4", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "react": "^17.0.2", "yargs-parser": "^21.1.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/js-yaml": "^4.0.5", "@types/yargs-parser": "21.0.0", diff --git a/packages/compass-preferences-model/src/feature-flags.ts b/packages/compass-preferences-model/src/feature-flags.ts index 22ac1514575..ca4d0fe0b2d 100644 --- a/packages/compass-preferences-model/src/feature-flags.ts +++ b/packages/compass-preferences-model/src/feature-flags.ts @@ -144,7 +144,7 @@ export const featureFlags: Required<{ }, enableContextMenus: { - stage: 'development', + stage: 'released', description: { short: 'Enable context (right-click) menus', }, diff --git a/packages/compass-preferences-model/src/preferences-schema.tsx b/packages/compass-preferences-model/src/preferences-schema.tsx index 93b5a6540d0..99c6d135a0b 100644 --- a/packages/compass-preferences-model/src/preferences-schema.tsx +++ b/packages/compass-preferences-model/src/preferences-schema.tsx @@ -101,6 +101,7 @@ export type UserConfigurablePreferences = PermanentFeatureFlags & enableCreatingNewConnections: boolean; enableProxySupport: boolean; proxy: string; + inferNamespacesFromPrivileges?: boolean; }; /** @@ -1012,6 +1013,18 @@ export const storedUserPreferencesProps: Required<{ type: 'boolean', }, + inferNamespacesFromPrivileges: { + ui: true, + cli: true, + global: true, + description: { + short: 'Infer additional namespaces from privileges', + long: "Show databases and collections implied by your roles and privileges, in addition to those returned by listDatabases and listCollections. This may include namespaces that don't exist yet.", + }, + validator: z.boolean().default(true), + type: 'boolean', + }, + ...allFeatureFlagsProps, }; diff --git a/packages/compass-query-bar/package.json b/packages/compass-query-bar/package.json index 1223cfb1ebe..2120babf7a0 100644 --- a/packages/compass-query-bar/package.json +++ b/packages/compass-query-bar/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "8.68.0", + "version": "8.70.0", "homepage": "https://github.com/mongodb-js/compass", "license": "SSPL", "bugs": { @@ -48,14 +48,14 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", @@ -65,27 +65,27 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "mongodb-query-parser": "^4.3.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "react": "^17.0.2", "react-redux": "^8.1.3", diff --git a/packages/compass-saved-aggregations-queries/package.json b/packages/compass-saved-aggregations-queries/package.json index b526edb9bbd..b6ee87081e9 100644 --- a/packages/compass-saved-aggregations-queries/package.json +++ b/packages/compass-saved-aggregations-queries/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.67.0", + "version": "1.69.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,18 +48,18 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-form": "^1.59.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-form": "^1.61.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "fuse.js": "^6.5.3", "mongodb-ns": "^2.4.2", "react": "^17.0.2", @@ -68,10 +68,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-schema-validation/package.json b/packages/compass-schema-validation/package.json index 38fc07f77f6..92399df0c74 100644 --- a/packages/compass-schema-validation/package.json +++ b/packages/compass-schema-validation/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "6.67.0", + "version": "6.69.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,39 +48,39 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", - "hadron-ipc": "^3.5.7", + "hadron-ipc": "^3.5.9", "mocha": "^10.2.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^8.1.1", "typescript": "^5.8.3" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongodb-js/mongodb-constants": "^0.12.2", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "javascript-stringify": "^2.0.1", "lodash": "^4.17.21", "mongodb": "^6.17.0", diff --git a/packages/compass-schema/package.json b/packages/compass-schema/package.json index 615c1daae4c..b76caeebad8 100644 --- a/packages/compass-schema/package.json +++ b/packages/compass-schema/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "6.68.0", + "version": "6.70.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,11 +48,11 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/leaflet": "^1.9.8", @@ -71,26 +71,26 @@ "xvfb-maybe": "^0.2.1" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/connection-storage": "^0.44.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "d3": "^3.5.17", - "hadron-document": "^8.9.3", + "hadron-document": "^8.9.4", "leaflet": "^1.5.1", "leaflet-defaulticon-compatibility": "^0.1.1", "leaflet-draw": "^1.0.4", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-query-util": "^2.5.3", + "mongodb-query-util": "^2.5.4", "mongodb-schema": "^12.6.2", "numeral": "^1.5.6", "prop-types": "^15.7.2", diff --git a/packages/compass-serverstats/package.json b/packages/compass-serverstats/package.json index f48ead9887e..705b11a92c8 100644 --- a/packages/compass-serverstats/package.json +++ b/packages/compass-serverstats/package.json @@ -2,7 +2,7 @@ "name": "@mongodb-js/compass-serverstats", "description": "Compass Real Time", "private": true, - "version": "16.66.0", + "version": "16.68.0", "main": "dist/index.js", "compass:main": "src/index.ts", "exports": { @@ -30,15 +30,15 @@ }, "license": "SSPL", "dependencies": { - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", "d3": "^3.5.17", "d3-timer": "^1.0.3", "debug": "^4.3.4", - "@mongodb-js/compass-app-registry": "^9.4.17", + "@mongodb-js/compass-app-registry": "^9.4.18", "lodash": "^4.17.21", "mongodb-ns": "^2.4.2", "prop-types": "^15.7.2", @@ -46,10 +46,10 @@ "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/d3": "^3.5.x", "chai": "^4.1.2", diff --git a/packages/compass-settings/package.json b/packages/compass-settings/package.json index 71f8564b8b1..11a3d6089b7 100644 --- a/packages/compass-settings/package.json +++ b/packages/compass-settings/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.65.0", + "version": "0.67.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,23 +49,23 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "compass-preferences-model": "^2.47.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "hadron-ipc": "^3.5.7", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "compass-preferences-model": "^2.49.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "hadron-ipc": "^3.5.9", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-settings/src/components/settings/general.tsx b/packages/compass-settings/src/components/settings/general.tsx index 92516f7e073..5b9375c1c35 100644 --- a/packages/compass-settings/src/components/settings/general.tsx +++ b/packages/compass-settings/src/components/settings/general.tsx @@ -14,6 +14,7 @@ const generalFields = [ : []), 'enableShowDialogOnQuit', 'enableDbAndCollStats', + 'inferNamespacesFromPrivileges', ] as const; export const GeneralSettings: React.FunctionComponent = () => { diff --git a/packages/compass-shell/package.json b/packages/compass-shell/package.json index 448bb1a582b..4bb48fcf798 100644 --- a/packages/compass-shell/package.json +++ b/packages/compass-shell/package.json @@ -6,7 +6,7 @@ "email": "compass@mongodb.com" }, "private": true, - "version": "3.66.0", + "version": "3.68.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,34 +49,34 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-workspaces": "^0.48.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-workspaces": "^0.50.0", "@mongosh/browser-repl": "^3.16.4", "@mongosh/logging": "^3.9.2", "@mongosh/node-runtime-worker-thread": "^3.3.18", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "react": "^17.0.2", "react-redux": "^8.1.3", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "chai": "^4.2.0", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", "nyc": "^15.1.0", diff --git a/packages/compass-sidebar/package.json b/packages/compass-sidebar/package.json index e04cb9aa054..b95ed4aedd9 100644 --- a/packages/compass-sidebar/package.json +++ b/packages/compass-sidebar/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "5.67.0", + "version": "5.69.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,22 +48,22 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-connections-navigation": "^1.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-maybe-protect-connection-string": "^0.45.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-connections-navigation": "^1.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-maybe-protect-connection-string": "^0.47.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/mongodb-constants": "^0.12.2", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", - "mongodb-instance-model": "^12.39.0", + "mongodb-instance-model": "^12.41.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -71,10 +71,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", @@ -86,7 +86,7 @@ "depcheck": "^1.4.1", "electron-mocha": "^12.2.0", "mocha": "^10.2.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "nyc": "^15.1.0", "react-dom": "^17.0.2", "sinon": "^9.2.3", diff --git a/packages/compass-sidebar/src/components/use-filtered-connections.spec.ts b/packages/compass-sidebar/src/components/use-filtered-connections.spec.ts index 0c171690dd5..854f5229066 100644 --- a/packages/compass-sidebar/src/components/use-filtered-connections.spec.ts +++ b/packages/compass-sidebar/src/components/use-filtered-connections.spec.ts @@ -51,7 +51,7 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'coll_ready_1_1_2', @@ -59,12 +59,12 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, ], collectionsLength: 1, collectionsStatus: 'ready', - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'db_ready_1_2', @@ -76,7 +76,7 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'coll_ready_1_2_2', @@ -84,12 +84,12 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, ], collectionsLength: 1, collectionsStatus: 'ready', - isNonExistent: false, + inferredFromPrivileges: false, }, ], databasesStatus: 'ready', @@ -116,7 +116,7 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, { _id: 'coll_ready_2_2', @@ -124,12 +124,12 @@ const sidebarConnections: SidebarConnection[] = [ type: 'collection', sourceName: '', pipeline: [], - isNonExistent: false, + inferredFromPrivileges: false, }, ], collectionsLength: 1, collectionsStatus: 'ready', - isNonExistent: false, + inferredFromPrivileges: false, }, ], databasesStatus: 'ready', diff --git a/packages/compass-sidebar/src/modules/databases.spec.ts b/packages/compass-sidebar/src/modules/databases.spec.ts index 7f351ce6325..67e521bb09a 100644 --- a/packages/compass-sidebar/src/modules/databases.spec.ts +++ b/packages/compass-sidebar/src/modules/databases.spec.ts @@ -17,12 +17,12 @@ async function createDatabases(dbs: any[] = []) { }; } ); - return data.map(({ is_non_existent, collections, ...rest }) => ({ + return data.map(({ inferred_from_privileges, collections, ...rest }) => ({ ...rest, - isNonExistent: is_non_existent, - collections: collections.map(({ is_non_existent, ...coll }) => ({ + inferredFromPrivileges: inferred_from_privileges, + collections: collections.map(({ inferred_from_privileges, ...coll }) => ({ ...coll, - isNonExistent: is_non_existent, + inferredFromPrivileges: inferred_from_privileges, })), })); } diff --git a/packages/compass-sidebar/src/modules/databases.ts b/packages/compass-sidebar/src/modules/databases.ts index e879bec1859..aaa4d08fdd5 100644 --- a/packages/compass-sidebar/src/modules/databases.ts +++ b/packages/compass-sidebar/src/modules/databases.ts @@ -45,13 +45,13 @@ export type Database = Pick< InstanceDatabase, '_id' | 'name' | 'collectionsStatus' | 'collectionsLength' > & { - isNonExistent: boolean; + inferredFromPrivileges: boolean; collections: Array< Pick< InstanceDatabase['collections'][number], '_id' | 'name' | 'type' | 'sourceName' | 'pipeline' > & { - isNonExistent: boolean; + inferredFromPrivileges: boolean; } >; }; diff --git a/packages/compass-sidebar/src/modules/instance.ts b/packages/compass-sidebar/src/modules/instance.ts index b9c81eafbdc..d714c50ae57 100644 --- a/packages/compass-sidebar/src/modules/instance.ts +++ b/packages/compass-sidebar/src/modules/instance.ts @@ -132,7 +132,7 @@ export const setupInstance = name: db.name, collectionsStatus: db.collectionsStatus, collectionsLength: db.collectionsLength, - isNonExistent: db.is_non_existent, + inferredFromPrivileges: db.inferred_from_privileges, }; } @@ -143,7 +143,7 @@ export const setupInstance = type: coll.type, sourceName: coll.sourceName, pipeline: coll.pipeline, - isNonExistent: coll.is_non_existent, + inferredFromPrivileges: coll.inferred_from_privileges, }; } diff --git a/packages/compass-sidebar/test/helpers.ts b/packages/compass-sidebar/test/helpers.ts index 7219d48af7d..67d2749cf8c 100644 --- a/packages/compass-sidebar/test/helpers.ts +++ b/packages/compass-sidebar/test/helpers.ts @@ -18,11 +18,11 @@ export function createInstance( databases: dbs.map((db) => { return { _id: db._id, - is_non_existent: false, + inferred_from_privileges: false, collections: (db.collections || []).map((coll) => { return { _id: `${db._id}.${coll}`, - is_non_existent: false, + inferred_from_privileges: false, }; }), }; diff --git a/packages/compass-smoke-tests/package.json b/packages/compass-smoke-tests/package.json index 48bb1785cc1..b453cfdc55e 100644 --- a/packages/compass-smoke-tests/package.json +++ b/packages/compass-smoke-tests/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.1.27", + "version": "1.1.29", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -31,14 +31,14 @@ }, "devDependencies": { "@actions/github": "^6.0.0", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/node": "^20", - "compass-e2e-tests": "^1.39.0", + "compass-e2e-tests": "^1.40.1", "depcheck": "^1.4.1", "debug": "^4.3.4", - "hadron-build": "^25.8.7", + "hadron-build": "^25.8.9", "lodash": "^4.17.21", "typescript": "^5.8.3", "yargs": "^17.7.2" diff --git a/packages/compass-telemetry/.eslintrc.js b/packages/compass-telemetry/.eslintrc.js index e4cf824b6ac..49d6d33c515 100644 --- a/packages/compass-telemetry/.eslintrc.js +++ b/packages/compass-telemetry/.eslintrc.js @@ -5,4 +5,26 @@ module.exports = { tsconfigRootDir: __dirname, project: ['./tsconfig-lint.json'], }, + overrides: [ + { + files: ['./src/**/*.ts', './src/**/*.tsx'], + rules: { + 'no-restricted-imports': 'off', + '@typescript-eslint/no-restricted-imports': [ + 'error', + { + paths: [ + { + name: '@mongodb-js/mdb-experiment-js', + message: + 'Use type-only imports from @mongodb-js/mdb-experiment-js', + allowTypeImports: true, + }, + ], + }, + ], + '@typescript-eslint/no-redundant-type-constituents': 'off', + }, + }, + ], }; diff --git a/packages/compass-telemetry/package.json b/packages/compass-telemetry/package.json index 894ea506358..90bfe021ea7 100644 --- a/packages/compass-telemetry/package.json +++ b/packages/compass-telemetry/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.10.6", + "version": "1.12.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -52,13 +52,14 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-app-registry": "^9.4.17", - "hadron-ipc": "^3.5.7", - "react": "^17.0.2" + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-app-registry": "^9.4.18", + "hadron-ipc": "^3.5.9", + "react": "^17.0.2", + "@mongodb-js/mdb-experiment-js": "1.9.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/compass-telemetry/src/experimentation-provider.tsx b/packages/compass-telemetry/src/experimentation-provider.tsx new file mode 100644 index 00000000000..3055fd255a3 --- /dev/null +++ b/packages/compass-telemetry/src/experimentation-provider.tsx @@ -0,0 +1,63 @@ +import React, { createContext, useContext, useRef } from 'react'; +import type { types } from '@mongodb-js/mdb-experiment-js'; +import type { typesReact } from '@mongodb-js/mdb-experiment-js/react'; +import type { ExperimentTestName } from './growth-experiments'; + +type UseAssignmentHook = ( + experimentName: ExperimentTestName, + trackIsInSample: boolean, + options?: typesReact.UseAssignmentOptions +) => typesReact.UseAssignmentResponse; + +type AssignExperimentFn = ( + experimentName: ExperimentTestName, + options?: types.AssignOptions +) => Promise; + +interface CompassExperimentationProviderContextValue { + useAssignment: UseAssignmentHook; + assignExperiment: AssignExperimentFn; +} + +const initialContext: CompassExperimentationProviderContextValue = { + useAssignment() { + return { + assignment: null, + asyncStatus: null, + error: null, + isLoading: false, + isError: false, + isSuccess: true, + }; + }, + assignExperiment() { + return Promise.resolve(null); + }, +}; + +export const ExperimentationContext = + createContext(initialContext); + +// Provider component that accepts MMS experiment utils as props +export const CompassExperimentationProvider: React.FC<{ + children: React.ReactNode; + useAssignment: UseAssignmentHook; + assignExperiment: AssignExperimentFn; +}> = ({ children, useAssignment, assignExperiment }) => { + // Use useRef to keep the functions up-to-date; Use mutation pattern to maintain the + // same object reference to prevent unnecessary re-renders of consuming components + const { current: contextValue } = useRef({ useAssignment, assignExperiment }); + contextValue.useAssignment = useAssignment; + contextValue.assignExperiment = assignExperiment; + + return ( + + {children} + + ); +}; + +// Hook for components to access experiment assignment +export const useAssignment = (...args: Parameters) => { + return useContext(ExperimentationContext).useAssignment(...args); +}; diff --git a/packages/compass-telemetry/src/growth-experiments.ts b/packages/compass-telemetry/src/growth-experiments.ts index dfe4d52cd11..87437d07e5b 100644 --- a/packages/compass-telemetry/src/growth-experiments.ts +++ b/packages/compass-telemetry/src/growth-experiments.ts @@ -1,3 +1,4 @@ -export enum TestName { +export enum ExperimentTestName { earlyJourneyIndexesGuidance = 'EARLY_JOURNEY_INDEXES_GUIDANCE_20250328', + mockDataGenerator = 'MOCK_DATA_GENERATOR_20251001', } diff --git a/packages/compass-telemetry/src/index.ts b/packages/compass-telemetry/src/index.ts index a2e155c8073..248c878dc21 100644 --- a/packages/compass-telemetry/src/index.ts +++ b/packages/compass-telemetry/src/index.ts @@ -5,3 +5,7 @@ export type { IdentifyTraits, ExtraConnectionData, } from './types'; + +export { CompassExperimentationProvider } from './experimentation-provider'; +export { experimentationServiceLocator } from './provider'; +export { ExperimentTestName } from './growth-experiments'; diff --git a/packages/compass-telemetry/src/provider.tsx b/packages/compass-telemetry/src/provider.tsx index 3ff409becb3..9eea405ad2e 100644 --- a/packages/compass-telemetry/src/provider.tsx +++ b/packages/compass-telemetry/src/provider.tsx @@ -1,9 +1,11 @@ -import React, { useRef } from 'react'; +import React, { useRef, useContext } from 'react'; import { createServiceLocator } from '@mongodb-js/compass-app-registry'; import { createTrack, type TelemetryServiceOptions } from './generic-track'; import { useLogger } from '@mongodb-js/compass-logging/provider'; import type { TrackFunction } from './types'; -import { TestName } from './growth-experiments'; +import { ExperimentTestName } from './growth-experiments'; +import { ExperimentationContext } from './experimentation-provider'; +import type { types } from '@mongodb-js/mdb-experiment-js'; const noop = () => { // noop @@ -47,6 +49,22 @@ export function useTelemetry(): TrackFunction { return track; } +export interface ExperimentationServices { + assignExperiment: ( + experimentName: ExperimentTestName, + options?: types.AssignOptions + ) => Promise; +} + +// Service locator for experimentation services (non-component access) +export const experimentationServiceLocator = createServiceLocator( + function useExperimentationServices(): ExperimentationServices { + const { assignExperiment } = useContext(ExperimentationContext); + return { assignExperiment }; + }, + 'experimentationServiceLocator' +); + type FirstArgument = F extends (...args: [infer A, ...any]) => any ? A : F extends { new (...args: [infer A, ...any]): any } @@ -110,7 +128,7 @@ export function useTrackOnChange( * * @example * useFireExperimentViewed({ - * testName: TestName.earlyJourneyIndexesGuidance, + * testName: ExperimentTestName.earlyJourneyIndexesGuidance, * shouldFire: enableInIndexesGuidanceExp , * }); */ @@ -118,7 +136,7 @@ export const useFireExperimentViewed = ({ testName, shouldFire = true, }: { - testName: TestName; + testName: ExperimentTestName; shouldFire?: boolean; }) => { useTrackOnChange( @@ -136,4 +154,4 @@ export const useFireExperimentViewed = ({ }; export type { TrackFunction }; -export { TestName }; +export { ExperimentTestName }; diff --git a/packages/compass-telemetry/src/telemetry-events.ts b/packages/compass-telemetry/src/telemetry-events.ts index 3ced818db18..6dc51fe9c37 100644 --- a/packages/compass-telemetry/src/telemetry-events.ts +++ b/packages/compass-telemetry/src/telemetry-events.ts @@ -832,6 +832,12 @@ type ConnectionFailedEvent = ConnectionScopedEvent<{ * The error name. */ error_name: string; + + /** + * The error codes (or code names) from the error's cause chain. + * The driver and the OIDC library we use are two places that use cause chains. + */ + error_code_cause_chain: (string | number)[] | undefined; } & ExtraConnectionData; }>; @@ -2897,7 +2903,51 @@ type DataModelingDiagramCreated = CommonEvent<{ type DataModelingDiagramExported = CommonEvent<{ name: 'Data Modeling Diagram Exported'; payload: { - format: 'png' | 'json'; + format: 'png' | 'json' | 'diagram'; + }; +}>; + +/** + * This event is fired when user imports data modeling diagram. + * + * @category Data Modeling + */ +type DataModelingDiagramImported = CommonEvent<{ + name: 'Data Modeling Diagram Imported'; + payload: Record; +}>; + +/** + * This event is fired when user adds a new relationship to a data modeling diagram. + * + * @category Data Modeling + */ +type DataModelingDiagramRelationshipAdded = CommonEvent<{ + name: 'Data Modeling Relationship Added'; + payload: { + num_relationships: number; + }; +}>; + +/** + * This event is fired when user edits a relationship in a data modeling diagram. + * + * @category Data Modeling + */ +type DataModelingDiagramRelationshipEdited = CommonEvent<{ + name: 'Data Modeling Relationship Form Opened'; + payload: Record; +}>; + +/** + * This event is fired when user deletes a relationship from a data modeling diagram. + * + * @category Data Modeling + */ +type DataModelingDiagramRelationshipDeleted = CommonEvent<{ + name: 'Data Modeling Relationship Deleted'; + payload: { + num_relationships: number; }; }>; @@ -3048,4 +3098,8 @@ export type TelemetryEvent = | CreateIndexIndexSuggestionsCopied | CreateIndexStrategiesDocumentationClicked | UUIDEncounteredEvent - | DataModelingDiagramExported; + | DataModelingDiagramExported + | DataModelingDiagramImported + | DataModelingDiagramRelationshipAdded + | DataModelingDiagramRelationshipEdited + | DataModelingDiagramRelationshipDeleted; diff --git a/packages/compass-test-server/package.json b/packages/compass-test-server/package.json index fca05357d69..084198f94e7 100644 --- a/packages/compass-test-server/package.json +++ b/packages/compass-test-server/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.3.15", + "version": "0.3.16", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -53,7 +53,7 @@ "mongodb-runner": "^5.8.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/compass-user-data/package.json b/packages/compass-user-data/package.json index 7ccc0e97f8e..bd60cdd043f 100644 --- a/packages/compass-user-data/package.json +++ b/packages/compass-user-data/package.json @@ -12,7 +12,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.8.2", + "version": "0.8.4", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,13 +49,13 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-utils": "^0.9.9", "write-file-atomic": "^5.0.1", "zod": "^3.25.17" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/compass-user-data/src/user-data.ts b/packages/compass-user-data/src/user-data.ts index d27ded084fb..228ad9b3ebe 100644 --- a/packages/compass-user-data/src/user-data.ts +++ b/packages/compass-user-data/src/user-data.ts @@ -373,7 +373,6 @@ export class AtlasUserData extends IUserData { data: [], errors: [], }; - // debugger; try { const response = await this.authenticatedFetch( this.getResourceUrl( diff --git a/packages/compass-utils/package.json b/packages/compass-utils/package.json index 94071849590..728b371bace 100644 --- a/packages/compass-utils/package.json +++ b/packages/compass-utils/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.9.7", + "version": "0.9.9", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -50,7 +50,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -67,6 +67,6 @@ }, "dependencies": { "@electron/remote": "^2.1.3", - "electron": "^37.2.2" + "electron": "^37.2.5" } } diff --git a/packages/compass-web/package.json b/packages/compass-web/package.json index aac8e19aacc..2aa97f3d0b0 100644 --- a/packages/compass-web/package.json +++ b/packages/compass-web/package.json @@ -14,7 +14,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.19.2", + "version": "0.20.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -63,38 +63,38 @@ "react-dom": "^17.0.2" }, "devDependencies": { - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", "@types/express-http-proxy": "^1.6.6", @@ -106,12 +106,12 @@ "bson": "^6.10.4", "buffer": "^6.0.3", "chai": "^4.3.6", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "crypto-browserify": "^3.12.0", "debug": "^4.3.4", "depcheck": "^1.4.1", "dns-query": "^0.11.2", - "electron": "^37.2.2", + "electron": "^37.2.5", "events": "^3.3.0", "express": "^4.21.1", "express-http-proxy": "^2.0.0", @@ -119,7 +119,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.17.0", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "nyc": "^15.1.0", diff --git a/packages/compass-web/src/index.tsx b/packages/compass-web/src/index.tsx index 2c6525f50c2..e9078380492 100644 --- a/packages/compass-web/src/index.tsx +++ b/packages/compass-web/src/index.tsx @@ -4,3 +4,5 @@ export type { OpenWorkspaceOptions, WorkspaceTab, } from '@mongodb-js/compass-workspaces'; + +export { CompassExperimentationProvider } from '@mongodb-js/compass-telemetry'; diff --git a/packages/compass-welcome/package.json b/packages/compass-welcome/package.json index 9d3234e06d6..bc453e1f803 100644 --- a/packages/compass-welcome/package.json +++ b/packages/compass-welcome/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.65.0", + "version": "0.67.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -49,22 +49,22 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "compass-preferences-model": "^2.47.0", - "@mongodb-js/compass-app-registry": "^9.4.17", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "compass-preferences-model": "^2.49.0", + "@mongodb-js/compass-app-registry": "^9.4.18", "react": "^17.0.2", "redux": "^4.2.1", "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-workspaces/package.json b/packages/compass-workspaces/package.json index d202b29ce11..8b774e2aebc 100644 --- a/packages/compass-workspaces/package.json +++ b/packages/compass-workspaces/package.json @@ -11,7 +11,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.48.0", + "version": "0.50.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -51,16 +51,16 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-logging": "^1.7.8", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-logging": "^1.7.10", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "lodash": "^4.17.21", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -68,10 +68,10 @@ "redux-thunk": "^2.4.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/compass-workspaces/src/components/workspaces.tsx b/packages/compass-workspaces/src/components/workspaces.tsx index dc3c0734c98..3ec7dcc56b7 100644 --- a/packages/compass-workspaces/src/components/workspaces.tsx +++ b/packages/compass-workspaces/src/components/workspaces.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useMemo } from 'react'; import { + DrawerAnchor, ErrorBoundary, MongoDBLogoMark, WorkspaceTabs, @@ -61,7 +62,6 @@ const workspacesContainerStyles = css({ const workspacesContentStyles = css({ display: 'flex', - flex: 1, minHeight: 0, }); @@ -122,21 +122,21 @@ const CompassWorkspaces: React.FunctionComponent = ({ const { content: WorkspaceTabContent, header: WorkspaceTabTitle } = plugin; - let isNonExistent: boolean | undefined; + let inferredFromPrivileges: boolean | undefined; if (tab.type === 'Collections') { - // TODO(COMPASS-9456): Move this logic and `isNonExistent` setting to the plugin. + // TODO(COMPASS-9456): Move this logic and `inferredFromPrivileges` setting to the plugin. const database = tab.namespace; const namespaceId = `${tab.connectionId}.${database}`; - const { isNonExistent: databaseDoesNotExist } = + const { inferredFromPrivileges: databaseDoesNotExist } = databaseInfo[namespaceId] ?? {}; - isNonExistent = databaseDoesNotExist; + inferredFromPrivileges = databaseDoesNotExist; } else if (tab.type === 'Collection') { - // TODO(COMPASS-9456): Move this logic and `isNonExistent` setting to the plugin. + // TODO(COMPASS-9456): Move this logic and `inferredFromPrivileges` setting to the plugin. const { ns } = toNS(tab.namespace); const namespaceId = `${tab.connectionId}.${ns}`; - const { isNonExistent: collectionDoesNotExist } = + const { inferredFromPrivileges: collectionDoesNotExist } = collectionInfo[namespaceId] ?? {}; - isNonExistent = collectionDoesNotExist; + inferredFromPrivileges = collectionDoesNotExist; } return { @@ -156,7 +156,7 @@ const CompassWorkspaces: React.FunctionComponent = ({ @@ -216,11 +216,13 @@ const CompassWorkspaces: React.FunctionComponent = ({ >
- {activeTab && workspaceTabContent ? ( - workspaceTabContent - ) : ( - - )} + + {activeTab && workspaceTabContent ? ( + workspaceTabContent + ) : ( + + )} +
); diff --git a/packages/compass-workspaces/src/index.spec.tsx b/packages/compass-workspaces/src/index.spec.tsx index 7bc542d8fc7..7ae34918358 100644 --- a/packages/compass-workspaces/src/index.spec.tsx +++ b/packages/compass-workspaces/src/index.spec.tsx @@ -98,7 +98,7 @@ describe('WorkspacesPlugin', function () { { _id: 'db', name: 'db', - is_non_existent: false, + inferred_from_privileges: false, collection_count: 0, document_count: 0, index_count: 0, diff --git a/packages/compass-workspaces/src/index.ts b/packages/compass-workspaces/src/index.ts index e87b816e759..b0126401b9e 100644 --- a/packages/compass-workspaces/src/index.ts +++ b/packages/compass-workspaces/src/index.ts @@ -104,24 +104,28 @@ export function activateWorkspacePlugin( store.dispatch(collectionRenamed(from, collection.ns)); }); - on(instance, 'change:databases.is_non_existent', (database: Database) => { - const namespaceId = `${connectionId}.${database._id}`; - const databaseInfo = { - isNonExistent: database.is_non_existent, - }; - store.dispatch(updateDatabaseInfo(namespaceId, databaseInfo)); - }); + on( + instance, + 'change:databases.inferred_from_privileges', + (database: Database) => { + const namespaceId = `${connectionId}.${database._id}`; + const databaseInfo = { + inferredFromPrivileges: database.inferred_from_privileges, + }; + store.dispatch(updateDatabaseInfo(namespaceId, databaseInfo)); + } + ); on( instance, - 'change:collections.is_non_existent', + 'change:collections.inferred_from_privileges', (collection: Collection) => { const namespaceId = `${connectionId}.${collection._id}`; const collectionInfo = { isTimeSeries: collection.isTimeSeries, isReadonly: collection.readonly ?? collection.isView, sourceName: collection.sourceName, - isNonExistent: collection.is_non_existent, + inferredFromPrivileges: collection.inferred_from_privileges, }; store.dispatch(updateCollectionInfo(namespaceId, collectionInfo)); } diff --git a/packages/compass-workspaces/src/stores/workspaces.ts b/packages/compass-workspaces/src/stores/workspaces.ts index 06444ee81fe..3219cb8ed43 100644 --- a/packages/compass-workspaces/src/stores/workspaces.ts +++ b/packages/compass-workspaces/src/stores/workspaces.ts @@ -77,11 +77,11 @@ export type CollectionTabInfo = { isTimeSeries: boolean; isReadonly: boolean; sourceName?: string | null; - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; export type DatabaseTabInfo = { - isNonExistent: boolean; + inferredFromPrivileges: boolean; }; export type WorkspacesState = { @@ -725,7 +725,7 @@ const fetchCollectionInfo = ( isTimeSeries: coll.isTimeSeries, isReadonly: coll.readonly ?? coll.isView, sourceName: coll.sourceName, - isNonExistent: coll.is_non_existent, + inferredFromPrivileges: coll.inferred_from_privileges, }; dispatch(updateCollectionInfo(namespaceId, info)); } @@ -777,7 +777,7 @@ const fetchDatabaseInfo = ( if (db) { await db.fetch({ dataService }); const info = { - isNonExistent: db.is_non_existent, + inferredFromPrivileges: db.inferred_from_privileges, }; dispatch(updateDatabaseInfo(namespaceId, info)); } diff --git a/packages/compass-workspaces/src/types.ts b/packages/compass-workspaces/src/types.ts index 2cbbc9b6458..4c9c5ebaf62 100644 --- a/packages/compass-workspaces/src/types.ts +++ b/packages/compass-workspaces/src/types.ts @@ -42,8 +42,8 @@ export type CollectionsWorkspace = { type: 'Collections'; connectionId: string; namespace: string; - // TODO(COMPASS-9456): Remove the `isNonExistent` field here. - isNonExistent?: boolean; + // TODO(COMPASS-9456): Remove the `inferredFromPrivileges` field here. + inferredFromPrivileges?: boolean; }; export type CollectionWorkspace = { @@ -61,8 +61,8 @@ export type CollectionWorkspace = { initialPipelineText?: string; initialAggregation?: unknown; editViewName?: string; - // TODO(COMPASS-9456): Remove the `isNonExistent` field here. - isNonExistent?: boolean; + // TODO(COMPASS-9456): Remove the `inferredFromPrivileges` field here. + inferredFromPrivileges?: boolean; }; export type WorkspaceTabProps = diff --git a/packages/compass/package.json b/packages/compass/package.json index ff8dddb189b..714a0ad3c8f 100644 --- a/packages/compass/package.json +++ b/packages/compass/package.json @@ -194,78 +194,78 @@ "devDependencies": { "@electron/rebuild": "^4.0.1", "@electron/remote": "^2.1.3", - "@mongodb-js/atlas-service": "^0.52.0", - "@mongodb-js/compass-aggregations": "^9.69.0", - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-app-stores": "^7.53.0", - "@mongodb-js/compass-collection": "^4.66.0", - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connection-import-export": "^0.63.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-crud": "^13.67.0", - "@mongodb-js/compass-data-modeling": "^1.18.0", - "@mongodb-js/compass-databases-collections": "^1.66.0", - "@mongodb-js/compass-explain-plan": "^6.67.0", - "@mongodb-js/compass-export-to-language": "^9.43.0", - "@mongodb-js/compass-field-store": "^9.42.0", - "@mongodb-js/compass-find-in-page": "^4.46.0", - "@mongodb-js/compass-generative-ai": "^0.47.0", - "@mongodb-js/compass-global-writes": "^1.26.0", - "@mongodb-js/compass-import-export": "^7.66.0", - "@mongodb-js/compass-indexes": "^5.66.0", - "@mongodb-js/compass-intercom": "^0.31.0", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-query-bar": "^8.68.0", - "@mongodb-js/compass-saved-aggregations-queries": "^1.67.0", - "@mongodb-js/compass-schema": "^6.68.0", - "@mongodb-js/compass-schema-validation": "^6.67.0", - "@mongodb-js/compass-serverstats": "^16.66.0", - "@mongodb-js/compass-settings": "^0.65.0", - "@mongodb-js/compass-shell": "^3.66.0", - "@mongodb-js/compass-sidebar": "^5.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/compass-welcome": "^0.65.0", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "@mongodb-js/connection-storage": "^0.42.0", + "@mongodb-js/atlas-service": "^0.54.0", + "@mongodb-js/compass-aggregations": "^9.71.0", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-app-stores": "^7.55.0", + "@mongodb-js/compass-collection": "^4.68.0", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connection-import-export": "^0.65.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-crud": "^13.69.0", + "@mongodb-js/compass-data-modeling": "^1.20.0", + "@mongodb-js/compass-databases-collections": "^1.68.0", + "@mongodb-js/compass-explain-plan": "^6.69.0", + "@mongodb-js/compass-export-to-language": "^9.45.0", + "@mongodb-js/compass-field-store": "^9.44.0", + "@mongodb-js/compass-find-in-page": "^4.48.0", + "@mongodb-js/compass-generative-ai": "^0.49.0", + "@mongodb-js/compass-global-writes": "^1.28.0", + "@mongodb-js/compass-import-export": "^7.68.0", + "@mongodb-js/compass-indexes": "^5.68.0", + "@mongodb-js/compass-intercom": "^0.33.0", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-query-bar": "^8.70.0", + "@mongodb-js/compass-saved-aggregations-queries": "^1.69.0", + "@mongodb-js/compass-schema": "^6.70.0", + "@mongodb-js/compass-schema-validation": "^6.69.0", + "@mongodb-js/compass-serverstats": "^16.68.0", + "@mongodb-js/compass-settings": "^0.67.0", + "@mongodb-js/compass-shell": "^3.68.0", + "@mongodb-js/compass-sidebar": "^5.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/compass-welcome": "^0.67.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "@mongodb-js/connection-storage": "^0.44.0", "@mongodb-js/devtools-proxy-support": "^0.5.1", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/get-os-info": "^0.4.0", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/mongodb-downloader": "^0.3.7", - "@mongodb-js/my-queries-storage": "^0.34.0", + "@mongodb-js/my-queries-storage": "^0.36.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/sbom-tools": "^0.7.2", "@mongodb-js/signing-utils": "^0.3.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", - "@mongodb-js/webpack-config-compass": "^1.9.2", + "@mongodb-js/webpack-config-compass": "^1.9.4", "@segment/analytics-node": "^1.1.4", "@types/minimatch": "^5.1.2", "bson": "^6.10.4", "chai": "^4.3.4", "chalk": "^4.1.2", "clean-stack": "^2.0.0", - "compass-preferences-model": "^2.47.0", + "compass-preferences-model": "^2.49.0", "cross-spawn": "^7.0.5", "debug": "^4.3.4", "depcheck": "^1.4.1", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-devtools-installer": "^3.2.0", "electron-dl": "^3.5.0", "electron-mocha": "^12.2.0", "ensure-error": "^3.0.1", "glob": "^10.2.5", - "hadron-build": "^25.8.7", - "hadron-ipc": "^3.5.7", + "hadron-build": "^25.8.9", + "hadron-ipc": "^3.5.9", "make-fetch-happen": "^10.2.1", "minimatch": "^10.0.1", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^2.4.2", "react": "^17.0.2", diff --git a/packages/compass/src/main/application.ts b/packages/compass/src/main/application.ts index a858b63e3fc..17b44e9d0bc 100644 --- a/packages/compass/src/main/application.ts +++ b/packages/compass/src/main/application.ts @@ -175,15 +175,13 @@ class CompassApplication { await this.setupCORSBypass(); void this.setupCompassAuthService(); - if (!process.env.CI || process.env.HADRON_AUTO_UPDATE_ENDPOINT_OVERRIDE) { - this.setupAutoUpdate(); - } await setupCSFLELibrary(); setupTheme(this); this.setupJavaScriptArguments(); this.setupLifecycleListeners(); this.setupApplicationMenu(); this.setupWindowManager(); + this.setupAutoUpdate(); this.trackApplicationLaunched(globalPreferences); } @@ -213,7 +211,9 @@ class CompassApplication { } private static setupAutoUpdate(): void { - CompassAutoUpdateManager.init(this); + if (!process.env.CI || process.env.HADRON_AUTO_UPDATE_ENDPOINT_OVERRIDE) { + void CompassAutoUpdateManager.init(this); + } } private static setupApplicationMenu(): void { diff --git a/packages/compass/src/main/auto-update-manager.spec.ts b/packages/compass/src/main/auto-update-manager.spec.ts index 026f7b27f1f..942f8dc55dc 100644 --- a/packages/compass/src/main/auto-update-manager.spec.ts +++ b/packages/compass/src/main/auto-update-manager.spec.ts @@ -6,7 +6,7 @@ import { CompassAutoUpdateManager, } from './auto-update-manager'; import type { DownloadItem } from 'electron'; -import { dialog, autoUpdater } from 'electron'; +import { dialog, autoUpdater, BrowserWindow } from 'electron'; import os from 'os'; import dl from 'electron-dl'; import { createSandboxFromDefaultPreferences } from 'compass-preferences-model'; @@ -344,6 +344,10 @@ describe('CompassAutoUpdateManager', function () { return Promise.resolve({ response: 0, checkboxChecked: false }); }); + sandbox.stub(BrowserWindow, 'getAllWindows').callsFake(() => { + return [{} as BrowserWindow]; + }); + const stub = sandbox.stub(dl, 'download').callsFake(() => { return Promise.resolve({} as DownloadItem); }); @@ -356,6 +360,10 @@ describe('CompassAutoUpdateManager', function () { ) ).to.eq(true); + // Any small timeout will do, we're allowing for the async tasks to + // clear + await wait(300); + expect(stub).to.be.calledOnce; }); diff --git a/packages/compass/src/main/auto-update-manager.ts b/packages/compass/src/main/auto-update-manager.ts index 3735c860ae7..119641b8b8b 100644 --- a/packages/compass/src/main/auto-update-manager.ts +++ b/packages/compass/src/main/auto-update-manager.ts @@ -16,6 +16,7 @@ import type { PreferencesAccess } from 'compass-preferences-model'; import { getOsInfo } from '@mongodb-js/get-os-info'; import { createIpcTrack } from '@mongodb-js/compass-telemetry'; import type { Response } from '@mongodb-js/devtools-proxy-support'; +import { pathToFileURL } from 'url'; const { log, mongoLogId, debug } = createLogger('COMPASS-AUTO-UPDATES'); const track = createIpcTrack(); @@ -60,6 +61,37 @@ function isMismatchedArchDarwin(): boolean { return process.platform === 'darwin' && getSystemArch() !== process.arch; } +async function waitForWindow(timeout = 5_000) { + const start = Date.now(); + while (start + timeout > Date.now()) { + await new Promise((resolve) => setTimeout(resolve, 100)); + const window = BrowserWindow.getAllWindows()[0]; + if (window) { + return window; + } + } + return null; +} + +async function download(url: string): Promise { + const maybeWindow = await waitForWindow(); + if (maybeWindow) { + await dl.download(maybeWindow, url, { + onCompleted(file) { + const fileURL = pathToFileURL(file.path).toString(); + void shell.openExternal(fileURL); + }, + }); + } else { + await shell.openExternal(url); + } +} + +function getMacOSDownloadUrl(channel: string, version: string): string { + version = channel === 'dev' ? 'latest' : version; + return `https://compass.mongodb.com/api/v2/download/${version}/compass/${channel}/darwin-${getSystemArch()}`; +} + type PromptForUpdateResult = 'download' | 'update' | 'cancel'; async function promptForUpdate( from: string, @@ -84,9 +116,9 @@ async function promptForUpdate( const answer = await dialog.showMessageBox({ ...commonOptions, - detail: `Compass ${to} is available. You are currently using a build of Compass that is not optimized for M1/M2 processors. Would you like to download the version of Compass ${to} optimized for M1/M2 processors now?`, + detail: `Compass ${to} is available. You are currently using a build of Compass that is not optimized for Apple processors. Would you like to download the version of Compass ${to} optimized for Apple processors now?`, buttons: [ - 'Download Compass for M1/M2 (Recommended)', + 'Download Compass for Apple silicon (Recommended)', 'Update current installation', 'Ask me later', ], @@ -445,7 +477,7 @@ const STATE_UPDATE: Record< }, [AutoUpdateManagerState.ManualDownload]: { nextStates: [AutoUpdateManagerState.UserPromptedManualCheck], - enter: function (_updateManager, _fromState, updateInfo: UpdateInfo) { + enter: function (updateManager, _fromState, updateInfo: UpdateInfo) { log.info( mongoLogId(1_001_000_167), 'AutoUpdateManager', @@ -467,10 +499,11 @@ const STATE_UPDATE: Record< ); } - const url = `https://downloads.mongodb.com/compass/${ - process.env.HADRON_PRODUCT - }-${updateInfo.to}-${process.platform}-${getSystemArch()}.dmg`; - void dl.download(BrowserWindow.getAllWindows()[0], url); + const url = getMacOSDownloadUrl( + updateManager.autoUpdateOptions.channel, + updateInfo.to + ); + void download(url); }, }, [AutoUpdateManagerState.UpdateDismissed]: { @@ -827,11 +860,54 @@ class CompassAutoUpdateManager { this.setState(AutoUpdateManagerState.RestartDismissed); } - private static _init( + private static checkForMismatchedMacOSArch() { + const mismatchedOnArm = + isMismatchedArchDarwin() && getSystemArch() === 'arm64'; + + if (!mismatchedOnArm) { + return; + } + + void dialog + .showMessageBox({ + icon: COMPASS_ICON, + message: 'Mismatched architecture detected', + detail: + 'You are currently using a build of Compass that is not optimized for Apple Silicon processors. This version might have significant performance issues when used. ' + + 'Would you like to download the version of Compass optimized for Apple Silicon processors now?', + buttons: [ + 'Download Compass for Apple Silicon (Recommended)', + 'Not now', + ], + cancelId: 1, + }) + .then(({ response }) => { + if (response === 0) { + const url = getMacOSDownloadUrl( + this.autoUpdateOptions.channel, + this.autoUpdateOptions.version + ); + return download(url); + } + }) + .catch((err) => { + log.warn( + mongoLogId(1_001_000_362), + 'AutoUpdateManager', + 'Failed to download Compass for a mismatched macos arch', + { error: err.message } + ); + }); + } + + private static async _init( compassApp: typeof CompassApplication, options: Partial = {} - ): void { + ): Promise { + await app.whenReady(); + this.fetch = (url: string) => compassApp.httpClient.fetch(url); + compassApp.addExitHandler(() => { this.stop(); return Promise.resolve(); @@ -867,6 +943,8 @@ class CompassAutoUpdateManager { ...options, }; + this.checkForMismatchedMacOSArch(); + // TODO(COMPASS-7232): If auto-updates are not supported, then there is // still a menu item to check for updates and then if it finds an update but // auto-updates aren't supported it will still display a popup with an @@ -961,13 +1039,13 @@ class CompassAutoUpdateManager { ); } - static init( + static async init( compassApp: typeof CompassApplication, options: Partial = {} - ): void { + ): Promise { if (!this.initCalled) { this.initCalled = true; - this._init(compassApp, options); + await this._init(compassApp, options); } } diff --git a/packages/connection-form/package.json b/packages/connection-form/package.json index 772c867db7e..d1f242d356b 100644 --- a/packages/connection-form/package.json +++ b/packages/connection-form/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.59.0", + "version": "1.61.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,23 +48,23 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/connection-info": "^0.17.0", "@mongodb-js/shell-bson-parser": "^1.2.0", "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2", + "mongodb-data-service": "^22.30.0", "mongodb-query-parser": "^4.3.0", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/connection-info/package.json b/packages/connection-info/package.json index 2d408787885..7cb961624f8 100644 --- a/packages/connection-info/package.json +++ b/packages/connection-info/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.16.2", + "version": "0.17.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -54,10 +54,10 @@ "lodash": "^4.17.21", "mongodb": "^6.17.0", "mongodb-connection-string-url": "^3.0.1", - "mongodb-data-service": "^22.29.2" + "mongodb-data-service": "^22.30.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/connection-storage/package.json b/packages/connection-storage/package.json index 6f19aa112ed..8bb34a958c2 100644 --- a/packages/connection-storage/package.json +++ b/packages/connection-storage/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.42.0", + "version": "0.44.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -56,23 +56,23 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-user-data": "^0.8.2", - "@mongodb-js/compass-utils": "^0.9.7", - "@mongodb-js/connection-info": "^0.16.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-user-data": "^0.8.4", + "@mongodb-js/compass-utils": "^0.9.9", + "@mongodb-js/connection-info": "^0.17.0", "bson": "^6.10.4", - "compass-preferences-model": "^2.47.0", - "electron": "^37.2.2", - "hadron-ipc": "^3.5.7", + "compass-preferences-model": "^2.49.0", + "electron": "^37.2.5", + "hadron-ipc": "^3.5.9", "keytar": "^7.9.0", "lodash": "^4.17.21", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/data-service/package.json b/packages/data-service/package.json index 3d9a5e6de95..a241f1f73cc 100644 --- a/packages/data-service/package.json +++ b/packages/data-service/package.json @@ -7,7 +7,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "22.29.2", + "version": "22.30.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -51,8 +51,8 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-logging": "^1.7.8", - "@mongodb-js/compass-utils": "^0.9.7", + "@mongodb-js/compass-logging": "^1.7.10", + "@mongodb-js/compass-utils": "^0.9.9", "@mongodb-js/devtools-connect": "^3.9.2", "@mongodb-js/devtools-proxy-support": "^0.5.1", "bson": "^6.10.4", @@ -63,9 +63,9 @@ "mongodb-ns": "^2.4.2" }, "devDependencies": { - "@mongodb-js/compass-test-server": "^0.3.15", + "@mongodb-js/compass-test-server": "^0.3.16", "@mongodb-js/devtools-docker-test-envs": "^1.3.3", - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/oidc-plugin": "^2.0.1", "@mongodb-js/prettier-config-compass": "^1.2.8", diff --git a/packages/data-service/src/data-service.spec.ts b/packages/data-service/src/data-service.spec.ts index c18b9903795..581c0ff7a89 100644 --- a/packages/data-service/src/data-service.spec.ts +++ b/packages/data-service/src/data-service.spec.ts @@ -704,13 +704,29 @@ describe('DataService', function () { it('returns collections from user privileges', async function () { const collections = await dataService.listCollections('imdb'); const mappedCollections = collections.map( - ({ _id, name, is_non_existent }) => ({ _id, name, is_non_existent }) + ({ _id, name, inferred_from_privileges }) => ({ + _id, + name, + inferred_from_privileges, + }) ); const expectedCollections = [ - { _id: 'imdb.movies', name: 'movies', is_non_existent: true }, - { _id: 'imdb.reviews', name: 'reviews', is_non_existent: true }, - { _id: 'imdb.users', name: 'users', is_non_existent: true }, + { + _id: 'imdb.movies', + name: 'movies', + inferred_from_privileges: true, + }, + { + _id: 'imdb.reviews', + name: 'reviews', + inferred_from_privileges: true, + }, + { + _id: 'imdb.users', + name: 'users', + inferred_from_privileges: true, + }, ]; expect(mappedCollections).to.deep.include.members( expectedCollections @@ -721,13 +737,29 @@ describe('DataService', function () { await dataService.createCollection('imdb.movies', {}); const collections = await dataService.listCollections('imdb'); const mappedCollections = collections.map( - ({ _id, name, is_non_existent }) => ({ _id, name, is_non_existent }) + ({ _id, name, inferred_from_privileges }) => ({ + _id, + name, + inferred_from_privileges, + }) ); const expectedCollections = [ - { _id: 'imdb.movies', name: 'movies', is_non_existent: false }, - { _id: 'imdb.reviews', name: 'reviews', is_non_existent: true }, - { _id: 'imdb.users', name: 'users', is_non_existent: true }, + { + _id: 'imdb.movies', + name: 'movies', + inferred_from_privileges: false, + }, + { + _id: 'imdb.reviews', + name: 'reviews', + inferred_from_privileges: true, + }, + { + _id: 'imdb.users', + name: 'users', + inferred_from_privileges: true, + }, ]; expect(mappedCollections).to.deep.include.members( expectedCollections @@ -942,7 +974,11 @@ describe('DataService', function () { it('returns databases from user roles and privileges', async function () { const databases = await dataService.listDatabases(); const mappedDatabases = databases.map( - ({ _id, name, is_non_existent }) => ({ _id, name, is_non_existent }) + ({ _id, name, inferred_from_privileges }) => ({ + _id, + name, + inferred_from_privileges, + }) ); const expectedDatabases = [ @@ -950,11 +986,15 @@ describe('DataService', function () { { _id: 'sample_airbnb', name: 'sample_airbnb', - is_non_existent: true, + inferred_from_privileges: true, + }, + { + _id: 'sample_wiki', + name: 'sample_wiki', + inferred_from_privileges: true, }, - { _id: 'sample_wiki', name: 'sample_wiki', is_non_existent: true }, // Based on privileges - { _id: 'imdb', name: 'imdb', is_non_existent: true }, + { _id: 'imdb', name: 'imdb', inferred_from_privileges: true }, ]; expect(mappedDatabases).to.deep.include.members(expectedDatabases); }); @@ -964,17 +1004,25 @@ describe('DataService', function () { await dataService.createCollection('sample_airbnb.whatever', {}); const databases = await dataService.listDatabases(); const mappedDatabases = databases.map( - ({ _id, name, is_non_existent }) => ({ _id, name, is_non_existent }) + ({ _id, name, inferred_from_privileges }) => ({ + _id, + name, + inferred_from_privileges, + }) ); const expectedDatabases = [ { _id: 'sample_airbnb', name: 'sample_airbnb', - is_non_existent: false, + inferred_from_privileges: false, + }, + { + _id: 'sample_wiki', + name: 'sample_wiki', + inferred_from_privileges: true, }, - { _id: 'sample_wiki', name: 'sample_wiki', is_non_existent: true }, - { _id: 'imdb', name: 'imdb', is_non_existent: false }, + { _id: 'imdb', name: 'imdb', inferred_from_privileges: false }, ]; expect(mappedDatabases).to.deep.include.members(expectedDatabases); }); @@ -2102,13 +2150,16 @@ describe('DataService', function () { }, }); const dbs = (await dataService.listDatabases()).map( - ({ name, is_non_existent }) => ({ name, is_non_existent }) + ({ name, inferred_from_privileges }) => ({ + name, + inferred_from_privileges, + }) ); expect(dbs).to.deep.eq([ - { name: 'pineapple', is_non_existent: true }, - { name: 'foo', is_non_existent: false }, - { name: 'buz', is_non_existent: true }, - { name: 'bar', is_non_existent: false }, + { name: 'pineapple', inferred_from_privileges: true }, + { name: 'foo', inferred_from_privileges: false }, + { name: 'buz', inferred_from_privileges: true }, + { name: 'bar', inferred_from_privileges: false }, ]); }); @@ -2129,9 +2180,14 @@ describe('DataService', function () { }, }); const dbs = (await dataService.listDatabases()).map( - ({ name, is_non_existent }) => ({ name, is_non_existent }) + ({ name, inferred_from_privileges }) => ({ + name, + inferred_from_privileges, + }) ); - expect(dbs).to.deep.eq([{ name: 'foo', is_non_existent: true }]); + expect(dbs).to.deep.eq([ + { name: 'foo', inferred_from_privileges: true }, + ]); }); }); @@ -2224,13 +2280,16 @@ describe('DataService', function () { }, }); const colls = (await dataService.listCollections('foo')).map( - ({ name, is_non_existent }) => ({ name, is_non_existent }) + ({ name, inferred_from_privileges }) => ({ + name, + inferred_from_privileges, + }) ); expect(colls).to.deep.eq([ - { name: 'bar', is_non_existent: true }, - { name: 'buz', is_non_existent: false }, - { name: 'bla', is_non_existent: false }, - { name: 'meow', is_non_existent: false }, + { name: 'bar', inferred_from_privileges: true }, + { name: 'buz', inferred_from_privileges: false }, + { name: 'bla', inferred_from_privileges: false }, + { name: 'meow', inferred_from_privileges: false }, ]); }); @@ -2253,9 +2312,14 @@ describe('DataService', function () { }, }); const colls = (await dataService.listCollections('foo')).map( - ({ name, is_non_existent }) => ({ name, is_non_existent }) + ({ name, inferred_from_privileges }) => ({ + name, + inferred_from_privileges, + }) ); - expect(colls).to.deep.eq([{ name: 'bar', is_non_existent: true }]); + expect(colls).to.deep.eq([ + { name: 'bar', inferred_from_privileges: true }, + ]); }); }); diff --git a/packages/data-service/src/data-service.ts b/packages/data-service/src/data-service.ts index 98505e7440f..b0d9e87ad73 100644 --- a/packages/data-service/src/data-service.ts +++ b/packages/data-service/src/data-service.ts @@ -351,6 +351,7 @@ export interface DataService { filter?: Document, options?: { nameOnly?: true; + fetchNamespacesFromPrivileges?: boolean; privileges?: | ConnectionStatusWithPrivileges['authInfo']['authenticatedUserPrivileges'] | null; @@ -459,6 +460,7 @@ export interface DataService { */ listDatabases(options?: { nameOnly?: true; + fetchNamespacesFromPrivileges?: boolean; privileges?: | ConnectionStatusWithPrivileges['authInfo']['authenticatedUserPrivileges'] | null; @@ -1368,9 +1370,11 @@ class DataServiceImpl extends WithLogContext implements DataService { filter: Document = {}, { nameOnly, + fetchNamespacesFromPrivileges = true, privileges = null, }: { nameOnly?: true; + fetchNamespacesFromPrivileges?: boolean; privileges?: | ConnectionStatusWithPrivileges['authInfo']['authenticatedUserPrivileges'] | null; @@ -1381,11 +1385,14 @@ class DataServiceImpl extends WithLogContext implements DataService { nameOnly, }); return colls.map((coll) => ({ - is_non_existent: false, + inferred_from_privileges: false, ...coll, })); }; const getCollectionsFromPrivileges = async () => { + if (!fetchNamespacesFromPrivileges) { + return []; + } const databases = getPrivilegesByDatabaseAndCollection( await this._getPrivilegesOrFallback(privileges), ['find'] @@ -1400,7 +1407,7 @@ class DataServiceImpl extends WithLogContext implements DataService { // those registered as "real" collection names Boolean ) - .map((name) => ({ name, is_non_existent: true })); + .map((name) => ({ name, inferred_from_privileges: true })); }; const [listedCollections, collectionsFromPrivileges] = await Promise.all([ @@ -1418,8 +1425,8 @@ class DataServiceImpl extends WithLogContext implements DataService { // if they were fetched successfully [...collectionsFromPrivileges, ...listedCollections], 'name' - ).map(({ is_non_existent, ...coll }) => ({ - is_non_existent, + ).map(({ inferred_from_privileges, ...coll }) => ({ + inferred_from_privileges, ...adaptCollectionInfo({ db: databaseName, ...coll }), })); @@ -1434,10 +1441,12 @@ class DataServiceImpl extends WithLogContext implements DataService { }) async listDatabases({ nameOnly, + fetchNamespacesFromPrivileges = true, privileges = null, roles = null, }: { nameOnly?: true; + fetchNamespacesFromPrivileges?: boolean; privileges?: | ConnectionStatusWithPrivileges['authInfo']['authenticatedUserPrivileges'] | null; @@ -1467,7 +1476,7 @@ class DataServiceImpl extends WithLogContext implements DataService { ); return databases.map((x) => ({ ...x, - is_non_existent: false, + inferred_from_privileges: false, })); } catch (err) { // Currently Compass should not fail if listDatabase failed for any @@ -1488,6 +1497,10 @@ class DataServiceImpl extends WithLogContext implements DataService { }; const getDatabasesFromPrivileges = async () => { + if (!fetchNamespacesFromPrivileges) { + return []; + } + const databases = getPrivilegesByDatabaseAndCollection( await this._getPrivilegesOrFallback(privileges), ['find'] @@ -1500,7 +1513,7 @@ class DataServiceImpl extends WithLogContext implements DataService { // out Boolean ) - .map((name) => ({ name, is_non_existent: true })); + .map((name) => ({ name, inferred_from_privileges: true })); }; const getDatabasesFromRoles = async () => { @@ -1515,7 +1528,10 @@ class DataServiceImpl extends WithLogContext implements DataService { // have custom privileges that we can't currently fetch. ['read', 'readWrite', 'dbAdmin', 'dbOwner'] ); - return databases.map((name) => ({ name, is_non_existent: true })); + return databases.map((name) => ({ + name, + inferred_from_privileges: true, + })); }; const [listedDatabases, databasesFromPrivileges, databasesFromRoles] = @@ -1530,11 +1546,11 @@ class DataServiceImpl extends WithLogContext implements DataService { // if they were fetched successfully [...databasesFromRoles, ...databasesFromPrivileges, ...listedDatabases], 'name' - ).map(({ name, is_non_existent, ...db }) => { + ).map(({ name, inferred_from_privileges, ...db }) => { return { _id: name, name, - is_non_existent, + inferred_from_privileges, ...adaptDatabaseInfo(db), }; }); diff --git a/packages/data-service/src/instance-detail-helper.ts b/packages/data-service/src/instance-detail-helper.ts index ce84cf7396f..e93188d6592 100644 --- a/packages/data-service/src/instance-detail-helper.ts +++ b/packages/data-service/src/instance-detail-helper.ts @@ -76,7 +76,7 @@ export type CollectionDetails = { validationAction: string; validationLevel: string; } | null; - is_non_existent: boolean; + inferred_from_privileges: boolean; }; export type DatabaseDetails = { @@ -89,7 +89,7 @@ export type DatabaseDetails = { index_count: number; index_size: number; collections: CollectionDetails[]; - is_non_existent: boolean; + inferred_from_privileges: boolean; }; export type InstanceDetails = { @@ -362,7 +362,10 @@ export function adaptBuildInfo( export function adaptDatabaseInfo( databaseStats: Partial & Partial -): Omit { +): Omit< + DatabaseDetails, + '_id' | 'collections' | 'name' | 'inferred_from_privileges' +> { return { collection_count: databaseStats.collections ?? 0, document_count: databaseStats.objects ?? 0, @@ -382,7 +385,7 @@ export function adaptCollectionInfo({ }: CollectionInfoNameOnly & Partial & { db: string; - }): Omit { + }): Omit { const ns = toNS(`${db}.${name}`); const { collection, diff --git a/packages/database-model/index.d.ts b/packages/database-model/index.d.ts index ac5bdf4250b..b244cc8a9ca 100644 --- a/packages/database-model/index.d.ts +++ b/packages/database-model/index.d.ts @@ -16,7 +16,7 @@ interface DatabaseProps { index_size: number | undefined; collectionsLength: number; collections: CollectionCollection; - is_non_existent: boolean; + inferred_from_privileges: boolean; } interface Database extends DatabaseProps { diff --git a/packages/database-model/lib/model.js b/packages/database-model/lib/model.js index cbe596434a1..4c3a1cfd0e8 100644 --- a/packages/database-model/lib/model.js +++ b/packages/database-model/lib/model.js @@ -105,7 +105,7 @@ const DatabaseModel = AmpersandModel.extend( statusError: { type: 'string', default: null }, collectionsStatus: { type: 'string', default: 'initial' }, collectionsStatusError: { type: 'string', default: null }, - is_non_existent: 'boolean', + inferred_from_privileges: 'boolean', collection_count: 'number', document_count: 'number', storage_size: 'number', @@ -142,7 +142,7 @@ const DatabaseModel = AmpersandModel.extend( const shouldFetchDbAndCollStats = getParentByType( this, 'Instance' - ).shouldFetchDbAndCollStats; + ).shouldFetchDbAndCollStats(); if (!shouldFetch(this.status, force)) { return; @@ -251,17 +251,21 @@ const DatabaseCollection = AmpersandCollection.extend( ); } + const shouldFetchNamespacesFromPrivileges = + instanceModel.shouldFetchNamespacesFromPrivileges(); + const dbs = await dataService.listDatabases({ nameOnly: true, + fetchNamespacesFromPrivileges: shouldFetchNamespacesFromPrivileges, privileges: instanceModel.auth.privileges, roles: instanceModel.auth.roles, }); this.set( - dbs.map(({ _id, name, is_non_existent }) => ({ + dbs.map(({ _id, name, inferred_from_privileges }) => ({ _id, name, - is_non_existent, + inferred_from_privileges, })) ); }, diff --git a/packages/database-model/package.json b/packages/database-model/package.json index 97a38ca1979..add8614fbf0 100644 --- a/packages/database-model/package.json +++ b/packages/database-model/package.json @@ -2,7 +2,7 @@ "name": "mongodb-database-model", "description": "MongoDB database model", "author": "Lucas Hrabovsky ", - "version": "2.30.2", + "version": "2.31.0", "bugs": { "url": "https://jira.mongodb.org/projects/COMPASS/issues", "email": "compass@mongodb.com" @@ -30,11 +30,11 @@ "dependencies": { "ampersand-collection": "^2.0.2", "ampersand-model": "^8.0.1", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2" + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "depcheck": "^1.4.1", "mocha": "^10.2.0" diff --git a/packages/databases-collections-list/package.json b/packages/databases-collections-list/package.json index 04bd2402d4b..97f213a6e9e 100644 --- a/packages/databases-collections-list/package.json +++ b/packages/databases-collections-list/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.64.0", + "version": "1.66.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,22 +48,22 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "dependencies": { - "@mongodb-js/compass-components": "^1.45.0", - "@mongodb-js/compass-connections": "^1.67.0", - "@mongodb-js/compass-telemetry": "^1.10.6", - "@mongodb-js/compass-workspaces": "^0.48.0", - "@mongodb-js/connection-info": "^0.16.2", - "compass-preferences-model": "^2.47.0", - "mongodb-collection-model": "^5.30.2", - "mongodb-database-model": "^2.30.2", + "@mongodb-js/compass-components": "^1.47.0", + "@mongodb-js/compass-connections": "^1.69.0", + "@mongodb-js/compass-telemetry": "^1.12.0", + "@mongodb-js/compass-workspaces": "^0.50.0", + "@mongodb-js/connection-info": "^0.17.0", + "compass-preferences-model": "^2.49.0", + "mongodb-collection-model": "^5.31.0", + "mongodb-database-model": "^2.31.0", "mongodb-ns": "^2.4.2", "react": "^17.0.2" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", - "@mongodb-js/testing-library-compass": "^1.3.7", + "@mongodb-js/testing-library-compass": "^1.3.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "@types/chai": "^4.2.21", "@types/chai-dom": "^0.0.10", diff --git a/packages/databases-collections-list/src/collections.tsx b/packages/databases-collections-list/src/collections.tsx index 50ea1befcbe..019dc76b822 100644 --- a/packages/databases-collections-list/src/collections.tsx +++ b/packages/databases-collections-list/src/collections.tsx @@ -192,7 +192,7 @@ const CollectionsList: React.FunctionComponent<{ name={coll.name} type="collection" status={coll.status} - isNonExistent={coll.is_non_existent} + inferredFromPrivileges={coll.inferred_from_privileges} data={data} badges={badges} onItemClick={onItemClick} diff --git a/packages/databases-collections-list/src/databases.tsx b/packages/databases-collections-list/src/databases.tsx index 40c1b897c74..c7e780727e8 100644 --- a/packages/databases-collections-list/src/databases.tsx +++ b/packages/databases-collections-list/src/databases.tsx @@ -71,7 +71,7 @@ const DatabasesList: React.FunctionComponent<{ type="database" viewType={viewType} status={db.status} - isNonExistent={db.is_non_existent} + inferredFromPrivileges={db.inferred_from_privileges} data={[ { label: 'Storage size', diff --git a/packages/databases-collections-list/src/index.spec.tsx b/packages/databases-collections-list/src/index.spec.tsx index 19bb3f0d898..9ec322bc4c2 100644 --- a/packages/databases-collections-list/src/index.spec.tsx +++ b/packages/databases-collections-list/src/index.spec.tsx @@ -25,7 +25,7 @@ function createDatabase(name) { collectionsStatusError: null, collection_count: 1, collections: [] as any, - is_non_existent: false, + inferred_from_privileges: false, // dbStats document_count: 10, storage_size: 1500, @@ -59,7 +59,7 @@ function createCollection(name, props: any = {}) { is_capped: false, isTimeSeries: false, isView: false, - is_non_existent: false, + inferred_from_privileges: false, /** Only relevant for a view and identifies collection/view from which this view was created. */ sourceName: null, source: {} as any, diff --git a/packages/databases-collections-list/src/namespace-card.tsx b/packages/databases-collections-list/src/namespace-card.tsx index 90263412ada..0dbd16c7f8f 100644 --- a/packages/databases-collections-list/src/namespace-card.tsx +++ b/packages/databases-collections-list/src/namespace-card.tsx @@ -38,11 +38,11 @@ const CardTitleGroup: React.FunctionComponent = ({ children }) => { return
{children}
; }; -const nonExistantLightStyles = css({ +const inferredFromPrivilegesLightStyles = css({ color: palette.gray.dark1, }); -const nonExistantDarkStyles = css({ +const inferredFromPrivilegesDarkStyles = css({ color: palette.gray.base, }); @@ -86,8 +86,8 @@ const cardName = css({ const CardName: React.FunctionComponent<{ children: string; - isNonExistent: boolean; -}> = ({ children, isNonExistent }) => { + inferredFromPrivileges: boolean; +}> = ({ children, inferredFromPrivileges }) => { const darkMode = useDarkMode(); return (
@@ -96,8 +96,10 @@ const CardName: React.FunctionComponent<{ className={cx( cardName, darkMode ? cardNameDark : cardNameLight, - isNonExistent && !darkMode && nonExistantLightStyles, - isNonExistent && darkMode && nonExistantDarkStyles + inferredFromPrivileges && + !darkMode && + inferredFromPrivilegesLightStyles, + inferredFromPrivileges && darkMode && inferredFromPrivilegesDarkStyles )} > {children} @@ -189,7 +191,7 @@ export type NamespaceItemCardProps = { status: 'initial' | 'fetching' | 'refreshing' | 'ready' | 'error'; data: DataProp[]; badges?: BadgeProp[] | null; - isNonExistent: boolean; + inferredFromPrivileges: boolean; onItemClick(id: string): void; onItemDeleteClick?: (id: string) => void; }; @@ -222,7 +224,7 @@ export const NamespaceItemCard: React.FunctionComponent< onItemDeleteClick, badges = null, viewType, - isNonExistent, + inferredFromPrivileges, ...props }) => { const { readOnly, enableDbAndCollStats } = usePreferences([ @@ -239,7 +241,7 @@ export const NamespaceItemCard: React.FunctionComponent< const hasDeleteHandler = !!onItemDeleteClick; const cardActions: ItemAction[] = useMemo(() => { - return readOnly || !hasDeleteHandler || isNonExistent + return readOnly || !hasDeleteHandler || inferredFromPrivileges ? [] : [ { @@ -248,7 +250,7 @@ export const NamespaceItemCard: React.FunctionComponent< icon: 'Trash', }, ]; - }, [type, readOnly, isNonExistent, hasDeleteHandler]); + }, [type, readOnly, inferredFromPrivileges, hasDeleteHandler]); const defaultActionProps = useDefaultAction(onDefaultAction); @@ -273,9 +275,9 @@ export const NamespaceItemCard: React.FunctionComponent< { className: cx( card, - isNonExistent && [ - !darkMode && nonExistantLightStyles, - darkMode && nonExistantDarkStyles, + inferredFromPrivileges && [ + !darkMode && inferredFromPrivilegesLightStyles, + darkMode && inferredFromPrivilegesDarkStyles, inactiveCardStyles, ] ), @@ -303,9 +305,11 @@ export const NamespaceItemCard: React.FunctionComponent< {...cardProps} > - {name} + + {name} + - {isNonExistent && ( + {inferredFromPrivileges && ( } > - Your privileges grant you access to this namespace, but it does not + Your privileges grant you access to this namespace, but it might not currently exist )} @@ -340,7 +344,7 @@ export const NamespaceItemCard: React.FunctionComponent< ); } diff --git a/packages/explain-plan-helper/package.json b/packages/explain-plan-helper/package.json index ca09015f567..8e33ff92be0 100644 --- a/packages/explain-plan-helper/package.json +++ b/packages/explain-plan-helper/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.4.15", + "version": "1.4.16", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -50,10 +50,10 @@ }, "dependencies": { "@mongodb-js/shell-bson-parser": "^1.2.0", - "mongodb-explain-compat": "^3.3.15" + "mongodb-explain-compat": "^3.3.16" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/hadron-build/commands/upload.js b/packages/hadron-build/commands/upload.js index 09ecb82c67e..4bbb8a34eaf 100644 --- a/packages/hadron-build/commands/upload.js +++ b/packages/hadron-build/commands/upload.js @@ -17,7 +17,6 @@ const { diffString } = require('json-diff'); const download = require('download'); const Target = require('../lib/target'); const { - getKeyPrefix, downloadManifest, uploadAsset, uploadAssetNew, @@ -76,10 +75,10 @@ function readablePlatformName(arch, platform, fileName = '') { switch (`${platform}-${arch}`) { case 'darwin-x64': - name = 'macOS x64 (Intel) (10.15+)'; + name = 'macOS x64 (Intel) (11+)'; break; case 'darwin-arm64': - name = 'macOS arm64 (M1) (11.0+)'; + name = 'macOS arm64 (Apple silicon) (11.0+)'; break; case 'win32-x64': name = 'Windows 64-bit (10+)'; @@ -87,7 +86,7 @@ function readablePlatformName(arch, platform, fileName = '') { case 'linux-x64': name = fileName.endsWith('.rpm') ? 'RedHat 64-bit (8+)' - : 'Ubuntu 64-bit (16.04+)'; + : 'Ubuntu 64-bit (20.04+)'; break; default: throw new Error( diff --git a/packages/hadron-build/package.json b/packages/hadron-build/package.json index d9a19d6c39f..05dd065d4ff 100644 --- a/packages/hadron-build/package.json +++ b/packages/hadron-build/package.json @@ -1,7 +1,7 @@ { "name": "hadron-build", "description": "Tooling for Hadron apps like Compass", - "version": "25.8.7", + "version": "25.8.9", "scripts": { "check": "npm run lint && npm run depcheck", "test": "mocha -R spec", @@ -32,7 +32,7 @@ "debug": "^4.3.4", "del": "^2.0.2", "download": "^8.0.0", - "electron": "^37.2.2", + "electron": "^37.2.5", "electron-packager": "^15.5.1", "electron-packager-plugin-non-proprietary-codecs-ffmpeg": "^1.0.2", "flatnest": "^1.0.0", @@ -57,7 +57,7 @@ "zip-folder": "^1.0.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.2.0", "depcheck": "^1.4.1", "eslint-plugin-mocha": "^8.0.0", diff --git a/packages/hadron-build/test/upload.test.js b/packages/hadron-build/test/upload.test.js index 24aa8e61702..11ac350e53d 100644 --- a/packages/hadron-build/test/upload.test.js +++ b/packages/hadron-build/test/upload.test.js @@ -43,7 +43,7 @@ describe('upload', function () { describe('readablePlatformName', function () { it('returns a pretty-printed platform / arch label', function () { expect(readablePlatformName('x64', 'darwin')).to.eq( - 'macOS x64 (Intel) (10.15+)' + 'macOS x64 (Intel) (11+)' ); }); @@ -69,21 +69,21 @@ describe('upload', function () { arch: 'arm64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-1.0.0-darwin-arm64.dmg', - name: 'macOS arm64 (M1) (11.0+)', + name: 'macOS arm64 (Apple silicon) (11.0+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-1.0.0-darwin-x64.dmg', - name: 'macOS x64 (Intel) (10.15+)', + name: 'macOS x64 (Intel) (11+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass_1.0.0_amd64.deb', - name: 'Ubuntu 64-bit (16.04+)', + name: 'Ubuntu 64-bit (20.04+)', os: 'linux', }, { @@ -124,21 +124,21 @@ describe('upload', function () { arch: 'arm64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-readonly-1.0.0-darwin-arm64.dmg', - name: 'macOS arm64 (M1) (11.0+)', + name: 'macOS arm64 (Apple silicon) (11.0+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-readonly-1.0.0-darwin-x64.dmg', - name: 'macOS x64 (Intel) (10.15+)', + name: 'macOS x64 (Intel) (11+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-readonly_1.0.0_amd64.deb', - name: 'Ubuntu 64-bit (16.04+)', + name: 'Ubuntu 64-bit (20.04+)', os: 'linux', }, { @@ -179,21 +179,21 @@ describe('upload', function () { arch: 'arm64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-isolated-1.0.0-darwin-arm64.dmg', - name: 'macOS arm64 (M1) (11.0+)', + name: 'macOS arm64 (Apple silicon) (11.0+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-isolated-1.0.0-darwin-x64.dmg', - name: 'macOS x64 (Intel) (10.15+)', + name: 'macOS x64 (Intel) (11+)', os: 'darwin', }, { arch: 'x64', download_link: 'https://downloads.mongodb.com/compass/mongodb-compass-isolated_1.0.0_amd64.deb', - name: 'Ubuntu 64-bit (16.04+)', + name: 'Ubuntu 64-bit (20.04+)', os: 'linux', }, { diff --git a/packages/hadron-document/package.json b/packages/hadron-document/package.json index 9f3cdb6efc9..9efb178b19e 100644 --- a/packages/hadron-document/package.json +++ b/packages/hadron-document/package.json @@ -7,7 +7,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "8.9.3", + "version": "8.9.4", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -48,12 +48,12 @@ "dependencies": { "bson": "^6.10.4", "eventemitter3": "^4.0.0", - "hadron-type-checker": "^7.4.15", + "hadron-type-checker": "^7.4.16", "lodash": "^4.17.21", "mongodb": "^6.17.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/hadron-ipc/package.json b/packages/hadron-ipc/package.json index 846b5983f99..33e4582e65d 100644 --- a/packages/hadron-ipc/package.json +++ b/packages/hadron-ipc/package.json @@ -1,7 +1,7 @@ { "name": "hadron-ipc", "description": "Simplified IPC for electron apps.", - "version": "3.5.7", + "version": "3.5.9", "author": { "name": "MongoDB Inc", "email": "compass@mongodb.com" @@ -50,7 +50,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -67,7 +67,7 @@ }, "dependencies": { "debug": "^4.3.4", - "electron": "^37.2.2", + "electron": "^37.2.5", "is-electron-renderer": "^2.0.1" } } diff --git a/packages/hadron-type-checker/package.json b/packages/hadron-type-checker/package.json index bc0def70c1f..5cba461ef8d 100644 --- a/packages/hadron-type-checker/package.json +++ b/packages/hadron-type-checker/package.json @@ -7,7 +7,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "7.4.15", + "version": "7.4.16", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -31,7 +31,7 @@ "lodash": "^4.17.21" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "chai": "^4.2.0", "depcheck": "^1.4.1", "mocha": "^10.2.0" diff --git a/packages/instance-model/lib/model.js b/packages/instance-model/lib/model.js index 7142aa5a940..7cfb2cd638c 100644 --- a/packages/instance-model/lib/model.js +++ b/packages/instance-model/lib/model.js @@ -135,22 +135,9 @@ const InstanceModel = AmpersandModel.extend( isSearchIndexesSupported: 'boolean', atlasVersion: { type: 'string', default: '' }, csfleMode: { type: 'string', default: 'unavailable' }, - shouldFetchDbAndCollStats: { type: 'boolean', default: false }, }, initialize: function ({ preferences, ...props }) { - // Initialize the property directly from preferences - this.set({ - shouldFetchDbAndCollStats: - preferences.getPreferences().enableDbAndCollStats, - }); - - // Listen to preference changes using the preferences API - this._preferenceUnsubscribe = preferences.onPreferenceValueChanged( - 'enableDbAndCollStats', - (value) => { - this.set({ shouldFetchDbAndCollStats: value }); - } - ); + this.preferences = preferences; AmpersandModel.prototype.initialize.call(this, props); }, @@ -409,11 +396,15 @@ const InstanceModel = AmpersandModel.extend( return coll; }, + shouldFetchDbAndCollStats() { + return this.preferences.getPreferences().enableDbAndCollStats; + }, + + shouldFetchNamespacesFromPrivileges() { + return this.preferences.getPreferences().inferNamespacesFromPrivileges; + }, + removeAllListeners() { - // Clean up preference listeners - if (this._preferenceUnsubscribe) { - this._preferenceUnsubscribe(); - } InstanceModel.removeAllListeners(this); }, diff --git a/packages/instance-model/package.json b/packages/instance-model/package.json index 4cc3cf31024..08b18d9b0d5 100644 --- a/packages/instance-model/package.json +++ b/packages/instance-model/package.json @@ -2,7 +2,7 @@ "name": "mongodb-instance-model", "description": "MongoDB instance model", "author": "Lucas Hrabovsky ", - "version": "12.39.0", + "version": "12.41.0", "bugs": { "url": "https://jira.mongodb.org/projects/COMPASS/issues", "email": "compass@mongodb.com" @@ -29,13 +29,13 @@ }, "dependencies": { "ampersand-model": "^8.0.1", - "mongodb-collection-model": "^5.30.2", - "mongodb-data-service": "^22.29.2", - "mongodb-database-model": "^2.30.2", - "compass-preferences-model": "^2.47.0" + "mongodb-collection-model": "^5.31.0", + "mongodb-data-service": "^22.30.0", + "mongodb-database-model": "^2.31.0", + "compass-preferences-model": "^2.49.0" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "chai": "^4.3.4", "depcheck": "^1.4.1", diff --git a/packages/instance-model/test/index.test.js b/packages/instance-model/test/index.test.js index 9dd8f78cf86..b89bf08ccf1 100644 --- a/packages/instance-model/test/index.test.js +++ b/packages/instance-model/test/index.test.js @@ -23,10 +23,10 @@ describe('mongodb-instance-model', function () { const instance = new MongoDBInstance({ _id: 'abc', preferences }); await preferences.savePreferences({ enableDbAndCollStats: true }); - expect(instance.shouldFetchDbAndCollStats).to.equal(true); + expect(instance.shouldFetchDbAndCollStats()).to.equal(true); await preferences.savePreferences({ enableDbAndCollStats: false }); - expect(instance.shouldFetchDbAndCollStats).to.equal(false); + expect(instance.shouldFetchDbAndCollStats()).to.equal(false); }); context('with mocked dataService', function () { diff --git a/packages/mongodb-explain-compat/package.json b/packages/mongodb-explain-compat/package.json index b5040c46f04..682b3764d48 100644 --- a/packages/mongodb-explain-compat/package.json +++ b/packages/mongodb-explain-compat/package.json @@ -1,6 +1,6 @@ { "name": "mongodb-explain-compat", - "version": "3.3.15", + "version": "3.3.16", "description": "Convert mongodb SBE explain output to 4.4 explain output", "keywords": [ "mongodb", @@ -47,7 +47,7 @@ }, "license": "SSPL", "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "gen-esm-wrapper": "^1.1.0", "mocha": "^10.2.0", "nyc": "^15.1.0" diff --git a/packages/mongodb-query-util/package.json b/packages/mongodb-query-util/package.json index 945ee51c379..40772a04efd 100644 --- a/packages/mongodb-query-util/package.json +++ b/packages/mongodb-query-util/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "2.5.3", + "version": "2.5.4", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -50,7 +50,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/packages/my-queries-storage/package.json b/packages/my-queries-storage/package.json index 8108e69fb8b..145d20d0fbb 100644 --- a/packages/my-queries-storage/package.json +++ b/packages/my-queries-storage/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.34.0", + "version": "0.36.0", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -55,7 +55,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", @@ -71,9 +71,9 @@ "typescript": "^5.8.3" }, "dependencies": { - "@mongodb-js/compass-app-registry": "^9.4.17", - "@mongodb-js/compass-editor": "^0.47.0", - "@mongodb-js/compass-user-data": "^0.8.2", + "@mongodb-js/compass-app-registry": "^9.4.18", + "@mongodb-js/compass-editor": "^0.49.0", + "@mongodb-js/compass-user-data": "^0.8.4", "bson": "^6.10.4", "react": "^17.0.2" } diff --git a/packages/my-queries-storage/src/compass-pipeline-storage.ts b/packages/my-queries-storage/src/compass-pipeline-storage.ts index 597e5fccbae..c610490d53b 100644 --- a/packages/my-queries-storage/src/compass-pipeline-storage.ts +++ b/packages/my-queries-storage/src/compass-pipeline-storage.ts @@ -71,31 +71,17 @@ export class CompassPipelineStorage implements PipelineStorage { } async create(data: Omit): Promise { - try { - await this.userData.write(data.id, { - ...data, - lastModified: Date.now(), - }); - return true; - } catch { - return false; - } + return await this.userData.write(data.id, { + ...data, + lastModified: Date.now(), + }); } async updateAttributes( id: string, attributes: Partial ): Promise { - try { - await this.userData.write(id, { - ...(await this.userData.readOne(id)), - ...attributes, - lastModified: Date.now(), - }); - return true; - } catch { - return false; - } + return await this.userData.updateAttributes(id, attributes); } async delete(id: string) { diff --git a/packages/my-queries-storage/src/pipeline-storage-schema.ts b/packages/my-queries-storage/src/pipeline-storage-schema.ts index 9173c4eea24..e99fa1a3b76 100644 --- a/packages/my-queries-storage/src/pipeline-storage-schema.ts +++ b/packages/my-queries-storage/src/pipeline-storage-schema.ts @@ -61,8 +61,7 @@ export const PipelineSchema = z.preprocess( host: z.string().nullable().optional(), pipelineText: z.string(), lastModified: z - .number() - .default(0) + .union([z.coerce.date(), z.number()]) .transform((x) => new Date(x)), }) ); diff --git a/packages/reflux-state-mixin/package.json b/packages/reflux-state-mixin/package.json index c40d33a7d6c..74bf3fa2a9e 100644 --- a/packages/reflux-state-mixin/package.json +++ b/packages/reflux-state-mixin/package.json @@ -13,7 +13,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "1.2.15", + "version": "1.2.16", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -53,7 +53,7 @@ "reflux": "^0.4.1" }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/mocha-config-compass": "^1.7.0", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", diff --git a/scripts/package.json b/scripts/package.json index fab57d80e07..44121e727d3 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -14,7 +14,7 @@ "email": "compass@mongodb.com" }, "homepage": "https://github.com/mongodb-js/compass", - "version": "0.19.8", + "version": "0.19.9", "repository": { "type": "git", "url": "https://github.com/mongodb-js/compass.git" @@ -30,7 +30,7 @@ "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ." }, "devDependencies": { - "@mongodb-js/eslint-config-compass": "^1.4.4", + "@mongodb-js/eslint-config-compass": "^1.4.5", "@mongodb-js/prettier-config-compass": "^1.2.8", "@mongodb-js/tsconfig-compass": "^1.2.9", "depcheck": "^1.4.1"