MCPcopy
hub / github.com/callumalpass/tasknotes / matchesProjectProperty

Function matchesProjectProperty

src/utils/projectFilterUtils.ts:48–99  ·  view source on GitHub ↗
(
	frontmatter: Record<string, unknown> | undefined | null,
	filter: ProjectPropertyFilter
)

Source from the content-addressed store, hash-verified

46}
47
48export function matchesProjectProperty(
49 frontmatter: Record<string, unknown> | undefined | null,
50 filter: ProjectPropertyFilter
51): boolean {
52 if (!filter.enabled) {
53 return true;
54 }
55
56 if (!frontmatter || typeof frontmatter !== "object") {
57 return false;
58 }
59
60 if (!(filter.key in frontmatter)) {
61 return false;
62 }
63
64 const actualValue = (frontmatter)[filter.key];
65
66 const expectedValues = normalizePropertyValues(filter.value);
67 if (expectedValues.length === 0) {
68 return actualValue !== undefined && actualValue !== null;
69 }
70
71 const normalizedExpectedValues = new Set(
72 expectedValues.map((expectedValue) => expectedValue.toLowerCase())
73 );
74
75 const matchesValue = (value: unknown): boolean => {
76 if (value === null || value === undefined) {
77 return false;
78 }
79 if (Array.isArray(value)) {
80 return value.some((item) => matchesValue(item));
81 }
82 if (typeof value === "string") {
83 return normalizedExpectedValues.has(value.trim().toLowerCase());
84 }
85 if (typeof value === "number" || typeof value === "boolean") {
86 return normalizedExpectedValues.has(String(value).toLowerCase());
87 }
88 if (typeof value === "object") {
89 try {
90 return normalizedExpectedValues.has(JSON.stringify(value).toLowerCase());
91 } catch {
92 return false;
93 }
94 }
95 return normalizedExpectedValues.has(stringifyUnknown(value).toLowerCase());
96 };
97
98 return matchesValue(actualValue);
99}

Callers 4

getItemsMethod · 0.90
runFunction · 0.90

Calls 2

normalizePropertyValuesFunction · 0.85
matchesValueFunction · 0.85

Tested by

no test coverage detected