From d7705bb66ab25aafa418209312a21074a7a62593 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Fri, 14 Nov 2025 16:13:06 -0800 Subject: [PATCH 1/2] feat(query-bar): add _id: ObjectId('text') around pasted object id in query bar COMPASS-10077 --- .../src/query/leniently-fix-query.spec.ts | 32 +++++++ .../src/query/leniently-fix-query.ts | 84 +++++++++++++------ 2 files changed, 89 insertions(+), 27 deletions(-) diff --git a/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts b/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts index bbee092ee77..a563fac2e8c 100644 --- a/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts +++ b/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts @@ -31,4 +31,36 @@ describe('lenientlyFixQuery [Utils]', function () { expect(query).to.equal('\\{ query: 1 ${}}'); }); }); + + describe('when an ObjectId is pasted alone', function () { + it('returns a fix action with _id: ObjectId("")', function () { + const query = lenientlyFixQuery('{578cfb38d5021e616087f53f}'); + expect(query).to.equal('{ _id: ObjectId("578cfb38d5021e616087f53f") }'); + }); + }); + + describe('when a valid ObjectId query is pasted', function () { + it('returns a no-op with the existing query', function () { + const query = lenientlyFixQuery( + '{ _id: ObjectId("507f1f77bcf86cd799439011") }' + ); + + expect(query).to.equal(false); + }); + }); + + describe('when an invalid ObjectId is pasted', function () { + it('returns a no-op with the existing query', function () { + const queryWith25Chars = lenientlyFixQuery('{578cfb38d5021e616087f53f1}'); + expect(queryWith25Chars).to.equal(false); + + const queryWithObjectIdNoBraces = lenientlyFixQuery( + '578cfb38d5021e616087f53f1' + ); + expect(queryWithObjectIdNoBraces).to.equal(false); + + const pineappleQuery = lenientlyFixQuery('{pineapple}'); + expect(pineappleQuery).to.equal(false); + }); + }); }); diff --git a/packages/compass-query-bar/src/query/leniently-fix-query.ts b/packages/compass-query-bar/src/query/leniently-fix-query.ts index 50f6abdd228..7a2e9c22101 100644 --- a/packages/compass-query-bar/src/query/leniently-fix-query.ts +++ b/packages/compass-query-bar/src/query/leniently-fix-query.ts @@ -8,43 +8,73 @@ function _isValidQuery(query: string): boolean { } } +// Add _id: ObjectId("") when a user pastes only an object id. +function _fixObjectIdInQuery(query: string): string | undefined { + const objectIdRegex = /^{([0-9a-fA-F]{24})}$/; + + const match = query.match(objectIdRegex); + if (match) { + return `{ _id: ObjectId("${match[1]}") }`; + } + return; +} + +function _fixBraceEscapingInQuery(query: string): string | undefined { + const isValid = _isValidQuery(query); + + if (isValid) { + return; + } + + let modified = false; + if (query.startsWith('{') && query.endsWith('}')) { + const queryWithoutWrappingBraces = query.substring(1, query.length - 1); + const isInnerQueryValid = _isValidQuery(queryWithoutWrappingBraces); + if (isInnerQueryValid) { + modified = true; + query = queryWithoutWrappingBraces; + } + } else { + const wrappedQuery = `{${query}}`; + if (_isValidQuery(wrappedQuery)) { + modified = true; + query = wrappedQuery; + } + } + + if (!modified) { + return; + } + + // Add template formatting to put the cursor position before the last closing brace. + query = query.replaceAll('{', '\\{'); + const caretPosition = query.lastIndexOf('}'); + + query = + query.substring(0, caretPosition) + '${}' + query.substring(caretPosition); + return query; +} + export function lenientlyFixQuery(query: string): string | false { query = query.trim(); - let modified = false; if (query === '') { return '\\{${}}'; } - const isValid = _isValidQuery(query); + let modified = false; - if (!isValid) { - if (query.startsWith('{') && query.endsWith('}')) { - const queryWithoutWrappingBraces = query.substring(1, query.length - 1); - const isInnerQueryValid = _isValidQuery(queryWithoutWrappingBraces); - if (isInnerQueryValid) { - modified = true; - query = queryWithoutWrappingBraces; - } - } else { - const wrappedQuery = `{${query}}`; - if (_isValidQuery(wrappedQuery)) { - modified = true; - query = wrappedQuery; - } - } + const fixedObjectId = _fixObjectIdInQuery(query); + if (fixedObjectId) { + modified = true; + query = fixedObjectId; } - if (modified) { - query = query.replaceAll('{', '\\{'); - const caretPosition = query.lastIndexOf('}'); - - query = - query.substring(0, caretPosition) + - '${}' + - query.substring(caretPosition); - return query; + const fixedBraceEscaping = _fixBraceEscapingInQuery(query); + if (fixedBraceEscaping) { + modified = true; + query = fixedBraceEscaping; } - return false; + return modified ? query : false; } From 3d112686c6b9c6a8f5840d32c92e169d72e44c91 Mon Sep 17 00:00:00 2001 From: Rhys Howell Date: Fri, 14 Nov 2025 16:22:13 -0800 Subject: [PATCH 2/2] fixup: template for both fixes --- .../src/query/leniently-fix-query.spec.ts | 4 ++- .../src/query/leniently-fix-query.ts | 32 ++++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts b/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts index a563fac2e8c..0d4e2d59d7c 100644 --- a/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts +++ b/packages/compass-query-bar/src/query/leniently-fix-query.spec.ts @@ -35,7 +35,9 @@ describe('lenientlyFixQuery [Utils]', function () { describe('when an ObjectId is pasted alone', function () { it('returns a fix action with _id: ObjectId("")', function () { const query = lenientlyFixQuery('{578cfb38d5021e616087f53f}'); - expect(query).to.equal('{ _id: ObjectId("578cfb38d5021e616087f53f") }'); + expect(query).to.equal( + '\\{ _id: ObjectId("578cfb38d5021e616087f53f") ${}}' + ); }); }); diff --git a/packages/compass-query-bar/src/query/leniently-fix-query.ts b/packages/compass-query-bar/src/query/leniently-fix-query.ts index 7a2e9c22101..3b98423b74e 100644 --- a/packages/compass-query-bar/src/query/leniently-fix-query.ts +++ b/packages/compass-query-bar/src/query/leniently-fix-query.ts @@ -16,7 +16,6 @@ function _fixObjectIdInQuery(query: string): string | undefined { if (match) { return `{ _id: ObjectId("${match[1]}") }`; } - return; } function _fixBraceEscapingInQuery(query: string): string | undefined { @@ -26,33 +25,18 @@ function _fixBraceEscapingInQuery(query: string): string | undefined { return; } - let modified = false; if (query.startsWith('{') && query.endsWith('}')) { const queryWithoutWrappingBraces = query.substring(1, query.length - 1); const isInnerQueryValid = _isValidQuery(queryWithoutWrappingBraces); if (isInnerQueryValid) { - modified = true; - query = queryWithoutWrappingBraces; + return queryWithoutWrappingBraces; } } else { const wrappedQuery = `{${query}}`; if (_isValidQuery(wrappedQuery)) { - modified = true; - query = wrappedQuery; + return wrappedQuery; } } - - if (!modified) { - return; - } - - // Add template formatting to put the cursor position before the last closing brace. - query = query.replaceAll('{', '\\{'); - const caretPosition = query.lastIndexOf('}'); - - query = - query.substring(0, caretPosition) + '${}' + query.substring(caretPosition); - return query; } export function lenientlyFixQuery(query: string): string | false { @@ -76,5 +60,15 @@ export function lenientlyFixQuery(query: string): string | false { query = fixedBraceEscaping; } - return modified ? query : false; + if (!modified) { + return false; + } + + // Add template formatting to put the cursor position before the last closing brace. + query = query.replaceAll('{', '\\{'); + const caretPosition = query.lastIndexOf('}'); + + query = + query.substring(0, caretPosition) + '${}' + query.substring(caretPosition); + return query; }