diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts index 27cd65d63b..55c18cd6fc 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.test.ts @@ -1145,6 +1145,35 @@ describe('parseHighlightFields', () => { bar: 'ghi <>jkl', }); }); + + it('should filter out non array positions', () => { + expect( + parseHighlightFields({ + preTag: '<>', + postTag: '', + doc: { foo: 'abc def', bar: 'ghi jkl' }, + positionMetadata: { + test: { + foo: { + // invalid position item + position: [null as unknown as number[]], + }, + }, + anotherTest: { + foo: { + position: [[4, 3]], + }, + bar: { + position: [[4, 3]], + }, + }, + }, + }), + ).toEqual({ + foo: 'abc <>def', + bar: 'ghi <>jkl', + }); + }); }); describe('stopword testing', () => { diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index b69b5ea863..ae5a541e81 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -309,8 +309,13 @@ export function parseHighlightFields({ const highlightFieldPositions = Object.values(positionMetadata).reduce( (fieldPositions, metadata) => { Object.keys(metadata).map(fieldKey => { - fieldPositions[fieldKey] = fieldPositions[fieldKey] ?? []; - fieldPositions[fieldKey].push(...metadata[fieldKey].position); + const validFieldMetadataPositions = metadata[ + fieldKey + ]?.position?.filter(position => Array.isArray(position)); + if (validFieldMetadataPositions.length) { + fieldPositions[fieldKey] = fieldPositions[fieldKey] ?? []; + fieldPositions[fieldKey].push(...validFieldMetadataPositions); + } }); return fieldPositions;