diff --git a/packages/mongodb-ns/README.md b/packages/mongodb-ns/README.md index 221868f4c..a85a99984 100644 --- a/packages/mongodb-ns/README.md +++ b/packages/mongodb-ns/README.md @@ -24,7 +24,14 @@ canadian-things.songs-aboot-bacon special: false, specialish: false, normal: true, + internal: false, validDatabaseName: true, validCollectionName: true, databaseHash: 23620443216 } ``` + +`internal` is `true` for +[internal databases](https://www.mongodb.com/docs/atlas/reference/internal-database/#internal-databases) +matching `__mdb_internal_*`, except `__mdb_internal_search` — UIs filter on +`internal` to hide these, and that one needs to stay visible. It is still +`special`/`specialish`. diff --git a/packages/mongodb-ns/src/index.spec.ts b/packages/mongodb-ns/src/index.spec.ts index a0b89ab37..ac7e65d88 100644 --- a/packages/mongodb-ns/src/index.spec.ts +++ b/packages/mongodb-ns/src/index.spec.ts @@ -69,6 +69,16 @@ describe('ns', function () { it('should acccept `__mdb_internal_suffix`', function () { assert(ns('__mdb_internal_suffix').special); }); + // COMPASS-10948: special via its own clause, not via `internal`. + it('should acccept `__mdb_internal_search`', function () { + assert(ns('__mdb_internal_search').special); + }); + }); + + describe('should identify specialish namespaces', function () { + it('should acccept `__mdb_internal_search`', function () { + assert(ns('__mdb_internal_search').specialish); + }); }); describe('should identify system namespaces', function () { @@ -103,6 +113,14 @@ describe('ns', function () { assert.equal(ns('__mdb_internal').isInternal(), false); assert(ns('__mdb_internal_bla').internal); assert(ns('__mdb_internal_foo_bar').isInternal()); + // COMPASS-10948: only the exact database name is exempt. + assert.equal(ns('__mdb_internal_search').internal, false); + assert.equal(ns('__mdb_internal_search.someColl').isInternal(), false); + assert(ns('__mdb_internal_search_foo').internal); + assert(ns('__mdb_internal_searchfoo').internal); + assert(ns('__mdb_internal_searchX').internal); + assert(ns('__mdb_internal_Search').internal); + assert.equal(ns('__mdb_internal_').isInternal(), false); }); describe('database name validation', function () { diff --git a/packages/mongodb-ns/src/index.ts b/packages/mongodb-ns/src/index.ts index 0ac0aec72..2577bf1f4 100644 --- a/packages/mongodb-ns/src/index.ts +++ b/packages/mongodb-ns/src/index.ts @@ -50,7 +50,9 @@ const NS: NSConstructor = function (this: NS, ns: string | NS): NS { } // https://www.mongodb.com/docs/atlas/reference/internal-database/#internal-databases - this.internal = /^__mdb_internal_\w/.test(this.database); + // `__mdb_internal_search` is exempt so UIs filtering on `internal` stop hiding + // it (COMPASS-10948). It stays `special` below — keep both changes together. + this.internal = /^__mdb_internal_(?!search$)\w/.test(this.database); this.system = /^(?:system(?!\.profile$).*|enxcol_)\./.test(this.collection); @@ -63,7 +65,8 @@ const NS: NSConstructor = function (this: NS, ns: string | NS): NS { this.command || this.system || this.database === 'config' || - this.internal; + this.internal || + this.database === '__mdb_internal_search'; this.specialish = this.special || ['local', 'admin'].indexOf(this.database) > -1;