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 } */