Skip to content

fix(preset-algolia): keep separator highlight when reverse-highlight siblings disagree#1348

Merged
Haroenv merged 1 commit into
algolia:nextfrom
devteamaegis:fix/reverse-highlight-sibling-state
Jun 19, 2026
Merged

fix(preset-algolia): keep separator highlight when reverse-highlight siblings disagree#1348
Haroenv merged 1 commit into
algolia:nextfrom
devteamaegis:fix/reverse-highlight-sibling-state

Conversation

@devteamaegis

Copy link
Copy Markdown
Contributor

What's broken

In the reverse-highlight / reverse-snippet "sibling strategy", isPartHighlighted computes neighbor state with ||:

const isNextHighlighted = parts[i + 1]?.isHighlighted || true;
const isPreviousHighlighted = parts[i - 1]?.isHighlighted || true;

X || true is always true, even when the neighbor exists and is genuinely false. So the isPreviousHighlighted === isNextHighlighted guard is always true, and every separator part between mismatched neighbors is wrongly treated as highlighted-from-siblings. For a value where a separator sits between a highlighted and a non-highlighted segment, the reverse-highlight output is wrong.

Why it happens

|| was used where a "default only when the neighbor is missing" was intended — the ?. optional chaining shows the intent. false || true collapses a real false neighbor to true.

Fix

Use ?? so the true default applies only when the neighbor is absent (undefined).

Test

Added a case: a separator between a highlighted and a non-highlighted segment keeps its own state; fails before, passes after. Full autocomplete-preset-algolia suite stays green.

…siblings disagree

isPartHighlighted defaulted neighbor highlight states with `|| true`, which
also overrode an existing `false` neighbor. That made both siblings always
appear highlighted, so every non-alphanumeric separator was treated as
highlighted-from-siblings regardless of its real neighbors. Use `?? true` so
the default only applies when a neighbor is missing.
@codacy-production

codacy-production Bot commented Jun 11, 2026

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

TIP This summary will be updated as you push new changes.

@devteamaegis devteamaegis force-pushed the fix/reverse-highlight-sibling-state branch from 7e6df5f to 3837461 Compare June 11, 2026 19:44
@Haroenv Haroenv requested a review from Copilot June 19, 2026 13:34

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes incorrect separator highlighting in the autocomplete-preset-algolia reverse-highlight / reverse-snippet “sibling strategy” by ensuring sibling highlight state defaults only when a sibling is missing (not when it exists and is false).

Changes:

  • Replace || true with ?? true in isPartHighlighted so real false sibling states are preserved.
  • Add a regression test covering the “siblings disagree” case to prevent separator parts from incorrectly inheriting sibling highlight state.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
packages/autocomplete-preset-algolia/src/highlight/isPartHighlighted.ts Fixes sibling highlight defaulting logic by using nullish coalescing (??) instead of logical OR (`
packages/autocomplete-preset-algolia/src/highlight/tests/isPartHighlighted.test.ts Adds a regression test asserting separators keep their own highlight state when adjacent parts disagree.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Haroenv Haroenv left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks, this is correct!

@Haroenv Haroenv merged commit 732869e into algolia:next Jun 19, 2026
1 check passed
Haroenv added a commit to algolia/instantsearch that referenced this pull request Jun 26, 2026
…disagree (#7079)

* fix(highlight): keep separator state when reverse-highlight siblings disagree

`getHighlightFromSiblings` defaulted neighbor highlight state with `|| true`:

    const isNextHighlighted = parts[i + 1]?.isHighlighted || true;
    const isPreviousHighlighted = parts[i - 1]?.isHighlighted || true;

`X || true` is always `true`, even when the neighbor exists and is genuinely
`false`. So the `isPreviousHighlighted === isNextHighlighted` guard is always
satisfied and every separator part is treated as inheriting its siblings'
highlight state — even when the siblings disagree. For a value where a
separator sits between a highlighted and a non-highlighted segment, the
reverse-highlight / reverse-snippet output is wrong.

The `?.` optional chaining shows the intent was "default only when the neighbor
is missing". Use `??` so the `true` default applies only when the neighbor is
absent (`undefined`), preserving a real `false`.

Mirrors algolia/autocomplete#1348, which fixes the same bug in the
`autocomplete-preset-algolia` port of this sibling strategy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(highlight): update reverseHighlightedParts expectation for fixed sibling logic

The "multiple matches" case asserted the buggy output: a separator between two
non-highlighted parts ('Fi' and 'Black') was reversed to non-highlighted,
leaving a gap in an otherwise contiguous reverse-highlighted run. With the
`?? true` fix the separator correctly inherits its (agreeing) siblings, so the
reversed "Fi - Black" run is now uniformly highlighted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants