@defra/forms-engine-plugin 5.0.0-alpha.3 → 5.0.0-alpha.31
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/37c964ca545c240f010a.mjs +2 -0
- package/.public/37c964ca545c240f010a.mjs.LICENSE.txt +4 -0
- package/.public/assets-manifest.json +3 -0
- package/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.LICENSE.txt +7 -0
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.LICENSE.txt +9 -0
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/javascripts/vendor/@defra.min.js +1 -1
- package/.public/javascripts/vendor/@defra.min.js.map +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js +1 -1
- package/.public/javascripts/vendor/maplibre-gl.min.js.LICENSE.txt +3 -3
- package/.public/javascripts/vendor/maplibre-gl.min.js.map +1 -1
- package/.public/stylesheets/application.min.css +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/file-upload.js +6 -3
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.d.ts +159 -5
- package/.server/client/javascripts/geospatial-map.js +161 -81
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/geospatial-map.test.js +152 -0
- package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
- package/.server/client/javascripts/govuk.js +2 -1
- package/.server/client/javascripts/govuk.js.map +1 -1
- package/.server/client/javascripts/location-map.d.ts +44 -0
- package/.server/client/javascripts/location-map.js +55 -6
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map-constants.d.ts +3 -0
- package/.server/client/javascripts/map-constants.js +4 -0
- package/.server/client/javascripts/map-constants.js.map +1 -0
- package/.server/client/javascripts/map.d.ts +17 -4
- package/.server/client/javascripts/map.js +59 -6
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/maps.d.ts +5 -0
- package/.server/client/javascripts/maps.js +6 -0
- package/.server/client/javascripts/maps.js.map +1 -0
- package/.server/client/javascripts/shared.d.ts +1 -4
- package/.server/client/javascripts/shared.js +1 -4
- package/.server/client/javascripts/shared.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +18 -20
- package/.server/client/javascripts/sssi-dataset.js +37 -39
- package/.server/client/javascripts/sssi-dataset.js.map +1 -1
- package/.server/client/stylesheets/maps.scss +4 -0
- package/.server/client/stylesheets/shared.scss +1 -5
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/forms/components.json +8 -0
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- package/.server/server/plugins/engine/__stubs__/definitions.d.ts +29 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js +125 -0
- package/.server/server/plugins/engine/__stubs__/definitions.js.map +1 -0
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +8 -3
- package/.server/server/plugins/engine/components/AutocompleteField.js +17 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +23 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +30 -5
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -1
- package/.server/server/plugins/engine/components/ComponentBase.js +2 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +12 -7
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DatePartsField.js +12 -7
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +6 -3
- package/.server/server/plugins/engine/components/DeclarationField.js +6 -4
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/Details.d.ts +1 -0
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +33 -2
- package/.server/server/plugins/engine/components/EastingNorthingField.js +110 -54
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +23 -2
- package/.server/server/plugins/engine/components/FileUploadField.js +35 -3
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +5 -1
- package/.server/server/plugins/engine/components/FormComponent.js +5 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +23 -0
- package/.server/server/plugins/engine/components/GeospatialField.js +33 -9
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/Html.d.ts +1 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -0
- package/.server/server/plugins/engine/components/LatLongField.d.ts +32 -2
- package/.server/server/plugins/engine/components/LatLongField.js +85 -48
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/List.d.ts +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +3 -2
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +8 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js +31 -7
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +12 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +21 -13
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -0
- package/.server/server/plugins/engine/components/Markdown.js +1 -1
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +5 -2
- package/.server/server/plugins/engine/components/MonthYearField.js +13 -9
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +1 -0
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +4 -3
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NotificationBanner.d.ts +1 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +5 -0
- package/.server/server/plugins/engine/components/NumberField.js +22 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +103 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +13 -3
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +2 -0
- package/.server/server/plugins/engine/components/PaymentField.js +9 -5
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +1 -0
- package/.server/server/plugins/engine/components/TrackingField.d.ts +21 -0
- package/.server/server/plugins/engine/components/TrackingField.js +46 -0
- package/.server/server/plugins/engine/components/TrackingField.js.map +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +23 -8
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
- package/.server/server/plugins/engine/components/YesNoField.js +22 -8
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +1 -1
- package/.server/server/plugins/engine/components/helpers/components.js +6 -3
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +8 -1
- package/.server/server/plugins/engine/components/helpers/geospatial.js +58 -17
- package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/index.d.ts +21 -1
- package/.server/server/plugins/engine/components/helpers/index.js +45 -1
- package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
- package/.server/server/plugins/engine/components/index.d.ts +1 -0
- package/.server/server/plugins/engine/components/index.js +1 -0
- package/.server/server/plugins/engine/components/index.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +1 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/errors.d.ts +49 -0
- package/.server/server/plugins/engine/errors.js +75 -0
- package/.server/server/plugins/engine/errors.js.map +1 -0
- package/.server/server/plugins/engine/form-availability.d.ts +3 -2
- package/.server/server/plugins/engine/form-availability.js +3 -2
- package/.server/server/plugins/engine/form-availability.js.map +1 -1
- package/.server/server/plugins/engine/form-context.js +2 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +23 -2
- package/.server/server/plugins/engine/helpers.js +44 -5
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +4 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +31 -7
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -1
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
- package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
- package/.server/server/plugins/engine/i18n/form.js +35 -0
- package/.server/server/plugins/engine/i18n/form.js.map +1 -0
- package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
- package/.server/server/plugins/engine/i18n/languages.js +19 -0
- package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +176 -7
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/.server/server/plugins/engine/i18n/types.d.ts +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -1
- package/.server/server/plugins/engine/index.d.ts +4 -0
- package/.server/server/plugins/engine/index.js +4 -0
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
- package/.server/server/plugins/engine/models/FormModel.js +35 -23
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js +9 -4
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/models/types.d.ts +28 -1
- package/.server/server/plugins/engine/models/types.js.map +1 -1
- package/.server/server/plugins/engine/models/unavailable-view-model.d.ts +11 -2
- package/.server/server/plugins/engine/models/unavailable-view-model.js +23 -4
- package/.server/server/plugins/engine/models/unavailable-view-model.js.map +1 -1
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +14 -6
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +7 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +56 -10
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +3 -4
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +10 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js +2 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +35 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +100 -3
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +24 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +3 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/referenceNumbers.d.ts +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js +1 -0
- package/.server/server/plugins/engine/referenceNumbers.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +9 -4
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/types/enums.d.ts +3 -3
- package/.server/server/plugins/engine/types/enums.js +5 -4
- package/.server/server/plugins/engine/types/enums.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +15 -4
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +24 -2
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/unavailable-response.js +5 -2
- package/.server/server/plugins/engine/unavailable-response.js.map +1 -1
- package/.server/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/.server/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/.server/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/.server/server/plugins/engine/views/components/trackingfield.html +3 -0
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/.server/server/plugins/engine/views/file-upload.html +1 -1
- package/.server/server/plugins/engine/views/summary.html +1 -0
- package/.server/server/plugins/engine/views/unavailable.html +14 -11
- package/.server/server/plugins/map/routes/index.d.ts +4 -0
- package/.server/server/plugins/map/routes/index.js +12 -4
- package/.server/server/plugins/map/routes/index.js.map +1 -1
- package/.server/server/plugins/map/routes/index.test.js +7 -0
- package/.server/server/plugins/map/routes/index.test.js.map +1 -0
- package/.server/server/plugins/map/routes/vts/README.md +38 -0
- package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/.server/server/plugins/map/types.d.ts +24 -2
- package/.server/server/plugins/map/types.js +9 -2
- package/.server/server/plugins/map/types.js.map +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
- package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
- package/.server/server/plugins/payment/helper.d.ts +11 -1
- package/.server/server/plugins/payment/helper.js +18 -2
- package/.server/server/plugins/payment/helper.js.map +1 -1
- package/.server/server/plugins/payment/helper.test.js +2 -1
- package/.server/server/plugins/payment/helper.test.js.map +1 -1
- package/.server/server/plugins/payment/service.d.ts +2 -1
- package/.server/server/plugins/payment/service.js +5 -2
- package/.server/server/plugins/payment/service.js.map +1 -1
- package/.server/server/plugins/payment/service.test.js +7 -3
- package/.server/server/plugins/payment/service.test.js.map +1 -1
- package/.server/server/plugins/payment/types.d.ts +4 -0
- package/.server/server/plugins/payment/types.js +1 -0
- package/.server/server/plugins/payment/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +249 -3
- package/.server/server/plugins/postcode-lookup/models/index.js +103 -36
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +64 -18
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
- package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
- package/.server/server/plugins/postcode-lookup/types.js +6 -1
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/.server/server/utils/type-utils.d.ts +1 -2
- package/.server/server/utils/type-utils.js +0 -3
- package/.server/server/utils/type-utils.js.map +1 -1
- package/.server/server/utils/utils.d.ts +6 -0
- package/.server/server/utils/utils.js +18 -1
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/server/utils/utils.test.js +21 -1
- package/.server/server/utils/utils.test.js.map +1 -1
- package/.server/typings/geodesy/index.d.js +2 -0
- package/.server/typings/geodesy/index.d.js.map +1 -0
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +24 -9
- package/src/client/javascripts/file-upload.js +11 -3
- package/src/client/javascripts/geospatial-map.js +181 -86
- package/src/client/javascripts/govuk.js +2 -0
- package/src/client/javascripts/location-map.js +62 -6
- package/src/client/javascripts/map-constants.js +3 -0
- package/src/client/javascripts/map.js +66 -9
- package/src/client/javascripts/maps.js +5 -0
- package/src/client/javascripts/shared.js +1 -4
- package/src/client/javascripts/sssi-dataset.js +39 -41
- package/src/client/stylesheets/maps.scss +4 -0
- package/src/client/stylesheets/shared.scss +1 -5
- package/src/server/constants.js +2 -0
- package/src/server/forms/components.json +8 -0
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +4 -0
- package/src/server/plugins/engine/__stubs__/definitions.ts +155 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +20 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +41 -8
- package/src/server/plugins/engine/components/ComponentBase.ts +6 -4
- package/src/server/plugins/engine/components/ComponentCollection.ts +17 -15
- package/src/server/plugins/engine/components/DatePartsField.ts +20 -9
- package/src/server/plugins/engine/components/DeclarationField.ts +10 -10
- package/src/server/plugins/engine/components/EastingNorthingField.ts +185 -89
- package/src/server/plugins/engine/components/EmailAddressField.ts +2 -1
- package/src/server/plugins/engine/components/FileUploadField.ts +46 -5
- package/src/server/plugins/engine/components/FormComponent.ts +6 -5
- package/src/server/plugins/engine/components/GeospatialField.ts +47 -9
- package/src/server/plugins/engine/components/LatLongField.ts +128 -58
- package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
- package/src/server/plugins/engine/components/LocationFieldBase.ts +41 -8
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +28 -14
- package/src/server/plugins/engine/components/Markdown.ts +2 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +20 -15
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +9 -3
- package/src/server/plugins/engine/components/NumberField.ts +24 -0
- package/src/server/plugins/engine/components/OsGridRefField.ts +22 -3
- package/src/server/plugins/engine/components/PaymentField.ts +9 -4
- package/src/server/plugins/engine/components/TrackingField.ts +64 -0
- package/src/server/plugins/engine/components/UkAddressField.ts +30 -7
- package/src/server/plugins/engine/components/YesNoField.ts +27 -9
- package/src/server/plugins/engine/components/helpers/components.ts +8 -3
- package/src/server/plugins/engine/components/helpers/geospatial.ts +87 -24
- package/src/server/plugins/engine/components/helpers/index.ts +64 -1
- package/src/server/plugins/engine/components/index.ts +1 -0
- package/src/server/plugins/engine/components/types.ts +1 -0
- package/src/server/plugins/engine/errors.ts +78 -0
- package/src/server/plugins/engine/form-availability.ts +8 -2
- package/src/server/plugins/engine/form-context.ts +4 -2
- package/src/server/plugins/engine/helpers.ts +52 -5
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +16 -8
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
- package/src/server/plugins/engine/i18n/form.ts +54 -0
- package/src/server/plugins/engine/i18n/languages.ts +19 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +176 -7
- package/src/server/plugins/engine/i18n/translations/en-GB.json +110 -6
- package/src/server/plugins/engine/i18n/types.ts +2 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.ts +46 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +6 -5
- package/src/server/plugins/engine/models/types.ts +31 -0
- package/src/server/plugins/engine/models/unavailable-view-model.ts +26 -5
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +18 -7
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +60 -9
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +15 -4
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -1
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +143 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +29 -4
- package/src/server/plugins/engine/plugin.ts +6 -0
- package/src/server/plugins/engine/referenceNumbers.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -3
- package/src/server/plugins/engine/types/enums.ts +4 -3
- package/src/server/plugins/engine/types/schema.ts +22 -5
- package/src/server/plugins/engine/types.ts +28 -1
- package/src/server/plugins/engine/unavailable-response.ts +6 -2
- package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/src/server/plugins/engine/views/components/fileuploadfield.html +1 -1
- package/src/server/plugins/engine/views/components/geospatialfield.html +1 -0
- package/src/server/plugins/engine/views/components/osgridreffield.html +4 -1
- package/src/server/plugins/engine/views/components/trackingfield.html +3 -0
- package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
- package/src/server/plugins/engine/views/file-upload.html +1 -1
- package/src/server/plugins/engine/views/summary.html +1 -0
- package/src/server/plugins/engine/views/unavailable.html +14 -11
- package/src/server/plugins/map/routes/index.js +29 -4
- package/src/server/plugins/map/routes/vts/README.md +38 -0
- package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
- package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
- package/src/server/plugins/map/types.js +9 -2
- package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
- package/src/server/plugins/nunjucks/filters/index.js +1 -0
- package/src/server/plugins/payment/helper.js +22 -2
- package/src/server/plugins/payment/service.js +6 -2
- package/src/server/plugins/payment/types.js +1 -0
- package/src/server/plugins/postcode-lookup/models/index.js +91 -46
- package/src/server/plugins/postcode-lookup/routes/index.js +96 -24
- package/src/server/plugins/postcode-lookup/types.js +6 -1
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/utils/type-utils.ts +1 -11
- package/src/server/utils/utils.js +19 -1
- package/src/typings/geodesy/index.d.ts +18 -0
- package/src/typings/hapi/index.d.ts +2 -0
|
@@ -14,7 +14,26 @@
|
|
|
14
14
|
"numberInteger": "{{#label}} must be a whole number",
|
|
15
15
|
"numberMin": "{{#label}} must be {{#limit}} or higher",
|
|
16
16
|
"numberMax": "{{#label}} must be {{#limit}} or lower",
|
|
17
|
-
"maxWords": "{{#label}} must be {{#limit}} words or fewer"
|
|
17
|
+
"maxWords": "{{#label}} must be {{#limit}} words or fewer",
|
|
18
|
+
"unicode": "{{#label}} includes invalid characters, for example, long dashes",
|
|
19
|
+
"arrayMin_one": "Select at least {{#limit}} option from the list",
|
|
20
|
+
"arrayMin_other": "Select at least {{#limit}} options from the list",
|
|
21
|
+
"arrayMax_one": "Only {{#limit}} option can be selected from the list",
|
|
22
|
+
"arrayMax_other": "Only {{#limit}} options can be selected from the list",
|
|
23
|
+
"arrayLength_one": "Select only {{#limit}} option from the list",
|
|
24
|
+
"arrayLength_other": "Select only {{#limit}} options from the list",
|
|
25
|
+
"featuresMin_one": "Define at least {{#limit}} feature",
|
|
26
|
+
"featuresMin_other": "Define at least {{#limit}} features",
|
|
27
|
+
"featuresMax_one": "Only {{#limit}} feature can be defined",
|
|
28
|
+
"featuresMax_other": "Only {{#limit}} features can be defined",
|
|
29
|
+
"featuresLength_one": "Define exactly {{#limit}} feature",
|
|
30
|
+
"featuresLength_other": "Define exactly {{#limit}} features",
|
|
31
|
+
"filesMin_one": "You must upload {{#limit}} file or more",
|
|
32
|
+
"filesMin_other": "You must upload {{#limit}} files or more",
|
|
33
|
+
"filesMax_one": "You can only upload {{#limit}} file or less",
|
|
34
|
+
"filesMax_other": "You can only upload {{#limit}} files or less",
|
|
35
|
+
"filesLength_one": "You must upload exactly {{#limit}} file",
|
|
36
|
+
"filesLength_other": "You must upload exactly {{#limit}} files"
|
|
18
37
|
},
|
|
19
38
|
|
|
20
39
|
"errors": {
|
|
@@ -29,7 +48,14 @@
|
|
|
29
48
|
"continue": "Continue",
|
|
30
49
|
"saveAndExit": "Save and exit",
|
|
31
50
|
"draft": "draft",
|
|
32
|
-
"live": "live"
|
|
51
|
+
"live": "live",
|
|
52
|
+
"or": "or",
|
|
53
|
+
"and": "and",
|
|
54
|
+
"england": "England",
|
|
55
|
+
"wales": "Wales",
|
|
56
|
+
"northern-ireland": "Northern Ireland",
|
|
57
|
+
"scotland": "Scotland",
|
|
58
|
+
"sendFeedback": "Send feedback"
|
|
33
59
|
},
|
|
34
60
|
|
|
35
61
|
"pages": {
|
|
@@ -60,6 +86,8 @@
|
|
|
60
86
|
"totalAmount": "Total amount",
|
|
61
87
|
"reference": "Reference",
|
|
62
88
|
"dateOfPayment": "Date of payment",
|
|
89
|
+
"fileUpload_one": "Uploaded [[count]] file",
|
|
90
|
+
"fileUpload_other": "Uploaded [[count]] files",
|
|
63
91
|
"submissionFailed": "There was a problem and your form was not submitted. Try submitting the form again",
|
|
64
92
|
"submissionFailedContactSuffix": " or you can [[contactUsLink]] and quote your reference number to arrange a refund",
|
|
65
93
|
"contactUsLinkText": "contact us (opens in new tab)",
|
|
@@ -89,7 +117,18 @@
|
|
|
89
117
|
|
|
90
118
|
"fileUpload": {
|
|
91
119
|
"upload": "Upload file",
|
|
92
|
-
"maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more."
|
|
120
|
+
"maxFilesReached": "You have reached the maximum number of files. Please remove a file to upload more.",
|
|
121
|
+
"remove": "Remove",
|
|
122
|
+
"removeFileTitle": "Are you sure you want to remove this file?",
|
|
123
|
+
"removeFileBody": "You cannot recover removed files.",
|
|
124
|
+
"removeFileButton": "Remove file",
|
|
125
|
+
"cancel": "Cancel",
|
|
126
|
+
"FILE_VIRUS": "The selected file contains a virus",
|
|
127
|
+
"FILE_EMPTY": "The selected file is empty",
|
|
128
|
+
"FILE_TOO_LARGE": "The selected file must be smaller than [[maxFileSizeFormatted]]",
|
|
129
|
+
"FILE_INVALID_TYPE": "The selected file must be a [[fileExtensions]]",
|
|
130
|
+
"FILE_UPLOAD_FAILED": "The selected file could not be uploaded - try again",
|
|
131
|
+
"FILE_ERROR_UNKNOWN": "Unknown error"
|
|
93
132
|
},
|
|
94
133
|
|
|
95
134
|
"exit": {
|
|
@@ -115,6 +154,16 @@
|
|
|
115
154
|
"bannerForce": "This is a preview of a [[previewMode]] form. Do not enter personal information.",
|
|
116
155
|
"bannerText": "This is a preview of a [[previewMode]] form page you are editing.",
|
|
117
156
|
"previousPages": "It depends on answers from earlier pages in the form. In the live version, users will need to complete those questions first."
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
"formUnavailable": {
|
|
160
|
+
"title": "Sorry, this form is unavailable",
|
|
161
|
+
"subHeading": "'[[formTitle]]' is no longer available.",
|
|
162
|
+
"contactDetailsHeading": "Contact details for [[organisationName]]",
|
|
163
|
+
"telephone": "Telephone",
|
|
164
|
+
"callCharges": "Find out about call charges",
|
|
165
|
+
"email": "Email",
|
|
166
|
+
"onlineContactForm": "Online contact form"
|
|
118
167
|
}
|
|
119
168
|
},
|
|
120
169
|
|
|
@@ -200,7 +249,8 @@
|
|
|
200
249
|
"eastingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 6 digits",
|
|
201
250
|
"northingDigits": "{{#label}} for [[fieldLabel]] must be between 1 and 7 digits",
|
|
202
251
|
"eastingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
|
|
203
|
-
"northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]"
|
|
252
|
+
"northingRange": "{{#label}} for [[fieldLabel]] must be between [[min]] and [[max]]",
|
|
253
|
+
"wrongCountry": "Location must be within [[country]]"
|
|
204
254
|
},
|
|
205
255
|
|
|
206
256
|
"nationalGridField": {
|
|
@@ -216,7 +266,16 @@
|
|
|
216
266
|
},
|
|
217
267
|
|
|
218
268
|
"locationFieldBase": {
|
|
219
|
-
"howToFind": "How to find location details"
|
|
269
|
+
"howToFind": "How to find location details",
|
|
270
|
+
"map": {
|
|
271
|
+
"helpPanel": {
|
|
272
|
+
"label": "How to use this map",
|
|
273
|
+
"point1": "Search for a place or postcode",
|
|
274
|
+
"point2": "Use the + and - icons to zoom in and out",
|
|
275
|
+
"point3": "Use a mouse or keyboard to centre the point at the location",
|
|
276
|
+
"point4": "Click to add the location to the map"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
220
279
|
},
|
|
221
280
|
|
|
222
281
|
"yesNoField": {
|
|
@@ -239,6 +298,47 @@
|
|
|
239
298
|
"geospatialField": {
|
|
240
299
|
"added_one": "Added [[count]] location",
|
|
241
300
|
"added_other": "Added [[count]] locations",
|
|
301
|
+
"map": {
|
|
302
|
+
"helpPanel": {
|
|
303
|
+
"label": "How to use this map",
|
|
304
|
+
"ledeIntro": "You can add",
|
|
305
|
+
"ledeOutro": "to the map.",
|
|
306
|
+
"lineText": "a line",
|
|
307
|
+
"shapeText": "a shape",
|
|
308
|
+
"lineOrShapeText": "a line or shape",
|
|
309
|
+
"typesPhrasePoint": "points",
|
|
310
|
+
"typesPhraseLine": "lines",
|
|
311
|
+
"typesPhraseShape": "shapes",
|
|
312
|
+
"typesPhraseOr": "or",
|
|
313
|
+
"point1": "Search for a county, place or postcode",
|
|
314
|
+
"point2": "Use the + and - icons to zoom in and out",
|
|
315
|
+
"point3": "Double‑click, or select 'Done', when you have finished drawing",
|
|
316
|
+
"point4": "Give the location a name"
|
|
317
|
+
},
|
|
318
|
+
"typeDescriptions": {
|
|
319
|
+
"point": "Point",
|
|
320
|
+
"line": "Line",
|
|
321
|
+
"polygon": "Shape"
|
|
322
|
+
},
|
|
323
|
+
"buttons": {
|
|
324
|
+
"point": "Add point",
|
|
325
|
+
"line": "Add line",
|
|
326
|
+
"polygon": "Add shape"
|
|
327
|
+
},
|
|
328
|
+
"itemLabel1": "Location",
|
|
329
|
+
"itemLabel2": "description",
|
|
330
|
+
"itemUpdateLink": "Update",
|
|
331
|
+
"itemDeleteLink": "Delete",
|
|
332
|
+
"itemFocusLink": "Show",
|
|
333
|
+
"itemVisuallyHidden": "location",
|
|
334
|
+
"details": {
|
|
335
|
+
"summary": "Coordinates",
|
|
336
|
+
"type": "Type",
|
|
337
|
+
"centroidGridReference": "Centre grid reference",
|
|
338
|
+
"firstPointGridReference": "First point grid reference",
|
|
339
|
+
"detailedCoordinates": "Detailed coordinates"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
242
342
|
"validation": {
|
|
243
343
|
"descriptionRequired": "Enter description for location [[count]]",
|
|
244
344
|
"wrongCountry": "Location [[count]] must be within [[country]]"
|
|
@@ -262,11 +362,15 @@
|
|
|
262
362
|
},
|
|
263
363
|
|
|
264
364
|
"fileUploadField": {
|
|
365
|
+
"uploading": "Uploading…",
|
|
265
366
|
"uploaded": "Uploaded",
|
|
266
367
|
"uploadFailed": "There was a problem with your uploaded files. Re-upload them before submitting the form again.",
|
|
267
368
|
"uploadedFilesHeading": "Uploaded files",
|
|
268
369
|
"filesCount_one": "[[count]] file uploaded",
|
|
269
|
-
"filesCount_other": "[[count]] files uploaded"
|
|
370
|
+
"filesCount_other": "[[count]] files uploaded",
|
|
371
|
+
"chooseFile": "Choose file",
|
|
372
|
+
"dropFile": "or drop file",
|
|
373
|
+
"noFileChosen": "No file chosen"
|
|
270
374
|
},
|
|
271
375
|
|
|
272
376
|
"characterCount": {
|
|
@@ -13,7 +13,9 @@ export type FormDefinitionTranslations = Record<string, {
|
|
|
13
13
|
hint: string;
|
|
14
14
|
content: string;
|
|
15
15
|
shortDescription: string;
|
|
16
|
+
errorDescription: string;
|
|
16
17
|
paymentDescription: string;
|
|
18
|
+
instructionText: string;
|
|
17
19
|
}>>;
|
|
18
20
|
sections: Record<string, Partial<Pick<Section, 'title'>>>;
|
|
19
21
|
listItems: Record<string, Partial<Pick<Item, 'text' | 'hint'>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../../src/server/plugins/engine/i18n/types.ts"],"sourcesContent":["import {\n type ComponentDef,\n type Item,\n type Page,\n type Section\n} from '@defra/forms-model'\n\n/**\n * Structure of the `translations` block in a form definition.\n * Also used to derive the valid property keys for the typed tX functions.\n */\nexport type FormDefinitionTranslations = Record<\n string,\n {\n pages: Record<string, Partial<{ title: string; repeatTitle: string }>>\n // ComponentDef is a discriminated union; Pick across the full union is not feasible.\n // The four keys below are the complete set of translatable component properties.\n components: Record<\n string,\n Partial<{\n title: string\n hint: string\n content: string\n shortDescription: string\n paymentDescription: string\n }>\n >\n sections: Record<string, Partial<Pick<Section, 'title'>>>\n listItems: Record<string, Partial<Pick<Item, 'text' | 'hint'>>>\n form: Record<string, string>\n }\n>\n\ntype EntityTranslations = FormDefinitionTranslations[string]\n\n/**\n * Scoped translator returned by model.createTranslator(language).\n * t — plugin namespace (UI strings, buttons, errors, sub-field labels)\n * tForm — form namespace: form attributes, currently only form name\n * tPage — form namespace: page titles\n * tComponent — form namespace: component titles, hints, shortDescriptions\n * tSection — form namespace: section titles\n * tListItem — form namespace: list item text\n * language - current language\n */\nexport interface Translator {\n t: (key: string, opts?: Record<string, unknown>) => string\n tForm: (prop: string) => string\n tPage: (page: Page, prop: keyof EntityTranslations['pages'][string]) => string\n tComponent: (\n component: ComponentDef,\n prop: keyof EntityTranslations['components'][string]\n ) => string\n tSection: (\n section: Section,\n prop: keyof EntityTranslations['sections'][string]\n ) => string\n tListItem: (\n item: Item,\n prop: keyof EntityTranslations['listItems'][string]\n ) => string\n language: string\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../../src/server/plugins/engine/i18n/types.ts"],"sourcesContent":["import {\n type ComponentDef,\n type Item,\n type Page,\n type Section\n} from '@defra/forms-model'\n\n/**\n * Structure of the `translations` block in a form definition.\n * Also used to derive the valid property keys for the typed tX functions.\n */\nexport type FormDefinitionTranslations = Record<\n string,\n {\n pages: Record<string, Partial<{ title: string; repeatTitle: string }>>\n // ComponentDef is a discriminated union; Pick across the full union is not feasible.\n // The four keys below are the complete set of translatable component properties.\n components: Record<\n string,\n Partial<{\n title: string\n hint: string\n content: string\n shortDescription: string\n errorDescription: string\n paymentDescription: string\n instructionText: string\n }>\n >\n sections: Record<string, Partial<Pick<Section, 'title'>>>\n listItems: Record<string, Partial<Pick<Item, 'text' | 'hint'>>>\n form: Record<string, string>\n }\n>\n\ntype EntityTranslations = FormDefinitionTranslations[string]\n\n/**\n * Scoped translator returned by model.createTranslator(language).\n * t — plugin namespace (UI strings, buttons, errors, sub-field labels)\n * tForm — form namespace: form attributes, currently only form name\n * tPage — form namespace: page titles\n * tComponent — form namespace: component titles, hints, shortDescriptions\n * tSection — form namespace: section titles\n * tListItem — form namespace: list item text\n * language - current language\n */\nexport interface Translator {\n t: (key: string, opts?: Record<string, unknown>) => string\n tForm: (prop: string) => string\n tPage: (page: Page, prop: keyof EntityTranslations['pages'][string]) => string\n tComponent: (\n component: ComponentDef,\n prop: keyof EntityTranslations['components'][string]\n ) => string\n tSection: (\n section: Section,\n prop: keyof EntityTranslations['sections'][string]\n ) => string\n tListItem: (\n item: Item,\n prop: keyof EntityTranslations['listItems'][string]\n ) => string\n language: string\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -5,6 +5,10 @@ export { getPageHref } from '../../../server/plugins/engine/helpers.js';
|
|
|
5
5
|
export { context } from '../../../server/plugins/nunjucks/context.js';
|
|
6
6
|
export { getFirstJourneyPage, getFormContext, getFormModel, resolveFormModel } from '../../../server/plugins/engine/form-context.js';
|
|
7
7
|
export * from '../../../server/plugins/engine/form-availability.js';
|
|
8
|
+
export { getAvailableLanguages } from '../../../server/plugins/engine/i18n/languages.js';
|
|
9
|
+
export { extractMetadataBaseTranslations, loadFormTranslations } from '../../../server/plugins/engine/i18n/createFormTranslator.js';
|
|
10
|
+
export { extractBaseTranslations } from '../../../server/plugins/engine/i18n/extractBaseTranslations.js';
|
|
11
|
+
export { applyUrlParam } from '../../../server/plugins/nunjucks/filters/applyUrlParam.js';
|
|
8
12
|
export declare const VIEW_PATH = "src/server/plugins/engine/views";
|
|
9
13
|
export declare const PLUGIN_PATH = "node_modules/@defra/forms-engine-plugin";
|
|
10
14
|
export declare const STATE_NOT_YET_VALIDATED = "__stateNotYetValidated";
|
|
@@ -7,6 +7,10 @@ export { getPageHref } from "./helpers.js";
|
|
|
7
7
|
export { context } from "../nunjucks/context.js";
|
|
8
8
|
export { getFirstJourneyPage, getFormContext, getFormModel, resolveFormModel } from "./form-context.js";
|
|
9
9
|
export * from "./form-availability.js";
|
|
10
|
+
export { getAvailableLanguages } from "./i18n/languages.js";
|
|
11
|
+
export { extractMetadataBaseTranslations, loadFormTranslations } from "./i18n/createFormTranslator.js";
|
|
12
|
+
export { extractBaseTranslations } from "./i18n/extractBaseTranslations.js";
|
|
13
|
+
export { applyUrlParam } from "../nunjucks/filters/applyUrlParam.js";
|
|
10
14
|
const globals = {
|
|
11
15
|
checkComponentTemplates,
|
|
12
16
|
checkErrorTemplates,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["markdownToHtml","engine","plugin","checkComponentTemplates","checkErrorTemplates","evaluate","govukRebrand","tGlobal","filters","getPageHref","context","getFirstJourneyPage","getFormContext","getFormModel","resolveFormModel","globals","t","VIEW_PATH","PLUGIN_PATH","STATE_NOT_YET_VALIDATED","CURRENT_PAGE_PATH_KEY","MAGIC_LINK_GROUP_ID","prepareNunjucksEnvironment","env","pluginOptions","name","nunjucksFilter","Object","entries","addFilter","text","startingHeaderLevel","baseUrl","nunjucksGlobal","addGlobal","filter","registerFilter","forEach","fn"],"sources":["../../../../src/server/plugins/engine/index.ts"],"sourcesContent":["import { markdownToHtml } from '@defra/forms-model'\nimport { type Environment } from 'nunjucks'\n\nimport { engine } from '~/src/server/plugins/engine/helpers.js'\nimport { plugin } from '~/src/server/plugins/engine/plugin.js'\nimport { type PluginOptions } from '~/src/server/plugins/engine/types.js'\nimport {\n checkComponentTemplates,\n checkErrorTemplates,\n evaluate,\n govukRebrand,\n tGlobal\n} from '~/src/server/plugins/nunjucks/environment.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nexport { getPageHref } from '~/src/server/plugins/engine/helpers.js'\nexport { context } from '~/src/server/plugins/nunjucks/context.js'\nexport {\n getFirstJourneyPage,\n getFormContext,\n getFormModel,\n resolveFormModel\n} from '~/src/server/plugins/engine/form-context.js'\nexport * from '~/src/server/plugins/engine/form-availability.js'\n\nconst globals = {\n checkComponentTemplates,\n checkErrorTemplates,\n evaluate,\n govukRebrand,\n t: tGlobal\n}\n\nexport const VIEW_PATH = 'src/server/plugins/engine/views'\nexport const PLUGIN_PATH = 'node_modules/@defra/forms-engine-plugin'\n\nexport const STATE_NOT_YET_VALIDATED = '__stateNotYetValidated'\nexport const CURRENT_PAGE_PATH_KEY = '__currentPagePath'\nexport const MAGIC_LINK_GROUP_ID = '__magicLinkGroupId'\n\nexport const prepareNunjucksEnvironment = function (\n env: Environment,\n pluginOptions: PluginOptions\n) {\n for (const [name, nunjucksFilter] of Object.entries(filters)) {\n env.addFilter(name, nunjucksFilter)\n }\n\n env.addFilter('markdown', (text: string, startingHeaderLevel?: number) =>\n markdownToHtml(text, {\n baseUrl: pluginOptions.baseUrl,\n startingHeaderLevel\n })\n )\n\n for (const [name, nunjucksGlobal] of Object.entries(globals)) {\n env.addGlobal(name, nunjucksGlobal)\n }\n\n // Apply any additional filters to both the liquid and nunjucks engines\n if (pluginOptions.filters) {\n for (const [name, filter] of Object.entries(pluginOptions.filters)) {\n env.addFilter(name, filter)\n engine.registerFilter(name, filter)\n }\n }\n\n // Apply any additional globals to nunjucks engines\n if (pluginOptions.globals) {\n Object.entries(pluginOptions.globals).forEach(([name, fn]) => {\n env.addGlobal(name, fn)\n })\n }\n}\n\nexport default plugin\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,oBAAoB;AAGnD,SAASC,MAAM;AACf,SAASC,MAAM;AAEf,SACEC,uBAAuB,EACvBC,mBAAmB,EACnBC,QAAQ,EACRC,YAAY,EACZC,OAAO;AAET,OAAO,KAAKC,OAAO;AAEnB,SAASC,WAAW;AACpB,SAASC,OAAO;AAChB,SACEC,mBAAmB,EACnBC,cAAc,EACdC,YAAY,EACZC,gBAAgB;AAElB;
|
|
1
|
+
{"version":3,"file":"index.js","names":["markdownToHtml","engine","plugin","checkComponentTemplates","checkErrorTemplates","evaluate","govukRebrand","tGlobal","filters","getPageHref","context","getFirstJourneyPage","getFormContext","getFormModel","resolveFormModel","getAvailableLanguages","extractMetadataBaseTranslations","loadFormTranslations","extractBaseTranslations","applyUrlParam","globals","t","VIEW_PATH","PLUGIN_PATH","STATE_NOT_YET_VALIDATED","CURRENT_PAGE_PATH_KEY","MAGIC_LINK_GROUP_ID","prepareNunjucksEnvironment","env","pluginOptions","name","nunjucksFilter","Object","entries","addFilter","text","startingHeaderLevel","baseUrl","nunjucksGlobal","addGlobal","filter","registerFilter","forEach","fn"],"sources":["../../../../src/server/plugins/engine/index.ts"],"sourcesContent":["import { markdownToHtml } from '@defra/forms-model'\nimport { type Environment } from 'nunjucks'\n\nimport { engine } from '~/src/server/plugins/engine/helpers.js'\nimport { plugin } from '~/src/server/plugins/engine/plugin.js'\nimport { type PluginOptions } from '~/src/server/plugins/engine/types.js'\nimport {\n checkComponentTemplates,\n checkErrorTemplates,\n evaluate,\n govukRebrand,\n tGlobal\n} from '~/src/server/plugins/nunjucks/environment.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nexport { getPageHref } from '~/src/server/plugins/engine/helpers.js'\nexport { context } from '~/src/server/plugins/nunjucks/context.js'\nexport {\n getFirstJourneyPage,\n getFormContext,\n getFormModel,\n resolveFormModel\n} from '~/src/server/plugins/engine/form-context.js'\nexport * from '~/src/server/plugins/engine/form-availability.js'\nexport { getAvailableLanguages } from '~/src/server/plugins/engine/i18n/languages.js'\nexport {\n extractMetadataBaseTranslations,\n loadFormTranslations\n} from '~/src/server/plugins/engine/i18n/createFormTranslator.js'\nexport { extractBaseTranslations } from '~/src/server/plugins/engine/i18n/extractBaseTranslations.js'\nexport { applyUrlParam } from '~/src/server/plugins/nunjucks/filters/applyUrlParam.js'\n\nconst globals = {\n checkComponentTemplates,\n checkErrorTemplates,\n evaluate,\n govukRebrand,\n t: tGlobal\n}\n\nexport const VIEW_PATH = 'src/server/plugins/engine/views'\nexport const PLUGIN_PATH = 'node_modules/@defra/forms-engine-plugin'\n\nexport const STATE_NOT_YET_VALIDATED = '__stateNotYetValidated'\nexport const CURRENT_PAGE_PATH_KEY = '__currentPagePath'\nexport const MAGIC_LINK_GROUP_ID = '__magicLinkGroupId'\n\nexport const prepareNunjucksEnvironment = function (\n env: Environment,\n pluginOptions: PluginOptions\n) {\n for (const [name, nunjucksFilter] of Object.entries(filters)) {\n env.addFilter(name, nunjucksFilter)\n }\n\n env.addFilter('markdown', (text: string, startingHeaderLevel?: number) =>\n markdownToHtml(text, {\n baseUrl: pluginOptions.baseUrl,\n startingHeaderLevel\n })\n )\n\n for (const [name, nunjucksGlobal] of Object.entries(globals)) {\n env.addGlobal(name, nunjucksGlobal)\n }\n\n // Apply any additional filters to both the liquid and nunjucks engines\n if (pluginOptions.filters) {\n for (const [name, filter] of Object.entries(pluginOptions.filters)) {\n env.addFilter(name, filter)\n engine.registerFilter(name, filter)\n }\n }\n\n // Apply any additional globals to nunjucks engines\n if (pluginOptions.globals) {\n Object.entries(pluginOptions.globals).forEach(([name, fn]) => {\n env.addGlobal(name, fn)\n })\n }\n}\n\nexport default plugin\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,oBAAoB;AAGnD,SAASC,MAAM;AACf,SAASC,MAAM;AAEf,SACEC,uBAAuB,EACvBC,mBAAmB,EACnBC,QAAQ,EACRC,YAAY,EACZC,OAAO;AAET,OAAO,KAAKC,OAAO;AAEnB,SAASC,WAAW;AACpB,SAASC,OAAO;AAChB,SACEC,mBAAmB,EACnBC,cAAc,EACdC,YAAY,EACZC,gBAAgB;AAElB;AACA,SAASC,qBAAqB;AAC9B,SACEC,+BAA+B,EAC/BC,oBAAoB;AAEtB,SAASC,uBAAuB;AAChC,SAASC,aAAa;AAEtB,MAAMC,OAAO,GAAG;EACdjB,uBAAuB;EACvBC,mBAAmB;EACnBC,QAAQ;EACRC,YAAY;EACZe,CAAC,EAAEd;AACL,CAAC;AAED,OAAO,MAAMe,SAAS,GAAG,iCAAiC;AAC1D,OAAO,MAAMC,WAAW,GAAG,yCAAyC;AAEpE,OAAO,MAAMC,uBAAuB,GAAG,wBAAwB;AAC/D,OAAO,MAAMC,qBAAqB,GAAG,mBAAmB;AACxD,OAAO,MAAMC,mBAAmB,GAAG,oBAAoB;AAEvD,OAAO,MAAMC,0BAA0B,GAAG,SAAAA,CACxCC,GAAgB,EAChBC,aAA4B,EAC5B;EACA,KAAK,MAAM,CAACC,IAAI,EAAEC,cAAc,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACzB,OAAO,CAAC,EAAE;IAC5DoB,GAAG,CAACM,SAAS,CAACJ,IAAI,EAAEC,cAAc,CAAC;EACrC;EAEAH,GAAG,CAACM,SAAS,CAAC,UAAU,EAAE,CAACC,IAAY,EAAEC,mBAA4B,KACnEpC,cAAc,CAACmC,IAAI,EAAE;IACnBE,OAAO,EAAER,aAAa,CAACQ,OAAO;IAC9BD;EACF,CAAC,CACH,CAAC;EAED,KAAK,MAAM,CAACN,IAAI,EAAEQ,cAAc,CAAC,IAAIN,MAAM,CAACC,OAAO,CAACb,OAAO,CAAC,EAAE;IAC5DQ,GAAG,CAACW,SAAS,CAACT,IAAI,EAAEQ,cAAc,CAAC;EACrC;;EAEA;EACA,IAAIT,aAAa,CAACrB,OAAO,EAAE;IACzB,KAAK,MAAM,CAACsB,IAAI,EAAEU,MAAM,CAAC,IAAIR,MAAM,CAACC,OAAO,CAACJ,aAAa,CAACrB,OAAO,CAAC,EAAE;MAClEoB,GAAG,CAACM,SAAS,CAACJ,IAAI,EAAEU,MAAM,CAAC;MAC3BvC,MAAM,CAACwC,cAAc,CAACX,IAAI,EAAEU,MAAM,CAAC;IACrC;EACF;;EAEA;EACA,IAAIX,aAAa,CAACT,OAAO,EAAE;IACzBY,MAAM,CAACC,OAAO,CAACJ,aAAa,CAACT,OAAO,CAAC,CAACsB,OAAO,CAAC,CAAC,CAACZ,IAAI,EAAEa,EAAE,CAAC,KAAK;MAC5Df,GAAG,CAACW,SAAS,CAACT,IAAI,EAAEa,EAAE,CAAC;IACzB,CAAC,CAAC;EACJ;AACF,CAAC;AAED,eAAezC,MAAM","ignoreList":[]}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { ComponentType, ConditionsModel, ControllerPath, ControllerType, SchemaVersion, convertConditionWrapperFromV2, formDefinitionSchema, formDefinitionV2Schema, generateConditionAlias, hasComponents, hasComponentsEvenIfNoNext, hasRepeater, isConditionWrapperV2, yesNoListId, yesNoListName } from '@defra/forms-model';
|
|
1
|
+
import { ComponentType, ConditionEvaluationOutcome, ConditionsModel, ControllerPath, ControllerType, SchemaVersion, convertConditionWrapperFromV2, formDefinitionSchema, formDefinitionV2Schema, generateConditionAlias, getErrorMessage, hasComponents, hasComponentsEvenIfNoNext, hasRepeater, isConditionWrapperV2, yesNoListId, yesNoListName } from '@defra/forms-model';
|
|
2
2
|
import { add, format } from 'date-fns';
|
|
3
3
|
import { Parser } from 'expr-eval-fork';
|
|
4
4
|
import joi from 'joi';
|
|
5
5
|
import { logger } from "../../../common/helpers/logging/logger.js";
|
|
6
|
+
import { EN_GB } from "../../../constants.js";
|
|
6
7
|
import "../components/YesNoField.js";
|
|
7
8
|
import { hasListFormField } from "../components/helpers/components.js";
|
|
8
9
|
import { todayAsDateOnly } from "../date-helper.js";
|
|
10
|
+
import { ConditionBuildError, SchemaValidationError } from "../errors.js";
|
|
9
11
|
import { findPage, getError, getPage } from "../helpers.js";
|
|
10
12
|
import { loadFormTranslations } from "../i18n/createFormTranslator.js";
|
|
11
13
|
import { createTranslator } from "../i18n/createTranslator.js";
|
|
12
14
|
import { extractBaseTranslations } from "../i18n/extractBaseTranslations.js";
|
|
13
15
|
import { createFormI18nInstance } from "../i18n/index.js";
|
|
16
|
+
import { getAvailableLanguages } from "../i18n/languages.js";
|
|
14
17
|
import { createPage } from "../pageControllers/helpers/pages.js";
|
|
15
18
|
import { validationOptions as opts } from "../pageControllers/validationOptions.js";
|
|
16
19
|
import * as defaultServices from "../services/index.js";
|
|
@@ -52,7 +55,7 @@ export class FormModel {
|
|
|
52
55
|
abortEarly: false
|
|
53
56
|
});
|
|
54
57
|
if (result.error) {
|
|
55
|
-
throw result.error;
|
|
58
|
+
throw new SchemaValidationError(result.error);
|
|
56
59
|
}
|
|
57
60
|
|
|
58
61
|
// Make a clone of the shallow copy returned
|
|
@@ -129,7 +132,12 @@ export class FormModel {
|
|
|
129
132
|
}
|
|
130
133
|
|
|
131
134
|
/** Returns a scoped translator pair for the given language. */
|
|
132
|
-
createTranslator(language =
|
|
135
|
+
createTranslator(language = EN_GB) {
|
|
136
|
+
// @ts-expect-error - dynamic language lookup
|
|
137
|
+
if (!this.def.metadata?.translations?.[language]) {
|
|
138
|
+
// If not translations defined in the FormDefinition, always default to English
|
|
139
|
+
language = EN_GB;
|
|
140
|
+
}
|
|
133
141
|
return createTranslator(this.i18nInstance, language);
|
|
134
142
|
}
|
|
135
143
|
|
|
@@ -173,21 +181,38 @@ export class FormModel {
|
|
|
173
181
|
displayName,
|
|
174
182
|
value
|
|
175
183
|
} = condition;
|
|
176
|
-
|
|
177
|
-
|
|
184
|
+
let expr;
|
|
185
|
+
try {
|
|
186
|
+
expr = this.toConditionExpression(value, parser);
|
|
187
|
+
} catch (cause) {
|
|
188
|
+
throw new ConditionBuildError(displayName, {
|
|
189
|
+
cause
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const evaluate = evaluationState => {
|
|
178
193
|
const ctx = this.toConditionContext(evaluationState, this.conditions);
|
|
179
194
|
try {
|
|
180
|
-
return
|
|
181
|
-
|
|
182
|
-
|
|
195
|
+
return {
|
|
196
|
+
outcome: expr.evaluate(ctx) ? ConditionEvaluationOutcome.True : ConditionEvaluationOutcome.False
|
|
197
|
+
};
|
|
198
|
+
} catch (err) {
|
|
199
|
+
return {
|
|
200
|
+
outcome: ConditionEvaluationOutcome.Error,
|
|
201
|
+
error: getErrorMessage(err)
|
|
202
|
+
};
|
|
183
203
|
}
|
|
184
204
|
};
|
|
205
|
+
|
|
206
|
+
// A failed evaluation continues to route as `false`. `evaluate` exists so
|
|
207
|
+
// that the two can be told apart when recording outcomes for submission.
|
|
208
|
+
const fn = evaluationState => evaluate(evaluationState).outcome === ConditionEvaluationOutcome.True;
|
|
185
209
|
return {
|
|
186
210
|
name,
|
|
187
211
|
displayName,
|
|
188
212
|
value,
|
|
189
213
|
expr,
|
|
190
|
-
fn
|
|
214
|
+
fn,
|
|
215
|
+
evaluate
|
|
191
216
|
};
|
|
192
217
|
}
|
|
193
218
|
toConditionContext(evaluationState, conditions) {
|
|
@@ -481,7 +506,7 @@ function validateFormState(request, page, context) {
|
|
|
481
506
|
|
|
482
507
|
// Add relevant state errors
|
|
483
508
|
if (error) {
|
|
484
|
-
const errorsState = error.details.map(getError);
|
|
509
|
+
const errorsState = error.details.map(item => getError(EN_GB, item));
|
|
485
510
|
return {
|
|
486
511
|
...context,
|
|
487
512
|
errors: errors.concat(errorsState)
|
|
@@ -495,17 +520,4 @@ function getReferenceNumber(state) {
|
|
|
495
520
|
}
|
|
496
521
|
return state.$$__referenceNumber;
|
|
497
522
|
}
|
|
498
|
-
export function getAvailableLanguages(def) {
|
|
499
|
-
// @ts-expect-error - dynamic property
|
|
500
|
-
if (def.metadata?.translations?.cy) {
|
|
501
|
-
return [{
|
|
502
|
-
name: 'English',
|
|
503
|
-
code: 'en-GB'
|
|
504
|
-
}, {
|
|
505
|
-
name: 'Cymraeg',
|
|
506
|
-
code: 'cy'
|
|
507
|
-
}];
|
|
508
|
-
}
|
|
509
|
-
return [];
|
|
510
|
-
}
|
|
511
523
|
//# sourceMappingURL=FormModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormModel.js","names":["ComponentType","ConditionsModel","ControllerPath","ControllerType","SchemaVersion","convertConditionWrapperFromV2","formDefinitionSchema","formDefinitionV2Schema","generateConditionAlias","hasComponents","hasComponentsEvenIfNoNext","hasRepeater","isConditionWrapperV2","yesNoListId","yesNoListName","add","format","Parser","joi","logger","hasListFormField","todayAsDateOnly","findPage","getError","getPage","loadFormTranslations","createTranslator","extractBaseTranslations","createFormI18nInstance","createPage","validationOptions","opts","defaultServices","FormAction","merge","FormModel","engine","schemaVersion","def","lists","sections","name","formId","values","basePath","ordnanceSurveyApiKey","conditions","pages","services","i18nInstance","controllers","pageDefMap","listDefMap","listDefIdMap","componentDefMap","componentDefIdMap","pageMap","componentMap","constructor","options","schema","V1","warn","result","validate","abortEarly","error","structuredClone","value","baseTranslations","push","id","title","type","items","text","moreThanOnePaymentQuestion","Error","Map","map","page","path","list","filter","flatMap","components","component","forEach","conditionDef","condition","makeCondition","pageDef","some","controller","Status","collection","language","makeFilteredSchema","relevantPages","object","required","concat","stateSchema","parser","operators","logical","Object","assign","functions","dateForComparison","timePeriod","timeUnit","displayName","expr","toConditionExpression","fn","evaluationState","ctx","toConditionContext","evaluate","context","conditionId","propertyName","V2","defineProperty","get","from","parse","toExpression","getList","nameOrId","find","getSection","section","getFormContext","request","state","errors","translator","query","currentPath","startPath","getStartPath","isForceAccess","relevantState","payload","getFormDataFromState","paths","data","referenceNumber","getReferenceNumber","languages","getAvailableLanguages","validateFormPayload","nextPage","initialiseContext","assignEvaluationState","assignRelevantState","pageStateIsInvalid","getNextPath","validateFormState","assignPaths","emptyState","freeze","getContextValueFromState","key","keys","listFields","fields","field","undefined","YesNoField","hasOptionalItems","item","length","fieldStateIsInvalid","validValues","fieldState","getFormValueFromState","isInvalid","isArray","Array","every","includes","t","href","getComponentById","componentId","getListById","listId","getConditionById","numOfPaymentFields","comp","PaymentField","action","getFormParams","Validate","startsWith","External","update","CheckboxesField","formState","getStateFromValidForm","previousPages","relevantPage","model","stripUnknown","errorsState","details","$$__referenceNumber","metadata","translations","cy","code"],"sources":["../../../../../src/server/plugins/engine/models/FormModel.ts"],"sourcesContent":["import {\n ComponentType,\n ConditionsModel,\n ControllerPath,\n ControllerType,\n SchemaVersion,\n convertConditionWrapperFromV2,\n formDefinitionSchema,\n formDefinitionV2Schema,\n generateConditionAlias,\n hasComponents,\n hasComponentsEvenIfNoNext,\n hasRepeater,\n isConditionWrapperV2,\n yesNoListId,\n yesNoListName,\n type ComponentDef,\n type ConditionWrapper,\n type ConditionWrapperV2,\n type ConditionsModelData,\n type DateUnits,\n type Engine,\n type FormDefinition,\n type List,\n type Page,\n type Section\n} from '@defra/forms-model'\nimport { add, format } from 'date-fns'\nimport { Parser, type Value } from 'expr-eval-fork'\nimport { type i18n } from 'i18next'\nimport joi from 'joi'\n\nimport { logger } from '~/src/server/common/helpers/logging/logger.js'\nimport { type ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'\nimport {} from '~/src/server/plugins/engine/components/YesNoField.js'\nimport {\n hasListFormField,\n type Component\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { todayAsDateOnly } from '~/src/server/plugins/engine/date-helper.js'\nimport {\n findPage,\n getError,\n getPage\n} from '~/src/server/plugins/engine/helpers.js'\nimport { loadFormTranslations } from '~/src/server/plugins/engine/i18n/createFormTranslator.js'\nimport { createTranslator } from '~/src/server/plugins/engine/i18n/createTranslator.js'\nimport { extractBaseTranslations } from '~/src/server/plugins/engine/i18n/extractBaseTranslations.js'\nimport { createFormI18nInstance } from '~/src/server/plugins/engine/i18n/index.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type ExecutableCondition } from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n createPage,\n type PageControllerClass\n} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type FormContext,\n type FormContextRequest,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { FormAction } from '~/src/server/routes/types.js'\nimport { merge } from '~/src/server/services/cacheService.js'\nimport { type Services } from '~/src/server/types.js'\n\nexport class FormModel {\n /** The runtime engine that should be used */\n engine?: Engine\n\n schemaVersion: SchemaVersion\n\n /** the entire form JSON as an object */\n def: FormDefinition\n\n lists: FormDefinition['lists']\n sections: FormDefinition['sections'] = []\n name: string\n formId: string\n values: FormDefinition\n basePath: string\n ordnanceSurveyApiKey?: string\n conditions: Partial<Record<string, ExecutableCondition>>\n pages: PageControllerClass[]\n services: Services\n private readonly i18nInstance: i18n\n\n controllers?: Record<string, typeof PageController>\n pageDefMap: Map<string, Page>\n\n listDefMap: Map<string, List>\n listDefIdMap: Map<string, List>\n\n componentDefMap: Map<string, ComponentDef>\n componentDefIdMap: Map<string, ComponentDef>\n\n pageMap: Map<string, PageControllerClass>\n componentMap: Map<string, Component>\n\n constructor(\n def: typeof this.def,\n options: {\n basePath: string\n ordnanceSurveyApiKey?: string\n formId?: string\n },\n services: Services = defaultServices,\n controllers?: Record<string, typeof PageController>\n ) {\n let schema = formDefinitionV2Schema\n\n if (!def.schema || def.schema === SchemaVersion.V1) {\n logger.warn(\n `[DEPRECATION NOTICE] Form \"${def.name}\" constructed with legacy V1 schema. See https://defra.github.io/forms-engine-plugin/schemas/form-definition-schema.html.`\n )\n schema = formDefinitionSchema\n }\n\n const result = schema.validate(def, { abortEarly: false })\n\n if (result.error) {\n throw result.error\n }\n\n // Make a clone of the shallow copy returned\n // by joi so as not to change the source data.\n def = structuredClone(result.value)\n\n const baseTranslations = extractBaseTranslations(def)\n this.i18nInstance = createFormI18nInstance(baseTranslations)\n loadFormTranslations(def, this.i18nInstance)\n\n // Add default lists. Yes/No text stored as i18n key constants so they\n // resolve to the user's language at render time via the translator.\n def.lists.push({\n id: def.schema === SchemaVersion.V1 ? yesNoListName : yesNoListId,\n name: '__yesNo',\n title: 'Yes/No',\n type: 'boolean',\n items: [\n {\n id: '02900d42-83d1-4c72-a719-c4e8228952fa',\n text: 'components.yesNoField.yes',\n value: true\n },\n {\n id: 'f39000eb-c51b-4019-8f82-bbda0423f04d',\n text: 'components.yesNoField.no',\n value: false\n }\n ]\n })\n\n this.engine = def.engine\n this.schemaVersion = def.schema ?? SchemaVersion.V1\n this.def = def\n this.lists = def.lists\n this.sections = def.sections\n this.name = def.name ?? ''\n this.formId = options.formId ?? ''\n this.values = result.value\n this.basePath = options.basePath\n this.ordnanceSurveyApiKey = options.ordnanceSurveyApiKey\n this.conditions = {}\n this.services = services\n this.controllers = controllers\n\n // Assert that there is only one payment question (if any)\n if (this.moreThanOnePaymentQuestion()) {\n throw new Error(\n 'Invalid form definition: Only one payment question is allowed per form'\n )\n }\n\n this.pageDefMap = new Map(def.pages.map((page) => [page.path, page]))\n this.listDefMap = new Map(def.lists.map((list) => [list.name, list]))\n this.listDefIdMap = new Map(\n def.lists\n .filter((list) => list.id) // Skip lists without an ID\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n .map((list) => [list.id as string, list])\n )\n this.componentDefMap = new Map(\n def.pages\n .filter(hasComponents)\n .flatMap((page) =>\n page.components.map((component) => [component.name, component])\n )\n )\n this.componentDefIdMap = new Map(\n def.pages.filter(hasComponents).flatMap((page) =>\n page.components\n .filter((component) => component.id) // Skip components without an ID\n .map((component) => {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return [component.id as string, component]\n })\n )\n )\n\n def.conditions.forEach((conditionDef) => {\n const condition = this.makeCondition(\n isConditionWrapperV2(conditionDef)\n ? convertConditionWrapperFromV2(conditionDef, this)\n : conditionDef\n )\n this.conditions[condition.name] = condition\n })\n\n this.pages = def.pages.map((pageDef) => createPage(this, pageDef))\n\n if (\n !def.pages.some(\n ({ controller }) =>\n // Check for user-provided status page (optional)\n controller === ControllerType.Status\n )\n ) {\n this.pages.push(\n createPage(this, {\n title: 'pages.confirmation.formSubmitted',\n path: ControllerPath.Status,\n controller: ControllerType.Status\n })\n )\n }\n\n this.pageMap = new Map(this.pages.map((page) => [page.path, page]))\n this.componentMap = new Map(\n this.pages.flatMap((page) =>\n page.collection.components.map((component) => [\n component.name,\n component\n ])\n )\n )\n }\n\n /** Returns a scoped translator pair for the given language. */\n createTranslator(language = 'en-GB'): Translator {\n return createTranslator(this.i18nInstance, language)\n }\n\n /**\n * build the entire model schema from individual pages/sections and filter out answers\n * for pages which are no longer accessible due to an answer that has been changed\n */\n makeFilteredSchema(relevantPages: PageControllerClass[]) {\n // Build the entire model schema\n // from the individual pages/sections\n let schema = joi.object<FormSubmissionState>().required()\n\n relevantPages.forEach((page) => {\n schema = schema.concat(page.collection.stateSchema)\n })\n\n return schema\n }\n\n /**\n * Instantiates a Condition based on {@link ConditionWrapper}\n * @param condition\n */\n makeCondition(condition: ConditionWrapper): ExecutableCondition {\n const parser = new Parser({\n operators: {\n logical: true\n }\n })\n\n Object.assign(parser.functions, {\n dateForComparison(timePeriod: number, timeUnit: DateUnits) {\n // The time element must be stripped (hence using startOfDay() which has no time element),\n // then formatted as YYYY-MM-DD otherwise we can hit time element and BST issues giving the\n // wrong date to compare against.\n // Do not use .toISOString() to format the date as that introduces BST errors.\n return format(\n add(todayAsDateOnly(), { [timeUnit]: timePeriod }),\n 'yyyy-MM-dd'\n )\n }\n })\n\n const { name, displayName, value } = condition\n const expr = this.toConditionExpression(value, parser)\n\n const fn = (evaluationState: FormState) => {\n const ctx = this.toConditionContext(evaluationState, this.conditions)\n try {\n return expr.evaluate(ctx) as boolean\n } catch {\n return false\n }\n }\n\n return {\n name,\n displayName,\n value,\n expr,\n fn\n }\n }\n\n toConditionContext(\n evaluationState: FormState,\n conditions: Partial<Record<string, ExecutableCondition>>\n ) {\n const context = { ...evaluationState }\n\n for (const conditionId in conditions) {\n const propertyName =\n this.schemaVersion === SchemaVersion.V2\n ? generateConditionAlias(conditionId)\n : conditionId\n\n Object.defineProperty(context, propertyName, {\n get() {\n return conditions[conditionId]?.fn(evaluationState)\n }\n })\n }\n\n return context as Extract<Value, Record<string, Value>>\n }\n\n toConditionExpression(value: ConditionsModelData, parser: Parser) {\n const conditions = ConditionsModel.from(value)\n return parser.parse(conditions.toExpression())\n }\n\n getList(nameOrId: string): List | undefined {\n return this.schemaVersion === SchemaVersion.V1\n ? this.lists.find((list) => list.name === nameOrId)\n : this.lists.find((list) => list.id === nameOrId)\n }\n\n getSection(nameOrId: string): Section | undefined {\n return this.schemaVersion === SchemaVersion.V1\n ? this.sections.find((section) => section.name === nameOrId)\n : this.sections.find((section) => section.id === nameOrId)\n }\n\n /**\n * Form context for the current page\n */\n getFormContext(\n request: FormContextRequest,\n state: FormSubmissionState,\n errors?: FormSubmissionError[],\n translator?: Translator\n ): FormContext {\n const { query } = request\n\n const page = getPage(this, request)\n\n // Determine form paths\n const currentPath = page.path\n const startPath = page.getStartPath()\n\n // Preview URL direct access is allowed\n const isForceAccess = 'force' in query\n\n let context: FormContext = {\n evaluationState: {},\n relevantState: {},\n relevantPages: [],\n payload: page.getFormDataFromState(request, state),\n state,\n paths: [],\n errors,\n isForceAccess,\n data: {},\n pageDefMap: this.pageDefMap,\n listDefMap: this.listDefMap,\n componentDefMap: this.componentDefMap,\n pageMap: this.pageMap,\n componentMap: this.componentMap,\n referenceNumber: getReferenceNumber(state),\n languages: getAvailableLanguages(this.def),\n translator\n }\n\n // Validate current page\n context = validateFormPayload(request, page, context, translator)\n\n // Find start page\n let nextPage = findPage(this, startPath)\n\n this.initialiseContext(context)\n\n // Walk form pages from start\n while (nextPage) {\n // Add page to context\n context.relevantPages.push(nextPage)\n\n this.assignEvaluationState(context, nextPage)\n\n this.assignRelevantState(context, nextPage)\n\n // Stop at current page\n if (\n this.pageStateIsInvalid(context, nextPage, translator) ||\n nextPage.path === currentPath\n ) {\n break\n }\n\n // Apply conditions to determine next page\n nextPage = findPage(this, nextPage.getNextPath(context))\n }\n\n // Validate form state\n context = validateFormState(request, page, context)\n\n // Add paths for navigation\n this.assignPaths(context)\n\n return context\n }\n\n private initialiseContext(context: FormContext) {\n // Initialise `evaluationState` for all keys using empty state.\n // This is because the current condition evaluation library (eval-expr)\n // will throw if an expression uses a key that is undefined.\n const emptyState = Object.freeze({})\n\n for (const page of this.pages) {\n const { collection, pageDef } = page\n\n if (!hasRepeater(pageDef)) {\n Object.assign(\n context.evaluationState,\n collection.getContextValueFromState(emptyState)\n )\n }\n }\n }\n\n private assignEvaluationState(\n context: FormContext,\n page: PageControllerClass\n ) {\n const { collection, pageDef } = page\n // Skip evaluation state for repeater pages\n\n if (!hasRepeater(pageDef)) {\n Object.assign(\n context.evaluationState,\n collection.getContextValueFromState(context.state)\n )\n }\n }\n\n private assignRelevantState(context: FormContext, page: PageControllerClass) {\n // Copy relevant state by expected keys\n for (const key of page.keys) {\n if (typeof context.state[key] !== 'undefined') {\n context.relevantState[key] = context.state[key]\n }\n }\n }\n\n private pageStateIsInvalid(\n context: FormContext,\n page: PageControllerClass,\n translator?: Translator\n ) {\n // Get any list-bound fields on the page\n const listFields = page.collection.fields.filter(hasListFormField)\n\n // For each list field that is bound to a list that contains any conditional items,\n // we need to check any answers are still valid. Do this by evaluating the conditions\n // and ensuring any current answers are all included in the set of valid answers\n for (const field of listFields) {\n const list = field.list\n\n // Filter out YesNo as they can't be conditional\n if (list !== undefined && field.type !== ComponentType.YesNoField) {\n const hasOptionalItems =\n list.items.filter((item) => item.condition).length > 0\n\n if (hasOptionalItems) {\n return this.fieldStateIsInvalid(context, field, list, translator)\n }\n }\n }\n }\n\n private fieldStateIsInvalid(\n context: FormContext,\n field: ListFormComponent,\n list: List,\n translator?: Translator\n ) {\n const { evaluationState, state } = context\n\n const validValues = list.items\n .filter((item) =>\n item.condition\n ? this.conditions[item.condition]?.fn(evaluationState)\n : true\n )\n .map((item) => item.value)\n\n // Get the field state\n const fieldState = field.getFormValueFromState(state)\n\n if (fieldState !== undefined) {\n let isInvalid = false\n const isArray = Array.isArray(fieldState)\n\n // Check if any saved state value(s) are still valid\n // and return true if any are invalid\n if (isArray) {\n isInvalid = !fieldState.every((item) => validValues.includes(item))\n } else {\n isInvalid = !validValues.includes(fieldState)\n }\n\n if (isInvalid) {\n context.errors ??= []\n\n const text = (translator ?? this.createTranslator('en-GB')).t(\n 'errors.optionsMismatch'\n )\n\n context.errors.push({\n text,\n name: field.name,\n href: `#${field.name}`,\n path: [`#${field.name}`]\n })\n }\n\n return isInvalid\n }\n }\n\n private assignPaths(context: FormContext) {\n for (const { keys, path } of context.relevantPages) {\n context.paths.push(path)\n\n // Stop at page with errors\n if (\n context.errors?.some(({ name, path }) => {\n return keys.includes(name) || keys.some((key) => path.includes(key))\n })\n ) {\n break\n }\n }\n }\n\n getComponentById(componentId: string): ComponentDef | undefined {\n return this.componentDefIdMap.get(componentId)\n }\n\n getListById(listId: string): List | undefined {\n return this.listDefIdMap.get(listId)\n }\n\n /**\n * Returns a condition by its ID. O(n) lookup time.\n * @param conditionId\n * @returns\n */\n getConditionById(conditionId: string): ConditionWrapperV2 | undefined {\n return this.def.conditions\n .filter(isConditionWrapperV2)\n .find((condition) => condition.id === conditionId)\n }\n\n /**\n * Checks that only one payment field exists (if any payments fields exist)\n */\n moreThanOnePaymentQuestion() {\n const numOfPaymentFields = this.def.pages\n .flatMap((page) =>\n hasComponentsEvenIfNoNext(page) ? page.components : []\n )\n .filter((comp) => comp.type === ComponentType.PaymentField).length\n return numOfPaymentFields > 1\n }\n}\n\n/**\n * Validate current page only\n */\nfunction validateFormPayload(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext,\n translator?: Translator\n): FormContext {\n const { collection } = page\n const { payload, state } = context\n\n const { action } = page.getFormParams(request)\n\n // Skip validation GET requests or other actions\n if (\n !request.payload ||\n (action &&\n action !== FormAction.Validate &&\n !action.startsWith(FormAction.External))\n ) {\n return context\n }\n\n // For checkbox fields missing in the payload (i.e. unchecked),\n // explicitly set their value to undefined so that any previously\n // stored value is cleared and required field validation is enforced.\n const update = { ...request.payload }\n collection.fields.forEach((field) => {\n if (\n field.type === ComponentType.CheckboxesField &&\n !(field.name in update)\n ) {\n update[field.name] = undefined\n }\n })\n\n const { value, errors } = collection.validate(\n { ...payload, ...update },\n translator\n )\n\n // Add sanitised payload (ready to save)\n const formState = page.getStateFromValidForm(request, state, value)\n\n return {\n ...context,\n payload: merge(payload, value),\n state: merge(state, formState),\n errors\n }\n}\n\n/**\n * Validate entire form state\n */\nfunction validateFormState(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext\n): FormContext {\n const { errors = [], relevantPages, relevantState } = context\n\n // Exclude current page\n const previousPages = relevantPages.filter(\n (relevantPage) => relevantPage !== page\n )\n\n // Validate relevant state\n const { error } = page.model\n .makeFilteredSchema(previousPages)\n .validate(relevantState, { ...opts, stripUnknown: true })\n\n // Add relevant state errors\n if (error) {\n const errorsState = error.details.map(getError)\n return { ...context, errors: errors.concat(errorsState) }\n }\n\n return context\n}\n\nfunction getReferenceNumber(state: FormSubmissionState): string {\n if (\n !state.$$__referenceNumber ||\n typeof state.$$__referenceNumber !== 'string'\n ) {\n throw Error('Reference number not found in form state')\n }\n\n return state.$$__referenceNumber\n}\n\nexport function getAvailableLanguages(\n def: FormDefinition\n): { name: string; code: string }[] {\n // @ts-expect-error - dynamic property\n if (def.metadata?.translations?.cy) {\n return [\n { name: 'English', code: 'en-GB' },\n { name: 'Cymraeg', code: 'cy' }\n ]\n }\n return []\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FormModel.js","names":["ComponentType","ConditionEvaluationOutcome","ConditionsModel","ControllerPath","ControllerType","SchemaVersion","convertConditionWrapperFromV2","formDefinitionSchema","formDefinitionV2Schema","generateConditionAlias","getErrorMessage","hasComponents","hasComponentsEvenIfNoNext","hasRepeater","isConditionWrapperV2","yesNoListId","yesNoListName","add","format","Parser","joi","logger","EN_GB","hasListFormField","todayAsDateOnly","ConditionBuildError","SchemaValidationError","findPage","getError","getPage","loadFormTranslations","createTranslator","extractBaseTranslations","createFormI18nInstance","getAvailableLanguages","createPage","validationOptions","opts","defaultServices","FormAction","merge","FormModel","engine","schemaVersion","def","lists","sections","name","formId","values","basePath","ordnanceSurveyApiKey","conditions","pages","services","i18nInstance","controllers","pageDefMap","listDefMap","listDefIdMap","componentDefMap","componentDefIdMap","pageMap","componentMap","constructor","options","schema","V1","warn","result","validate","abortEarly","error","structuredClone","value","baseTranslations","push","id","title","type","items","text","moreThanOnePaymentQuestion","Error","Map","map","page","path","list","filter","flatMap","components","component","forEach","conditionDef","condition","makeCondition","pageDef","some","controller","Status","collection","language","metadata","translations","makeFilteredSchema","relevantPages","object","required","concat","stateSchema","parser","operators","logical","Object","assign","functions","dateForComparison","timePeriod","timeUnit","displayName","expr","toConditionExpression","cause","evaluate","evaluationState","ctx","toConditionContext","outcome","True","False","err","fn","context","conditionId","propertyName","V2","defineProperty","get","from","parse","toExpression","getList","nameOrId","find","getSection","section","getFormContext","request","state","errors","translator","query","currentPath","startPath","getStartPath","isForceAccess","relevantState","payload","getFormDataFromState","paths","data","referenceNumber","getReferenceNumber","languages","validateFormPayload","nextPage","initialiseContext","assignEvaluationState","assignRelevantState","pageStateIsInvalid","getNextPath","validateFormState","assignPaths","emptyState","freeze","getContextValueFromState","key","keys","listFields","fields","field","undefined","YesNoField","hasOptionalItems","item","length","fieldStateIsInvalid","validValues","fieldState","getFormValueFromState","isInvalid","isArray","Array","every","includes","t","href","getComponentById","componentId","getListById","listId","getConditionById","numOfPaymentFields","comp","PaymentField","action","getFormParams","Validate","startsWith","External","update","CheckboxesField","formState","getStateFromValidForm","previousPages","relevantPage","model","stripUnknown","errorsState","details","$$__referenceNumber"],"sources":["../../../../../src/server/plugins/engine/models/FormModel.ts"],"sourcesContent":["import {\n ComponentType,\n ConditionEvaluationOutcome,\n ConditionsModel,\n ControllerPath,\n ControllerType,\n SchemaVersion,\n convertConditionWrapperFromV2,\n formDefinitionSchema,\n formDefinitionV2Schema,\n generateConditionAlias,\n getErrorMessage,\n hasComponents,\n hasComponentsEvenIfNoNext,\n hasRepeater,\n isConditionWrapperV2,\n yesNoListId,\n yesNoListName,\n type ComponentDef,\n type ConditionWrapper,\n type ConditionWrapperV2,\n type ConditionsModelData,\n type DateUnits,\n type Engine,\n type FormDefinition,\n type List,\n type Page,\n type Section\n} from '@defra/forms-model'\nimport { add, format } from 'date-fns'\nimport { Parser, type Value } from 'expr-eval-fork'\nimport { type i18n } from 'i18next'\nimport joi from 'joi'\n\nimport { logger } from '~/src/server/common/helpers/logging/logger.js'\nimport { EN_GB } from '~/src/server/constants.js'\nimport { type ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'\nimport {} from '~/src/server/plugins/engine/components/YesNoField.js'\nimport {\n hasListFormField,\n type Component\n} from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { todayAsDateOnly } from '~/src/server/plugins/engine/date-helper.js'\nimport {\n ConditionBuildError,\n SchemaValidationError\n} from '~/src/server/plugins/engine/errors.js'\nimport {\n findPage,\n getError,\n getPage\n} from '~/src/server/plugins/engine/helpers.js'\nimport { loadFormTranslations } from '~/src/server/plugins/engine/i18n/createFormTranslator.js'\nimport { createTranslator } from '~/src/server/plugins/engine/i18n/createTranslator.js'\nimport { extractBaseTranslations } from '~/src/server/plugins/engine/i18n/extractBaseTranslations.js'\nimport { createFormI18nInstance } from '~/src/server/plugins/engine/i18n/index.js'\nimport { getAvailableLanguages } from '~/src/server/plugins/engine/i18n/languages.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type ConditionEvaluation,\n type ExecutableCondition\n} from '~/src/server/plugins/engine/models/types.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport {\n createPage,\n type PageControllerClass\n} from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type FormContext,\n type FormContextRequest,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport { FormAction } from '~/src/server/routes/types.js'\nimport { merge } from '~/src/server/services/cacheService.js'\nimport { type Services } from '~/src/server/types.js'\n\nexport class FormModel {\n /** The runtime engine that should be used */\n engine?: Engine\n\n schemaVersion: SchemaVersion\n\n /** the entire form JSON as an object */\n def: FormDefinition\n\n lists: FormDefinition['lists']\n sections: FormDefinition['sections'] = []\n name: string\n formId: string\n values: FormDefinition\n basePath: string\n ordnanceSurveyApiKey?: string\n conditions: Partial<Record<string, ExecutableCondition>>\n pages: PageControllerClass[]\n services: Services\n private readonly i18nInstance: i18n\n\n controllers?: Record<string, typeof PageController>\n pageDefMap: Map<string, Page>\n\n listDefMap: Map<string, List>\n listDefIdMap: Map<string, List>\n\n componentDefMap: Map<string, ComponentDef>\n componentDefIdMap: Map<string, ComponentDef>\n\n pageMap: Map<string, PageControllerClass>\n componentMap: Map<string, Component>\n\n constructor(\n def: typeof this.def,\n options: {\n basePath: string\n ordnanceSurveyApiKey?: string\n formId?: string\n },\n services: Services = defaultServices,\n controllers?: Record<string, typeof PageController>\n ) {\n let schema = formDefinitionV2Schema\n\n if (!def.schema || def.schema === SchemaVersion.V1) {\n logger.warn(\n `[DEPRECATION NOTICE] Form \"${def.name}\" constructed with legacy V1 schema. See https://defra.github.io/forms-engine-plugin/schemas/form-definition-schema.html.`\n )\n schema = formDefinitionSchema\n }\n\n const result = schema.validate(def, { abortEarly: false })\n\n if (result.error) {\n throw new SchemaValidationError(result.error)\n }\n\n // Make a clone of the shallow copy returned\n // by joi so as not to change the source data.\n def = structuredClone(result.value)\n\n const baseTranslations = extractBaseTranslations(def)\n this.i18nInstance = createFormI18nInstance(baseTranslations)\n loadFormTranslations(def, this.i18nInstance)\n\n // Add default lists. Yes/No text stored as i18n key constants so they\n // resolve to the user's language at render time via the translator.\n def.lists.push({\n id: def.schema === SchemaVersion.V1 ? yesNoListName : yesNoListId,\n name: '__yesNo',\n title: 'Yes/No',\n type: 'boolean',\n items: [\n {\n id: '02900d42-83d1-4c72-a719-c4e8228952fa',\n text: 'components.yesNoField.yes',\n value: true\n },\n {\n id: 'f39000eb-c51b-4019-8f82-bbda0423f04d',\n text: 'components.yesNoField.no',\n value: false\n }\n ]\n })\n\n this.engine = def.engine\n this.schemaVersion = def.schema ?? SchemaVersion.V1\n this.def = def\n this.lists = def.lists\n this.sections = def.sections\n this.name = def.name ?? ''\n this.formId = options.formId ?? ''\n this.values = result.value\n this.basePath = options.basePath\n this.ordnanceSurveyApiKey = options.ordnanceSurveyApiKey\n this.conditions = {}\n this.services = services\n this.controllers = controllers\n\n // Assert that there is only one payment question (if any)\n if (this.moreThanOnePaymentQuestion()) {\n throw new Error(\n 'Invalid form definition: Only one payment question is allowed per form'\n )\n }\n\n this.pageDefMap = new Map(def.pages.map((page) => [page.path, page]))\n this.listDefMap = new Map(def.lists.map((list) => [list.name, list]))\n this.listDefIdMap = new Map(\n def.lists\n .filter((list) => list.id) // Skip lists without an ID\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n .map((list) => [list.id as string, list])\n )\n this.componentDefMap = new Map(\n def.pages\n .filter(hasComponents)\n .flatMap((page) =>\n page.components.map((component) => [component.name, component])\n )\n )\n this.componentDefIdMap = new Map(\n def.pages.filter(hasComponents).flatMap((page) =>\n page.components\n .filter((component) => component.id) // Skip components without an ID\n .map((component) => {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return [component.id as string, component]\n })\n )\n )\n\n def.conditions.forEach((conditionDef) => {\n const condition = this.makeCondition(\n isConditionWrapperV2(conditionDef)\n ? convertConditionWrapperFromV2(conditionDef, this)\n : conditionDef\n )\n this.conditions[condition.name] = condition\n })\n\n this.pages = def.pages.map((pageDef) => createPage(this, pageDef))\n\n if (\n !def.pages.some(\n ({ controller }) =>\n // Check for user-provided status page (optional)\n controller === ControllerType.Status\n )\n ) {\n this.pages.push(\n createPage(this, {\n title: 'pages.confirmation.formSubmitted',\n path: ControllerPath.Status,\n controller: ControllerType.Status\n })\n )\n }\n\n this.pageMap = new Map(this.pages.map((page) => [page.path, page]))\n this.componentMap = new Map(\n this.pages.flatMap((page) =>\n page.collection.components.map((component) => [\n component.name,\n component\n ])\n )\n )\n }\n\n /** Returns a scoped translator pair for the given language. */\n createTranslator(language = EN_GB): Translator {\n // @ts-expect-error - dynamic language lookup\n if (!this.def.metadata?.translations?.[language]) {\n // If not translations defined in the FormDefinition, always default to English\n language = EN_GB\n }\n return createTranslator(this.i18nInstance, language)\n }\n\n /**\n * build the entire model schema from individual pages/sections and filter out answers\n * for pages which are no longer accessible due to an answer that has been changed\n */\n makeFilteredSchema(relevantPages: PageControllerClass[]) {\n // Build the entire model schema\n // from the individual pages/sections\n let schema = joi.object<FormSubmissionState>().required()\n\n relevantPages.forEach((page) => {\n schema = schema.concat(page.collection.stateSchema)\n })\n\n return schema\n }\n\n /**\n * Instantiates a Condition based on {@link ConditionWrapper}\n * @param condition\n */\n makeCondition(condition: ConditionWrapper): ExecutableCondition {\n const parser = new Parser({\n operators: {\n logical: true\n }\n })\n\n Object.assign(parser.functions, {\n dateForComparison(timePeriod: number, timeUnit: DateUnits) {\n // The time element must be stripped (hence using startOfDay() which has no time element),\n // then formatted as YYYY-MM-DD otherwise we can hit time element and BST issues giving the\n // wrong date to compare against.\n // Do not use .toISOString() to format the date as that introduces BST errors.\n return format(\n add(todayAsDateOnly(), { [timeUnit]: timePeriod }),\n 'yyyy-MM-dd'\n )\n }\n })\n\n const { name, displayName, value } = condition\n\n let expr\n try {\n expr = this.toConditionExpression(value, parser)\n } catch (cause) {\n throw new ConditionBuildError(displayName, { cause })\n }\n\n const evaluate = (evaluationState: FormState): ConditionEvaluation => {\n const ctx = this.toConditionContext(evaluationState, this.conditions)\n\n try {\n return {\n outcome: (expr.evaluate(ctx) as boolean)\n ? ConditionEvaluationOutcome.True\n : ConditionEvaluationOutcome.False\n }\n } catch (err) {\n return {\n outcome: ConditionEvaluationOutcome.Error,\n error: getErrorMessage(err)\n }\n }\n }\n\n // A failed evaluation continues to route as `false`. `evaluate` exists so\n // that the two can be told apart when recording outcomes for submission.\n const fn = (evaluationState: FormState) =>\n evaluate(evaluationState).outcome === ConditionEvaluationOutcome.True\n\n return {\n name,\n displayName,\n value,\n expr,\n fn,\n evaluate\n }\n }\n\n toConditionContext(\n evaluationState: FormState,\n conditions: Partial<Record<string, ExecutableCondition>>\n ) {\n const context = { ...evaluationState }\n\n for (const conditionId in conditions) {\n const propertyName =\n this.schemaVersion === SchemaVersion.V2\n ? generateConditionAlias(conditionId)\n : conditionId\n\n Object.defineProperty(context, propertyName, {\n get() {\n return conditions[conditionId]?.fn(evaluationState)\n }\n })\n }\n\n return context as Extract<Value, Record<string, Value>>\n }\n\n toConditionExpression(value: ConditionsModelData, parser: Parser) {\n const conditions = ConditionsModel.from(value)\n return parser.parse(conditions.toExpression())\n }\n\n getList(nameOrId: string): List | undefined {\n return this.schemaVersion === SchemaVersion.V1\n ? this.lists.find((list) => list.name === nameOrId)\n : this.lists.find((list) => list.id === nameOrId)\n }\n\n getSection(nameOrId: string): Section | undefined {\n return this.schemaVersion === SchemaVersion.V1\n ? this.sections.find((section) => section.name === nameOrId)\n : this.sections.find((section) => section.id === nameOrId)\n }\n\n /**\n * Form context for the current page\n */\n getFormContext(\n request: FormContextRequest,\n state: FormSubmissionState,\n errors?: FormSubmissionError[],\n translator?: Translator\n ): FormContext {\n const { query } = request\n\n const page = getPage(this, request)\n\n // Determine form paths\n const currentPath = page.path\n const startPath = page.getStartPath()\n\n // Preview URL direct access is allowed\n const isForceAccess = 'force' in query\n\n let context: FormContext = {\n evaluationState: {},\n relevantState: {},\n relevantPages: [],\n payload: page.getFormDataFromState(request, state),\n state,\n paths: [],\n errors,\n isForceAccess,\n data: {},\n pageDefMap: this.pageDefMap,\n listDefMap: this.listDefMap,\n componentDefMap: this.componentDefMap,\n pageMap: this.pageMap,\n componentMap: this.componentMap,\n referenceNumber: getReferenceNumber(state),\n languages: getAvailableLanguages(this.def),\n translator\n }\n\n // Validate current page\n context = validateFormPayload(request, page, context, translator)\n\n // Find start page\n let nextPage = findPage(this, startPath)\n\n this.initialiseContext(context)\n\n // Walk form pages from start\n while (nextPage) {\n // Add page to context\n context.relevantPages.push(nextPage)\n\n this.assignEvaluationState(context, nextPage)\n\n this.assignRelevantState(context, nextPage)\n\n // Stop at current page\n if (\n this.pageStateIsInvalid(context, nextPage, translator) ||\n nextPage.path === currentPath\n ) {\n break\n }\n\n // Apply conditions to determine next page\n nextPage = findPage(this, nextPage.getNextPath(context))\n }\n\n // Validate form state\n context = validateFormState(request, page, context)\n\n // Add paths for navigation\n this.assignPaths(context)\n\n return context\n }\n\n private initialiseContext(context: FormContext) {\n // Initialise `evaluationState` for all keys using empty state.\n // This is because the current condition evaluation library (eval-expr)\n // will throw if an expression uses a key that is undefined.\n const emptyState = Object.freeze({})\n\n for (const page of this.pages) {\n const { collection, pageDef } = page\n\n if (!hasRepeater(pageDef)) {\n Object.assign(\n context.evaluationState,\n collection.getContextValueFromState(emptyState)\n )\n }\n }\n }\n\n private assignEvaluationState(\n context: FormContext,\n page: PageControllerClass\n ) {\n const { collection, pageDef } = page\n // Skip evaluation state for repeater pages\n\n if (!hasRepeater(pageDef)) {\n Object.assign(\n context.evaluationState,\n collection.getContextValueFromState(context.state)\n )\n }\n }\n\n private assignRelevantState(context: FormContext, page: PageControllerClass) {\n // Copy relevant state by expected keys\n for (const key of page.keys) {\n if (typeof context.state[key] !== 'undefined') {\n context.relevantState[key] = context.state[key]\n }\n }\n }\n\n private pageStateIsInvalid(\n context: FormContext,\n page: PageControllerClass,\n translator?: Translator\n ) {\n // Get any list-bound fields on the page\n const listFields = page.collection.fields.filter(hasListFormField)\n\n // For each list field that is bound to a list that contains any conditional items,\n // we need to check any answers are still valid. Do this by evaluating the conditions\n // and ensuring any current answers are all included in the set of valid answers\n for (const field of listFields) {\n const list = field.list\n\n // Filter out YesNo as they can't be conditional\n if (list !== undefined && field.type !== ComponentType.YesNoField) {\n const hasOptionalItems =\n list.items.filter((item) => item.condition).length > 0\n\n if (hasOptionalItems) {\n return this.fieldStateIsInvalid(context, field, list, translator)\n }\n }\n }\n }\n\n private fieldStateIsInvalid(\n context: FormContext,\n field: ListFormComponent,\n list: List,\n translator?: Translator\n ) {\n const { evaluationState, state } = context\n\n const validValues = list.items\n .filter((item) =>\n item.condition\n ? this.conditions[item.condition]?.fn(evaluationState)\n : true\n )\n .map((item) => item.value)\n\n // Get the field state\n const fieldState = field.getFormValueFromState(state)\n\n if (fieldState !== undefined) {\n let isInvalid = false\n const isArray = Array.isArray(fieldState)\n\n // Check if any saved state value(s) are still valid\n // and return true if any are invalid\n if (isArray) {\n isInvalid = !fieldState.every((item) => validValues.includes(item))\n } else {\n isInvalid = !validValues.includes(fieldState)\n }\n\n if (isInvalid) {\n context.errors ??= []\n\n const text = (translator ?? this.createTranslator('en-GB')).t(\n 'errors.optionsMismatch'\n )\n\n context.errors.push({\n text,\n name: field.name,\n href: `#${field.name}`,\n path: [`#${field.name}`]\n })\n }\n\n return isInvalid\n }\n }\n\n private assignPaths(context: FormContext) {\n for (const { keys, path } of context.relevantPages) {\n context.paths.push(path)\n\n // Stop at page with errors\n if (\n context.errors?.some(({ name, path }) => {\n return keys.includes(name) || keys.some((key) => path.includes(key))\n })\n ) {\n break\n }\n }\n }\n\n getComponentById(componentId: string): ComponentDef | undefined {\n return this.componentDefIdMap.get(componentId)\n }\n\n getListById(listId: string): List | undefined {\n return this.listDefIdMap.get(listId)\n }\n\n /**\n * Returns a condition by its ID. O(n) lookup time.\n * @param conditionId\n * @returns\n */\n getConditionById(conditionId: string): ConditionWrapperV2 | undefined {\n return this.def.conditions\n .filter(isConditionWrapperV2)\n .find((condition) => condition.id === conditionId)\n }\n\n /**\n * Checks that only one payment field exists (if any payments fields exist)\n */\n moreThanOnePaymentQuestion() {\n const numOfPaymentFields = this.def.pages\n .flatMap((page) =>\n hasComponentsEvenIfNoNext(page) ? page.components : []\n )\n .filter((comp) => comp.type === ComponentType.PaymentField).length\n return numOfPaymentFields > 1\n }\n}\n\n/**\n * Validate current page only\n */\nfunction validateFormPayload(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext,\n translator?: Translator\n): FormContext {\n const { collection } = page\n const { payload, state } = context\n\n const { action } = page.getFormParams(request)\n\n // Skip validation GET requests or other actions\n if (\n !request.payload ||\n (action &&\n action !== FormAction.Validate &&\n !action.startsWith(FormAction.External))\n ) {\n return context\n }\n\n // For checkbox fields missing in the payload (i.e. unchecked),\n // explicitly set their value to undefined so that any previously\n // stored value is cleared and required field validation is enforced.\n const update = { ...request.payload }\n collection.fields.forEach((field) => {\n if (\n field.type === ComponentType.CheckboxesField &&\n !(field.name in update)\n ) {\n update[field.name] = undefined\n }\n })\n\n const { value, errors } = collection.validate(\n { ...payload, ...update },\n translator\n )\n\n // Add sanitised payload (ready to save)\n const formState = page.getStateFromValidForm(request, state, value)\n\n return {\n ...context,\n payload: merge(payload, value),\n state: merge(state, formState),\n errors\n }\n}\n\n/**\n * Validate entire form state\n */\nfunction validateFormState(\n request: FormContextRequest,\n page: PageControllerClass,\n context: FormContext\n): FormContext {\n const { errors = [], relevantPages, relevantState } = context\n\n // Exclude current page\n const previousPages = relevantPages.filter(\n (relevantPage) => relevantPage !== page\n )\n\n // Validate relevant state\n const { error } = page.model\n .makeFilteredSchema(previousPages)\n .validate(relevantState, { ...opts, stripUnknown: true })\n\n // Add relevant state errors\n if (error) {\n const errorsState = error.details.map((item) => getError(EN_GB, item))\n return { ...context, errors: errors.concat(errorsState) }\n }\n\n return context\n}\n\nfunction getReferenceNumber(state: FormSubmissionState): string {\n if (\n !state.$$__referenceNumber ||\n typeof state.$$__referenceNumber !== 'string'\n ) {\n throw Error('Reference number not found in form state')\n }\n\n return state.$$__referenceNumber\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SchemaVersion } from '@defra/forms-model';
|
|
2
|
+
import { EN_GB } from "../../../constants.js";
|
|
2
3
|
import { PaymentField } from "../components/PaymentField.js";
|
|
3
4
|
import { getAnswer } from "../components/helpers/components.js";
|
|
4
5
|
import { evaluateTemplate, getError, getPageHref } from "../helpers.js";
|
|
@@ -62,7 +63,7 @@ export class SummaryViewModel {
|
|
|
62
63
|
});
|
|
63
64
|
|
|
64
65
|
// Format errors
|
|
65
|
-
this.errors = result.error?.details.map(getError);
|
|
66
|
+
this.errors = result.error?.details.map(item => getError(EN_GB, item));
|
|
66
67
|
this.details = this.summaryDetails(request, sections, translator);
|
|
67
68
|
|
|
68
69
|
// Format check answers
|
|
@@ -164,12 +165,16 @@ function ItemRepeat(page, state, options, translator) {
|
|
|
164
165
|
repeat
|
|
165
166
|
} = page;
|
|
166
167
|
const {
|
|
167
|
-
name
|
|
168
|
-
title
|
|
168
|
+
name
|
|
169
169
|
} = repeat.options;
|
|
170
|
+
const {
|
|
171
|
+
t,
|
|
172
|
+
tPage
|
|
173
|
+
} = translator;
|
|
174
|
+
const title = tPage(page.pageDef, 'repeatTitle') || repeat.options.title;
|
|
170
175
|
const values = page.getListFromState(state);
|
|
171
176
|
const count = values.length;
|
|
172
|
-
const value = count === 0 ? '' :
|
|
177
|
+
const value = count === 0 ? '' : t('pages.repeater.pageTitle', {
|
|
173
178
|
count
|
|
174
179
|
});
|
|
175
180
|
return {
|