diff --git a/src/server/plugins/engine/components/AutocompleteField.test.ts b/src/server/plugins/engine/components/AutocompleteField.test.ts
index 8c38e772d..a94f0574d 100644
--- a/src/server/plugins/engine/components/AutocompleteField.test.ts
+++ b/src/server/plugins/engine/components/AutocompleteField.test.ts
@@ -9,7 +9,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
listNumber,
diff --git a/src/server/plugins/engine/components/CheckboxesField.test.ts b/src/server/plugins/engine/components/CheckboxesField.test.ts
index e4cbc675d..9f304d174 100644
--- a/src/server/plugins/engine/components/CheckboxesField.test.ts
+++ b/src/server/plugins/engine/components/CheckboxesField.test.ts
@@ -11,7 +11,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
listNumber,
diff --git a/src/server/plugins/engine/components/ComponentBase.ts b/src/server/plugins/engine/components/ComponentBase.ts
index a8c27eef1..307583354 100644
--- a/src/server/plugins/engine/components/ComponentBase.ts
+++ b/src/server/plugins/engine/components/ComponentBase.ts
@@ -9,10 +9,10 @@ import joi, {
} from 'joi'
import { type ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Component } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'
import { type ViewModel } from '~/src/server/plugins/engine/components/types.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
export class ComponentBase {
page?: PageControllerClass
diff --git a/src/server/plugins/engine/components/ComponentCollection.ts b/src/server/plugins/engine/components/ComponentCollection.ts
index d09ee1230..faf8271ca 100644
--- a/src/server/plugins/engine/components/ComponentCollection.ts
+++ b/src/server/plugins/engine/components/ComponentCollection.ts
@@ -15,11 +15,11 @@ import {
type Component,
type Field,
type Guidance
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'
import { getErrors } from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import {
type FormPayload,
diff --git a/src/server/plugins/engine/components/DatePartsField.test.ts b/src/server/plugins/engine/components/DatePartsField.test.ts
index 1d4145d73..dc4fab8fc 100644
--- a/src/server/plugins/engine/components/DatePartsField.test.ts
+++ b/src/server/plugins/engine/components/DatePartsField.test.ts
@@ -5,7 +5,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
diff --git a/src/server/plugins/engine/components/Details.test.ts b/src/server/plugins/engine/components/Details.test.ts
index 6d5a63813..4d9c1a6a0 100644
--- a/src/server/plugins/engine/components/Details.test.ts
+++ b/src/server/plugins/engine/components/Details.test.ts
@@ -1,7 +1,7 @@
import { ComponentType, type DetailsComponent } from '@defra/forms-model'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Guidance } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Guidance } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/EmailAddressField.test.ts b/src/server/plugins/engine/components/EmailAddressField.test.ts
index b9d12c269..580c1bac9 100644
--- a/src/server/plugins/engine/components/EmailAddressField.test.ts
+++ b/src/server/plugins/engine/components/EmailAddressField.test.ts
@@ -7,7 +7,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/blank.js'
import { getFormData, getFormState } from '~/test/helpers/component-helpers.js'
diff --git a/src/server/plugins/engine/components/FileUploadField.test.ts b/src/server/plugins/engine/components/FileUploadField.test.ts
index 5aa24bab0..5c16e7c00 100644
--- a/src/server/plugins/engine/components/FileUploadField.test.ts
+++ b/src/server/plugins/engine/components/FileUploadField.test.ts
@@ -8,12 +8,12 @@ import { tempItemSchema } from '~/src/server/plugins/engine/components/FileUploa
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
createPage,
type PageControllerClass
-} from '~/src/server/plugins/engine/pageControllers/helpers.js'
+} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import {
FileStatus,
diff --git a/src/server/plugins/engine/components/Html.test.ts b/src/server/plugins/engine/components/Html.test.ts
index bf63d07a6..321a6068c 100644
--- a/src/server/plugins/engine/components/Html.test.ts
+++ b/src/server/plugins/engine/components/Html.test.ts
@@ -1,7 +1,7 @@
import { ComponentType, type HtmlComponent } from '@defra/forms-model'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Guidance } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Guidance } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/InsetText.test.ts b/src/server/plugins/engine/components/InsetText.test.ts
index 4d30be0c5..d0daae408 100644
--- a/src/server/plugins/engine/components/InsetText.test.ts
+++ b/src/server/plugins/engine/components/InsetText.test.ts
@@ -1,7 +1,7 @@
import { ComponentType, type InsetTextComponent } from '@defra/forms-model'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Guidance } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Guidance } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/List.test.ts b/src/server/plugins/engine/components/List.test.ts
index dd188ceaa..1e91e53e0 100644
--- a/src/server/plugins/engine/components/List.test.ts
+++ b/src/server/plugins/engine/components/List.test.ts
@@ -1,7 +1,7 @@
import { ComponentType, type ListComponent } from '@defra/forms-model'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Guidance } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Guidance } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/Markdown.test.ts b/src/server/plugins/engine/components/Markdown.test.ts
index 6756e9bd2..a5f5fd8ef 100644
--- a/src/server/plugins/engine/components/Markdown.test.ts
+++ b/src/server/plugins/engine/components/Markdown.test.ts
@@ -1,7 +1,7 @@
import { ComponentType, type MarkdownComponent } from '@defra/forms-model'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
-import { type Guidance } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Guidance } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/MonthYearField.test.ts b/src/server/plugins/engine/components/MonthYearField.test.ts
index a45716e03..7781fcdc8 100644
--- a/src/server/plugins/engine/components/MonthYearField.test.ts
+++ b/src/server/plugins/engine/components/MonthYearField.test.ts
@@ -5,7 +5,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
diff --git a/src/server/plugins/engine/components/MultilineTextField.test.ts b/src/server/plugins/engine/components/MultilineTextField.test.ts
index 092e37b35..f76358fc5 100644
--- a/src/server/plugins/engine/components/MultilineTextField.test.ts
+++ b/src/server/plugins/engine/components/MultilineTextField.test.ts
@@ -8,7 +8,7 @@ import { MultilineTextField } from '~/src/server/plugins/engine/components/Multi
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/blank.js'
import { getFormData, getFormState } from '~/test/helpers/component-helpers.js'
diff --git a/src/server/plugins/engine/components/NumberField.test.ts b/src/server/plugins/engine/components/NumberField.test.ts
index afe6d5a70..28b266df0 100644
--- a/src/server/plugins/engine/components/NumberField.test.ts
+++ b/src/server/plugins/engine/components/NumberField.test.ts
@@ -5,7 +5,7 @@ import { NumberField } from '~/src/server/plugins/engine/components/NumberField.
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/blank.js'
import { getFormData, getFormState } from '~/test/helpers/component-helpers.js'
diff --git a/src/server/plugins/engine/components/RadiosField.test.ts b/src/server/plugins/engine/components/RadiosField.test.ts
index d071cb3a8..8ccc0ff9f 100644
--- a/src/server/plugins/engine/components/RadiosField.test.ts
+++ b/src/server/plugins/engine/components/RadiosField.test.ts
@@ -6,7 +6,7 @@ import { RadiosField } from '~/src/server/plugins/engine/components/RadiosField.
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
listNumber,
diff --git a/src/server/plugins/engine/components/SelectField.test.ts b/src/server/plugins/engine/components/SelectField.test.ts
index 585ebbda8..19dad941d 100644
--- a/src/server/plugins/engine/components/SelectField.test.ts
+++ b/src/server/plugins/engine/components/SelectField.test.ts
@@ -6,7 +6,7 @@ import { SelectField } from '~/src/server/plugins/engine/components/SelectField.
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
listNumber,
diff --git a/src/server/plugins/engine/components/TelephoneNumberField.test.ts b/src/server/plugins/engine/components/TelephoneNumberField.test.ts
index 0c828e9a7..8ac5863cd 100644
--- a/src/server/plugins/engine/components/TelephoneNumberField.test.ts
+++ b/src/server/plugins/engine/components/TelephoneNumberField.test.ts
@@ -7,7 +7,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/blank.js'
import { getFormData, getFormState } from '~/test/helpers/component-helpers.js'
diff --git a/src/server/plugins/engine/components/TelephoneNumberField.ts b/src/server/plugins/engine/components/TelephoneNumberField.ts
index 14f8b22fc..4f817bd51 100644
--- a/src/server/plugins/engine/components/TelephoneNumberField.ts
+++ b/src/server/plugins/engine/components/TelephoneNumberField.ts
@@ -2,7 +2,7 @@ import { type TelephoneNumberFieldComponent } from '@defra/forms-model'
import joi, { type StringSchema } from 'joi'
import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'
-import { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers.js'
+import { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers/index.js'
import { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import {
type ErrorMessageTemplateList,
diff --git a/src/server/plugins/engine/components/TextField.test.ts b/src/server/plugins/engine/components/TextField.test.ts
index f2c0bb26b..492e0fff5 100644
--- a/src/server/plugins/engine/components/TextField.test.ts
+++ b/src/server/plugins/engine/components/TextField.test.ts
@@ -4,7 +4,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/blank.js'
import { getFormData, getFormState } from '~/test/helpers/component-helpers.js'
diff --git a/src/server/plugins/engine/components/UkAddressField.test.ts b/src/server/plugins/engine/components/UkAddressField.test.ts
index a00ba3690..784e19c68 100644
--- a/src/server/plugins/engine/components/UkAddressField.test.ts
+++ b/src/server/plugins/engine/components/UkAddressField.test.ts
@@ -9,7 +9,7 @@ import { UkAddressField } from '~/src/server/plugins/engine/components/UkAddress
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type ViewModel } from '~/src/server/plugins/engine/components/types.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import {
diff --git a/src/server/plugins/engine/components/YesNoField.test.ts b/src/server/plugins/engine/components/YesNoField.test.ts
index e00498d38..1178c9f7a 100644
--- a/src/server/plugins/engine/components/YesNoField.test.ts
+++ b/src/server/plugins/engine/components/YesNoField.test.ts
@@ -4,7 +4,7 @@ import { ComponentCollection } from '~/src/server/plugins/engine/components/Comp
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import { listYesNoExamples } from '~/test/fixtures/list.js'
import definition from '~/test/form/definitions/blank.js'
diff --git a/src/server/plugins/engine/components/YesNoField.ts b/src/server/plugins/engine/components/YesNoField.ts
index 967c07179..598253d75 100644
--- a/src/server/plugins/engine/components/YesNoField.ts
+++ b/src/server/plugins/engine/components/YesNoField.ts
@@ -6,7 +6,7 @@ import {
} from '@defra/forms-model'
import { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js'
-import { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers.js'
+import { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers/index.js'
import { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import { type ErrorMessageTemplateList } from '~/src/server/plugins/engine/types.js'
import { convertToLanguageMessages } from '~/src/server/utils/type-utils.js'
diff --git a/src/server/plugins/engine/components/helpers.ts b/src/server/plugins/engine/components/helpers/components.ts
similarity index 92%
rename from src/server/plugins/engine/components/helpers.ts
rename to src/server/plugins/engine/components/helpers/components.ts
index 49dbba3b9..82fd6d210 100644
--- a/src/server/plugins/engine/components/helpers.ts
+++ b/src/server/plugins/engine/components/helpers/components.ts
@@ -4,49 +4,10 @@ import { Marked, type Token } from 'marked'
import { config } from '~/src/config/index.js'
import { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'
import { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'
+import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
import * as Components from '~/src/server/plugins/engine/components/index.js'
import { type FormState } from '~/src/server/plugins/engine/types.js'
-const designerUrl = config.get('designerUrl')
-
-const markdown = new Marked({
- breaks: true,
- gfm: true,
-
- /**
- * Render paragraphs without `
` wrappers
- * for check answers summary list `
`
- */
- extensions: [
- {
- name: 'paragraph',
- renderer({ tokens = [] }) {
- const text = this.parser.parseInline(tokens)
- return tokens.length > 1 ? `${text}
` : text
- }
- }
- ],
-
- /**
- * Restrict allowed Markdown tokens
- */
- walkTokens(token) {
- const tokens: Token['type'][] = [
- 'br',
- 'escape',
- 'list',
- 'list_item',
- 'paragraph',
- 'space',
- 'text'
- ]
-
- if (!tokens.includes(token.type)) {
- token.type = 'text'
- }
- }
-})
-
// All component instances
export type Component = InstanceType<
(typeof Components)[keyof typeof Components]
@@ -88,6 +49,46 @@ export type ListField = InstanceType<
| typeof Components.YesNoField
>
+export const designerUrl = config.get('designerUrl')
+
+export const markdown = new Marked({
+ breaks: true,
+ gfm: true,
+
+ /**
+ * Render paragraphs without `` wrappers
+ * for check answers summary list `
`
+ */
+ extensions: [
+ {
+ name: 'paragraph',
+ renderer({ tokens = [] }) {
+ const text = this.parser.parseInline(tokens)
+ return tokens.length > 1 ? `${text}
` : text
+ }
+ }
+ ],
+
+ /**
+ * Restrict allowed Markdown tokens
+ */
+ walkTokens(token) {
+ const tokens: Token['type'][] = [
+ 'br',
+ 'escape',
+ 'list',
+ 'list_item',
+ 'paragraph',
+ 'space',
+ 'text'
+ ]
+
+ if (!tokens.includes(token.type)) {
+ token.type = 'text'
+ }
+ }
+})
+
/**
* Filter known components with lists
*/
@@ -328,40 +329,3 @@ export function getAnswerMarkdown(
return answerEscaped
}
-
-/**
- * Prevent Markdown formatting
- * @see {@link https://pandoc.org/chunkedhtml-demo/8.11-backslash-escapes.html}
- */
-export function escapeMarkdown(answer: string) {
- const punctuation = [
- '`',
- "'",
- '*',
- '_',
- '{',
- '}',
- '[',
- ']',
- '(',
- ')',
- '#',
- '+',
- '-',
- '.',
- '!'
- ]
-
- for (const character of punctuation) {
- answer = answer.toString().replaceAll(character, `\\${character}`)
- }
-
- return answer
-}
-
-export const addClassOptionIfNone = (
- options: Extract['options'],
- className: string
-) => {
- options.classes ??= className
-}
diff --git a/src/server/plugins/engine/components/helpers.test.ts b/src/server/plugins/engine/components/helpers/helpers.test.ts
similarity index 98%
rename from src/server/plugins/engine/components/helpers.test.ts
rename to src/server/plugins/engine/components/helpers/helpers.test.ts
index 486286735..a753bfabf 100644
--- a/src/server/plugins/engine/components/helpers.test.ts
+++ b/src/server/plugins/engine/components/helpers/helpers.test.ts
@@ -1,7 +1,7 @@
import { type ComponentDef } from '@defra/forms-model'
import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'
-import { createComponent } from '~/src/server/plugins/engine/components/helpers.js'
+import { createComponent } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import definition from '~/test/form/definitions/basic.js'
diff --git a/src/server/plugins/engine/components/helpers/index.ts b/src/server/plugins/engine/components/helpers/index.ts
new file mode 100644
index 000000000..83ec8d9d1
--- /dev/null
+++ b/src/server/plugins/engine/components/helpers/index.ts
@@ -0,0 +1,38 @@
+import { type ComponentDef } from '@defra/forms-model'
+
+/**
+ * Prevent Markdown formatting
+ * @see {@link https://pandoc.org/chunkedhtml-demo/8.11-backslash-escapes.html}
+ */
+export function escapeMarkdown(answer: string) {
+ const punctuation = [
+ '`',
+ "'",
+ '*',
+ '_',
+ '{',
+ '}',
+ '[',
+ ']',
+ '(',
+ ')',
+ '#',
+ '+',
+ '-',
+ '.',
+ '!'
+ ]
+
+ for (const character of punctuation) {
+ answer = answer.toString().replaceAll(character, `\\${character}`)
+ }
+
+ return answer
+}
+
+export const addClassOptionIfNone = (
+ options: Extract['options'],
+ className: string
+) => {
+ options.classes ??= className
+}
diff --git a/src/server/plugins/engine/helpers.test.ts b/src/server/plugins/engine/helpers.test.ts
index 3fae71501..632a431ca 100644
--- a/src/server/plugins/engine/helpers.test.ts
+++ b/src/server/plugins/engine/helpers.test.ts
@@ -22,7 +22,7 @@ import { buildFormContextRequest } from '~/src/server/plugins/engine/pageControl
import {
createPage,
type PageControllerClass
-} from '~/src/server/plugins/engine/pageControllers/helpers.js'
+} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
type FormContext,
type FormContextRequest
diff --git a/src/server/plugins/engine/helpers.ts b/src/server/plugins/engine/helpers.ts
index 5feae0c8c..9f6ffed16 100644
--- a/src/server/plugins/engine/helpers.ts
+++ b/src/server/plugins/engine/helpers.ts
@@ -19,9 +19,9 @@ import { createLogger } from '~/src/server/common/helpers/logging/logger.js'
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
type FormContext,
type FormContextRequest,
diff --git a/src/server/plugins/engine/models/FormModel.ts b/src/server/plugins/engine/models/FormModel.ts
index 5e0fb4263..edf9576f0 100644
--- a/src/server/plugins/engine/models/FormModel.ts
+++ b/src/server/plugins/engine/models/FormModel.ts
@@ -33,7 +33,7 @@ import {} from '~/src/server/plugins/engine/components/YesNoField.js'
import {
hasListFormField,
type Component
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { todayAsDateOnly } from '~/src/server/plugins/engine/date-helper.js'
import {
findPage,
@@ -46,7 +46,7 @@ import { type PageController } from '~/src/server/plugins/engine/pageControllers
import {
createPage,
type PageControllerClass
-} from '~/src/server/plugins/engine/pageControllers/helpers.js'
+} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import * as defaultServices from '~/src/server/plugins/engine/services/index.js'
import {
diff --git a/src/server/plugins/engine/models/SummaryViewModel.test.ts b/src/server/plugins/engine/models/SummaryViewModel.test.ts
index 32ac820c1..e5189dbd0 100644
--- a/src/server/plugins/engine/models/SummaryViewModel.test.ts
+++ b/src/server/plugins/engine/models/SummaryViewModel.test.ts
@@ -9,7 +9,7 @@ import { serverWithSaveAndReturn } from '~/src/server/plugins/engine/pageControl
import {
createPage,
type PageControllerClass
-} from '~/src/server/plugins/engine/pageControllers/helpers.js'
+} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
type FormContext,
type FormContextRequest,
diff --git a/src/server/plugins/engine/models/SummaryViewModel.ts b/src/server/plugins/engine/models/SummaryViewModel.ts
index 6af914a90..1857b7fce 100644
--- a/src/server/plugins/engine/models/SummaryViewModel.ts
+++ b/src/server/plugins/engine/models/SummaryViewModel.ts
@@ -3,7 +3,7 @@ import { type Section } from '@defra/forms-model'
import {
getAnswer,
type Field
-} from '~/src/server/plugins/engine/components/helpers.js'
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import {
type BackLink,
type ComponentViewModel
@@ -20,7 +20,7 @@ import {
type DetailItemRepeat
} from '~/src/server/plugins/engine/models/types.js'
import { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
import {
type CheckAnswers,
diff --git a/src/server/plugins/engine/models/types.ts b/src/server/plugins/engine/models/types.ts
index 57d3a2b31..7f17c367a 100644
--- a/src/server/plugins/engine/models/types.ts
+++ b/src/server/plugins/engine/models/types.ts
@@ -6,11 +6,11 @@ import {
import { type Expression } from 'expr-eval'
import {
- type Field,
- type getAnswer
-} from '~/src/server/plugins/engine/components/helpers.js'
+ getAnswer,
+ type Field
+} from '~/src/server/plugins/engine/components/helpers/components.js'
import { type RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
type FormState,
type FormSubmissionError
diff --git a/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts b/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts
index f34609cac..78dae0c90 100644
--- a/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts
+++ b/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts
@@ -1,7 +1,7 @@
import { type FormMetadata } from '@defra/forms-model'
import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
-import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/index.js'
import {
type DetailItem,
diff --git a/src/server/plugins/engine/outputFormatters/human/v1.ts b/src/server/plugins/engine/outputFormatters/human/v1.ts
index bd700a930..d83bcebc6 100644
--- a/src/server/plugins/engine/outputFormatters/human/v1.ts
+++ b/src/server/plugins/engine/outputFormatters/human/v1.ts
@@ -5,10 +5,8 @@ import {
import { addDays, format as dateFormat } from 'date-fns'
import { config } from '~/src/config/index.js'
-import {
- escapeMarkdown,
- getAnswer
-} from '~/src/server/plugins/engine/components/helpers.js'
+import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
+import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
diff --git a/src/server/plugins/engine/outputFormatters/machine/v1.test.ts b/src/server/plugins/engine/outputFormatters/machine/v1.test.ts
index c1894e8b2..14ade7e6a 100644
--- a/src/server/plugins/engine/outputFormatters/machine/v1.test.ts
+++ b/src/server/plugins/engine/outputFormatters/machine/v1.test.ts
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
-import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/index.js'
import {
type DetailItem,
diff --git a/src/server/plugins/engine/outputFormatters/machine/v1.ts b/src/server/plugins/engine/outputFormatters/machine/v1.ts
index 2098fce64..73907567e 100644
--- a/src/server/plugins/engine/outputFormatters/machine/v1.ts
+++ b/src/server/plugins/engine/outputFormatters/machine/v1.ts
@@ -4,7 +4,7 @@ import {
} from '@defra/forms-model'
import { config } from '~/src/config/index.js'
-import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
+import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FileUploadField } from '~/src/server/plugins/engine/components/index.js'
import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
diff --git a/src/server/plugins/engine/outputFormatters/machine/v2.test.ts b/src/server/plugins/engine/outputFormatters/machine/v2.test.ts
index d56f6871e..cfd85ff89 100644
--- a/src/server/plugins/engine/outputFormatters/machine/v2.test.ts
+++ b/src/server/plugins/engine/outputFormatters/machine/v2.test.ts
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
-import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
import { FormModel } from '~/src/server/plugins/engine/models/index.js'
import {
type DetailItem,
diff --git a/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts b/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts
index 9ce8f0fb0..b7249f584 100644
--- a/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts
+++ b/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts
@@ -15,7 +15,7 @@ import {
} from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'
import { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'
import { serverWithSaveAndReturn } from '~/src/server/plugins/engine/pageControllers/__stubs__/server.js'
-import * as pageHelpers from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import * as pageHelpers from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
import * as uploadService from '~/src/server/plugins/engine/services/uploadService.js'
import {
FileStatus,
diff --git a/src/server/plugins/engine/pageControllers/FileUploadPageController.ts b/src/server/plugins/engine/pageControllers/FileUploadPageController.ts
index ea3b37e8a..d361ccf14 100644
--- a/src/server/plugins/engine/pageControllers/FileUploadPageController.ts
+++ b/src/server/plugins/engine/pageControllers/FileUploadPageController.ts
@@ -15,7 +15,7 @@ import {
} from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'
-import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
import {
getUploadStatus,
initiateUpload
diff --git a/src/server/plugins/engine/pageControllers/SummaryPageController.ts b/src/server/plugins/engine/pageControllers/SummaryPageController.ts
index 76e3d46fd..23ad3ea00 100644
--- a/src/server/plugins/engine/pageControllers/SummaryPageController.ts
+++ b/src/server/plugins/engine/pageControllers/SummaryPageController.ts
@@ -9,7 +9,7 @@ import { type ResponseToolkit, type RouteOptions } from '@hapi/hapi'
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
-import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
+import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
import {
checkEmailAddressForLiveFormSubmission,
checkFormStatus,
diff --git a/src/server/plugins/engine/pageControllers/helpers.test.ts b/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts
similarity index 96%
rename from src/server/plugins/engine/pageControllers/helpers.test.ts
rename to src/server/plugins/engine/pageControllers/helpers/helpers.test.ts
index 52a0da64c..65d774708 100644
--- a/src/server/plugins/engine/pageControllers/helpers.test.ts
+++ b/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts
@@ -8,12 +8,12 @@ import {
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
import { PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
+import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
import {
createPage,
- getProxyUrlForLocalDevelopment,
isPageController,
type PageControllerType
-} from '~/src/server/plugins/engine/pageControllers/helpers.js'
+} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
FileUploadPageController,
QuestionPageController,
diff --git a/src/server/plugins/engine/pageControllers/helpers/index.ts b/src/server/plugins/engine/pageControllers/helpers/index.ts
new file mode 100644
index 000000000..e4f46857f
--- /dev/null
+++ b/src/server/plugins/engine/pageControllers/helpers/index.ts
@@ -0,0 +1,20 @@
+/**
+ * In local development environments, we sometimes need to rewrite the
+ * CDP upload URL to work with CSP/CORS restrictions.
+ * This helper function rewrites localhost URLs to use the sslip.io proxy
+ * This is only used when running locally with a development proxy.
+ * In non-local environments, this function returns null
+ * @param uploadUrl - The original upload URL from CDP
+ */
+export function getProxyUrlForLocalDevelopment(
+ uploadUrl?: string
+): string | null {
+ if (!uploadUrl?.includes('localhost:7337')) {
+ return null
+ }
+
+ return uploadUrl.replace(
+ /localhost:7337/g,
+ 'uploader.127.0.0.1.sslip.io:7300'
+ )
+}
diff --git a/src/server/plugins/engine/pageControllers/helpers.ts b/src/server/plugins/engine/pageControllers/helpers/pages.ts
similarity index 79%
rename from src/server/plugins/engine/pageControllers/helpers.ts
rename to src/server/plugins/engine/pageControllers/helpers/pages.ts
index 9dbc17466..a49389887 100644
--- a/src/server/plugins/engine/pageControllers/helpers.ts
+++ b/src/server/plugins/engine/pageControllers/helpers/pages.ts
@@ -5,7 +5,7 @@ import {
type Page
} from '@defra/forms-model'
-import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
+import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import * as PageControllers from '~/src/server/plugins/engine/pageControllers/index.js'
export function isPageController(
@@ -78,24 +78,3 @@ export function createPage(model: FormModel, pageDef: Page) {
return controller
}
-
-/**
- * In local development environments, we sometimes need to rewrite the
- * CDP upload URL to work with CSP/CORS restrictions.
- * This helper function rewrites localhost URLs to use the sslip.io proxy
- * This is only used when running locally with a development proxy.
- * In non-local environments, this function returns null
- * @param uploadUrl - The original upload URL from CDP
- */
-export function getProxyUrlForLocalDevelopment(
- uploadUrl?: string
-): string | null {
- if (!uploadUrl?.includes('localhost:7337')) {
- return null
- }
-
- return uploadUrl.replace(
- /localhost:7337/g,
- 'uploader.127.0.0.1.sslip.io:7300'
- )
-}
diff --git a/src/server/plugins/engine/routes/index.ts b/src/server/plugins/engine/routes/index.ts
index 25583bec1..dbefdd99d 100644
--- a/src/server/plugins/engine/routes/index.ts
+++ b/src/server/plugins/engine/routes/index.ts
@@ -17,7 +17,7 @@ import {
proceed
} from '~/src/server/plugins/engine/helpers.js'
import { FormModel } from '~/src/server/plugins/engine/models/index.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'
import * as defaultServices from '~/src/server/plugins/engine/services/index.js'
import {
diff --git a/src/server/plugins/engine/routes/questions.test.ts b/src/server/plugins/engine/routes/questions.test.ts
index c48d9e6b3..baf8d3f6f 100644
--- a/src/server/plugins/engine/routes/questions.test.ts
+++ b/src/server/plugins/engine/routes/questions.test.ts
@@ -4,7 +4,7 @@ import { type ResponseObject, type ResponseToolkit } from '@hapi/hapi'
import nock from 'nock'
import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'
import {
makeGetHandler,
diff --git a/src/server/plugins/engine/routes/questions.ts b/src/server/plugins/engine/routes/questions.ts
index 049074f8a..dc8d83dcd 100644
--- a/src/server/plugins/engine/routes/questions.ts
+++ b/src/server/plugins/engine/routes/questions.ts
@@ -19,7 +19,7 @@ import {
} from '~/src/server/plugins/engine/models/index.js'
import { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'
import { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import {
dispatchHandler,
redirectOrMakeHandler
diff --git a/src/server/plugins/engine/services/notifyService.test.ts b/src/server/plugins/engine/services/notifyService.test.ts
index 720ce6d4d..e0a6d5285 100644
--- a/src/server/plugins/engine/services/notifyService.test.ts
+++ b/src/server/plugins/engine/services/notifyService.test.ts
@@ -1,6 +1,6 @@
import { type FormMetadata } from '@defra/forms-model'
-import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'
+import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
import { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
diff --git a/src/server/plugins/engine/services/notifyService.ts b/src/server/plugins/engine/services/notifyService.ts
index 801c887b5..9774ce826 100644
--- a/src/server/plugins/engine/services/notifyService.ts
+++ b/src/server/plugins/engine/services/notifyService.ts
@@ -5,7 +5,7 @@ import {
} from '@defra/forms-model'
import { config } from '~/src/config/index.js'
-import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'
+import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
import { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
diff --git a/src/server/plugins/engine/types.ts b/src/server/plugins/engine/types.ts
index dbb5087d9..220d755f5 100644
--- a/src/server/plugins/engine/types.ts
+++ b/src/server/plugins/engine/types.ts
@@ -11,7 +11,7 @@ import { type PluginProperties, type Request } from '@hapi/hapi'
import { type JoiExpression, type ValidationErrorItem } from 'joi'
import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'
-import { type Component } from '~/src/server/plugins/engine/components/helpers.js'
+import { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'
import {
type BackLink,
type ComponentText,
@@ -20,7 +20,7 @@ import {
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { type RichFormValue } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
-import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
+import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
import { type ViewContext } from '~/src/server/plugins/nunjucks/types.js'
import {
type FormAction,
@@ -403,7 +403,7 @@ export type FormAdapterSubmissionMessageMetaSerialised = Omit<
FormAdapterSubmissionMessageMeta,
'schemaVersion' | 'timestamp' | 'status'
> & {
- schemaVersion: string
+ schemaVersion: number
status: string
timestamp: string
}
diff --git a/src/server/plugins/nunjucks/filters/answer.js b/src/server/plugins/nunjucks/filters/answer.js
index 3e0d0d18f..cb7b84f2f 100644
--- a/src/server/plugins/nunjucks/filters/answer.js
+++ b/src/server/plugins/nunjucks/filters/answer.js
@@ -1,4 +1,4 @@
-import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
+import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
/**
* Nunjucks filter to get the answer for a component
@@ -23,5 +23,5 @@ export function answer(name) {
/**
* @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
- * @import { Field } from '~/src/server/plugins/engine/components/helpers.js'
+ * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'
*/
diff --git a/src/server/plugins/nunjucks/filters/answer.test.js b/src/server/plugins/nunjucks/filters/answer.test.js
index a469b5f44..603e8024a 100644
--- a/src/server/plugins/nunjucks/filters/answer.test.js
+++ b/src/server/plugins/nunjucks/filters/answer.test.js
@@ -1,9 +1,12 @@
-import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
+import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
import { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'
-jest.mock('~/src/server/plugins/engine/components/helpers.ts', () => ({
- getAnswer: jest.fn()
-}))
+jest.mock(
+ '~/src/server/plugins/engine/components/helpers/components.ts',
+ () => ({
+ getAnswer: jest.fn()
+ })
+)
describe('answer Nunjucks filter', () => {
/** @type { NunjucksContext } */