Skip to content

Commit 170a5ec

Browse files
Move custom Nunjucks safe handling to filters
1 parent 2551fff commit 170a5ec

File tree

5 files changed

+17
-18
lines changed

5 files changed

+17
-18
lines changed

app/filters/nunjucks.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
// app/filters/nunjucks.js
22

3+
const { safe: nunjucksSafe } = require('nunjucks/src/filters')
4+
35
const log = (a, description = null) => {
46
if (description) {
57
description = `console.log("${description}:");`
68
}
7-
return `<script>${description || ''}console.log(${JSON.stringify(a, null, '\t')});</script>`
9+
10+
return nunjucksSafe(
11+
`<script>${description || ''}console.log(${JSON.stringify(a, null, '\t')});</script>`
12+
)
813
}
914

1015

app/filters/tags.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// app/filters/tags.js
22

3+
const { safe: nunjucksSafe } = require('nunjucks/src/filters')
34
const { formatWords, sentenceCase, snakeCase } = require('../lib/utils/strings')
45
const { getStatusTagColour, getStatusText } = require('../lib/utils/status')
56

@@ -31,7 +32,7 @@ const toTag = (status, options = {}) => {
3132

3233
// Generate tag HTML
3334
const idAttr = options.id ? ` id=\"${options.id}\"` : ''
34-
return `<strong${idAttr} class="${classes}">${text}</strong>`
35+
return nunjucksSafe(`<strong${idAttr} class="${classes}">${text}</strong>`)
3536
}
3637

3738
module.exports = {

app/lib/utils/participants.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// app/lib/utils/participants.js
2+
3+
const { safe: nunjucksSafe } = require('nunjucks/src/filters')
24
const riskLevels = require('../../data/risk-levels.js')
35

46
/**
@@ -18,7 +20,7 @@ const getParticipant = (data, participantId) => {
1820
const getFullName = (participant) => {
1921
if (!participant?.demographicInformation) return ''
2022
const { firstName, middleName, lastName } = participant.demographicInformation
21-
return [firstName, middleName, lastName].filter(Boolean).join(' ')
23+
return nunjucksSafe([firstName, middleName, lastName].filter(Boolean).join(' '))
2224
}
2325

2426
/**
@@ -38,7 +40,7 @@ const getFullNameReversed = (participant) => {
3840
const getShortName = (participant) => {
3941
if (!participant?.demographicInformation) return ''
4042
const { firstName, lastName } = participant.demographicInformation
41-
return `${firstName} ${lastName}`
43+
return nunjucksSafe(`${firstName} ${lastName}`)
4244
}
4345

4446
/**

app/lib/utils/strings.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// app/lib/utils/strings.js
22

3+
const { safe: nunjucksSafe } = require('nunjucks/src/filters')
34
const pluralizeLib = require('pluralize')
45

56

@@ -241,7 +242,7 @@ const stringLiteral = function (str) {
241242
*/
242243
const noWrap = (input) => {
243244
if (!input) return ''
244-
return `<span class="app-nowrap">${input}</span>`
245+
return nunjucksSafe(`<span class="app-nowrap">${input}</span>`)
245246
}
246247

247248
/**
@@ -251,7 +252,7 @@ const noWrap = (input) => {
251252
*/
252253
const asHint = (input) => {
253254
if (!input) return ''
254-
return `<span class="app-text-grey">${input}</span>`
255+
return nunjucksSafe(`<span class="app-text-grey">${input}</span>`)
255256
}
256257

257258
/** * Wrap string in a hidden text span
@@ -261,7 +262,7 @@ const asHint = (input) => {
261262
*/
262263
const asVisuallyHiddenText = (input) => {
263264
if (!input) return ''
264-
return `<span class="nhsuk-u-visually-hidden">${input}</span>`
265+
return nunjucksSafe(`<span class="nhsuk-u-visually-hidden">${input}</span>`)
265266
}
266267

267268
/**

lib/utils.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,11 @@ const crypto = require('crypto');
88
const coreFilters = require('./core_filters');
99
const customFilters = require('../app/filters');
1010

11-
const SAFE_FILTERS = ['noWrap', 'asHint', 'log', 'toTag', 'getShortName', 'getFullName', 'asVisuallyHiddenText'];
1211

1312
exports.addNunjucksFilters = function (env) {
1413
const filters = Object.assign(coreFilters(env), customFilters(env));
15-
const safe = env.getFilter('safe');
16-
1714
Object.keys(filters).forEach((filterName) => {
18-
const filter = filters[filterName];
19-
20-
// If it's in our safe list, wrap the filter to mark its output as safe
21-
if (SAFE_FILTERS.includes(filterName)) {
22-
env.addFilter(filterName, (...args) => safe(filter(...args)));
23-
} else {
24-
env.addFilter(filterName, filter);
25-
}
15+
env.addFilter(filterName, filters[filterName]);
2616
});
2717
};
2818

0 commit comments

Comments
 (0)