diff --git a/cypress/e2e/plugins/0-mock-plugin-tests/single-plugin-test.cypress.js b/cypress/e2e/plugins/0-mock-plugin-tests/single-plugin-test.cypress.js
index 1ace81b4be..66e714b941 100644
--- a/cypress/e2e/plugins/0-mock-plugin-tests/single-plugin-test.cypress.js
+++ b/cypress/e2e/plugins/0-mock-plugin-tests/single-plugin-test.cypress.js
@@ -18,7 +18,7 @@ const pluginFooViewMarkup = `
{% block content %}
{% include "foo.njk" %}
{{ 'abc' | foo__strong }}
-{{ fooEmphasize('def') }}
+{{ foo.styles.emphasize('def') }}
{{ fooField('pass', value='ghi') }}
{% endblock %}
diff --git a/cypress/fixtures/plugins/plugin-foo/functions.js b/cypress/fixtures/plugins/plugin-foo/functions.js
index 1ba0031835..92f3ec6cd8 100644
--- a/cypress/fixtures/plugins/plugin-foo/functions.js
+++ b/cypress/fixtures/plugins/plugin-foo/functions.js
@@ -1,2 +1,2 @@
const { addFunction } = require('govuk-prototype-kit').views
-addFunction('fooEmphasize', (content) => `${content}`, { renderAsHtml: true })
+addFunction('foo.styles.emphasize', (content) => `${content}`, { renderAsHtml: true })
diff --git a/lib/functions/api.js b/lib/functions/api.js
index e38e1f6a24..f67e3b9868 100644
--- a/lib/functions/api.js
+++ b/lib/functions/api.js
@@ -20,7 +20,27 @@ function addGlobalToEnvironment (name, fn, config) {
return new nunjucks.runtime.SafeString(html)
}
}
- environment.addGlobal(name, fnToAdd)
+
+ if (!name.includes('.')) {
+ environment.addGlobal(name, fnToAdd)
+ } else {
+ const [key, ...rest] = name.split('.')
+ try {
+ environment.getGlobal(key)
+ } catch (err) {
+ environment.addGlobal(key, {})
+ }
+ rest.reduce((obj, next, index) => {
+ if (index < rest.length - 1) {
+ if (!obj[next]) {
+ obj[next] = {}
+ }
+ return obj[next]
+ }
+ obj[next] = fnToAdd
+ return null
+ }, environment.getGlobal(key))
+ }
}
function addFunction (name, fn, config) {