From 7032569e8b64da6c0d07d896507640365cd857f6 Mon Sep 17 00:00:00 2001 From: "codefix-patchflow[bot]" <292349666+codefix-patchflow[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 17:20:03 +0000 Subject: [PATCH] fix: nested query-key parsing so literal bracket pairs inside a bracket group are preserved... --- lib/parse.js | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/parse.js b/lib/parse.js index 549de82e..3dc7294b 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -227,10 +227,41 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) { return [key]; } - var brackets = /(\[[^[\]]*])/; - var child = /(\[[^[\]]*])/g; + var findClosingBracket = function findClosingBracket(start) { + var bracketDepth = 0; - var segment = brackets.exec(key); + for (var j = start; j < key.length; ++j) { + if (key.charAt(j) === '[') { + bracketDepth += 1; + } else if (key.charAt(j) === ']') { + bracketDepth -= 1; + + if (bracketDepth === 0) { + return j; + } + } + } + + return -1; + }; + + var findNextSegment = function findNextSegment(start) { + var open = key.indexOf('[', start); + + if (open === -1) { + return null; + } + + var close = findClosingBracket(open); + + return { + segment: close === -1 ? '[' + key.slice(open) + ']' : key.slice(open, close + 1), + index: open, + end: close === -1 ? key.length : close + 1 + }; + }; + + var segment = findNextSegment(0); var parent = segment ? key.slice(0, segment.index) : key; var keys = []; @@ -246,17 +277,18 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) { } var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { + while (segment !== null && i < options.depth) { i += 1; - var segmentContent = segment[1].slice(1, -1); + var segmentContent = segment.segment.slice(1, -1); if (!options.plainObjects && has.call(Object.prototype, segmentContent)) { if (!options.allowPrototypes) { return; } } - keys[keys.length] = segment[1]; + keys[keys.length] = segment.segment; + segment = findNextSegment(segment.end); } if (segment) {