@defra/forms-engine-plugin 0.0.2 → 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/.server/server/plugins/nunjucks/environment.js +3 -3
- package/.server/server/plugins/nunjucks/environment.js.map +1 -1
- 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,220 +0,0 @@
|
|
|
1
|
-
import { type Section } from '@defra/forms-model'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
getAnswer,
|
|
5
|
-
type Field
|
|
6
|
-
} from '~/src/server/plugins/engine/components/helpers.js'
|
|
7
|
-
import { type BackLink } from '~/src/server/plugins/engine/components/types.js'
|
|
8
|
-
import {
|
|
9
|
-
evaluateTemplate,
|
|
10
|
-
getError,
|
|
11
|
-
getPageHref
|
|
12
|
-
} from '~/src/server/plugins/engine/helpers.js'
|
|
13
|
-
import {
|
|
14
|
-
type Detail,
|
|
15
|
-
type DetailItem,
|
|
16
|
-
type DetailItemField,
|
|
17
|
-
type DetailItemRepeat
|
|
18
|
-
} from '~/src/server/plugins/engine/models/types.js'
|
|
19
|
-
import { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
|
|
20
|
-
import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
|
|
21
|
-
import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
|
|
22
|
-
import {
|
|
23
|
-
type CheckAnswers,
|
|
24
|
-
type FormContext,
|
|
25
|
-
type FormContextRequest,
|
|
26
|
-
type FormState,
|
|
27
|
-
type FormSubmissionError,
|
|
28
|
-
type SummaryListAction,
|
|
29
|
-
type SummaryListRow
|
|
30
|
-
} from '~/src/server/plugins/engine/types.js'
|
|
31
|
-
|
|
32
|
-
export class SummaryViewModel {
|
|
33
|
-
/**
|
|
34
|
-
* Responsible for parsing state values to the govuk-frontend summary list template
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
page: PageControllerClass
|
|
38
|
-
pageTitle: string
|
|
39
|
-
declaration?: string
|
|
40
|
-
details: Detail[]
|
|
41
|
-
checkAnswers: CheckAnswers[]
|
|
42
|
-
context: FormContext
|
|
43
|
-
name: string | undefined
|
|
44
|
-
backLink?: BackLink
|
|
45
|
-
feedbackLink?: string
|
|
46
|
-
phaseTag?: string
|
|
47
|
-
errors?: FormSubmissionError[]
|
|
48
|
-
serviceUrl: string
|
|
49
|
-
hasMissingNotificationEmail?: boolean
|
|
50
|
-
|
|
51
|
-
constructor(
|
|
52
|
-
request: FormContextRequest,
|
|
53
|
-
page: PageControllerClass,
|
|
54
|
-
context: FormContext
|
|
55
|
-
) {
|
|
56
|
-
const { model } = page
|
|
57
|
-
const { basePath, def, sections } = model
|
|
58
|
-
const { isForceAccess } = context
|
|
59
|
-
|
|
60
|
-
this.page = page
|
|
61
|
-
this.pageTitle = page.title
|
|
62
|
-
this.serviceUrl = `/${basePath}`
|
|
63
|
-
this.name = def.name
|
|
64
|
-
this.declaration = def.declaration
|
|
65
|
-
this.context = context
|
|
66
|
-
|
|
67
|
-
const result = model
|
|
68
|
-
.makeFilteredSchema(this.context.relevantPages)
|
|
69
|
-
.validate(this.context.relevantState, { ...opts, stripUnknown: true })
|
|
70
|
-
|
|
71
|
-
// Format errors
|
|
72
|
-
this.errors = result.error?.details.map(getError)
|
|
73
|
-
this.details = this.summaryDetails(request, sections)
|
|
74
|
-
|
|
75
|
-
// Format check answers
|
|
76
|
-
this.checkAnswers = this.details.map((detail): CheckAnswers => {
|
|
77
|
-
const { title } = detail
|
|
78
|
-
|
|
79
|
-
const rows = detail.items.map((item): SummaryListRow => {
|
|
80
|
-
const items: SummaryListAction[] = []
|
|
81
|
-
|
|
82
|
-
// Remove summary list actions from previews
|
|
83
|
-
if (!isForceAccess) {
|
|
84
|
-
items.push({
|
|
85
|
-
href: item.href,
|
|
86
|
-
text: 'Change',
|
|
87
|
-
classes: 'govuk-link--no-visited-state',
|
|
88
|
-
visuallyHiddenText: item.label
|
|
89
|
-
})
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
-
key: {
|
|
94
|
-
text: evaluateTemplate(item.title, context)
|
|
95
|
-
},
|
|
96
|
-
value: {
|
|
97
|
-
classes: 'app-prose-scope',
|
|
98
|
-
html: item.value || 'Not supplied'
|
|
99
|
-
},
|
|
100
|
-
actions: {
|
|
101
|
-
items
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
title: title ? { text: title } : undefined,
|
|
108
|
-
summaryList: { rows }
|
|
109
|
-
}
|
|
110
|
-
})
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
private summaryDetails(request: FormContextRequest, sections: Section[]) {
|
|
114
|
-
const { context, errors } = this
|
|
115
|
-
const { relevantPages, state } = context
|
|
116
|
-
|
|
117
|
-
const details: Detail[] = []
|
|
118
|
-
|
|
119
|
-
;[undefined, ...sections].forEach((section) => {
|
|
120
|
-
const items: DetailItem[] = []
|
|
121
|
-
|
|
122
|
-
const sectionPages = relevantPages.filter(
|
|
123
|
-
(page) => page.section === section
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
sectionPages.forEach((page) => {
|
|
127
|
-
const { collection, path } = page
|
|
128
|
-
|
|
129
|
-
if (page instanceof RepeatPageController) {
|
|
130
|
-
items.push(
|
|
131
|
-
ItemRepeat(page, state, {
|
|
132
|
-
path: page.getSummaryPath(request),
|
|
133
|
-
errors
|
|
134
|
-
})
|
|
135
|
-
)
|
|
136
|
-
} else {
|
|
137
|
-
for (const field of collection.fields) {
|
|
138
|
-
items.push(ItemField(page, state, field, { path, errors }))
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
if (items.length) {
|
|
144
|
-
details.push({
|
|
145
|
-
name: section?.name,
|
|
146
|
-
title: section?.title,
|
|
147
|
-
items
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
return details
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Creates a repeater detail item
|
|
158
|
-
* @see {@link DetailItemField}
|
|
159
|
-
*/
|
|
160
|
-
function ItemRepeat(
|
|
161
|
-
page: RepeatPageController,
|
|
162
|
-
state: FormState,
|
|
163
|
-
options: {
|
|
164
|
-
path: string
|
|
165
|
-
errors?: FormSubmissionError[]
|
|
166
|
-
}
|
|
167
|
-
): DetailItemRepeat {
|
|
168
|
-
const { collection, repeat } = page
|
|
169
|
-
const { name, title } = repeat.options
|
|
170
|
-
|
|
171
|
-
const values = page.getListFromState(state)
|
|
172
|
-
const unit = values.length === 1 ? title : `${title}s`
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
name,
|
|
176
|
-
label: title,
|
|
177
|
-
title: values.length ? `${unit} added` : unit,
|
|
178
|
-
value: values.length ? `You added ${values.length} ${unit}` : '',
|
|
179
|
-
href: getPageHref(page, options.path, {
|
|
180
|
-
returnUrl: getPageHref(page, page.getSummaryPath())
|
|
181
|
-
}),
|
|
182
|
-
state,
|
|
183
|
-
page,
|
|
184
|
-
|
|
185
|
-
// Repeater field detail items
|
|
186
|
-
subItems: values.map((repeatState) =>
|
|
187
|
-
collection.fields.map((field) =>
|
|
188
|
-
ItemField(page, repeatState, field, options)
|
|
189
|
-
)
|
|
190
|
-
)
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Creates a form field detail item
|
|
196
|
-
* @see {@link DetailItemField}
|
|
197
|
-
*/
|
|
198
|
-
function ItemField(
|
|
199
|
-
page: PageControllerClass,
|
|
200
|
-
state: FormState,
|
|
201
|
-
field: Field,
|
|
202
|
-
options: {
|
|
203
|
-
path: string
|
|
204
|
-
errors?: FormSubmissionError[]
|
|
205
|
-
}
|
|
206
|
-
): DetailItemField {
|
|
207
|
-
return {
|
|
208
|
-
name: field.name,
|
|
209
|
-
label: field.title,
|
|
210
|
-
title: field.title,
|
|
211
|
-
error: field.getError(options.errors),
|
|
212
|
-
value: getAnswer(field, state),
|
|
213
|
-
href: getPageHref(page, options.path, {
|
|
214
|
-
returnUrl: getPageHref(page, page.getSummaryPath())
|
|
215
|
-
}),
|
|
216
|
-
state,
|
|
217
|
-
page,
|
|
218
|
-
field
|
|
219
|
-
}
|
|
220
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ConditionWrapper,
|
|
3
|
-
type FormComponentsDef,
|
|
4
|
-
type Section
|
|
5
|
-
} from '@defra/forms-model'
|
|
6
|
-
import { type Expression } from 'expr-eval'
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
type Field,
|
|
10
|
-
type getAnswer
|
|
11
|
-
} from '~/src/server/plugins/engine/components/helpers.js'
|
|
12
|
-
import { type RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
|
|
13
|
-
import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
|
|
14
|
-
import {
|
|
15
|
-
type FormState,
|
|
16
|
-
type FormSubmissionError
|
|
17
|
-
} from '~/src/server/plugins/engine/types.js'
|
|
18
|
-
|
|
19
|
-
export type ExecutableCondition = ConditionWrapper & {
|
|
20
|
-
expr: Expression
|
|
21
|
-
fn: (evaluationState: FormState) => boolean
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Used to render a row on a Summary List (check your answers)
|
|
26
|
-
*/
|
|
27
|
-
export interface DetailItemBase {
|
|
28
|
-
/**
|
|
29
|
-
* Name of the component defined in the JSON
|
|
30
|
-
* @see {@link FormComponentsDef.name}
|
|
31
|
-
*/
|
|
32
|
-
name: string
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Field label, used for change link visually hidden text
|
|
36
|
-
* @see {@link FormComponentsDef.title}
|
|
37
|
-
*/
|
|
38
|
-
label: string
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Field change link
|
|
42
|
-
*/
|
|
43
|
-
href: string
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Form submission state (or repeat state for sub items)
|
|
47
|
-
*/
|
|
48
|
-
state: FormState
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Field submission state error, used to flag unanswered questions
|
|
52
|
-
* Shown as 'Complete all unanswered questions before submitting the form'
|
|
53
|
-
*/
|
|
54
|
-
error?: FormSubmissionError
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface DetailItemField extends DetailItemBase {
|
|
58
|
-
/**
|
|
59
|
-
* Field page controller instance
|
|
60
|
-
*/
|
|
61
|
-
page: Exclude<PageControllerClass, RepeatPageController>
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Check answers summary list key
|
|
65
|
-
* For example, 'Date of birth'
|
|
66
|
-
*/
|
|
67
|
-
title: string
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Check answers summary list value, formatted by {@link getAnswer}
|
|
71
|
-
* For example, date fields formatted as '25 December 2022'
|
|
72
|
-
*/
|
|
73
|
-
value: string
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Field component instance
|
|
77
|
-
*/
|
|
78
|
-
field: Field
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export interface DetailItemRepeat extends DetailItemBase {
|
|
82
|
-
/**
|
|
83
|
-
* Repeat page controller instance
|
|
84
|
-
*/
|
|
85
|
-
page: RepeatPageController
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Check answers summary list key
|
|
89
|
-
* For example, 'Pizza' or 'Pizza added'
|
|
90
|
-
*/
|
|
91
|
-
title: string
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Check answers summary list value
|
|
95
|
-
* For example, 'You added 2 Pizzas'
|
|
96
|
-
*/
|
|
97
|
-
value: string
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Repeater field detail items
|
|
101
|
-
*/
|
|
102
|
-
subItems: DetailItemField[][]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export type DetailItem = DetailItemField | DetailItemRepeat
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Used to render a row on a Summary List (check your answers)
|
|
109
|
-
*/
|
|
110
|
-
export interface Detail {
|
|
111
|
-
name?: Section['name']
|
|
112
|
-
title?: Section['title']
|
|
113
|
-
items: DetailItem[]
|
|
114
|
-
}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { addDays, format as dateFormat } from 'date-fns'
|
|
2
|
-
import { outdent } from 'outdent'
|
|
3
|
-
|
|
4
|
-
import { FormModel } from '~/src/server/plugins/engine/models/index.js'
|
|
5
|
-
import { format } from '~/src/server/plugins/engine/outputFormatters/human/v1.js'
|
|
6
|
-
import {
|
|
7
|
-
SummaryPageController,
|
|
8
|
-
getFormSubmissionData
|
|
9
|
-
} from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'
|
|
10
|
-
import { type FormContextRequest } from '~/src/server/plugins/engine/types.js'
|
|
11
|
-
import { FormStatus } from '~/src/server/routes/types.js'
|
|
12
|
-
import definition from '~/test/form/definitions/repeat-mixed.js'
|
|
13
|
-
|
|
14
|
-
const itemId1 = 'abc-123'
|
|
15
|
-
const itemId2 = 'xyz-987'
|
|
16
|
-
|
|
17
|
-
const submitResponse = {
|
|
18
|
-
message: 'Submit completed',
|
|
19
|
-
result: {
|
|
20
|
-
files: {
|
|
21
|
-
main: '00000000-0000-0000-0000-000000000000',
|
|
22
|
-
repeaters: {
|
|
23
|
-
pizza: '11111111-1111-1111-1111-111111111111'
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const model = new FormModel(definition, {
|
|
30
|
-
basePath: 'test'
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
const state = {
|
|
34
|
-
orderType: 'delivery',
|
|
35
|
-
pizza: [
|
|
36
|
-
{
|
|
37
|
-
toppings: 'Ham',
|
|
38
|
-
quantity: 2,
|
|
39
|
-
itemId: itemId1
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
toppings: 'Pepperoni',
|
|
43
|
-
quantity: 1,
|
|
44
|
-
itemId: itemId2
|
|
45
|
-
}
|
|
46
|
-
]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const pageDef = definition.pages[2]
|
|
50
|
-
const pageUrl = new URL('http://example.com/repeat/pizza-order/summary')
|
|
51
|
-
|
|
52
|
-
const controller = new SummaryPageController(model, pageDef)
|
|
53
|
-
|
|
54
|
-
const request = {
|
|
55
|
-
method: 'get',
|
|
56
|
-
url: pageUrl,
|
|
57
|
-
path: pageUrl.pathname,
|
|
58
|
-
params: {
|
|
59
|
-
path: 'pizza-order',
|
|
60
|
-
slug: 'repeat'
|
|
61
|
-
},
|
|
62
|
-
query: {},
|
|
63
|
-
app: { model }
|
|
64
|
-
} satisfies FormContextRequest
|
|
65
|
-
|
|
66
|
-
const context = model.getFormContext(request, state)
|
|
67
|
-
const summaryViewModel = controller.getSummaryViewModel(request, context)
|
|
68
|
-
|
|
69
|
-
const items = getFormSubmissionData(
|
|
70
|
-
summaryViewModel.context,
|
|
71
|
-
summaryViewModel.details
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
describe('getPersonalisation', () => {
|
|
75
|
-
it.each([
|
|
76
|
-
{
|
|
77
|
-
state: FormStatus.Live,
|
|
78
|
-
isPreview: false
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
state: FormStatus.Draft,
|
|
82
|
-
isPreview: true
|
|
83
|
-
}
|
|
84
|
-
])('should personalise $state email', (formStatus) => {
|
|
85
|
-
const body = format(items, model, submitResponse, formStatus)
|
|
86
|
-
|
|
87
|
-
const dateNow = new Date()
|
|
88
|
-
const dateExpiry = addDays(dateNow, 90)
|
|
89
|
-
|
|
90
|
-
// Check for link expiry message
|
|
91
|
-
expect(body).toContain(
|
|
92
|
-
`^ For security reasons, the links in this email expire at ${dateFormat(dateExpiry, 'h:mmaaa')} on ${dateFormat(dateExpiry, 'eeee d MMMM yyyy')}`
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
// Check for form answers
|
|
96
|
-
expect(body).toContain(
|
|
97
|
-
outdent`
|
|
98
|
-
Form submitted at ${dateFormat(dateNow, 'h:mmaaa')} on ${dateFormat(dateNow, 'd MMMM yyyy')}.
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## How would you like to receive your pizza?
|
|
103
|
-
|
|
104
|
-
Delivery
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Pizza
|
|
109
|
-
|
|
110
|
-
[Download Pizza \\(CSV\\)](https://forms-designer/file-download/11111111-1111-1111-1111-111111111111)
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
[Download main form \\(CSV\\)](https://forms-designer/file-download/00000000-0000-0000-0000-000000000000)
|
|
115
|
-
`
|
|
116
|
-
)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should add test warnings to preview email only', () => {
|
|
120
|
-
const formStatus = {
|
|
121
|
-
state: FormStatus.Draft,
|
|
122
|
-
isPreview: true
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const body1 = format(items, model, submitResponse, {
|
|
126
|
-
state: FormStatus.Live,
|
|
127
|
-
isPreview: false
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
const body2 = format(items, model, submitResponse, {
|
|
131
|
-
state: FormStatus.Draft,
|
|
132
|
-
isPreview: true
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
expect(body1).not.toContain(
|
|
136
|
-
`This is a test of the ${definition.name} ${formStatus.state} form`
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
expect(body2).toContain(
|
|
140
|
-
`This is a test of the ${definition.name} ${formStatus.state} form`
|
|
141
|
-
)
|
|
142
|
-
})
|
|
143
|
-
})
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { type SubmitResponsePayload } from '@defra/forms-model'
|
|
2
|
-
import { addDays, format as dateFormat } from 'date-fns'
|
|
3
|
-
|
|
4
|
-
import { config } from '~/src/config/index.js'
|
|
5
|
-
import {
|
|
6
|
-
escapeMarkdown,
|
|
7
|
-
getAnswer
|
|
8
|
-
} from '~/src/server/plugins/engine/components/helpers.js'
|
|
9
|
-
import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
|
|
10
|
-
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
|
|
11
|
-
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
|
|
12
|
-
|
|
13
|
-
const designerUrl = config.get('designerUrl')
|
|
14
|
-
|
|
15
|
-
export function format(
|
|
16
|
-
items: DetailItem[],
|
|
17
|
-
model: FormModel,
|
|
18
|
-
submitResponse: SubmitResponsePayload,
|
|
19
|
-
formStatus: ReturnType<typeof checkFormStatus>
|
|
20
|
-
) {
|
|
21
|
-
const { files } = submitResponse.result
|
|
22
|
-
|
|
23
|
-
const formName = escapeMarkdown(model.name)
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @todo Refactor this below but the code to
|
|
27
|
-
* generate the question and answers works for now
|
|
28
|
-
*/
|
|
29
|
-
const now = new Date()
|
|
30
|
-
const formattedNow = `${dateFormat(now, 'h:mmaaa')} on ${dateFormat(now, 'd MMMM yyyy')}`
|
|
31
|
-
|
|
32
|
-
const fileExpiryDate = addDays(now, 90)
|
|
33
|
-
const formattedExpiryDate = `${dateFormat(fileExpiryDate, 'h:mmaaa')} on ${dateFormat(fileExpiryDate, 'eeee d MMMM yyyy')}`
|
|
34
|
-
|
|
35
|
-
const lines: string[] = []
|
|
36
|
-
|
|
37
|
-
lines.push(
|
|
38
|
-
`^ For security reasons, the links in this email expire at ${escapeMarkdown(formattedExpiryDate)}\n`
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
if (formStatus.isPreview) {
|
|
42
|
-
lines.push(`This is a test of the ${formName} ${formStatus.state} form.\n`)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
lines.push(`Form submitted at ${escapeMarkdown(formattedNow)}.\n`)
|
|
46
|
-
lines.push('---\n')
|
|
47
|
-
|
|
48
|
-
items.forEach((item) => {
|
|
49
|
-
const label = escapeMarkdown(item.label)
|
|
50
|
-
|
|
51
|
-
lines.push(`## ${label}\n`)
|
|
52
|
-
|
|
53
|
-
if ('subItems' in item) {
|
|
54
|
-
const filename = escapeMarkdown(`Download ${label} (CSV)`)
|
|
55
|
-
const fileId = files.repeaters[item.name]
|
|
56
|
-
|
|
57
|
-
lines.push(`[${filename}](${designerUrl}/file-download/${fileId})\n`)
|
|
58
|
-
} else {
|
|
59
|
-
lines.push(
|
|
60
|
-
getAnswer(item.field, item.state, {
|
|
61
|
-
format: 'email'
|
|
62
|
-
})
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
lines.push('---\n')
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
const filename = escapeMarkdown('Download main form (CSV)')
|
|
70
|
-
lines.push(`[${filename}](${designerUrl}/file-download/${files.main})\n`)
|
|
71
|
-
|
|
72
|
-
return lines.join('\n')
|
|
73
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { format as formatHumanV1 } from '~/src/server/plugins/engine/outputFormatters/human/v1.js'
|
|
2
|
-
import { getFormatter } from '~/src/server/plugins/engine/outputFormatters/index.js'
|
|
3
|
-
|
|
4
|
-
describe('Page controller helpers', () => {
|
|
5
|
-
it('should return a valid formatter if it exists', () => {
|
|
6
|
-
const formatter = getFormatter('human', '1')
|
|
7
|
-
expect(formatter).toBe(formatHumanV1)
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
it("should return an error if the audience doesn't exist", () => {
|
|
11
|
-
expect(() => getFormatter('foobar', '1')).toThrow('Unknown audience')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it("should return an error if the version doesn't exist", () => {
|
|
15
|
-
expect(() => getFormatter('human', '9999')).toThrow('Unknown version')
|
|
16
|
-
})
|
|
17
|
-
})
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { type SubmitResponsePayload } from '@defra/forms-model'
|
|
2
|
-
|
|
3
|
-
import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
|
|
4
|
-
import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
|
|
5
|
-
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
|
|
6
|
-
import { format as formatHumanV1 } from '~/src/server/plugins/engine/outputFormatters/human/v1.js'
|
|
7
|
-
import { format as formatMachineV1 } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'
|
|
8
|
-
import { format as formatMachineV2 } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
|
|
9
|
-
|
|
10
|
-
type Formatter = (
|
|
11
|
-
items: DetailItem[],
|
|
12
|
-
model: FormModel,
|
|
13
|
-
submitResponse: SubmitResponsePayload,
|
|
14
|
-
formStatus: ReturnType<typeof checkFormStatus>
|
|
15
|
-
) => string
|
|
16
|
-
|
|
17
|
-
const formatters: Record<
|
|
18
|
-
string,
|
|
19
|
-
Record<string, Formatter | undefined> | undefined
|
|
20
|
-
> = {
|
|
21
|
-
human: {
|
|
22
|
-
'1': formatHumanV1
|
|
23
|
-
},
|
|
24
|
-
machine: {
|
|
25
|
-
'1': formatMachineV1,
|
|
26
|
-
'2': formatMachineV2
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function getFormatter(audience: string, version: string) {
|
|
31
|
-
const versions = formatters[audience]
|
|
32
|
-
|
|
33
|
-
if (!versions) {
|
|
34
|
-
throw new Error('Unknown audience')
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const formatter = versions[version]
|
|
38
|
-
|
|
39
|
-
if (!formatter) {
|
|
40
|
-
throw new Error('Unknown version')
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return formatter
|
|
44
|
-
}
|