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[] = [
mockEnglishEntry,
mockFrenchEntry,
@ -71,6 +82,7 @@ describe('filterEntries', () => {
mockUnderscoreIndexEntry,
mockRandomFileNameEntry,
mockTags1and4Entry,
mockNestedEntry,
];
describe('field rules', () => {
@ -219,4 +231,12 @@ describe('filterEntries', () => {
).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 get from 'lodash/get';
import type { Entry, FieldFilterRule, FilterRule } from '@staticcms/core/interface';
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 (Array.isArray(fieldValue)) {
return Boolean(fieldValue.find(v => new RegExp(filterRule.pattern).test(String(v))));