feat: allow nested fields in filter rules

This commit is contained in:
Daniel Lautzenheiser 2023-06-13 20:04:20 -04:00
parent 19d8952c5f
commit b931d3d153
2 changed files with 22 additions and 1 deletions

View File

@ -64,6 +64,17 @@ describe('filterEntries', () => {
}, },
}); });
const mockNestedEntry = createMockEntry({
path: 'path/to/nested-object-field.md',
data: {
nested: {
object: {
field: 'yes',
},
},
},
});
const entries: Entry[] = [ const entries: Entry[] = [
mockEnglishEntry, mockEnglishEntry,
mockFrenchEntry, mockFrenchEntry,
@ -71,6 +82,7 @@ describe('filterEntries', () => {
mockUnderscoreIndexEntry, mockUnderscoreIndexEntry,
mockRandomFileNameEntry, mockRandomFileNameEntry,
mockTags1and4Entry, mockTags1and4Entry,
mockNestedEntry,
]; ];
describe('field rules', () => { describe('field rules', () => {
@ -219,4 +231,12 @@ describe('filterEntries', () => {
).toEqual([mockUnderscoreIndexEntry]); ).toEqual([mockUnderscoreIndexEntry]);
}); });
}); });
describe('nested fields', () => {
it('should filter based on multiple rules (must match all rules)', () => {
expect(filterEntries(entries, [{ field: 'nested.object.field', value: 'yes' }])).toEqual([
mockNestedEntry,
]);
});
});
}); });

View File

@ -1,9 +1,10 @@
import { parse } from 'path'; import { parse } from 'path';
import get from 'lodash/get';
import type { Entry, FieldFilterRule, FilterRule } from '@staticcms/core/interface'; import type { Entry, FieldFilterRule, FilterRule } from '@staticcms/core/interface';
export function entryMatchesFieldRule(entry: Entry, filterRule: FieldFilterRule): boolean { export function entryMatchesFieldRule(entry: Entry, filterRule: FieldFilterRule): boolean {
const fieldValue = entry.data?.[filterRule.field]; const fieldValue = get(entry.data, filterRule.field);
if ('pattern' in filterRule) { if ('pattern' in filterRule) {
if (Array.isArray(fieldValue)) { if (Array.isArray(fieldValue)) {
return Boolean(fieldValue.find(v => new RegExp(filterRule.pattern).test(String(v)))); return Boolean(fieldValue.find(v => new RegExp(filterRule.pattern).test(String(v))));