From b7ea1fca70e6e59935b082c12b19146e3e98f914 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Wed, 12 Nov 2025 15:03:30 +0000 Subject: [PATCH 1/6] Stash --- src/server/plugins/engine/components/Markdown.ts | 5 ++++- src/server/plugins/engine/index.ts | 2 +- src/server/plugins/engine/views/components/markdown.html | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/server/plugins/engine/components/Markdown.ts b/src/server/plugins/engine/components/Markdown.ts index c97208d7a..4f0fb66ad 100644 --- a/src/server/plugins/engine/components/Markdown.ts +++ b/src/server/plugins/engine/components/Markdown.ts @@ -5,6 +5,7 @@ import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentB export class Markdown extends ComponentBase { declare options: MarkdownComponent['options'] content: MarkdownComponent['content'] + numOfComponents: number constructor( def: MarkdownComponent, @@ -16,6 +17,7 @@ export class Markdown extends ComponentBase { this.content = content this.options = options + this.numOfComponents = props.page?.collection.components.length ?? 0 } getViewModel() { @@ -23,7 +25,8 @@ export class Markdown extends ComponentBase { return { ...viewModel, - content + content, + numOfComponents: this.numOfComponents } } } diff --git a/src/server/plugins/engine/index.ts b/src/server/plugins/engine/index.ts index 2d82d69ff..f7bbbb9fa 100644 --- a/src/server/plugins/engine/index.ts +++ b/src/server/plugins/engine/index.ts @@ -33,7 +33,7 @@ export const prepareNunjucksEnvironment = function ( env.addFilter(name, nunjucksFilter) } - env.addFilter('markdown', (text: string) => + env.addFilter('markdown', (text: string, _numOfComponents = 0) => markdownToHtml(text, pluginOptions.baseUrl) ) diff --git a/src/server/plugins/engine/views/components/markdown.html b/src/server/plugins/engine/views/components/markdown.html index fb014fa5d..a580cc46a 100644 --- a/src/server/plugins/engine/views/components/markdown.html +++ b/src/server/plugins/engine/views/components/markdown.html @@ -1,5 +1,5 @@ {% macro Markdown(component) %}
- {{ component.model.content | markdown | safe }} + {{ component.model.content | markdown(component.model.numOfComponents) | safe }}
{% endmacro %} From 630e77774874eda6b59ce0b5150f16cf825ba80a Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Thu, 13 Nov 2025 09:08:36 +0000 Subject: [PATCH 2/6] Demotes H1 in markdown if not the only component on the page --- src/server/forms/components.json | 2 +- src/server/plugins/engine/components/Markdown.ts | 6 ++++-- src/server/plugins/engine/index.ts | 4 ++-- src/server/plugins/engine/views/components/markdown.html | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/server/forms/components.json b/src/server/forms/components.json index 743e4081b..b5a59bbcd 100644 --- a/src/server/forms/components.json +++ b/src/server/forms/components.json @@ -117,7 +117,7 @@ "type": "Markdown", "name": "markdown", "title": "Title", - "content": "### This is a H3 in markdown\n\n[An internal link](http://localhost:3009/fictional-page)\n\n[An external link](https://defra.gov.uk/fictional-page)", + "content": "# This is an H1 in markdown (demoted)\n## This is an H2 in markdown\n### This is an H3 in markdown\n\n[An internal link](http://localhost:3009/fictional-page)\n\n[An external link](https://defra.gov.uk/fictional-page)", "options": {}, "schema": {} }, diff --git a/src/server/plugins/engine/components/Markdown.ts b/src/server/plugins/engine/components/Markdown.ts index 4f0fb66ad..8fbd2aa43 100644 --- a/src/server/plugins/engine/components/Markdown.ts +++ b/src/server/plugins/engine/components/Markdown.ts @@ -1,4 +1,4 @@ -import { type MarkdownComponent } from '@defra/forms-model' +import { hasFormComponents, type MarkdownComponent } from '@defra/forms-model' import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js' @@ -17,7 +17,9 @@ export class Markdown extends ComponentBase { this.content = content this.options = options - this.numOfComponents = props.page?.collection.components.length ?? 0 + this.numOfComponents = hasFormComponents(props.page?.pageDef) + ? props.page.pageDef.components.length + : 0 } getViewModel() { diff --git a/src/server/plugins/engine/index.ts b/src/server/plugins/engine/index.ts index f7bbbb9fa..06b21fbe2 100644 --- a/src/server/plugins/engine/index.ts +++ b/src/server/plugins/engine/index.ts @@ -33,8 +33,8 @@ export const prepareNunjucksEnvironment = function ( env.addFilter(name, nunjucksFilter) } - env.addFilter('markdown', (text: string, _numOfComponents = 0) => - markdownToHtml(text, pluginOptions.baseUrl) + env.addFilter('markdown', (text: string, demoteH1?: boolean) => + markdownToHtml(text, { baseUrl: pluginOptions.baseUrl, demoteH1 }) ) for (const [name, nunjucksGlobal] of Object.entries(globals)) { diff --git a/src/server/plugins/engine/views/components/markdown.html b/src/server/plugins/engine/views/components/markdown.html index a580cc46a..b133bd182 100644 --- a/src/server/plugins/engine/views/components/markdown.html +++ b/src/server/plugins/engine/views/components/markdown.html @@ -1,5 +1,5 @@ {% macro Markdown(component) %}
- {{ component.model.content | markdown(component.model.numOfComponents) | safe }} + {{ component.model.content | markdown(component.model.numOfComponents > 1) | safe }}
{% endmacro %} From b82307b69196b3528cc971b580d36c702c2666eb Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Fri, 14 Nov 2025 13:14:04 +0000 Subject: [PATCH 3/6] Demotes declarations and markdowns --- src/server/forms/components.json | 2 +- .../plugins/engine/components/DeclarationField.ts | 14 ++++++++++++-- src/server/plugins/engine/components/Markdown.ts | 7 ++++--- src/server/plugins/engine/index.ts | 7 +++++-- .../engine/views/components/declarationfield.html | 2 +- .../plugins/engine/views/components/markdown.html | 2 +- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/server/forms/components.json b/src/server/forms/components.json index b5a59bbcd..fc694e4e8 100644 --- a/src/server/forms/components.json +++ b/src/server/forms/components.json @@ -117,7 +117,7 @@ "type": "Markdown", "name": "markdown", "title": "Title", - "content": "# This is an H1 in markdown (demoted)\n## This is an H2 in markdown\n### This is an H3 in markdown\n\n[An internal link](http://localhost:3009/fictional-page)\n\n[An external link](https://defra.gov.uk/fictional-page)", + "content": "# Markdown - This is H1\n## This is H2\n### This is H3\n#### This is H4\n##### This is H5\n###### This is H6\n\n[An internal link](http://localhost:3009/fictional-page)\n\n[An external link](https://defra.gov.uk/fictional-page)", "options": {}, "schema": {} }, diff --git a/src/server/plugins/engine/components/DeclarationField.ts b/src/server/plugins/engine/components/DeclarationField.ts index f328abc19..8d403ff07 100644 --- a/src/server/plugins/engine/components/DeclarationField.ts +++ b/src/server/plugins/engine/components/DeclarationField.ts @@ -1,4 +1,8 @@ -import { type DeclarationFieldComponent, type Item } from '@defra/forms-model' +import { + hasFormComponents, + type DeclarationFieldComponent, + type Item +} from '@defra/forms-model' import joi, { type ArraySchema, type BooleanSchema, @@ -30,6 +34,7 @@ export class DeclarationField extends FormComponent { declare formSchema: ArraySchema declare stateSchema: BooleanSchema declare content: string + headerStartLevel: number constructor( def: DeclarationFieldComponent, @@ -64,6 +69,10 @@ export class DeclarationField extends FormComponent { this.content = content this.declarationConfirmationLabel = options.declarationConfirmationLabel ?? this.DEFAULT_DECLARATION_LABEL + const numOfQuestionsOnPage = hasFormComponents(props.page?.pageDef) + ? props.page.pageDef.components.length + : 0 + this.headerStartLevel = numOfQuestionsOnPage < 2 ? 1 : 2 } getFormValueFromState(state: FormSubmissionState) { @@ -125,7 +134,8 @@ export class DeclarationField extends FormComponent { text: declarationConfirmationLabel, value: 'true' } - ] + ], + headerStartLevel: this.headerStartLevel } } diff --git a/src/server/plugins/engine/components/Markdown.ts b/src/server/plugins/engine/components/Markdown.ts index 8fbd2aa43..fb54d273d 100644 --- a/src/server/plugins/engine/components/Markdown.ts +++ b/src/server/plugins/engine/components/Markdown.ts @@ -5,7 +5,7 @@ import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentB export class Markdown extends ComponentBase { declare options: MarkdownComponent['options'] content: MarkdownComponent['content'] - numOfComponents: number + headerStartLevel: number constructor( def: MarkdownComponent, @@ -17,9 +17,10 @@ export class Markdown extends ComponentBase { this.content = content this.options = options - this.numOfComponents = hasFormComponents(props.page?.pageDef) + const numOfQuestionsOnPage = hasFormComponents(props.page?.pageDef) ? props.page.pageDef.components.length : 0 + this.headerStartLevel = numOfQuestionsOnPage < 2 ? 1 : 2 } getViewModel() { @@ -28,7 +29,7 @@ export class Markdown extends ComponentBase { return { ...viewModel, content, - numOfComponents: this.numOfComponents + headerStartLevel: this.headerStartLevel } } } diff --git a/src/server/plugins/engine/index.ts b/src/server/plugins/engine/index.ts index 06b21fbe2..c45ccbbc6 100644 --- a/src/server/plugins/engine/index.ts +++ b/src/server/plugins/engine/index.ts @@ -33,8 +33,11 @@ export const prepareNunjucksEnvironment = function ( env.addFilter(name, nunjucksFilter) } - env.addFilter('markdown', (text: string, demoteH1?: boolean) => - markdownToHtml(text, { baseUrl: pluginOptions.baseUrl, demoteH1 }) + env.addFilter('markdown', (text: string, startingHeaderLevel?: number) => + markdownToHtml(text, { + baseUrl: pluginOptions.baseUrl, + startingHeaderLevel + }) ) for (const [name, nunjucksGlobal] of Object.entries(globals)) { diff --git a/src/server/plugins/engine/views/components/declarationfield.html b/src/server/plugins/engine/views/components/declarationfield.html index 7f18e2383..8f503b8f1 100644 --- a/src/server/plugins/engine/views/components/declarationfield.html +++ b/src/server/plugins/engine/views/components/declarationfield.html @@ -5,7 +5,7 @@ {% macro DeclarationField(component) %} {% set content %}
- {{ component.model.content | markdown | safe }} + {{ component.model.content | markdown(component.model.headerStartLevel) | safe }}
{% endset %} {% set checkboxes = component.model | merge({ formGroup: { beforeInputs: { html: content } } }) %} diff --git a/src/server/plugins/engine/views/components/markdown.html b/src/server/plugins/engine/views/components/markdown.html index b133bd182..602bd5192 100644 --- a/src/server/plugins/engine/views/components/markdown.html +++ b/src/server/plugins/engine/views/components/markdown.html @@ -1,5 +1,5 @@ {% macro Markdown(component) %}
- {{ component.model.content | markdown(component.model.numOfComponents > 1) | safe }} + {{ component.model.content | markdown(component.model.headerStartLevel) | safe }}
{% endmacro %} From e68002fdfb2cce7645961572388d75d656c4c8a0 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Tue, 25 Nov 2025 09:24:17 +0000 Subject: [PATCH 4/6] Corrected heading levels --- package-lock.json | 57 +++++++++---------- package.json | 2 +- src/server/forms/components.json | 2 +- .../components/DeclarationField.test.ts | 24 ++++++++ .../engine/components/DeclarationField.ts | 16 ++++-- .../components/DeclarationField2.test.ts | 26 +++++++++ .../plugins/engine/components/Markdown.ts | 7 +-- .../plugins/engine/views/confirmation.html | 2 +- .../definitions/declaration-with-guidance.js | 54 ++++++++++++++++++ .../declaration-without-guidance.js | 43 ++++++++++++++ 10 files changed, 192 insertions(+), 41 deletions(-) create mode 100644 src/server/plugins/engine/components/DeclarationField2.test.ts create mode 100644 test/form/definitions/declaration-with-guidance.js create mode 100644 test/form/definitions/declaration-without-guidance.js diff --git a/package-lock.json b/package-lock.json index 18f22adab..65d0e0fb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@defra/forms-model": "^3.0.575", + "@defra/forms-model": "^3.0.584", "@defra/hapi-tracing": "^1.26.0", "@elastic/ecs-pino-format": "^1.5.0", "@hapi/boom": "^10.0.1", @@ -303,6 +303,7 @@ "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -2246,6 +2247,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2269,6 +2271,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2298,9 +2301,9 @@ } }, "node_modules/@defra/forms-model": { - "version": "3.0.575", - "resolved": "https://registry.npmjs.org/@defra/forms-model/-/forms-model-3.0.575.tgz", - "integrity": "sha512-U6eJ34ukuaZaWs8jkGxi/lVwV36R+KlN1zAoz/IuW0KDehrXbSOmaI7NJEFEu4vSniCWctImjxVkNbsJ8h1xGg==", + "version": "3.0.584", + "resolved": "https://registry.npmjs.org/@defra/forms-model/-/forms-model-3.0.584.tgz", + "integrity": "sha512-hghONjBY8ho7Z7I/QRwYT70Ot5BStPO5rbtaSsGMMhjOsiXM93+jGmclr8rw1A3w5DTiqmaagbtX1lgDojcSjg==", "license": "OGL-UK-3.0", "dependencies": { "@joi/date": "^2.1.1", @@ -5138,6 +5141,7 @@ "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.35.1", "@typescript-eslint/types": "8.35.1", @@ -5860,6 +5864,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6727,6 +6732,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -6915,31 +6921,6 @@ "node": ">=10" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -8403,6 +8384,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -8612,6 +8594,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -8776,6 +8759,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", @@ -8868,6 +8852,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -10731,6 +10716,7 @@ "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.0.5", "@jest/types": "30.0.5", @@ -12269,6 +12255,7 @@ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -12277,6 +12264,7 @@ "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "peer": true, "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -12337,6 +12325,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -14022,6 +14011,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -15744,6 +15734,7 @@ "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -16369,6 +16360,7 @@ "url": "https://github.com/sponsors/stylelint" } ], + "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", @@ -16668,6 +16660,7 @@ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17071,6 +17064,7 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -17179,6 +17173,7 @@ "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -17306,6 +17301,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17549,6 +17545,7 @@ "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -17615,6 +17612,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -17915,6 +17913,7 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index af74bffee..d92af1da9 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@defra/forms-model": "^3.0.575", + "@defra/forms-model": "^3.0.584", "@defra/hapi-tracing": "^1.26.0", "@elastic/ecs-pino-format": "^1.5.0", "@hapi/boom": "^10.0.1", diff --git a/src/server/forms/components.json b/src/server/forms/components.json index fc694e4e8..7933cb50e 100644 --- a/src/server/forms/components.json +++ b/src/server/forms/components.json @@ -125,7 +125,7 @@ "type": "DeclarationField", "name": "declaration", "title": "Declaration", - "content": "By submitting this form, I agree to:\n\n- Provide accurate and complete information\n- Comply with all applicable regulations\n- Accept responsibility for any false statements", + "content": "# H1\nBy submitting this form, I agree to:\n\n- Provide accurate and complete information\n- Comply with all applicable regulations\n- Accept responsibility for any false statements", "hint": "Please read and confirm the following terms" } ] diff --git a/src/server/plugins/engine/components/DeclarationField.test.ts b/src/server/plugins/engine/components/DeclarationField.test.ts index bfb8a41a4..2f7bb9a75 100644 --- a/src/server/plugins/engine/components/DeclarationField.test.ts +++ b/src/server/plugins/engine/components/DeclarationField.test.ts @@ -11,6 +11,8 @@ import { } 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 declarationWithGuidance from '~/test/form/definitions/declaration-with-guidance.js' +import declarationWithoutGuidance from '~/test/form/definitions/declaration-without-guidance.js' import { getFormData, getFormState } from '~/test/helpers/component-helpers.js' describe('DeclarationField', () => { @@ -423,4 +425,26 @@ describe('DeclarationField', () => { expect(DeclarationField.isBool(true)).toBe(true) }) }) + + describe('Markdown header starting level', () => { + test('should determine startHeadingLevel is 3 some guidance', () => { + const modelDecl = new FormModel(declarationWithGuidance, { + basePath: 'test' + }) + const field = modelDecl.componentMap.get( + 'declarationField' + ) as DeclarationField + expect(field.headerStartLevel).toBe(3) + }) + + test('should determine startHeadingLevel is 2 when no guidance', () => { + const modelDecl = new FormModel(declarationWithoutGuidance, { + basePath: 'test' + }) + const field = modelDecl.componentMap.get( + 'declarationField' + ) as DeclarationField + expect(field.headerStartLevel).toBe(2) + }) + }) }) diff --git a/src/server/plugins/engine/components/DeclarationField.ts b/src/server/plugins/engine/components/DeclarationField.ts index 8d403ff07..abce5c105 100644 --- a/src/server/plugins/engine/components/DeclarationField.ts +++ b/src/server/plugins/engine/components/DeclarationField.ts @@ -1,5 +1,7 @@ import { + ComponentType, hasFormComponents, + isFormType, type DeclarationFieldComponent, type Item } from '@defra/forms-model' @@ -69,10 +71,16 @@ export class DeclarationField extends FormComponent { this.content = content this.declarationConfirmationLabel = options.declarationConfirmationLabel ?? this.DEFAULT_DECLARATION_LABEL - const numOfQuestionsOnPage = hasFormComponents(props.page?.pageDef) - ? props.page.pageDef.components.length - : 0 - this.headerStartLevel = numOfQuestionsOnPage < 2 ? 1 : 2 + const formComponents = hasFormComponents(props.page?.pageDef) + ? props.page.pageDef.components + : [] + const numOfQuestionsOnPage = formComponents.filter((q) => + isFormType(q.type) + ).length + const hasGuidance = formComponents.some( + (comp, idx) => comp.type === ComponentType.Markdown && idx === 0 + ) + this.headerStartLevel = numOfQuestionsOnPage < 2 && !hasGuidance ? 2 : 3 } getFormValueFromState(state: FormSubmissionState) { diff --git a/src/server/plugins/engine/components/DeclarationField2.test.ts b/src/server/plugins/engine/components/DeclarationField2.test.ts new file mode 100644 index 000000000..b315f1bac --- /dev/null +++ b/src/server/plugins/engine/components/DeclarationField2.test.ts @@ -0,0 +1,26 @@ +import { type DeclarationField } from '~/src/server/plugins/engine/components/DeclarationField.js' +import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js' +import declarationWithGuidance from '~/test/form/definitions/declaration-with-guidance.js' +import declarationWithoutGuidance from '~/test/form/definitions/declaration-without-guidance.js' + +describe('Markdown header starting level', () => { + test('should determine startHeadingLevel is 3 some guidance', () => { + const modelDecl = new FormModel(declarationWithGuidance, { + basePath: 'test' + }) + const field = modelDecl.componentMap.get( + 'declarationField' + ) as DeclarationField + expect(field.headerStartLevel).toBe(3) + }) + + test('should determine startHeadingLevel is 2 when no guidance', () => { + const modelDecl = new FormModel(declarationWithoutGuidance, { + basePath: 'test' + }) + const field = modelDecl.componentMap.get( + 'declarationField' + ) as DeclarationField + expect(field.headerStartLevel).toBe(2) + }) +}) diff --git a/src/server/plugins/engine/components/Markdown.ts b/src/server/plugins/engine/components/Markdown.ts index fb54d273d..cbc3c7c01 100644 --- a/src/server/plugins/engine/components/Markdown.ts +++ b/src/server/plugins/engine/components/Markdown.ts @@ -1,4 +1,4 @@ -import { hasFormComponents, type MarkdownComponent } from '@defra/forms-model' +import { type MarkdownComponent } from '@defra/forms-model' import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js' @@ -17,10 +17,7 @@ export class Markdown extends ComponentBase { this.content = content this.options = options - const numOfQuestionsOnPage = hasFormComponents(props.page?.pageDef) - ? props.page.pageDef.components.length - : 0 - this.headerStartLevel = numOfQuestionsOnPage < 2 ? 1 : 2 + this.headerStartLevel = 2 } getViewModel() { diff --git a/src/server/plugins/engine/views/confirmation.html b/src/server/plugins/engine/views/confirmation.html index 7c9fbb1a7..82b8c3cbf 100644 --- a/src/server/plugins/engine/views/confirmation.html +++ b/src/server/plugins/engine/views/confirmation.html @@ -12,7 +12,7 @@ }) }}

What happens next

- {{ submissionGuidance | markdown | safe }} + {{ submissionGuidance | markdown(3) | safe }}
diff --git a/test/form/definitions/declaration-with-guidance.js b/test/form/definitions/declaration-with-guidance.js new file mode 100644 index 000000000..e866ed7e7 --- /dev/null +++ b/test/form/definitions/declaration-with-guidance.js @@ -0,0 +1,54 @@ +export default /** @type {FormDefinition} */ ({ + startPage: '/page1', + pages: [ + { + path: '/page1', + components: [ + { + type: 'Markdown', + name: 'kklNow', + title: 'Some guidance', + options: { + required: true + }, + schema: {}, + content: '# H1\n## H2\n### H3\nOther content', + id: '1d1e3b2c-16ce-41bb-a817-a9ffd2e13e87' + }, + { + type: 'DeclarationField', + title: 'Declaration title', + name: 'declarationField', + shortDescription: 'Declaration', + content: + '# H1\r\n## H2\r\n### H3\r\n#### h4\r\n##### h5\r\n###### h6\r\n####### h7', + options: { + required: true + }, + schema: {}, + id: '3a71d9e2-ecab-4d43-8357-23fafbe8eb25' + } + ], + next: [ + { + path: '/summary' + } + ], + title: 'Some guidance' + }, + { + path: '/summary', + controller: 'SummaryPageController', + title: 'Summary', + components: [] + } + ], + lists: [], + sections: [], + phaseBanner: {}, + conditions: [] +}) + +/** + * @import { FormDefinition } from '@defra/forms-model' + */ diff --git a/test/form/definitions/declaration-without-guidance.js b/test/form/definitions/declaration-without-guidance.js new file mode 100644 index 000000000..35d51f5dc --- /dev/null +++ b/test/form/definitions/declaration-without-guidance.js @@ -0,0 +1,43 @@ +export default /** @type {FormDefinition} */ ({ + startPage: '/page1', + pages: [ + { + path: '/page1', + components: [ + { + type: 'DeclarationField', + title: 'Declaration title', + name: 'declarationField', + shortDescription: 'Declaration', + content: + '# H1\r\n## H2\r\n### H3\r\n#### h4\r\n##### h5\r\n###### h6\r\n####### h7', + options: { + required: true + }, + schema: {}, + id: '3a71d9e2-ecab-4d43-8357-23fafbe8eb25' + } + ], + next: [ + { + path: '/summary' + } + ], + title: 'Some guidance' + }, + { + path: '/summary', + controller: 'SummaryPageController', + title: 'Summary', + components: [] + } + ], + lists: [], + sections: [], + phaseBanner: {}, + conditions: [] +}) + +/** + * @import { FormDefinition } from '@defra/forms-model' + */ From 95355ffcf149ea6bd343eb6c544ed9c8b400d15f Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Tue, 25 Nov 2025 09:44:28 +0000 Subject: [PATCH 5/6] Added chokidar --- package-lock.json | 62 +++++++++++++++++++++++++++++------------------ package.json | 1 + 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index f770032d6..ff8369ae0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "blankie": "^5.0.0", "blipp": "^4.0.2", "btoa": "^1.2.1", + "chokidar": "^3.6.0", "convict": "^6.2.4", "date-fns": "^4.1.0", "dotenv": "^17.2.3", @@ -2047,6 +2048,7 @@ "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -5241,6 +5243,7 @@ "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.4", @@ -6013,8 +6016,8 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "peer": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6170,7 +6173,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -6744,7 +6746,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", - "optional": true, "engines": { "node": ">=8" }, @@ -6810,7 +6811,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -6959,6 +6959,7 @@ "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -7093,6 +7094,31 @@ "node": ">=10" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -8574,8 +8600,8 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "peer": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -8810,8 +8836,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, - "peer": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -8987,8 +9013,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, - "peer": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", @@ -9064,8 +9090,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, - "peer": true, "license": "ISC", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -9420,7 +9446,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -9583,7 +9608,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -9809,7 +9833,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -10525,7 +10548,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", - "optional": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10656,7 +10678,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10725,7 +10746,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -10771,7 +10791,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -12233,8 +12252,8 @@ "version": "17.13.3", "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "peer": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -13280,7 +13299,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13794,7 +13812,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -14687,6 +14704,7 @@ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14967,7 +14985,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", - "optional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -16703,8 +16720,8 @@ "url": "https://github.com/sponsors/stylelint" } ], - "peer": true, "license": "MIT", + "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", @@ -17002,7 +17019,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17487,7 +17503,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -18056,8 +18071,8 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, - "peer": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -18518,7 +18533,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index 05ce2462a..e32161e74 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "blankie": "^5.0.0", "blipp": "^4.0.2", "btoa": "^1.2.1", + "chokidar": "^3.6.0", "convict": "^6.2.4", "date-fns": "^4.1.0", "dotenv": "^17.2.3", From f5227f12b29861b1e4fba64e8d62fb28bf6b9aaf Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Tue, 25 Nov 2025 10:13:07 +0000 Subject: [PATCH 6/6] Removed unnecessary test --- package-lock.json | 2 +- package.json | 2 +- .../components/DeclarationField2.test.ts | 26 ------------------- 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 src/server/plugins/engine/components/DeclarationField2.test.ts diff --git a/package-lock.json b/package-lock.json index ff8369ae0..a4edf5f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "blankie": "^5.0.0", "blipp": "^4.0.2", "btoa": "^1.2.1", - "chokidar": "^3.6.0", + "chokidar": "3.6.0", "convict": "^6.2.4", "date-fns": "^4.1.0", "dotenv": "^17.2.3", diff --git a/package.json b/package.json index e32161e74..6c7d8224d 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "blankie": "^5.0.0", "blipp": "^4.0.2", "btoa": "^1.2.1", - "chokidar": "^3.6.0", + "chokidar": "3.6.0", "convict": "^6.2.4", "date-fns": "^4.1.0", "dotenv": "^17.2.3", diff --git a/src/server/plugins/engine/components/DeclarationField2.test.ts b/src/server/plugins/engine/components/DeclarationField2.test.ts deleted file mode 100644 index b315f1bac..000000000 --- a/src/server/plugins/engine/components/DeclarationField2.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { type DeclarationField } from '~/src/server/plugins/engine/components/DeclarationField.js' -import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js' -import declarationWithGuidance from '~/test/form/definitions/declaration-with-guidance.js' -import declarationWithoutGuidance from '~/test/form/definitions/declaration-without-guidance.js' - -describe('Markdown header starting level', () => { - test('should determine startHeadingLevel is 3 some guidance', () => { - const modelDecl = new FormModel(declarationWithGuidance, { - basePath: 'test' - }) - const field = modelDecl.componentMap.get( - 'declarationField' - ) as DeclarationField - expect(field.headerStartLevel).toBe(3) - }) - - test('should determine startHeadingLevel is 2 when no guidance', () => { - const modelDecl = new FormModel(declarationWithoutGuidance, { - basePath: 'test' - }) - const field = modelDecl.componentMap.get( - 'declarationField' - ) as DeclarationField - expect(field.headerStartLevel).toBe(2) - }) -})