@defra/forms-engine-plugin 4.0.23 → 4.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.server/server/forms/components.json +2 -2
  2. package/.server/server/plugins/engine/components/DeclarationField.d.ts +2 -0
  3. package/.server/server/plugins/engine/components/DeclarationField.js +8 -1
  4. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  5. package/.server/server/plugins/engine/components/EastingNorthingField.js +7 -6
  6. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  7. package/.server/server/plugins/engine/components/LatLongField.js +7 -6
  8. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  9. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +4 -4
  10. package/.server/server/plugins/engine/components/LocationFieldBase.js +3 -2
  11. package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
  12. package/.server/server/plugins/engine/components/Markdown.d.ts +2 -0
  13. package/.server/server/plugins/engine/components/Markdown.js +4 -1
  14. package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
  15. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +3 -3
  16. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +5 -3
  17. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
  18. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +3 -3
  19. package/.server/server/plugins/engine/components/OsGridRefField.js +5 -3
  20. package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
  21. package/.server/server/plugins/engine/components/helpers/index.d.ts +10 -0
  22. package/.server/server/plugins/engine/components/helpers/index.js +18 -0
  23. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  24. package/.server/server/plugins/engine/index.js +4 -1
  25. package/.server/server/plugins/engine/index.js.map +1 -1
  26. package/.server/server/plugins/engine/views/components/declarationfield.html +1 -1
  27. package/.server/server/plugins/engine/views/components/markdown.html +1 -1
  28. package/.server/server/plugins/engine/views/confirmation.html +1 -1
  29. package/package.json +3 -2
  30. package/src/server/forms/components.json +2 -2
  31. package/src/server/plugins/engine/components/DeclarationField.test.ts +24 -0
  32. package/src/server/plugins/engine/components/DeclarationField.ts +20 -2
  33. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +30 -1
  34. package/src/server/plugins/engine/components/EastingNorthingField.ts +19 -6
  35. package/src/server/plugins/engine/components/LatLongField.test.ts +30 -1
  36. package/src/server/plugins/engine/components/LatLongField.ts +19 -6
  37. package/src/server/plugins/engine/components/LocationFieldBase.ts +11 -6
  38. package/src/server/plugins/engine/components/Markdown.ts +4 -1
  39. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +4 -4
  40. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +11 -4
  41. package/src/server/plugins/engine/components/OsGridRefField.test.ts +4 -4
  42. package/src/server/plugins/engine/components/OsGridRefField.ts +11 -3
  43. package/src/server/plugins/engine/components/helpers/helpers.test.ts +40 -0
  44. package/src/server/plugins/engine/components/helpers/index.ts +18 -0
  45. package/src/server/plugins/engine/index.ts +5 -2
  46. package/src/server/plugins/engine/views/components/declarationfield.html +1 -1
  47. package/src/server/plugins/engine/views/components/markdown.html +1 -1
  48. package/src/server/plugins/engine/views/confirmation.html +1 -1
@@ -1,6 +1,7 @@
1
1
  import { type OsGridRefFieldComponent } from '@defra/forms-model'
2
2
 
3
3
  import { LocationFieldBase } from '~/src/server/plugins/engine/components/LocationFieldBase.js'
4
+ import { createLowerFirstExpression } from '~/src/server/plugins/engine/components/helpers/index.js'
4
5
 
5
6
  export class OsGridRefField extends LocationFieldBase {
6
7
  declare options: OsGridRefFieldComponent['options']
@@ -15,10 +16,15 @@ export class OsGridRefField extends LocationFieldBase {
15
16
  const pattern =
16
17
  /^((([sS]|[nN])[a-hA-Hj-zJ-Z])|(([tT]|[oO])[abfglmqrvwABFGLMQRVW])|([hH][l-zL-Z])|([jJ][lmqrvwLMQRVW]))\s?(([0-9]{3})\s?([0-9]{3})|([0-9]{4})\s?([0-9]{4})|([0-9]{5})\s?([0-9]{5}))$/
17
18
 
19
+ const patternTemplate =
20
+ 'Enter a valid OS grid reference for {{lowerFirst(#title)}} like TQ123456'
21
+
18
22
  return {
19
23
  pattern,
20
- patternErrorMessage: `Enter a valid OS grid reference for {{#title}} like TQ123456`,
21
- requiredMessage: 'Enter {{#title}}'
24
+ patternErrorMessage: createLowerFirstExpression(patternTemplate),
25
+ requiredMessage: createLowerFirstExpression(
26
+ 'Enter {{lowerFirst(#title)}}'
27
+ )
22
28
  }
23
29
  }
24
30
 
@@ -26,7 +32,9 @@ export class OsGridRefField extends LocationFieldBase {
26
32
  return [
27
33
  {
28
34
  type: 'pattern',
29
- template: 'Enter a valid OS grid reference for {{#title}} like TQ123456'
35
+ template: createLowerFirstExpression(
36
+ 'Enter a valid OS grid reference for {{lowerFirst(#title)}} like TQ123456'
37
+ )
30
38
  }
31
39
  ]
32
40
  }
@@ -6,6 +6,10 @@ import { LatLongField } from '~/src/server/plugins/engine/components/LatLongFiel
6
6
  import { NationalGridFieldNumberField } from '~/src/server/plugins/engine/components/NationalGridFieldNumberField.js'
7
7
  import { OsGridRefField } from '~/src/server/plugins/engine/components/OsGridRefField.js'
8
8
  import { createComponent } from '~/src/server/plugins/engine/components/helpers/components.js'
9
+ import {
10
+ createLowerFirstExpression,
11
+ lowerFirstExpressionOptions
12
+ } from '~/src/server/plugins/engine/components/helpers/index.js'
9
13
  import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
10
14
  import definition from '~/test/form/definitions/basic.js'
11
15
 
@@ -123,3 +127,39 @@ describe('ComponentBase tests', () => {
123
127
  expect(component.title).toBe('Context Field')
124
128
  })
125
129
  })
130
+
131
+ describe('lowerFirst expression helpers', () => {
132
+ test('lowerFirstExpressionOptions should have lowerFirst function', () => {
133
+ expect(lowerFirstExpressionOptions).toHaveProperty('functions')
134
+ expect(lowerFirstExpressionOptions).toHaveProperty(
135
+ 'functions.lowerFirst',
136
+ expect.any(Function)
137
+ )
138
+ })
139
+
140
+ test('createLowerFirstExpression should create a Joi expression', () => {
141
+ const template = 'Enter {{lowerFirst(#title)}}'
142
+ const expression = createLowerFirstExpression(template)
143
+
144
+ expect(expression).toBeDefined()
145
+ expect(typeof expression).toBe('object')
146
+ expect(expression).toHaveProperty('_template')
147
+ })
148
+
149
+ test('createLowerFirstExpression should render template with lowerFirst', () => {
150
+ const template = 'Enter {{lowerFirst(#title)}}'
151
+ const expression = createLowerFirstExpression(template)
152
+
153
+ // Check the rendered template is stored
154
+ expect(expression).toHaveProperty('rendered', template)
155
+ })
156
+
157
+ test('createLowerFirstExpression should support multiple interpolations', () => {
158
+ const template =
159
+ 'Easting for {{lowerFirst(#title)}} must be between {{#min}} and {{#max}}'
160
+ const expression = createLowerFirstExpression(template)
161
+
162
+ expect(expression).toBeDefined()
163
+ expect(expression).toHaveProperty('rendered', template)
164
+ })
165
+ })
@@ -1,4 +1,6 @@
1
1
  import { type ComponentDef } from '@defra/forms-model'
2
+ import joi, { type JoiExpression, type ReferenceOptions } from 'joi'
3
+ import lowerFirst from 'lodash/lowerFirst.js'
2
4
 
3
5
  /**
4
6
  * Prevent Markdown formatting
@@ -36,3 +38,19 @@ export const addClassOptionIfNone = (
36
38
  ) => {
37
39
  options.classes ??= className
38
40
  }
41
+
42
+ /**
43
+ * Configuration for Joi expressions that use lowerFirst function
44
+ */
45
+ export const lowerFirstExpressionOptions = {
46
+ functions: {
47
+ lowerFirst
48
+ }
49
+ } as ReferenceOptions
50
+
51
+ /**
52
+ * Creates a Joi expression with lowerFirst function support
53
+ * Used for error messages in location field components
54
+ */
55
+ export const createLowerFirstExpression = (template: string): JoiExpression =>
56
+ joi.expression(template, lowerFirstExpressionOptions) as JoiExpression
@@ -33,8 +33,11 @@ export const prepareNunjucksEnvironment = function (
33
33
  env.addFilter(name, nunjucksFilter)
34
34
  }
35
35
 
36
- env.addFilter('markdown', (text: string) =>
37
- markdownToHtml(text, pluginOptions.baseUrl)
36
+ env.addFilter('markdown', (text: string, startingHeaderLevel?: number) =>
37
+ markdownToHtml(text, {
38
+ baseUrl: pluginOptions.baseUrl,
39
+ startingHeaderLevel
40
+ })
38
41
  )
39
42
 
40
43
  for (const [name, nunjucksGlobal] of Object.entries(globals)) {
@@ -5,7 +5,7 @@
5
5
  {% macro DeclarationField(component) %}
6
6
  {% set content %}
7
7
  <div class="app-prose-scope">
8
- {{ component.model.content | markdown | safe }}
8
+ {{ component.model.content | markdown(component.model.headerStartLevel) | safe }}
9
9
  </div>
10
10
  {% endset %}
11
11
  {% set checkboxes = component.model | merge({ formGroup: { beforeInputs: { html: content } } }) %}
@@ -1,5 +1,5 @@
1
1
  {% macro Markdown(component) %}
2
2
  <div class="app-prose-scope">
3
- {{ component.model.content | markdown | safe }}
3
+ {{ component.model.content | markdown(component.model.headerStartLevel) | safe }}
4
4
  </div>
5
5
  {% endmacro %}
@@ -12,7 +12,7 @@
12
12
  }) }}
13
13
  <h2 class="govuk-heading-m">What happens next</h2>
14
14
  <div class="app-prose-scope">
15
- {{ submissionGuidance | markdown | safe }}
15
+ {{ submissionGuidance | markdown(3) | safe }}
16
16
  </div>
17
17
  </div>
18
18
  </div>