@defra/forms-engine-plugin 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
- package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
- package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
- package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
- package/.public/assets/images/favicon.ico +0 -0
- package/.public/assets/images/favicon.svg +1 -0
- package/.public/assets/images/govuk-crest.svg +1 -0
- package/.public/assets/images/govuk-icon-180.png +0 -0
- package/.public/assets/images/govuk-icon-192.png +0 -0
- package/.public/assets/images/govuk-icon-512.png +0 -0
- package/.public/assets/images/govuk-icon-mask.svg +1 -0
- package/.public/assets/images/govuk-opengraph-image.png +0 -0
- package/.public/assets/manifest.json +39 -0
- package/.public/assets-manifest.json +24 -0
- package/.public/javascripts/application.0fd8c18.min.js +3 -0
- package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
- package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
- package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
- package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
- package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
- package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
- package/.public/stylesheets/application.e340021.min.css +14 -0
- package/.public/stylesheets/application.e340021.min.css.map +1 -0
- package/package.json +6 -2
- package/.browserslistrc +0 -16
- package/.editorconfig +0 -9
- package/.eslintrc.cjs +0 -266
- package/.github/dependabot.yml +0 -85
- package/.github/workflows/check-pull-request.yml +0 -209
- package/.github/workflows/pr-notifier.yml +0 -98
- package/.github/workflows/publish.yml +0 -111
- package/.husky/pre-commit +0 -1
- package/.lintstagedrc.js +0 -4
- package/.nvmrc +0 -1
- package/.prettierignore +0 -8
- package/.prettierrc.cjs +0 -26
- package/Dockerfile +0 -61
- package/Procfile +0 -1
- package/babel.config.cjs +0 -55
- package/compose/aws.env +0 -4
- package/compose/start-localstack.sh +0 -26
- package/docker-compose.yaml +0 -86
- package/globals.d.ts +0 -1
- package/jest.config.cjs +0 -54
- package/jest.environment.js +0 -4
- package/jest.setup.cjs +0 -14
- package/postcss.config.js +0 -26
- package/sonar-project.properties +0 -17
- package/src/client/javascripts/application.js +0 -87
- package/src/client/javascripts/file-upload.js +0 -386
- package/src/client/stylesheets/_code.scss +0 -33
- package/src/client/stylesheets/_govuk-frontend.scss +0 -4
- package/src/client/stylesheets/_prose.scss +0 -56
- package/src/client/stylesheets/_service-banner.scss +0 -24
- package/src/client/stylesheets/_summary-list.scss +0 -28
- package/src/client/stylesheets/_tag-env.scss +0 -24
- package/src/client/stylesheets/application.scss +0 -14
- package/src/common/cookies.js +0 -58
- package/src/common/cookies.test.js +0 -23
- package/src/common/types.js +0 -5
- package/src/config/index.ts +0 -271
- package/src/index.ts +0 -31
- package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
- package/src/server/common/helpers/logging/logger-options.ts +0 -46
- package/src/server/common/helpers/logging/logger.ts +0 -7
- package/src/server/common/helpers/logging/request-logger.ts +0 -9
- package/src/server/common/helpers/logging/request-tracing.js +0 -10
- package/src/server/common/helpers/redis-client.js +0 -70
- package/src/server/constants.js +0 -1
- package/src/server/forms/README.md +0 -10
- package/src/server/forms/components.json +0 -1015
- package/src/server/forms/report-a-terrorist.json +0 -270
- package/src/server/forms/runner-components-test.json +0 -365
- package/src/server/forms/test.json +0 -581
- package/src/server/index.test.ts +0 -582
- package/src/server/index.ts +0 -140
- package/src/server/plugins/blankie.test.ts +0 -73
- package/src/server/plugins/blankie.ts +0 -48
- package/src/server/plugins/crumb.ts +0 -20
- package/src/server/plugins/engine/README.md +0 -87
- package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
- package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
- package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
- package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
- package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
- package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
- package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
- package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
- package/src/server/plugins/engine/components/Details.test.ts +0 -49
- package/src/server/plugins/engine/components/Details.ts +0 -30
- package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
- package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
- package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
- package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
- package/src/server/plugins/engine/components/FormComponent.ts +0 -249
- package/src/server/plugins/engine/components/Html.test.ts +0 -48
- package/src/server/plugins/engine/components/Html.ts +0 -29
- package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
- package/src/server/plugins/engine/components/InsetText.ts +0 -27
- package/src/server/plugins/engine/components/List.test.ts +0 -76
- package/src/server/plugins/engine/components/List.ts +0 -72
- package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
- package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
- package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
- package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
- package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
- package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
- package/src/server/plugins/engine/components/NumberField.ts +0 -163
- package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
- package/src/server/plugins/engine/components/RadiosField.ts +0 -24
- package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
- package/src/server/plugins/engine/components/SelectField.ts +0 -47
- package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
- package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
- package/src/server/plugins/engine/components/TextField.test.ts +0 -489
- package/src/server/plugins/engine/components/TextField.ts +0 -96
- package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
- package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
- package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
- package/src/server/plugins/engine/components/YesNoField.ts +0 -31
- package/src/server/plugins/engine/components/constants.ts +0 -1
- package/src/server/plugins/engine/components/helpers.ts +0 -330
- package/src/server/plugins/engine/components/index.ts +0 -24
- package/src/server/plugins/engine/components/types.ts +0 -117
- package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
- package/src/server/plugins/engine/helpers.test.ts +0 -791
- package/src/server/plugins/engine/helpers.ts +0 -379
- package/src/server/plugins/engine/index.ts +0 -7
- package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
- package/src/server/plugins/engine/models/FormModel.ts +0 -443
- package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
- package/src/server/plugins/engine/models/Section.ts +0 -0
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
- package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
- package/src/server/plugins/engine/models/index.ts +0 -2
- package/src/server/plugins/engine/models/types.ts +0 -114
- package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
- package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
- package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
- package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
- package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
- package/src/server/plugins/engine/pageControllers/README.md +0 -28
- package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
- package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
- package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
- package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
- package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
- package/src/server/plugins/engine/pageControllers/index.ts +0 -10
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
- package/src/server/plugins/engine/plugin.ts +0 -673
- package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
- package/src/server/plugins/engine/services/formsService.js +0 -46
- package/src/server/plugins/engine/services/formsService.test.js +0 -90
- package/src/server/plugins/engine/services/index.js +0 -3
- package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
- package/src/server/plugins/engine/services/notifyService.ts +0 -64
- package/src/server/plugins/engine/services/uploadService.js +0 -60
- package/src/server/plugins/engine/types.ts +0 -315
- package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
- package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
- package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
- package/src/server/plugins/engine/views/components/details.html +0 -6
- package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
- package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
- package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
- package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
- package/src/server/plugins/engine/views/components/html.html +0 -3
- package/src/server/plugins/engine/views/components/insettext.html +0 -7
- package/src/server/plugins/engine/views/components/list.html +0 -36
- package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
- package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
- package/src/server/plugins/engine/views/components/numberfield.html +0 -5
- package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
- package/src/server/plugins/engine/views/components/selectfield.html +0 -5
- package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
- package/src/server/plugins/engine/views/components/textfield.html +0 -5
- package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
- package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
- package/src/server/plugins/engine/views/file-upload.html +0 -45
- package/src/server/plugins/engine/views/index.html +0 -39
- package/src/server/plugins/engine/views/item-delete.html +0 -56
- package/src/server/plugins/engine/views/partials/components.html +0 -6
- package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
- package/src/server/plugins/engine/views/partials/debug.html +0 -44
- package/src/server/plugins/engine/views/partials/form.html +0 -15
- package/src/server/plugins/engine/views/partials/heading.html +0 -16
- package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
- package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
- package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
- package/src/server/plugins/errorPages.ts +0 -58
- package/src/server/plugins/nunjucks/context.js +0 -88
- package/src/server/plugins/nunjucks/context.test.js +0 -142
- package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
- package/src/server/plugins/nunjucks/environment.js +0 -116
- package/src/server/plugins/nunjucks/filters/answer.js +0 -27
- package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
- package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
- package/src/server/plugins/nunjucks/filters/field.js +0 -28
- package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
- package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
- package/src/server/plugins/nunjucks/filters/href.js +0 -30
- package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
- package/src/server/plugins/nunjucks/filters/index.js +0 -8
- package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
- package/src/server/plugins/nunjucks/filters/page.js +0 -24
- package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
- package/src/server/plugins/nunjucks/index.js +0 -3
- package/src/server/plugins/nunjucks/plugin.js +0 -40
- package/src/server/plugins/nunjucks/render.js +0 -42
- package/src/server/plugins/nunjucks/types.js +0 -40
- package/src/server/plugins/pulse.ts +0 -11
- package/src/server/plugins/router.ts +0 -201
- package/src/server/plugins/session.ts +0 -28
- package/src/server/routes/health.js +0 -13
- package/src/server/routes/health.test.js +0 -35
- package/src/server/routes/index.test.ts +0 -125
- package/src/server/routes/index.ts +0 -2
- package/src/server/routes/public.ts +0 -47
- package/src/server/routes/types.ts +0 -48
- package/src/server/schemas/index.ts +0 -34
- package/src/server/secure-context.js +0 -43
- package/src/server/services/cacheService.test.ts +0 -276
- package/src/server/services/cacheService.ts +0 -131
- package/src/server/services/httpService.test.js +0 -491
- package/src/server/services/httpService.ts +0 -50
- package/src/server/services/index.ts +0 -1
- package/src/server/types.ts +0 -54
- package/src/server/utils/notify.test.ts +0 -37
- package/src/server/utils/notify.ts +0 -50
- package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
- package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
- package/src/server/utils/utils.js +0 -24
- package/src/server/utils/utils.test.js +0 -54
- package/src/server/views/404.html +0 -16
- package/src/server/views/500.html +0 -19
- package/src/server/views/components/debug/macro.njk +0 -3
- package/src/server/views/components/debug/template.njk +0 -13
- package/src/server/views/components/service-banner/macro.njk +0 -3
- package/src/server/views/components/service-banner/template.njk +0 -20
- package/src/server/views/components/service-banner/template.test.js +0 -43
- package/src/server/views/components/tag-env/macro.njk +0 -3
- package/src/server/views/components/tag-env/template.njk +0 -30
- package/src/server/views/components/tag-env/template.test.js +0 -66
- package/src/server/views/confirmation.html +0 -19
- package/src/server/views/help/accessibility-statement.html +0 -58
- package/src/server/views/help/cookie-preferences.html +0 -57
- package/src/server/views/help/cookies.html +0 -71
- package/src/server/views/help/get-support.html +0 -37
- package/src/server/views/help/privacy-notice.html +0 -68
- package/src/server/views/help/terms-and-conditions.html +0 -83
- package/src/server/views/layout.html +0 -199
- package/src/server/views/summary.html +0 -50
- package/src/typings/hapi/index.d.ts +0 -95
- package/src/typings/hapi-tracing/index.d.ts +0 -6
- package/src/typings/index.d.ts +0 -3
- package/src/typings/joi/index.d.ts +0 -22
- package/stylelint.config.js +0 -10
- package/test/client/javascripts/file-upload.test.js +0 -1197
- package/test/condition/checkboxes.test.js +0 -112
- package/test/condition/radios.test.js +0 -112
- package/test/condition/text.test.js +0 -103
- package/test/fixtures/assets-manifest.json +0 -4
- package/test/fixtures/form.js +0 -86
- package/test/fixtures/index.js +0 -2
- package/test/fixtures/list.js +0 -92
- package/test/form/cookies.test.js +0 -338
- package/test/form/csrf.test.js +0 -87
- package/test/form/definitions/basic.js +0 -101
- package/test/form/definitions/blank.js +0 -10
- package/test/form/definitions/checkboxes.json +0 -88
- package/test/form/definitions/components.json +0 -452
- package/test/form/definitions/conditional-reveal.js +0 -140
- package/test/form/definitions/conditions-basic.js +0 -187
- package/test/form/definitions/conditions-complex.js +0 -338
- package/test/form/definitions/conditions-dates.js +0 -78
- package/test/form/definitions/conditions-escaping.js +0 -143
- package/test/form/definitions/demo-cph-number.js +0 -3099
- package/test/form/definitions/feedback.json +0 -45
- package/test/form/definitions/fields-optional.js +0 -402
- package/test/form/definitions/fields-required.js +0 -402
- package/test/form/definitions/file-upload-basic.js +0 -44
- package/test/form/definitions/file-upload.js +0 -66
- package/test/form/definitions/minimal.js +0 -39
- package/test/form/definitions/phase-alpha.json +0 -33
- package/test/form/definitions/phase-default.json +0 -26
- package/test/form/definitions/radios.json +0 -88
- package/test/form/definitions/repeat-mixed.js +0 -54
- package/test/form/definitions/repeat.js +0 -70
- package/test/form/definitions/status.json +0 -126
- package/test/form/definitions/templates.js +0 -183
- package/test/form/definitions/test.json +0 -581
- package/test/form/definitions/text.json +0 -75
- package/test/form/definitions/titles.json +0 -170
- package/test/form/definitions.test.js +0 -47
- package/test/form/exit-page.test.js +0 -210
- package/test/form/feedback.test.js +0 -68
- package/test/form/fields-optional.test.js +0 -237
- package/test/form/fields-required.test.js +0 -294
- package/test/form/file-upload.test.js +0 -313
- package/test/form/govuk-notify.test.js +0 -449
- package/test/form/journey-basic.test.js +0 -444
- package/test/form/persist-files.test.js +0 -227
- package/test/form/phase-banner.test.js +0 -71
- package/test/form/repeat.test.js +0 -628
- package/test/form/summary-submission-email.test.js +0 -95
- package/test/form/template.test.js +0 -288
- package/test/form/titles.test.js +0 -204
- package/test/helpers/component-helpers.js +0 -74
- package/test/utils/get-cookie.js +0 -42
- package/test/utils/get-form-definitions.js +0 -18
- package/tmp.pdf +0 -1
- package/tsconfig.json +0 -28
- package/webpack.config.js +0 -208
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
import { ComponentType, type ComponentDef } from '@defra/forms-model'
|
|
2
|
-
import { Marked, type Token } from 'marked'
|
|
3
|
-
|
|
4
|
-
import { config } from '~/src/config/index.js'
|
|
5
|
-
import { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'
|
|
6
|
-
import { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'
|
|
7
|
-
import * as Components from '~/src/server/plugins/engine/components/index.js'
|
|
8
|
-
import { type FormState } from '~/src/server/plugins/engine/types.js'
|
|
9
|
-
|
|
10
|
-
const designerUrl = config.get('designerUrl')
|
|
11
|
-
|
|
12
|
-
const markdown = new Marked({
|
|
13
|
-
breaks: true,
|
|
14
|
-
gfm: true,
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Render paragraphs without `<p>` wrappers
|
|
18
|
-
* for check answers summary list `<dd>`
|
|
19
|
-
*/
|
|
20
|
-
extensions: [
|
|
21
|
-
{
|
|
22
|
-
name: 'paragraph',
|
|
23
|
-
renderer({ tokens = [] }) {
|
|
24
|
-
const text = this.parser.parseInline(tokens)
|
|
25
|
-
return tokens.length > 1 ? `${text}<br>` : text
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
],
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Restrict allowed Markdown tokens
|
|
32
|
-
*/
|
|
33
|
-
walkTokens(token) {
|
|
34
|
-
const tokens: Token['type'][] = [
|
|
35
|
-
'br',
|
|
36
|
-
'escape',
|
|
37
|
-
'list',
|
|
38
|
-
'list_item',
|
|
39
|
-
'paragraph',
|
|
40
|
-
'space',
|
|
41
|
-
'text'
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
if (!tokens.includes(token.type)) {
|
|
45
|
-
token.type = 'text'
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
// All component instances
|
|
51
|
-
export type Component = InstanceType<
|
|
52
|
-
(typeof Components)[keyof typeof Components]
|
|
53
|
-
>
|
|
54
|
-
|
|
55
|
-
// Field component instances only
|
|
56
|
-
export type Field = InstanceType<
|
|
57
|
-
| typeof Components.AutocompleteField
|
|
58
|
-
| typeof Components.CheckboxesField
|
|
59
|
-
| typeof Components.DatePartsField
|
|
60
|
-
| typeof Components.EmailAddressField
|
|
61
|
-
| typeof Components.MonthYearField
|
|
62
|
-
| typeof Components.MultilineTextField
|
|
63
|
-
| typeof Components.NumberField
|
|
64
|
-
| typeof Components.SelectField
|
|
65
|
-
| typeof Components.TelephoneNumberField
|
|
66
|
-
| typeof Components.TextField
|
|
67
|
-
| typeof Components.UkAddressField
|
|
68
|
-
| typeof Components.FileUploadField
|
|
69
|
-
>
|
|
70
|
-
|
|
71
|
-
// Guidance component instances only
|
|
72
|
-
export type Guidance = InstanceType<
|
|
73
|
-
| typeof Components.Details
|
|
74
|
-
| typeof Components.Html
|
|
75
|
-
| typeof Components.InsetText
|
|
76
|
-
| typeof Components.List
|
|
77
|
-
>
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create field instance for each {@link ComponentDef} type
|
|
81
|
-
*/
|
|
82
|
-
export function createComponent(
|
|
83
|
-
def: ComponentDef,
|
|
84
|
-
options: ConstructorParameters<typeof ComponentBase>[1]
|
|
85
|
-
): Component {
|
|
86
|
-
let component: Component | undefined
|
|
87
|
-
|
|
88
|
-
switch (def.type) {
|
|
89
|
-
case ComponentType.AutocompleteField:
|
|
90
|
-
component = new Components.AutocompleteField(def, options)
|
|
91
|
-
break
|
|
92
|
-
|
|
93
|
-
case ComponentType.CheckboxesField:
|
|
94
|
-
component = new Components.CheckboxesField(def, options)
|
|
95
|
-
break
|
|
96
|
-
|
|
97
|
-
case ComponentType.DatePartsField:
|
|
98
|
-
component = new Components.DatePartsField(def, options)
|
|
99
|
-
break
|
|
100
|
-
|
|
101
|
-
case ComponentType.Details:
|
|
102
|
-
component = new Components.Details(def, options)
|
|
103
|
-
break
|
|
104
|
-
|
|
105
|
-
case ComponentType.EmailAddressField:
|
|
106
|
-
component = new Components.EmailAddressField(def, options)
|
|
107
|
-
break
|
|
108
|
-
|
|
109
|
-
case ComponentType.Html:
|
|
110
|
-
component = new Components.Html(def, options)
|
|
111
|
-
break
|
|
112
|
-
|
|
113
|
-
case ComponentType.InsetText:
|
|
114
|
-
component = new Components.InsetText(def, options)
|
|
115
|
-
break
|
|
116
|
-
|
|
117
|
-
case ComponentType.List:
|
|
118
|
-
component = new Components.List(def, options)
|
|
119
|
-
break
|
|
120
|
-
|
|
121
|
-
case ComponentType.MultilineTextField:
|
|
122
|
-
component = new Components.MultilineTextField(def, options)
|
|
123
|
-
break
|
|
124
|
-
|
|
125
|
-
case ComponentType.NumberField:
|
|
126
|
-
component = new Components.NumberField(def, options)
|
|
127
|
-
break
|
|
128
|
-
|
|
129
|
-
case ComponentType.RadiosField:
|
|
130
|
-
component = new Components.RadiosField(def, options)
|
|
131
|
-
break
|
|
132
|
-
|
|
133
|
-
case ComponentType.SelectField:
|
|
134
|
-
component = new Components.SelectField(def, options)
|
|
135
|
-
break
|
|
136
|
-
|
|
137
|
-
case ComponentType.TelephoneNumberField:
|
|
138
|
-
component = new Components.TelephoneNumberField(def, options)
|
|
139
|
-
break
|
|
140
|
-
|
|
141
|
-
case ComponentType.TextField:
|
|
142
|
-
component = new Components.TextField(def, options)
|
|
143
|
-
break
|
|
144
|
-
|
|
145
|
-
case ComponentType.UkAddressField:
|
|
146
|
-
component = new Components.UkAddressField(def, options)
|
|
147
|
-
break
|
|
148
|
-
|
|
149
|
-
case ComponentType.YesNoField:
|
|
150
|
-
component = new Components.YesNoField(def, options)
|
|
151
|
-
break
|
|
152
|
-
|
|
153
|
-
case ComponentType.MonthYearField:
|
|
154
|
-
component = new Components.MonthYearField(def, options)
|
|
155
|
-
break
|
|
156
|
-
|
|
157
|
-
case ComponentType.FileUploadField:
|
|
158
|
-
component = new Components.FileUploadField(def, options)
|
|
159
|
-
break
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (typeof component === 'undefined') {
|
|
163
|
-
throw new Error(`Component type ${def.type} does not exist`)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return component
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Get formatted answer for a field
|
|
171
|
-
*/
|
|
172
|
-
export function getAnswer(
|
|
173
|
-
field: Field,
|
|
174
|
-
state: FormState,
|
|
175
|
-
options: {
|
|
176
|
-
format:
|
|
177
|
-
| 'data' // Submission data
|
|
178
|
-
| 'email' // GOV.UK Notify emails
|
|
179
|
-
| 'summary' // Check answers summary
|
|
180
|
-
} = { format: 'summary' }
|
|
181
|
-
) {
|
|
182
|
-
// Use escaped display text for GOV.UK Notify emails
|
|
183
|
-
if (options.format === 'email') {
|
|
184
|
-
return getAnswerMarkdown(field, state, { format: 'email' })
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Use context value for submission data
|
|
188
|
-
if (options.format === 'data') {
|
|
189
|
-
const context = field.getContextValueFromState(state)
|
|
190
|
-
return context?.toString() ?? ''
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Use display HTML for check answers summary (multi line)
|
|
194
|
-
if (
|
|
195
|
-
field instanceof ListFormComponent ||
|
|
196
|
-
field instanceof Components.MultilineTextField ||
|
|
197
|
-
field instanceof Components.UkAddressField
|
|
198
|
-
) {
|
|
199
|
-
return markdown
|
|
200
|
-
.parse(getAnswerMarkdown(field, state), { async: false })
|
|
201
|
-
.trim()
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Use display text for check answers summary (single line)
|
|
205
|
-
return field.getDisplayStringFromState(state)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Get formatted answer for a field (Markdown only)
|
|
210
|
-
*/
|
|
211
|
-
export function getAnswerMarkdown(
|
|
212
|
-
field: Field,
|
|
213
|
-
state: FormState,
|
|
214
|
-
options: {
|
|
215
|
-
format:
|
|
216
|
-
| 'email' // GOV.UK Notify emails
|
|
217
|
-
| 'summary' // Check answers summary
|
|
218
|
-
} = { format: 'summary' }
|
|
219
|
-
) {
|
|
220
|
-
const answer = field.getDisplayStringFromState(state)
|
|
221
|
-
|
|
222
|
-
// Use escaped display text
|
|
223
|
-
let answerEscaped = `${escapeMarkdown(answer)}\n`
|
|
224
|
-
|
|
225
|
-
if (field instanceof Components.FileUploadField) {
|
|
226
|
-
const files = field.getFormValueFromState(state)
|
|
227
|
-
|
|
228
|
-
// Skip empty files
|
|
229
|
-
if (!files?.length) {
|
|
230
|
-
return answerEscaped
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
answerEscaped = `${escapeMarkdown(answer)}:\n\n`
|
|
234
|
-
|
|
235
|
-
// Append bullet points
|
|
236
|
-
answerEscaped += files
|
|
237
|
-
.map(({ status }) => {
|
|
238
|
-
const { file } = status.form
|
|
239
|
-
const filename = escapeMarkdown(file.filename)
|
|
240
|
-
return `* [${filename}](${designerUrl}/file-download/${file.fileId})\n`
|
|
241
|
-
})
|
|
242
|
-
.join('')
|
|
243
|
-
} else if (field instanceof ListFormComponent) {
|
|
244
|
-
const values = [field.getContextValueFromState(state)].flat()
|
|
245
|
-
const items = field.items.filter(({ value }) => values.includes(value))
|
|
246
|
-
|
|
247
|
-
// Skip empty values
|
|
248
|
-
if (!items.length) {
|
|
249
|
-
return answerEscaped
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
answerEscaped = ''
|
|
253
|
-
|
|
254
|
-
// Append bullet points
|
|
255
|
-
answerEscaped += items
|
|
256
|
-
.map((item) => {
|
|
257
|
-
const label = escapeMarkdown(item.text)
|
|
258
|
-
const value = escapeMarkdown(`(${item.value})`)
|
|
259
|
-
|
|
260
|
-
let line = label
|
|
261
|
-
|
|
262
|
-
// Prepend bullet points for checkboxes only
|
|
263
|
-
if (field instanceof Components.CheckboxesField) {
|
|
264
|
-
line = `* ${line}`
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Append raw values in parentheses
|
|
268
|
-
// e.g. `* None of the above (false)`
|
|
269
|
-
return options.format === 'email' &&
|
|
270
|
-
`${item.value}`.toLowerCase() !== item.text.toLowerCase()
|
|
271
|
-
? `${line} ${value}\n`
|
|
272
|
-
: `${line}\n`
|
|
273
|
-
})
|
|
274
|
-
.join('')
|
|
275
|
-
} else if (field instanceof Components.MultilineTextField) {
|
|
276
|
-
// Preserve Multiline text new lines
|
|
277
|
-
answerEscaped = answer
|
|
278
|
-
.split(/\r?\n/)
|
|
279
|
-
.map(escapeMarkdown)
|
|
280
|
-
.join('\n')
|
|
281
|
-
.concat('\n')
|
|
282
|
-
} else if (field instanceof Components.UkAddressField) {
|
|
283
|
-
// Format UK addresses into new lines
|
|
284
|
-
answerEscaped = (field.getContextValueFromState(state) ?? [])
|
|
285
|
-
.map(escapeMarkdown)
|
|
286
|
-
.join('\n')
|
|
287
|
-
.concat('\n')
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return answerEscaped
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Prevent Markdown formatting
|
|
295
|
-
* @see {@link https://pandoc.org/chunkedhtml-demo/8.11-backslash-escapes.html}
|
|
296
|
-
*/
|
|
297
|
-
export function escapeMarkdown(answer: string) {
|
|
298
|
-
const punctuation = [
|
|
299
|
-
'`',
|
|
300
|
-
"'",
|
|
301
|
-
'*',
|
|
302
|
-
'_',
|
|
303
|
-
'{',
|
|
304
|
-
'}',
|
|
305
|
-
'[',
|
|
306
|
-
']',
|
|
307
|
-
'(',
|
|
308
|
-
')',
|
|
309
|
-
'#',
|
|
310
|
-
'+',
|
|
311
|
-
'-',
|
|
312
|
-
'.',
|
|
313
|
-
'!'
|
|
314
|
-
]
|
|
315
|
-
|
|
316
|
-
for (const character of punctuation) {
|
|
317
|
-
answer = answer.toString().replaceAll(character, `\\${character}`)
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
return answer
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
export const addClassOptionIfNone = (
|
|
324
|
-
options: Extract<ComponentDef, { options: { classes?: string } }>['options'],
|
|
325
|
-
className: string
|
|
326
|
-
) => {
|
|
327
|
-
if (!options.classes) {
|
|
328
|
-
options.classes = className
|
|
329
|
-
}
|
|
330
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IMPORTANT: Exported Components must follow the naming convention implemented in {@link @defra/forms-model#ComponentType}
|
|
3
|
-
* In the Form JSON, components have a type property which is the name of the components, e.g. DatePartsField.
|
|
4
|
-
* Components are loaded in the ComponentsCollection constructor.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { AutocompleteField } from '~/src/server/plugins/engine/components/AutocompleteField.js'
|
|
8
|
-
export { CheckboxesField } from '~/src/server/plugins/engine/components/CheckboxesField.js'
|
|
9
|
-
export { DatePartsField } from '~/src/server/plugins/engine/components/DatePartsField.js'
|
|
10
|
-
export { Details } from '~/src/server/plugins/engine/components/Details.js'
|
|
11
|
-
export { EmailAddressField } from '~/src/server/plugins/engine/components/EmailAddressField.js'
|
|
12
|
-
export { Html } from '~/src/server/plugins/engine/components/Html.js'
|
|
13
|
-
export { InsetText } from '~/src/server/plugins/engine/components/InsetText.js'
|
|
14
|
-
export { List } from '~/src/server/plugins/engine/components/List.js'
|
|
15
|
-
export { MultilineTextField } from '~/src/server/plugins/engine/components/MultilineTextField.js'
|
|
16
|
-
export { NumberField } from '~/src/server/plugins/engine/components/NumberField.js'
|
|
17
|
-
export { RadiosField } from '~/src/server/plugins/engine/components/RadiosField.js'
|
|
18
|
-
export { SelectField } from '~/src/server/plugins/engine/components/SelectField.js'
|
|
19
|
-
export { TelephoneNumberField } from '~/src/server/plugins/engine/components/TelephoneNumberField.js'
|
|
20
|
-
export { TextField } from '~/src/server/plugins/engine/components/TextField.js'
|
|
21
|
-
export { UkAddressField } from '~/src/server/plugins/engine/components/UkAddressField.js'
|
|
22
|
-
export { YesNoField } from '~/src/server/plugins/engine/components/YesNoField.js'
|
|
23
|
-
export { MonthYearField } from '~/src/server/plugins/engine/components/MonthYearField.js'
|
|
24
|
-
export { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { type ComponentType, type Item } from '@defra/forms-model'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
type FormSubmissionError,
|
|
5
|
-
type FormValue,
|
|
6
|
-
type SummaryList
|
|
7
|
-
} from '~/src/server/plugins/engine/types.js'
|
|
8
|
-
|
|
9
|
-
export type ComponentText = {
|
|
10
|
-
classes?: string
|
|
11
|
-
attributes?: string | Record<string, string>
|
|
12
|
-
} & (
|
|
13
|
-
| {
|
|
14
|
-
text: string
|
|
15
|
-
html?: string
|
|
16
|
-
}
|
|
17
|
-
| {
|
|
18
|
-
text?: string
|
|
19
|
-
html: string
|
|
20
|
-
}
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
export interface Label {
|
|
24
|
-
text: string
|
|
25
|
-
classes?: string
|
|
26
|
-
html?: string
|
|
27
|
-
isPageHeading?: boolean
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface Content {
|
|
31
|
-
title?: string
|
|
32
|
-
text: string
|
|
33
|
-
condition?: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface BackLink {
|
|
37
|
-
text: string
|
|
38
|
-
href: string
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export type ListItemLabel = Omit<Label, 'text' | 'isPageHeading'>
|
|
42
|
-
|
|
43
|
-
export interface ListItem {
|
|
44
|
-
text?: string
|
|
45
|
-
value?: Item['value']
|
|
46
|
-
hint?: {
|
|
47
|
-
id?: string
|
|
48
|
-
text: string
|
|
49
|
-
}
|
|
50
|
-
checked?: boolean
|
|
51
|
-
selected?: boolean
|
|
52
|
-
label?: ListItemLabel
|
|
53
|
-
condition?: string
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface DateInputItem {
|
|
57
|
-
label?: Label
|
|
58
|
-
type?: string
|
|
59
|
-
id?: string
|
|
60
|
-
name?: string
|
|
61
|
-
value?: Item['value']
|
|
62
|
-
classes?: string
|
|
63
|
-
condition?: undefined
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface ViewModel extends Record<string, unknown> {
|
|
67
|
-
label?: Label
|
|
68
|
-
type?: string
|
|
69
|
-
id?: string
|
|
70
|
-
name?: string
|
|
71
|
-
value?: FormValue
|
|
72
|
-
hint?: {
|
|
73
|
-
id?: string
|
|
74
|
-
text: string
|
|
75
|
-
}
|
|
76
|
-
prefix?: ComponentText
|
|
77
|
-
suffix?: ComponentText
|
|
78
|
-
classes?: string
|
|
79
|
-
condition?: string
|
|
80
|
-
errors?: FormSubmissionError[]
|
|
81
|
-
errorMessage?: {
|
|
82
|
-
text: string
|
|
83
|
-
}
|
|
84
|
-
summaryHtml?: string
|
|
85
|
-
html?: string
|
|
86
|
-
attributes: {
|
|
87
|
-
autocomplete?: string
|
|
88
|
-
maxlength?: number
|
|
89
|
-
multiple?: string
|
|
90
|
-
accept?: string
|
|
91
|
-
inputmode?: string
|
|
92
|
-
}
|
|
93
|
-
content?: Content | Content[] | string
|
|
94
|
-
maxlength?: number
|
|
95
|
-
maxwords?: number
|
|
96
|
-
rows?: number
|
|
97
|
-
items?: ListItem[] | DateInputItem[]
|
|
98
|
-
fieldset?: {
|
|
99
|
-
attributes?: string | Record<string, string>
|
|
100
|
-
legend?: Label
|
|
101
|
-
}
|
|
102
|
-
formGroup?: {
|
|
103
|
-
classes?: string
|
|
104
|
-
attributes?: string | Record<string, string>
|
|
105
|
-
}
|
|
106
|
-
components?: ComponentViewModel[]
|
|
107
|
-
upload?: {
|
|
108
|
-
count: number
|
|
109
|
-
summaryList: SummaryList
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export interface ComponentViewModel {
|
|
114
|
-
type: ComponentType
|
|
115
|
-
isFormComponent: boolean
|
|
116
|
-
model: ViewModel
|
|
117
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { join, parse } from 'node:path'
|
|
2
|
-
|
|
3
|
-
import { type FormDefinition } from '@defra/forms-model'
|
|
4
|
-
import { type ServerRegisterPluginObject } from '@hapi/hapi'
|
|
5
|
-
|
|
6
|
-
import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
|
|
7
|
-
import {
|
|
8
|
-
plugin,
|
|
9
|
-
type PluginOptions
|
|
10
|
-
} from '~/src/server/plugins/engine/plugin.js'
|
|
11
|
-
import { type RouteConfig } from '~/src/server/types.js'
|
|
12
|
-
|
|
13
|
-
export const configureEnginePlugin = async ({
|
|
14
|
-
formFileName,
|
|
15
|
-
formFilePath,
|
|
16
|
-
services,
|
|
17
|
-
controllers
|
|
18
|
-
}: RouteConfig = {}): Promise<ServerRegisterPluginObject<PluginOptions>> => {
|
|
19
|
-
let model: FormModel | undefined
|
|
20
|
-
|
|
21
|
-
if (formFileName && formFilePath) {
|
|
22
|
-
const definition = await getForm(join(formFilePath, formFileName))
|
|
23
|
-
const { name } = parse(formFileName)
|
|
24
|
-
|
|
25
|
-
model = new FormModel(definition, { basePath: name }, services, controllers)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
plugin,
|
|
30
|
-
options: { model, services, controllers }
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function getForm(importPath: string) {
|
|
35
|
-
const { ext } = parse(importPath)
|
|
36
|
-
|
|
37
|
-
const attributes: ImportAttributes = {
|
|
38
|
-
type: ext === '.json' ? 'json' : 'module'
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const formImport = import(importPath, { with: attributes }) as Promise<{
|
|
42
|
-
default: FormDefinition
|
|
43
|
-
}>
|
|
44
|
-
|
|
45
|
-
const { default: definition } = await formImport
|
|
46
|
-
return definition
|
|
47
|
-
}
|