← back to Rentv
pr/letters: case-insensitive merge-field lookup in render(). The {{...}} regex is /gi (case-insensitive match) but the fill did context[key] (case-sensitive), and mergeContext keys are all lowercase — so a mixed-case field like {{First_Name}} silently failed to fill and rendered as a literal broken placeholder in the SENT letter. Now context[key.toLowerCase()]. Verified any-case fields resolve, genuinely-absent fields still show + flag missing
bcf70d2e2db4d503be21c188a7dd11546ce0ccb0 · 2026-08-05 22:23:56 -0700 · Steve
Files touched
M src/pr/services/letters.js
Diff
commit bcf70d2e2db4d503be21c188a7dd11546ce0ccb0
Author: Steve <steve@designerwallcoverings.com>
Date: Wed Aug 5 22:23:56 2026 -0700
pr/letters: case-insensitive merge-field lookup in render(). The {{...}} regex is /gi (case-insensitive match) but the fill did context[key] (case-sensitive), and mergeContext keys are all lowercase — so a mixed-case field like {{First_Name}} silently failed to fill and rendered as a literal broken placeholder in the SENT letter. Now context[key.toLowerCase()]. Verified any-case fields resolve, genuinely-absent fields still show + flag missing
---
src/pr/services/letters.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pr/services/letters.js b/src/pr/services/letters.js
index dfda681e..aac7fff6 100644
--- a/src/pr/services/letters.js
+++ b/src/pr/services/letters.js
@@ -142,8 +142,8 @@ function marketLabel(org) {
function render({ subject_template, blocks, context, orgBlock }) {
const citations = [];
const fill = (s) => String(s || '').replace(/\{\{\s*([a-z0-9_]+)\s*\}\}/gi, (m, key) => {
- if (key === 'organization_specific_block') return orgBlock ? orgBlock.trim() : '';
- const v = context[key];
+ if (key.toLowerCase() === 'organization_specific_block') return orgBlock ? orgBlock.trim() : '';
+ const v = context[key.toLowerCase()]; // case-insensitive: the {{...}} regex is /gi, so a mixed-case field like {{First_Name}} must resolve too (context keys are lowercase) — else it renders as a broken placeholder in the sent letter
return v == null || v === '' ? m : String(v); // leave unfilled placeholders visible
});
const ordered = [...(blocks || [])].sort((a, b) => (a.order || 0) - (b.order || 0));
← 61c09db7 auto-save: 2026-08-05T22:16:18 (7 files) — data/deals-regist
·
back to Rentv
·
pr/letters: Cody gate — lowercase-normalize extractMergeFiel 035683ac →