@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.js","names":["GeospatialField","PaymentField","getAnswer","formatCurrency","formatPaymentDate","buildMainRecords","items","translator","fieldItems","filter","item","records","field","push","buildPaymentRecords","value","getFormValueFromState","state","name","title","label","undefined","JSON","stringify","format","paymentState","getPaymentStateFromState","description","amount","reference","preAuth","createdAt","buildRepeaterRecords","map","subItems","detailItems","subItem","formValue"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/submission.ts"],"sourcesContent":["import { type SubmitPayload } from '@defra/forms-model'\n\nimport { GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { PaymentField } from '~/src/server/plugins/engine/components/PaymentField.js'\nimport { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport {\n type DetailItem,\n type DetailItemField\n} from '~/src/server/plugins/engine/models/types.js'\nimport {\n formatCurrency,\n formatPaymentDate\n} from '~/src/server/plugins/payment/helper.js'\n\nexport interface SubmitRecord {\n name: string\n title: string\n value: string\n}\n\n/**\n * Builds the main submission records from field items.\n * Regular fields are converted to single records, while PaymentField\n * components are expanded into four separate records.\n */\nexport function buildMainRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitRecord[] {\n const fieldItems = items.filter(\n (item): item is DetailItemField => 'field' in item\n )\n\n const records: SubmitRecord[] = []\n\n for (const item of fieldItems) {\n if (item.field instanceof PaymentField) {\n records.push(...buildPaymentRecords(item))\n } else if (item.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const value = item.field.getFormValueFromState(item.state)\n records.push({\n name: item.name,\n title: item.label,\n value: value === undefined ? '' : JSON.stringify(value)\n })\n } else {\n records.push({\n name: item.name,\n title: item.label,\n value: getAnswer(item.field, item.state, translator, { format: 'data' })\n })\n }\n }\n\n return records\n}\n\n/**\n * Expands a PaymentField into four submission records:\n * - Payment description\n * - Payment amount (formatted with currency symbol)\n * - Payment reference\n * - Payment date (formatted date/time)\n *\n * Returns an empty array if no payment state exists.\n */\nexport function buildPaymentRecords(item: DetailItemField): SubmitRecord[] {\n const paymentState = (item.field as PaymentField).getPaymentStateFromState(\n item.state\n )\n\n if (!paymentState) {\n return []\n }\n\n return [\n {\n name: `${item.name}_paymentDescription`,\n title: 'Payment description',\n value: paymentState.description\n },\n {\n name: `${item.name}_paymentAmount`,\n title: 'Payment amount',\n value: formatCurrency(paymentState.amount)\n },\n {\n name: `${item.name}_paymentReference`,\n title: 'Payment reference',\n value: paymentState.reference\n },\n {\n name: `${item.name}_paymentDate`,\n title: 'Payment date',\n value: paymentState.preAuth?.createdAt\n ? formatPaymentDate(paymentState.preAuth.createdAt)\n : ''\n }\n ]\n}\n\n/**\n * Builds the repeater submission records from repeater items.\n */\nexport function buildRepeaterRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitPayload['repeaters'] {\n return items\n .filter((item) => 'subItems' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n value: item.subItems.map((detailItems) =>\n detailItems.map((subItem) => {\n let value\n\n if (subItem.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const formValue = subItem.field.getFormValueFromState(subItem.state)\n value = formValue === undefined ? '' : JSON.stringify(formValue)\n } else {\n value = getAnswer(subItem.field, subItem.state, translator, {\n format: 'data'\n })\n }\n\n return {\n name: subItem.name,\n title: subItem.label,\n value\n }\n })\n )\n }))\n}\n"],"mappings":"AAEA,SAASA,eAAe;AACxB,SAASC,YAAY;AACrB,SAASC,SAAS;AAMlB,SACEC,cAAc,EACdC,iBAAiB;AASnB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,KAAmB,EACnBC,UAAsB,EACN;EAChB,MAAMC,UAAU,GAAGF,KAAK,CAACG,MAAM,CAC5BC,IAAI,IAA8B,OAAO,IAAIA,IAChD,CAAC;EAED,MAAMC,OAAuB,GAAG,EAAE;EAElC,KAAK,MAAMD,IAAI,IAAIF,UAAU,EAAE;IAC7B,IAAIE,IAAI,CAACE,KAAK,YAAYX,YAAY,EAAE;MACtCU,OAAO,CAACE,IAAI,CAAC,GAAGC,mBAAmB,CAACJ,IAAI,CAAC,CAAC;IAC5C,CAAC,MAAM,IAAIA,IAAI,CAACE,KAAK,YAAYZ,eAAe,EAAE;MAChD;MACA;MACA,MAAMe,KAAK,GAAGL,IAAI,CAACE,KAAK,CAACI,qBAAqB,CAACN,IAAI,CAACO,KAAK,CAAC;MAC1DN,OAAO,CAACE,IAAI,CAAC;QACXK,IAAI,EAAER,IAAI,CAACQ,IAAI;QACfC,KAAK,EAAET,IAAI,CAACU,KAAK;QACjBL,KAAK,EAAEA,KAAK,KAAKM,SAAS,GAAG,EAAE,GAAGC,IAAI,CAACC,SAAS,CAACR,KAAK;MACxD,CAAC,CAAC;IACJ,CAAC,MAAM;MACLJ,OAAO,CAACE,IAAI,CAAC;QACXK,IAAI,EAAER,IAAI,CAACQ,IAAI;QACfC,KAAK,EAAET,IAAI,CAACU,KAAK;QACjBL,KAAK,EAAEb,SAAS,CAACQ,IAAI,CAACE,KAAK,EAAEF,IAAI,CAACO,KAAK,EAAEV,UAAU,EAAE;UAAEiB,MAAM,EAAE;QAAO,CAAC;MACzE,CAAC,CAAC;IACJ;EACF;EAEA,OAAOb,OAAO;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,mBAAmBA,CAACJ,IAAqB,EAAkB;EACzE,MAAMe,YAAY,GAAIf,IAAI,CAACE,KAAK,CAAkBc,wBAAwB,CACxEhB,IAAI,CAACO,KACP,CAAC;EAED,IAAI,CAACQ,YAAY,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,OAAO,CACL;IACEP,IAAI,EAAE,GAAGR,IAAI,CAACQ,IAAI,qBAAqB;IACvCC,KAAK,EAAE,qBAAqB;IAC5BJ,KAAK,EAAEU,YAAY,CAACE;EACtB,CAAC,EACD;IACET,IAAI,EAAE,GAAGR,IAAI,CAACQ,IAAI,gBAAgB;IAClCC,KAAK,EAAE,gBAAgB;IACvBJ,KAAK,EAAEZ,cAAc,CAACsB,YAAY,CAACG,MAAM;EAC3C,CAAC,EACD;IACEV,IAAI,EAAE,GAAGR,IAAI,CAACQ,IAAI,mBAAmB;IACrCC,KAAK,EAAE,mBAAmB;IAC1BJ,KAAK,EAAEU,YAAY,CAACI;EACtB,CAAC,EACD;IACEX,IAAI,EAAE,GAAGR,IAAI,CAACQ,IAAI,cAAc;IAChCC,KAAK,EAAE,cAAc;IACrBJ,KAAK,EAAEU,YAAY,CAACK,OAAO,EAAEC,SAAS,GAClC3B,iBAAiB,CAACqB,YAAY,CAACK,OAAO,CAACC,SAAS,CAAC,GACjD;EACN,CAAC,CACF;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClC1B,KAAmB,EACnBC,UAAsB,EACM;EAC5B,OAAOD,KAAK,CACTG,MAAM,CAAEC,IAAI,IAAK,UAAU,IAAIA,IAAI,CAAC,CACpCuB,GAAG,CAAEvB,IAAI,KAAM;IACdQ,IAAI,EAAER,IAAI,CAACQ,IAAI;IACfC,KAAK,EAAET,IAAI,CAACU,KAAK;IACjBL,KAAK,EAAEL,IAAI,CAACwB,QAAQ,CAACD,GAAG,CAAEE,WAAW,IACnCA,WAAW,CAACF,GAAG,CAAEG,OAAO,IAAK;MAC3B,IAAIrB,KAAK;MAET,IAAIqB,OAAO,CAACxB,KAAK,YAAYZ,eAAe,EAAE;QAC5C;QACA;QACA,MAAMqC,SAAS,GAAGD,OAAO,CAACxB,KAAK,CAACI,qBAAqB,CAACoB,OAAO,CAACnB,KAAK,CAAC;QACpEF,KAAK,GAAGsB,SAAS,KAAKhB,SAAS,GAAG,EAAE,GAAGC,IAAI,CAACC,SAAS,CAACc,SAAS,CAAC;MAClE,CAAC,MAAM;QACLtB,KAAK,GAAGb,SAAS,CAACkC,OAAO,CAACxB,KAAK,EAAEwB,OAAO,CAACnB,KAAK,EAAEV,UAAU,EAAE;UAC1DiB,MAAM,EAAE;QACV,CAAC,CAAC;MACJ;MAEA,OAAO;QACLN,IAAI,EAAEkB,OAAO,CAAClB,IAAI;QAClBC,KAAK,EAAEiB,OAAO,CAAChB,KAAK;QACpBL;MACF,CAAC;IACH,CAAC,CACH;EACF,CAAC,CAAC,CAAC;AACP","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"submission.js","names":["isConditionWrapperV2","GeospatialField","PaymentField","getAnswer","formatCurrency","formatPaymentDate","buildMainRecords","items","translator","fieldItems","filter","item","records","field","push","buildPaymentRecords","value","getFormValueFromState","state","name","title","label","undefined","JSON","stringify","format","paymentState","getPaymentStateFromState","description","amount","reference","preAuth","createdAt","language","buildRepeaterRecords","map","subItems","detailItems","subItem","formValue","buildConditionEvaluations","model","context","evaluationState","def","conditions","flatMap","conditionDef","condition","id","outcome","evaluate","references","collectReferences","conditionId","values","isAnswered","Array","isArray","length","isConditionDataV2","Map","visited","Set","has","add","component","getComponentById","componentId","set","componentName","answered","referenced","getConditionById"],"sources":["../../../../../../src/server/plugins/engine/pageControllers/helpers/submission.ts"],"sourcesContent":["import {\n isConditionWrapperV2,\n type ConditionDataV2,\n type ConditionRefDataV2,\n type ConditionWrapperV2,\n type SubmitConditionEvaluation,\n type SubmitConditionReference,\n type SubmitPayload\n} from '@defra/forms-model'\n\nimport { GeospatialField } from '~/src/server/plugins/engine/components/GeospatialField.js'\nimport { PaymentField } from '~/src/server/plugins/engine/components/PaymentField.js'\nimport { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { type Translator } from '~/src/server/plugins/engine/i18n/types.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport {\n type DetailItem,\n type DetailItemField\n} from '~/src/server/plugins/engine/models/types.js'\nimport {\n type FormContext,\n type FormState,\n type FormStateValue\n} from '~/src/server/plugins/engine/types.js'\nimport {\n formatCurrency,\n formatPaymentDate\n} from '~/src/server/plugins/payment/helper.js'\n\nexport interface SubmitRecord {\n name: string\n title: string\n value: string\n}\n\n/**\n * Builds the main submission records from field items.\n * Regular fields are converted to single records, while PaymentField\n * components are expanded into four separate records.\n */\nexport function buildMainRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitRecord[] {\n const fieldItems = items.filter(\n (item): item is DetailItemField => 'field' in item\n )\n\n const records: SubmitRecord[] = []\n\n for (const item of fieldItems) {\n if (item.field instanceof PaymentField) {\n records.push(...buildPaymentRecords(item, translator))\n } else if (item.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const value = item.field.getFormValueFromState(item.state)\n records.push({\n name: item.name,\n title: item.label,\n value: value === undefined ? '' : JSON.stringify(value)\n })\n } else {\n records.push({\n name: item.name,\n title: item.label,\n value: getAnswer(item.field, item.state, translator, { format: 'data' })\n })\n }\n }\n\n return records\n}\n\n/**\n * Expands a PaymentField into four submission records:\n * - Payment description\n * - Payment amount (formatted with currency symbol)\n * - Payment reference\n * - Payment date (formatted date/time)\n *\n * Returns an empty array if no payment state exists.\n */\nexport function buildPaymentRecords(\n item: DetailItemField,\n translator: Translator\n): SubmitRecord[] {\n const paymentState = (item.field as PaymentField).getPaymentStateFromState(\n item.state\n )\n\n if (!paymentState) {\n return []\n }\n\n return [\n {\n name: `${item.name}_paymentDescription`,\n title: 'Payment description',\n value: paymentState.description\n },\n {\n name: `${item.name}_paymentAmount`,\n title: 'Payment amount',\n value: formatCurrency(paymentState.amount)\n },\n {\n name: `${item.name}_paymentReference`,\n title: 'Payment reference',\n value: paymentState.reference\n },\n {\n name: `${item.name}_paymentDate`,\n title: 'Payment date',\n value: paymentState.preAuth?.createdAt\n ? formatPaymentDate(paymentState.preAuth.createdAt, translator.language)\n : ''\n }\n ]\n}\n\n/**\n * Builds the repeater submission records from repeater items.\n */\nexport function buildRepeaterRecords(\n items: DetailItem[],\n translator: Translator\n): SubmitPayload['repeaters'] {\n return items\n .filter((item) => 'subItems' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n value: item.subItems.map((detailItems) =>\n detailItems.map((subItem) => {\n let value\n\n if (subItem.field instanceof GeospatialField) {\n // Stringify of GeoJSON is done here rather than inside `getContextValueFromState`\n // so we don't incur the overhead of JSON.stringify on every request when building context\n const formValue = subItem.field.getFormValueFromState(subItem.state)\n value = formValue === undefined ? '' : JSON.stringify(formValue)\n } else {\n value = getAnswer(subItem.field, subItem.state, translator, {\n format: 'data'\n })\n }\n\n return {\n name: subItem.name,\n title: subItem.label,\n value\n }\n })\n )\n }))\n}\n\n/**\n * Records the outcome of every condition in the form definition, evaluated\n * against the answers as they stand at the point of submission.\n *\n * Evaluated here rather than by the consumer because only the engine holds\n * the context to evaluate against: `evaluationState` is built by walking the\n * form from its start page along the path taken, applying page conditions as\n * it goes. A consumer receives the flat submitted answers, not that walked\n * state, and reproducing the walk in a second codebase would leave two\n * implementations of the same logic free to diverge.\n *\n * Each record carries the components the condition depends on and whether each\n * was answered. An unanswered question still yields a boolean - negative\n * operators such as \"is not\" return `true` against the seeded `null` - so the\n * outcome alone cannot be read as evidence that the user gave that answer.\n *\n * V2 definitions only. `conditionId` is the V2 condition id, and the\n * references are resolved from the component ids V2 conditions carry - V1\n * conditions reference components by name, and V1 components need not have\n * an id at all.\n */\nexport function buildConditionEvaluations(\n model: FormModel,\n context: FormContext\n): SubmitConditionEvaluation[] {\n const { evaluationState } = context\n\n return model.def.conditions\n .filter(isConditionWrapperV2)\n .flatMap((conditionDef) => {\n const condition = model.conditions[conditionDef.id]\n\n if (!condition) {\n return []\n }\n\n const { outcome } = condition.evaluate(evaluationState)\n\n const references = collectReferences(model, conditionDef, evaluationState)\n\n return {\n conditionId: conditionDef.id,\n outcome,\n references: [...references.values()]\n }\n })\n}\n\n/**\n * Whether a component held an answer at the point a condition was evaluated.\n *\n * The engine seeds every component in `evaluationState` with `null` before the\n * page walk begins, so an unanswered question is present but empty rather than\n * absent.\n * @see {@link FormModel.initialiseContext}\n */\nexport function isAnswered(value: FormStateValue | undefined) {\n if (value === undefined || value === null) {\n return false\n }\n\n if (Array.isArray(value)) {\n return value.length > 0\n }\n\n return value !== ''\n}\n\nfunction isConditionDataV2(\n item: ConditionDataV2 | ConditionRefDataV2\n): item is ConditionDataV2 {\n return 'componentId' in item\n}\n\n/**\n * Recursive function that collects every component a condition depends on, following nested condition\n * references. Results are keyed by component id so a component referenced more\n * than once is reported once.\n */\nfunction collectReferences(\n model: FormModel,\n conditionDef: ConditionWrapperV2,\n evaluationState: FormState,\n references: Map<string, SubmitConditionReference> = new Map<\n string,\n SubmitConditionReference\n >(),\n visited: Set<string> = new Set<string>()\n) {\n if (visited.has(conditionDef.id)) {\n return references\n }\n\n visited.add(conditionDef.id)\n\n for (const item of conditionDef.items) {\n if (isConditionDataV2(item)) {\n const component = model.getComponentById(item.componentId)\n\n // A condition referencing a component that no longer exists cannot be\n // resolved to a name, so there is nothing meaningful to report for it\n if (component) {\n references.set(item.componentId, {\n componentId: item.componentId,\n componentName: component.name,\n answered: isAnswered(evaluationState[component.name])\n })\n }\n\n continue\n }\n\n const referenced = model.getConditionById(item.conditionId)\n\n if (referenced) {\n collectReferences(model, referenced, evaluationState, references, visited)\n }\n }\n\n return references\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,5 +9,5 @@ export declare const opts: ReferenceOptions;
|
|
|
9
9
|
export declare const messageTemplate: ValidationMessages;
|
|
10
10
|
export declare const messages: LanguageMessagesExt;
|
|
11
11
|
export declare const messagesPre: LanguageMessages;
|
|
12
|
-
export declare function buildLanguageMessages(t: (key: string) => string): LanguageMessages;
|
|
12
|
+
export declare function buildLanguageMessages(t: (key: string, options?: Record<string, unknown>) => string): LanguageMessages;
|
|
13
13
|
export declare const validationOptions: ValidationOptions;
|
|
@@ -14,7 +14,7 @@ export const opts = {
|
|
|
14
14
|
* Components that have not yet been migrated to use model.validationMessages still
|
|
15
15
|
* import messageTemplate directly and get the English version.
|
|
16
16
|
*/
|
|
17
|
-
export const messageTemplate = buildValidationMessages(key => t(key, 'en-GB'));
|
|
17
|
+
export const messageTemplate = buildValidationMessages((key, options) => t(key, 'en-GB', options));
|
|
18
18
|
export const messages = {
|
|
19
19
|
'string.base': messageTemplate.required,
|
|
20
20
|
'string.min': messageTemplate.min,
|
|
@@ -39,7 +39,17 @@ export const messages = {
|
|
|
39
39
|
'date.format': messageTemplate.dateFormat,
|
|
40
40
|
'date.min': messageTemplate.dateMin,
|
|
41
41
|
'date.max': messageTemplate.dateMax,
|
|
42
|
-
'
|
|
42
|
+
'array.min': messageTemplate.arrayMin,
|
|
43
|
+
'array.max': messageTemplate.arrayMax,
|
|
44
|
+
'array.length': messageTemplate.arrayLength,
|
|
45
|
+
'features.min': messageTemplate.featuresMin,
|
|
46
|
+
'features.max': messageTemplate.featuresMax,
|
|
47
|
+
'features.length': messageTemplate.featuresLength,
|
|
48
|
+
'files.min': messageTemplate.filesMin,
|
|
49
|
+
'files.max': messageTemplate.filesMax,
|
|
50
|
+
'filees.length': messageTemplate.filesLength,
|
|
51
|
+
'object.invalidjson': messageTemplate.format,
|
|
52
|
+
'phoneNumber.invalid': messageTemplate.format
|
|
43
53
|
};
|
|
44
54
|
export const messagesPre = messages;
|
|
45
55
|
export function buildLanguageMessages(t) {
|
|
@@ -52,6 +62,7 @@ export function buildLanguageMessages(t) {
|
|
|
52
62
|
'string.email': vm.format,
|
|
53
63
|
'string.pattern.base': vm.pattern,
|
|
54
64
|
'string.maxWords': vm.maxWords,
|
|
65
|
+
'string.unicode': vm.unicode,
|
|
55
66
|
'number.base': vm.number,
|
|
56
67
|
'number.precision': vm.numberPrecision,
|
|
57
68
|
'number.integer': vm.numberInteger,
|
|
@@ -67,7 +78,17 @@ export function buildLanguageMessages(t) {
|
|
|
67
78
|
'date.format': vm.dateFormat,
|
|
68
79
|
'date.min': vm.dateMin,
|
|
69
80
|
'date.max': vm.dateMax,
|
|
70
|
-
'
|
|
81
|
+
'array.min': vm.arrayMin,
|
|
82
|
+
'array.max': vm.arrayMax,
|
|
83
|
+
'array.length': vm.arrayLength,
|
|
84
|
+
'features.min': vm.featuresMin,
|
|
85
|
+
'features.max': vm.featuresMax,
|
|
86
|
+
'features.length': vm.featuresLength,
|
|
87
|
+
'files.min': vm.filesMin,
|
|
88
|
+
'files.max': vm.filesMax,
|
|
89
|
+
'files.length': vm.filesLength,
|
|
90
|
+
'object.invalidjson': vm.format,
|
|
91
|
+
'phoneNumber.invalid': vm.format
|
|
71
92
|
};
|
|
72
93
|
}
|
|
73
94
|
export const validationOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validationOptions.js","names":["lowerFirstPreserveProperNouns","buildValidationMessages","t","opts","functions","lowerFirst","messageTemplate","key","messages","required","min","max","format","unicode","pattern","maxWords","number","numberPrecision","numberInteger","numberMin","numberMax","objectRequired","objectMissing","selectRequired","dateFormat","dateMin","dateMax","messagesPre","buildLanguageMessages","vm","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport {\n type LanguageMessages,\n type LanguageMessagesExt,\n type ReferenceOptions,\n type ValidationOptions\n} from 'joi'\n\nimport { lowerFirstPreserveProperNouns } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n buildValidationMessages,\n type ValidationMessages\n} from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\n\nexport const opts = {\n functions: {\n lowerFirst: lowerFirstPreserveProperNouns\n }\n} as ReferenceOptions\n\n/**\n * Module-level English message templates — built via the same factory used per-form.\n * Components that have not yet been migrated to use model.validationMessages still\n * import messageTemplate directly and get the English version.\n */\nexport const messageTemplate: ValidationMessages = buildValidationMessages(\n (key) => t(key, 'en-GB')\n)\n\nexport const messages: LanguageMessagesExt = {\n 'string.base': messageTemplate.required,\n 'string.min': messageTemplate.min,\n 'string.empty': messageTemplate.required,\n 'string.max': messageTemplate.max,\n 'string.email': messageTemplate.format,\n 'string.unicode': messageTemplate.unicode,\n 'string.pattern.base': messageTemplate.pattern,\n 'string.maxWords': messageTemplate.maxWords,\n\n 'number.base': messageTemplate.number,\n 'number.precision': messageTemplate.numberPrecision,\n 'number.integer': messageTemplate.numberInteger,\n 'number.unsafe': messageTemplate.format,\n 'number.min': messageTemplate.numberMin,\n 'number.max': messageTemplate.numberMax,\n\n 'object.required': messageTemplate.objectRequired,\n 'object.and': messageTemplate.objectMissing,\n\n 'any.only': messageTemplate.selectRequired,\n 'any.required': messageTemplate.selectRequired,\n 'any.empty': messageTemplate.required,\n\n 'date.base': messageTemplate.dateFormat,\n 'date.format': messageTemplate.dateFormat,\n 'date.min': messageTemplate.dateMin,\n 'date.max': messageTemplate.dateMax,\n\n 'object.invalidjson': messageTemplate.format\n}\n\nexport const messagesPre: LanguageMessages =\n messages as unknown as LanguageMessages\n\nexport function buildLanguageMessages(\n t: (key: string) => string\n): LanguageMessages {\n const vm = buildValidationMessages(t)\n return {\n 'string.base': vm.required,\n 'string.min': vm.min,\n 'string.empty': vm.required,\n 'string.max': vm.max,\n 'string.email': vm.format,\n 'string.pattern.base': vm.pattern,\n 'string.maxWords': vm.maxWords,\n 'number.base': vm.number,\n 'number.precision': vm.numberPrecision,\n 'number.integer': vm.numberInteger,\n 'number.unsafe': vm.format,\n 'number.min': vm.numberMin,\n 'number.max': vm.numberMax,\n 'object.required': vm.objectRequired,\n 'object.and': vm.objectMissing,\n 'any.only': vm.selectRequired,\n 'any.required': vm.selectRequired,\n 'any.empty': vm.required,\n 'date.base': vm.dateFormat,\n 'date.format': vm.dateFormat,\n 'date.min': vm.dateMin,\n 'date.max': vm.dateMax,\n 'object.invalidjson': vm.format\n } as unknown as LanguageMessages\n}\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages: messagesPre,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"AAAA;;AASA,SAASA,6BAA6B;AACtC,SACEC,uBAAuB;AAGzB,SAASC,CAAC;AAEV,OAAO,MAAMC,IAAI,GAAG;EAClBC,SAAS,EAAE;IACTC,UAAU,EAAEL;EACd;AACF,CAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMM,eAAmC,GAAGL,uBAAuB,
|
|
1
|
+
{"version":3,"file":"validationOptions.js","names":["lowerFirstPreserveProperNouns","buildValidationMessages","t","opts","functions","lowerFirst","messageTemplate","key","options","messages","required","min","max","format","unicode","pattern","maxWords","number","numberPrecision","numberInteger","numberMin","numberMax","objectRequired","objectMissing","selectRequired","dateFormat","dateMin","dateMax","arrayMin","arrayMax","arrayLength","featuresMin","featuresMax","featuresLength","filesMin","filesMax","filesLength","messagesPre","buildLanguageMessages","vm","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport {\n type LanguageMessages,\n type LanguageMessagesExt,\n type ReferenceOptions,\n type ValidationOptions\n} from 'joi'\n\nimport { lowerFirstPreserveProperNouns } from '~/src/server/plugins/engine/components/helpers/index.js'\nimport {\n buildValidationMessages,\n type ValidationMessages\n} from '~/src/server/plugins/engine/i18n/buildValidationMessages.js'\nimport { t } from '~/src/server/plugins/engine/i18n/index.js'\n\nexport const opts = {\n functions: {\n lowerFirst: lowerFirstPreserveProperNouns\n }\n} as ReferenceOptions\n\n/**\n * Module-level English message templates — built via the same factory used per-form.\n * Components that have not yet been migrated to use model.validationMessages still\n * import messageTemplate directly and get the English version.\n */\nexport const messageTemplate: ValidationMessages = buildValidationMessages(\n (key, options) => t(key, 'en-GB', options)\n)\n\nexport const messages: LanguageMessagesExt = {\n 'string.base': messageTemplate.required,\n 'string.min': messageTemplate.min,\n 'string.empty': messageTemplate.required,\n 'string.max': messageTemplate.max,\n 'string.email': messageTemplate.format,\n 'string.unicode': messageTemplate.unicode,\n 'string.pattern.base': messageTemplate.pattern,\n 'string.maxWords': messageTemplate.maxWords,\n\n 'number.base': messageTemplate.number,\n 'number.precision': messageTemplate.numberPrecision,\n 'number.integer': messageTemplate.numberInteger,\n 'number.unsafe': messageTemplate.format,\n 'number.min': messageTemplate.numberMin,\n 'number.max': messageTemplate.numberMax,\n\n 'object.required': messageTemplate.objectRequired,\n 'object.and': messageTemplate.objectMissing,\n\n 'any.only': messageTemplate.selectRequired,\n 'any.required': messageTemplate.selectRequired,\n 'any.empty': messageTemplate.required,\n\n 'date.base': messageTemplate.dateFormat,\n 'date.format': messageTemplate.dateFormat,\n 'date.min': messageTemplate.dateMin,\n 'date.max': messageTemplate.dateMax,\n\n 'array.min': messageTemplate.arrayMin,\n 'array.max': messageTemplate.arrayMax,\n 'array.length': messageTemplate.arrayLength,\n\n 'features.min': messageTemplate.featuresMin,\n 'features.max': messageTemplate.featuresMax,\n 'features.length': messageTemplate.featuresLength,\n\n 'files.min': messageTemplate.filesMin,\n 'files.max': messageTemplate.filesMax,\n 'filees.length': messageTemplate.filesLength,\n\n 'object.invalidjson': messageTemplate.format,\n\n 'phoneNumber.invalid': messageTemplate.format\n}\n\nexport const messagesPre: LanguageMessages =\n messages as unknown as LanguageMessages\n\nexport function buildLanguageMessages(\n t: (key: string, options?: Record<string, unknown>) => string\n): LanguageMessages {\n const vm = buildValidationMessages(t)\n return {\n 'string.base': vm.required,\n 'string.min': vm.min,\n 'string.empty': vm.required,\n 'string.max': vm.max,\n 'string.email': vm.format,\n 'string.pattern.base': vm.pattern,\n 'string.maxWords': vm.maxWords,\n 'string.unicode': vm.unicode,\n 'number.base': vm.number,\n 'number.precision': vm.numberPrecision,\n 'number.integer': vm.numberInteger,\n 'number.unsafe': vm.format,\n 'number.min': vm.numberMin,\n 'number.max': vm.numberMax,\n 'object.required': vm.objectRequired,\n 'object.and': vm.objectMissing,\n 'any.only': vm.selectRequired,\n 'any.required': vm.selectRequired,\n 'any.empty': vm.required,\n 'date.base': vm.dateFormat,\n 'date.format': vm.dateFormat,\n 'date.min': vm.dateMin,\n 'date.max': vm.dateMax,\n 'array.min': vm.arrayMin,\n 'array.max': vm.arrayMax,\n 'array.length': vm.arrayLength,\n 'features.min': vm.featuresMin,\n 'features.max': vm.featuresMax,\n 'features.length': vm.featuresLength,\n 'files.min': vm.filesMin,\n 'files.max': vm.filesMax,\n 'files.length': vm.filesLength,\n 'object.invalidjson': vm.format,\n 'phoneNumber.invalid': vm.format\n } as unknown as LanguageMessages\n}\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages: messagesPre,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { validatePluginOptions } from "./options.js";
|
|
2
|
+
import { generateUniqueReference } from "./referenceNumbers.js";
|
|
2
3
|
import { getRoutes as getFileUploadStatusRoutes } from "./routes/file-upload.js";
|
|
3
4
|
import { makeLoadFormPreHandler } from "./routes/index.js";
|
|
4
5
|
import { getRoutes as getPaymentRoutes } from "./routes/payment.js";
|
|
@@ -21,6 +22,7 @@ export const plugin = {
|
|
|
21
22
|
cache,
|
|
22
23
|
saveAndExit,
|
|
23
24
|
getLanguage,
|
|
25
|
+
generateReferenceNumber,
|
|
24
26
|
nunjucks: nunjucksOptions,
|
|
25
27
|
viewContext,
|
|
26
28
|
preparePageEventRequestOptions,
|
|
@@ -61,6 +63,7 @@ export const plugin = {
|
|
|
61
63
|
server.expose('cacheService', cacheService);
|
|
62
64
|
server.expose('saveAndExit', saveAndExit);
|
|
63
65
|
server.expose('getLanguage', getLanguage);
|
|
66
|
+
server.expose('generateReferenceNumber', generateReferenceNumber ?? generateUniqueReference);
|
|
64
67
|
server.expose('baseUrl', baseUrl);
|
|
65
68
|
server.expose('services', services);
|
|
66
69
|
server.app.model = model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":["validatePluginOptions","getRoutes","getFileUploadStatusRoutes","makeLoadFormPreHandler","getPaymentRoutes","getQuestionRoutes","getRepeaterItemDeleteRoutes","getRepeaterSummaryRoutes","registerUnavailableResponse","registerVision","mapPlugin","postcodeLookupPlugin","CacheService","plugin","name","dependencies","multiple","register","server","options","model","cache","saveAndExit","getLanguage","nunjucks","nunjucksOptions","viewContext","preparePageEventRequestOptions","onRequest","ordnanceSurveyApiKey","baseUrl","ordnanceSurveyApiSecret","services","cacheService","cacheName","expose","baseLayoutPath","app","itemCache","Map","models","loadFormPreHandler","getRouteOptions","pre","method","postRouteOptions","payload","parse","routes","route"],"sources":["../../../../src/server/plugins/engine/plugin.ts"],"sourcesContent":["import {\n type Lifecycle,\n type Plugin,\n type RouteOptions,\n type Server,\n type ServerRoute\n} from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { validatePluginOptions } from '~/src/server/plugins/engine/options.js'\nimport { getRoutes as getFileUploadStatusRoutes } from '~/src/server/plugins/engine/routes/file-upload.js'\nimport { makeLoadFormPreHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport { getRoutes as getPaymentRoutes } from '~/src/server/plugins/engine/routes/payment.js'\nimport { getRoutes as getQuestionRoutes } from '~/src/server/plugins/engine/routes/questions.js'\nimport { getRoutes as getRepeaterItemDeleteRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'\nimport { getRoutes as getRepeaterSummaryRoutes } from '~/src/server/plugins/engine/routes/repeaters/summary.js'\nimport { type PluginOptions } from '~/src/server/plugins/engine/types.js'\nimport { registerUnavailableResponse } from '~/src/server/plugins/engine/unavailable-response.js'\nimport { registerVision } from '~/src/server/plugins/engine/vision.js'\nimport { mapPlugin } from '~/src/server/plugins/map/index.js'\nimport { postcodeLookupPlugin } from '~/src/server/plugins/postcode-lookup/index.js'\nimport {\n type FormRequestPayloadRefs,\n type FormRequestRefs\n} from '~/src/server/routes/types.js'\nimport { CacheService } from '~/src/server/services/index.js'\n\nexport const plugin = {\n name: '@defra/forms-engine-plugin',\n dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],\n multiple: true,\n async register(server: Server, options: PluginOptions) {\n options = validatePluginOptions(options)\n\n const {\n model,\n cache,\n saveAndExit,\n getLanguage,\n nunjucks: nunjucksOptions,\n viewContext,\n preparePageEventRequestOptions,\n onRequest,\n ordnanceSurveyApiKey,\n baseUrl,\n ordnanceSurveyApiSecret,\n services\n } = options\n\n const cacheService =\n typeof cache === 'string'\n ? new CacheService({ server, cacheName: cache })\n : cache\n\n await registerVision(server, options)\n\n // Register the postcode lookup plugin only if we have an OS api key\n if (ordnanceSurveyApiKey) {\n await server.register({\n plugin: postcodeLookupPlugin,\n options: {\n ordnanceSurveyApiKey\n }\n })\n }\n\n // Register the maps plugin only if we have an OS api key & secret\n if (ordnanceSurveyApiKey && ordnanceSurveyApiSecret) {\n await server.register({\n plugin: mapPlugin,\n options: {\n ordnanceSurveyApiKey,\n ordnanceSurveyApiSecret\n }\n })\n }\n\n server.expose('baseLayoutPath', nunjucksOptions.baseLayoutPath)\n server.expose('viewContext', viewContext)\n server.expose('cacheService', cacheService)\n server.expose('saveAndExit', saveAndExit)\n server.expose('getLanguage', getLanguage)\n server.expose('baseUrl', baseUrl)\n server.expose('services', services)\n\n server.app.model = model\n\n // In-memory cache of FormModel items, exposed\n // (for testing purposes) through `server.app.models`\n const itemCache = new Map<string, { model: FormModel; updatedAt: Date }>()\n server.app.models = itemCache\n\n const loadFormPreHandler = makeLoadFormPreHandler(server, options)\n\n const getRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestRefs>\n }\n ]\n }\n\n const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {\n payload: {\n parse: true\n },\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestPayloadRefs>\n }\n ]\n }\n\n const routes = [\n ...getPaymentRoutes(),\n ...getFileUploadStatusRoutes(),\n ...getRepeaterSummaryRoutes(getRouteOptions, postRouteOptions, onRequest),\n ...getRepeaterItemDeleteRoutes(\n getRouteOptions,\n postRouteOptions,\n onRequest\n ),\n\n ...getQuestionRoutes(\n getRouteOptions,\n postRouteOptions,\n preparePageEventRequestOptions,\n onRequest\n )\n ]\n\n server.route(routes as unknown as ServerRoute[]) // TODO\n\n // Registration order is important: must be registered after the engine's\n // routes so it sees their responses, but before any global error-page\n // handler that would re-shape Boom errors.\n registerUnavailableResponse(server)\n }\n} satisfies Plugin<PluginOptions>\n"],"mappings":"AASA,SAASA,qBAAqB;AAC9B,SAASC,SAAS,IAAIC,yBAAyB;AAC/C,SAASC,sBAAsB;AAC/B,SAASF,SAAS,IAAIG,gBAAgB;AACtC,SAASH,SAAS,IAAII,iBAAiB;AACvC,SAASJ,SAAS,IAAIK,2BAA2B;AACjD,SAASL,SAAS,IAAIM,wBAAwB;AAE9C,SAASC,2BAA2B;AACpC,SAASC,cAAc;AACvB,SAASC,SAAS;AAClB,SAASC,oBAAoB;AAK7B,SAASC,YAAY;AAErB,OAAO,MAAMC,MAAM,GAAG;EACpBC,IAAI,EAAE,4BAA4B;EAClCC,YAAY,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC;EACvDC,QAAQ,EAAE,IAAI;EACd,MAAMC,QAAQA,CAACC,MAAc,EAAEC,OAAsB,EAAE;IACrDA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.js","names":["validatePluginOptions","generateUniqueReference","getRoutes","getFileUploadStatusRoutes","makeLoadFormPreHandler","getPaymentRoutes","getQuestionRoutes","getRepeaterItemDeleteRoutes","getRepeaterSummaryRoutes","registerUnavailableResponse","registerVision","mapPlugin","postcodeLookupPlugin","CacheService","plugin","name","dependencies","multiple","register","server","options","model","cache","saveAndExit","getLanguage","generateReferenceNumber","nunjucks","nunjucksOptions","viewContext","preparePageEventRequestOptions","onRequest","ordnanceSurveyApiKey","baseUrl","ordnanceSurveyApiSecret","services","cacheService","cacheName","expose","baseLayoutPath","app","itemCache","Map","models","loadFormPreHandler","getRouteOptions","pre","method","postRouteOptions","payload","parse","routes","route"],"sources":["../../../../src/server/plugins/engine/plugin.ts"],"sourcesContent":["import {\n type Lifecycle,\n type Plugin,\n type RouteOptions,\n type Server,\n type ServerRoute\n} from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { validatePluginOptions } from '~/src/server/plugins/engine/options.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport { getRoutes as getFileUploadStatusRoutes } from '~/src/server/plugins/engine/routes/file-upload.js'\nimport { makeLoadFormPreHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport { getRoutes as getPaymentRoutes } from '~/src/server/plugins/engine/routes/payment.js'\nimport { getRoutes as getQuestionRoutes } from '~/src/server/plugins/engine/routes/questions.js'\nimport { getRoutes as getRepeaterItemDeleteRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'\nimport { getRoutes as getRepeaterSummaryRoutes } from '~/src/server/plugins/engine/routes/repeaters/summary.js'\nimport { type PluginOptions } from '~/src/server/plugins/engine/types.js'\nimport { registerUnavailableResponse } from '~/src/server/plugins/engine/unavailable-response.js'\nimport { registerVision } from '~/src/server/plugins/engine/vision.js'\nimport { mapPlugin } from '~/src/server/plugins/map/index.js'\nimport { postcodeLookupPlugin } from '~/src/server/plugins/postcode-lookup/index.js'\nimport {\n type FormRequestPayloadRefs,\n type FormRequestRefs\n} from '~/src/server/routes/types.js'\nimport { CacheService } from '~/src/server/services/index.js'\n\nexport const plugin = {\n name: '@defra/forms-engine-plugin',\n dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],\n multiple: true,\n async register(server: Server, options: PluginOptions) {\n options = validatePluginOptions(options)\n\n const {\n model,\n cache,\n saveAndExit,\n getLanguage,\n generateReferenceNumber,\n nunjucks: nunjucksOptions,\n viewContext,\n preparePageEventRequestOptions,\n onRequest,\n ordnanceSurveyApiKey,\n baseUrl,\n ordnanceSurveyApiSecret,\n services\n } = options\n\n const cacheService =\n typeof cache === 'string'\n ? new CacheService({ server, cacheName: cache })\n : cache\n\n await registerVision(server, options)\n\n // Register the postcode lookup plugin only if we have an OS api key\n if (ordnanceSurveyApiKey) {\n await server.register({\n plugin: postcodeLookupPlugin,\n options: {\n ordnanceSurveyApiKey\n }\n })\n }\n\n // Register the maps plugin only if we have an OS api key & secret\n if (ordnanceSurveyApiKey && ordnanceSurveyApiSecret) {\n await server.register({\n plugin: mapPlugin,\n options: {\n ordnanceSurveyApiKey,\n ordnanceSurveyApiSecret\n }\n })\n }\n\n server.expose('baseLayoutPath', nunjucksOptions.baseLayoutPath)\n server.expose('viewContext', viewContext)\n server.expose('cacheService', cacheService)\n server.expose('saveAndExit', saveAndExit)\n server.expose('getLanguage', getLanguage)\n server.expose(\n 'generateReferenceNumber',\n generateReferenceNumber ?? generateUniqueReference\n )\n server.expose('baseUrl', baseUrl)\n server.expose('services', services)\n\n server.app.model = model\n\n // In-memory cache of FormModel items, exposed\n // (for testing purposes) through `server.app.models`\n const itemCache = new Map<string, { model: FormModel; updatedAt: Date }>()\n server.app.models = itemCache\n\n const loadFormPreHandler = makeLoadFormPreHandler(server, options)\n\n const getRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestRefs>\n }\n ]\n }\n\n const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {\n payload: {\n parse: true\n },\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestPayloadRefs>\n }\n ]\n }\n\n const routes = [\n ...getPaymentRoutes(),\n ...getFileUploadStatusRoutes(),\n ...getRepeaterSummaryRoutes(getRouteOptions, postRouteOptions, onRequest),\n ...getRepeaterItemDeleteRoutes(\n getRouteOptions,\n postRouteOptions,\n onRequest\n ),\n\n ...getQuestionRoutes(\n getRouteOptions,\n postRouteOptions,\n preparePageEventRequestOptions,\n onRequest\n )\n ]\n\n server.route(routes as unknown as ServerRoute[]) // TODO\n\n // Registration order is important: must be registered after the engine's\n // routes so it sees their responses, but before any global error-page\n // handler that would re-shape Boom errors.\n registerUnavailableResponse(server)\n }\n} satisfies Plugin<PluginOptions>\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
2
|
import { RegExpMatcher, englishDataset, englishRecommendedTransformers } from 'obscenity';
|
|
3
|
+
export const DEFAULT_REFERENCE_NUMBER = 'XXX-XXX-XXX';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceNumbers.js","names":["randomBytes","RegExpMatcher","englishDataset","englishRecommendedTransformers","convertToDecAlpha","strCodes","validChars","strLen","length","outArray","forEach","code","pos","push","charAt","join","generateUniqueReference","prefix","segmentLength","segmentCount","profanityMatcher","build","referenceNumber","segments","Array","from","slice","toUpperCase","hasMatch","replaceAll"],"sources":["../../../../src/server/plugins/engine/referenceNumbers.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto'\n\nimport {\n RegExpMatcher,\n englishDataset,\n englishRecommendedTransformers\n} from 'obscenity'\n\n/**\n * To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed.\n * @param strCodes - array of binary input values\n */\nexport function convertToDecAlpha(strCodes: number[]) {\n const validChars = 'ABCDEFHJKLMNPRSTUVWXYZ23456789'\n const strLen = validChars.length\n const outArray = [] as string[]\n\n strCodes.forEach((code) => {\n const pos = (code / 256) * strLen\n outArray.push(validChars.charAt(pos))\n })\n\n return outArray.join('')\n}\n\n/**\n * Generates a reference number in the format of `XXX-XXX-XXX`, or `PREFIX-XXX-XXX` if a prefix is provided.\n * Provides no guarantee on uniqueness.\n * To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed\n * (see https://gunkies.org/wiki/DEC_alphabet )\n */\nexport function generateUniqueReference(prefix?: string) {\n const segmentLength = 3\n const segmentCount = prefix ? 2 : 3\n prefix = prefix ? `${prefix}-` : ''\n\n const profanityMatcher = new RegExpMatcher({\n ...englishDataset.build(),\n ...englishRecommendedTransformers\n })\n\n let referenceNumber\n\n do {\n const segments = Array.from({ length: segmentCount }, () =>\n convertToDecAlpha([...randomBytes(segmentLength)]).slice(\n 0,\n segmentLength * 2\n )\n )\n\n referenceNumber = `${prefix}${segments.join('-')}`.toUpperCase()\n } while (profanityMatcher.hasMatch(referenceNumber.replaceAll('-', '')))\n\n return referenceNumber\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,aAAa;AAEzC,SACEC,aAAa,EACbC,cAAc,EACdC,8BAA8B,QACzB,WAAW;;
|
|
1
|
+
{"version":3,"file":"referenceNumbers.js","names":["randomBytes","RegExpMatcher","englishDataset","englishRecommendedTransformers","DEFAULT_REFERENCE_NUMBER","convertToDecAlpha","strCodes","validChars","strLen","length","outArray","forEach","code","pos","push","charAt","join","generateUniqueReference","prefix","segmentLength","segmentCount","profanityMatcher","build","referenceNumber","segments","Array","from","slice","toUpperCase","hasMatch","replaceAll"],"sources":["../../../../src/server/plugins/engine/referenceNumbers.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto'\n\nimport {\n RegExpMatcher,\n englishDataset,\n englishRecommendedTransformers\n} from 'obscenity'\n\nexport const DEFAULT_REFERENCE_NUMBER = 'XXX-XXX-XXX'\n\n/**\n * To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed.\n * @param strCodes - array of binary input values\n */\nexport function convertToDecAlpha(strCodes: number[]) {\n const validChars = 'ABCDEFHJKLMNPRSTUVWXYZ23456789'\n const strLen = validChars.length\n const outArray = [] as string[]\n\n strCodes.forEach((code) => {\n const pos = (code / 256) * strLen\n outArray.push(validChars.charAt(pos))\n })\n\n return outArray.join('')\n}\n\n/**\n * Generates a reference number in the format of `XXX-XXX-XXX`, or `PREFIX-XXX-XXX` if a prefix is provided.\n * Provides no guarantee on uniqueness.\n * To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed\n * (see https://gunkies.org/wiki/DEC_alphabet )\n */\nexport function generateUniqueReference(prefix?: string) {\n const segmentLength = 3\n const segmentCount = prefix ? 2 : 3\n prefix = prefix ? `${prefix}-` : ''\n\n const profanityMatcher = new RegExpMatcher({\n ...englishDataset.build(),\n ...englishRecommendedTransformers\n })\n\n let referenceNumber\n\n do {\n const segments = Array.from({ length: segmentCount }, () =>\n convertToDecAlpha([...randomBytes(segmentLength)]).slice(\n 0,\n segmentLength * 2\n )\n )\n\n referenceNumber = `${prefix}${segments.join('-')}`.toUpperCase()\n } while (profanityMatcher.hasMatch(referenceNumber.replaceAll('-', '')))\n\n return referenceNumber\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,aAAa;AAEzC,SACEC,aAAa,EACbC,cAAc,EACdC,8BAA8B,QACzB,WAAW;AAElB,OAAO,MAAMC,wBAAwB,GAAG,aAAa;;AAErD;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAACC,QAAkB,EAAE;EACpD,MAAMC,UAAU,GAAG,gCAAgC;EACnD,MAAMC,MAAM,GAAGD,UAAU,CAACE,MAAM;EAChC,MAAMC,QAAQ,GAAG,EAAc;EAE/BJ,QAAQ,CAACK,OAAO,CAAEC,IAAI,IAAK;IACzB,MAAMC,GAAG,GAAID,IAAI,GAAG,GAAG,GAAIJ,MAAM;IACjCE,QAAQ,CAACI,IAAI,CAACP,UAAU,CAACQ,MAAM,CAACF,GAAG,CAAC,CAAC;EACvC,CAAC,CAAC;EAEF,OAAOH,QAAQ,CAACM,IAAI,CAAC,EAAE,CAAC;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAACC,MAAe,EAAE;EACvD,MAAMC,aAAa,GAAG,CAAC;EACvB,MAAMC,YAAY,GAAGF,MAAM,GAAG,CAAC,GAAG,CAAC;EACnCA,MAAM,GAAGA,MAAM,GAAG,GAAGA,MAAM,GAAG,GAAG,EAAE;EAEnC,MAAMG,gBAAgB,GAAG,IAAIpB,aAAa,CAAC;IACzC,GAAGC,cAAc,CAACoB,KAAK,CAAC,CAAC;IACzB,GAAGnB;EACL,CAAC,CAAC;EAEF,IAAIoB,eAAe;EAEnB,GAAG;IACD,MAAMC,QAAQ,GAAGC,KAAK,CAACC,IAAI,CAAC;MAAEjB,MAAM,EAAEW;IAAa,CAAC,EAAE,MACpDf,iBAAiB,CAAC,CAAC,GAAGL,WAAW,CAACmB,aAAa,CAAC,CAAC,CAAC,CAACQ,KAAK,CACtD,CAAC,EACDR,aAAa,GAAG,CAClB,CACF,CAAC;IAEDI,eAAe,GAAG,GAAGL,MAAM,GAAGM,QAAQ,CAACR,IAAI,CAAC,GAAG,CAAC,EAAE,CAACY,WAAW,CAAC,CAAC;EAClE,CAAC,QAAQP,gBAAgB,CAACQ,QAAQ,CAACN,eAAe,CAACO,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;EAEvE,OAAOP,eAAe;AACxB","ignoreList":[]}
|
|
@@ -3,15 +3,16 @@ import Boom from '@hapi/boom';
|
|
|
3
3
|
import { EXTERNAL_STATE_APPENDAGE, EXTERNAL_STATE_PAYLOAD } from "../../../constants.js";
|
|
4
4
|
import { FormComponent, isFormState } from "../components/FormComponent.js";
|
|
5
5
|
import { resolveFormModel } from "../form-context.js";
|
|
6
|
-
import { checkFormStatus, findPage, getCacheService, getPage, getStartPath, proceed } from "../helpers.js";
|
|
6
|
+
import { checkFormStatus, findPage, getCacheService, getPage, getPluginOptions, getStartPath, proceed } from "../helpers.js";
|
|
7
7
|
import { checkSaveAndExitRepeater, copyNotYetValidatedState } from "../pageControllers/helpers/state.js";
|
|
8
|
-
import {
|
|
8
|
+
import { DEFAULT_REFERENCE_NUMBER } from "../referenceNumbers.js";
|
|
9
9
|
import * as defaultServices from "../services/index.js";
|
|
10
10
|
import { resolveLanguage } from "../../../utils/utils.js";
|
|
11
11
|
export async function redirectOrMakeHandler(request, h, onRequest, makeHandler) {
|
|
12
12
|
const {
|
|
13
13
|
app,
|
|
14
|
-
params
|
|
14
|
+
params,
|
|
15
|
+
query
|
|
15
16
|
} = request;
|
|
16
17
|
const {
|
|
17
18
|
model
|
|
@@ -27,7 +28,11 @@ export async function redirectOrMakeHandler(request, h, onRequest, makeHandler)
|
|
|
27
28
|
if (typeof prefix !== 'string') {
|
|
28
29
|
throw Boom.badImplementation('Reference number prefix must be a string or undefined');
|
|
29
30
|
}
|
|
30
|
-
const
|
|
31
|
+
const isForce = 'force' in query;
|
|
32
|
+
const {
|
|
33
|
+
generateReferenceNumber
|
|
34
|
+
} = getPluginOptions(request.server);
|
|
35
|
+
const referenceNumber = isForce ? DEFAULT_REFERENCE_NUMBER : await generateReferenceNumber(prefix);
|
|
31
36
|
state = await page.mergeState(request, state, {
|
|
32
37
|
$$__referenceNumber: referenceNumber
|
|
33
38
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["isPaymentPage","Boom","EXTERNAL_STATE_APPENDAGE","EXTERNAL_STATE_PAYLOAD","FormComponent","isFormState","resolveFormModel","checkFormStatus","findPage","getCacheService","getPage","getStartPath","proceed","checkSaveAndExitRepeater","copyNotYetValidatedState","generateUniqueReference","defaultServices","resolveLanguage","redirectOrMakeHandler","request","h","onRequest","makeHandler","app","params","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","importExternalComponentState","flash","getFlash","language","translator","createTranslator","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","result","continue","resumeInRepeaterUrl","startsWith","pageDef","isForceAccess","redirectTo","next","length","query","returnUrl","getHref","externalComponentData","yar","Array","isArray","typedStateAppendage","componentName","component","stateAppendage","data","componentMap","get","Error","TypeError","isStateValid","isState","componentState","isAppendageStateSingleObject","Object","fromEntries","entries","map","key","value","savedState","payload","stashedPayload","localState","getStateFromValidForm","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","ordnanceSurveyApiKey","handler","slug","isPreview","formState","routePrefix","dispatchHandler","servicePath","basePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import { isPaymentPage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\n\nimport {\n EXTERNAL_STATE_APPENDAGE,\n EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { resolveFormModel } from '~/src/server/plugins/engine/form-context.js'\nimport {\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n checkSaveAndExitRepeater,\n copyNotYetValidatedState\n} from '~/src/server/plugins/engine/pageControllers/helpers/state.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type ExternalStateAppendage,\n type FormContext,\n type FormPayload,\n type FormSubmissionState,\n type OnRequestCallback,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n onRequest: OnRequestCallback | undefined,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const referenceNumber = generateUniqueReference(prefix)\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n state = await importExternalComponentState(request, page, state)\n\n const flash = cacheService.getFlash(request)\n const language = resolveLanguage(request)\n const translator = model.createTranslator(language)\n const context = model.getFormContext(\n request,\n state,\n flash?.errors,\n translator\n )\n\n await copyNotYetValidatedState(request, context)\n\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n const result = await onRequest(request, h, context)\n if (result !== h.continue) {\n return result\n }\n }\n\n // Check whether save-and-exit should resume from within a repeater\n const resumeInRepeaterUrl = checkSaveAndExitRepeater(context, model)\n if (resumeInRepeaterUrl) {\n return proceed(request, h, resumeInRepeaterUrl)\n }\n\n // Return handler for relevant pages, payment pages, or preview URL direct access.\n // Payment pages are skipped in the normal page walk but must render when the user\n // is redirected there from CYA \"Pay and submit\".\n if (\n relevantPath.startsWith(page.path) ||\n isPaymentPage(page.pageDef) ||\n context.isForceAccess\n ) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nasync function importExternalComponentState(\n request: AnyFormRequest,\n page: PageControllerClass,\n state: FormSubmissionState\n): Promise<FormSubmissionState> {\n const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE)\n\n if (Array.isArray(externalComponentData)) {\n return state\n }\n\n const typedStateAppendage = externalComponentData as ExternalStateAppendage\n const componentName = typedStateAppendage.component\n const stateAppendage = typedStateAppendage.data\n\n const component = request.app.model?.componentMap.get(componentName)\n\n if (!component) {\n throw new Error(`Component ${componentName} not found in form`)\n }\n\n if (!(component instanceof FormComponent)) {\n throw new TypeError(\n `Component ${componentName} is not a FormComponent and does not support isState`\n )\n }\n\n const isStateValid = component.isState(stateAppendage)\n\n if (!isStateValid) {\n throw new Error(`State for component ${componentName} is invalid`)\n }\n\n // Create state structure from appendage state\n // Some components use a record structure with properties of the format of '<compName>__<fieldName>'\n // e.g. UKAddressField\n // Some components use a single object structure e.g. PaymentField\n const componentState =\n isFormState(stateAppendage) && !component.isAppendageStateSingleObject\n ? Object.fromEntries(\n Object.entries(stateAppendage).map(([key, value]) => [\n `${componentName}__${key}`,\n value\n ])\n )\n : { [componentName]: stateAppendage }\n\n // Save the external component state directly (already has correct key format)\n const savedState = await page.mergeState(request, state, componentState)\n\n // Merge any stashed payload into the local state\n const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD)\n const stashedPayload = Array.isArray(payload) ? {} : (payload as FormPayload)\n\n const localState = page.getStateFromValidForm(request, savedState, {\n ...stashedPayload,\n ...componentState\n } as FormPayload)\n\n return { ...savedState, ...localState }\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const {\n services = defaultServices,\n controllers,\n ordnanceSurveyApiKey\n } = options\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n const model = await resolveFormModel(server, slug, formState, {\n services,\n controllers,\n ordnanceSurveyApiKey,\n routePrefix: prefix,\n isPreview\n })\n\n request.app.model = model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,oBAAoB;AAClD,OAAOC,IAAI,MAAM,YAAY;AAO7B,SACEC,wBAAwB,EACxBC,sBAAsB;AAExB,SACEC,aAAa,EACbC,WAAW;AAEb,SAASC,gBAAgB;AACzB,SACEC,eAAe,EACfC,QAAQ,EACRC,eAAe,EACfC,OAAO,EACPC,YAAY,EACZC,OAAO;AAGT,SACEC,wBAAwB,EACxBC,wBAAwB;AAE1B,SAASC,uBAAuB;AAChC,OAAO,KAAKC,eAAe;AAc3B,SAASC,eAAe;AAExB,OAAO,eAAeC,qBAAqBA,CACzCC,OAAuB,EACvBC,CAAsB,EACtBC,SAAwC,EACxCC,WAG6C,EAC7C;EACA,MAAM;IAAEC,GAAG;IAAEC;EAAO,CAAC,GAAGL,OAAO;EAC/B,MAAM;IAAEM;EAAM,CAAC,GAAGF,GAAG;EAErB,IAAI,CAACE,KAAK,EAAE;IACV,MAAMxB,IAAI,CAACyB,QAAQ,CAAC,uBAAuBF,MAAM,CAACG,IAAI,EAAE,CAAC;EAC3D;EAEA,MAAMC,YAAY,GAAGnB,eAAe,CAACU,OAAO,CAACU,MAAM,CAAC;EACpD,MAAMC,IAAI,GAAGpB,OAAO,CAACe,KAAK,EAAEN,OAAO,CAAC;EACpC,IAAIY,KAAK,GAAG,MAAMD,IAAI,CAACE,QAAQ,CAACb,OAAO,CAAC;EAExC,IAAI,CAACY,KAAK,CAACE,mBAAmB,EAAE;IAC9B,MAAMC,MAAM,GAAGT,KAAK,CAACU,GAAG,CAACC,QAAQ,EAAEC,qBAAqB,IAAI,EAAE;IAE9D,IAAI,OAAOH,MAAM,KAAK,QAAQ,EAAE;MAC9B,MAAMjC,IAAI,CAACqC,iBAAiB,CAC1B,uDACF,CAAC;IACH;IAEA,MAAMC,eAAe,GAAGxB,uBAAuB,CAACmB,MAAM,CAAC;IACvDH,KAAK,GAAG,MAAMD,IAAI,CAACU,UAAU,CAACrB,OAAO,EAAEY,KAAK,EAAE;MAC5CE,mBAAmB,EAAEM;IACvB,CAAC,CAAC;EACJ;EAEAR,KAAK,GAAG,MAAMU,4BAA4B,CAACtB,OAAO,EAAEW,IAAI,EAAEC,KAAK,CAAC;EAEhE,MAAMW,KAAK,GAAGd,YAAY,CAACe,QAAQ,CAACxB,OAAO,CAAC;EAC5C,MAAMyB,QAAQ,GAAG3B,eAAe,CAACE,OAAO,CAAC;EACzC,MAAM0B,UAAU,GAAGpB,KAAK,CAACqB,gBAAgB,CAACF,QAAQ,CAAC;EACnD,MAAMG,OAAO,GAAGtB,KAAK,CAACuB,cAAc,CAClC7B,OAAO,EACPY,KAAK,EACLW,KAAK,EAAEO,MAAM,EACbJ,UACF,CAAC;EAED,MAAM/B,wBAAwB,CAACK,OAAO,EAAE4B,OAAO,CAAC;EAEhD,MAAMG,YAAY,GAAGpB,IAAI,CAACqB,eAAe,CAAChC,OAAO,EAAE4B,OAAO,CAAC;EAC3D,MAAMK,WAAW,GAAGtB,IAAI,CAACuB,cAAc,CAAC,CAAC;;EAEzC;EACA,IAAIhC,SAAS,EAAE;IACb,MAAMiC,MAAM,GAAG,MAAMjC,SAAS,CAACF,OAAO,EAAEC,CAAC,EAAE2B,OAAO,CAAC;IACnD,IAAIO,MAAM,KAAKlC,CAAC,CAACmC,QAAQ,EAAE;MACzB,OAAOD,MAAM;IACf;EACF;;EAEA;EACA,MAAME,mBAAmB,GAAG3C,wBAAwB,CAACkC,OAAO,EAAEtB,KAAK,CAAC;EACpE,IAAI+B,mBAAmB,EAAE;IACvB,OAAO5C,OAAO,CAACO,OAAO,EAAEC,CAAC,EAAEoC,mBAAmB,CAAC;EACjD;;EAEA;EACA;EACA;EACA,IACEN,YAAY,CAACO,UAAU,CAAC3B,IAAI,CAACH,IAAI,CAAC,IAClC3B,aAAa,CAAC8B,IAAI,CAAC4B,OAAO,CAAC,IAC3BX,OAAO,CAACY,aAAa,EACrB;IACA,OAAOrC,WAAW,CAACQ,IAAI,EAAEiB,OAAO,CAAC;EACnC;;EAEA;EACA,MAAMa,UAAU,GAAGpD,QAAQ,CAACiB,KAAK,EAAEyB,YAAY,CAAC;EAChD;EACA,IAAIU,UAAU,EAAEC,IAAI,CAACC,MAAM,EAAE;IAC3B3C,OAAO,CAAC4C,KAAK,CAACC,SAAS,GAAGlC,IAAI,CAACmC,OAAO,CAACb,WAAW,CAAC;EACrD;EAEA,OAAOxC,OAAO,CAACO,OAAO,EAAEC,CAAC,EAAEU,IAAI,CAACmC,OAAO,CAACf,YAAY,CAAC,CAAC;AACxD;AAEA,eAAeT,4BAA4BA,CACzCtB,OAAuB,EACvBW,IAAyB,EACzBC,KAA0B,EACI;EAC9B,MAAMmC,qBAAqB,GAAG/C,OAAO,CAACgD,GAAG,CAACzB,KAAK,CAACxC,wBAAwB,CAAC;EAEzE,IAAIkE,KAAK,CAACC,OAAO,CAACH,qBAAqB,CAAC,EAAE;IACxC,OAAOnC,KAAK;EACd;EAEA,MAAMuC,mBAAmB,GAAGJ,qBAA+C;EAC3E,MAAMK,aAAa,GAAGD,mBAAmB,CAACE,SAAS;EACnD,MAAMC,cAAc,GAAGH,mBAAmB,CAACI,IAAI;EAE/C,MAAMF,SAAS,GAAGrD,OAAO,CAACI,GAAG,CAACE,KAAK,EAAEkD,YAAY,CAACC,GAAG,CAACL,aAAa,CAAC;EAEpE,IAAI,CAACC,SAAS,EAAE;IACd,MAAM,IAAIK,KAAK,CAAC,aAAaN,aAAa,oBAAoB,CAAC;EACjE;EAEA,IAAI,EAAEC,SAAS,YAAYpE,aAAa,CAAC,EAAE;IACzC,MAAM,IAAI0E,SAAS,CACjB,aAAaP,aAAa,sDAC5B,CAAC;EACH;EAEA,MAAMQ,YAAY,GAAGP,SAAS,CAACQ,OAAO,CAACP,cAAc,CAAC;EAEtD,IAAI,CAACM,YAAY,EAAE;IACjB,MAAM,IAAIF,KAAK,CAAC,uBAAuBN,aAAa,aAAa,CAAC;EACpE;;EAEA;EACA;EACA;EACA;EACA,MAAMU,cAAc,GAClB5E,WAAW,CAACoE,cAAc,CAAC,IAAI,CAACD,SAAS,CAACU,4BAA4B,GAClEC,MAAM,CAACC,WAAW,CAChBD,MAAM,CAACE,OAAO,CAACZ,cAAc,CAAC,CAACa,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK,CACnD,GAAGjB,aAAa,KAAKgB,GAAG,EAAE,EAC1BC,KAAK,CACN,CACH,CAAC,GACD;IAAE,CAACjB,aAAa,GAAGE;EAAe,CAAC;;EAEzC;EACA,MAAMgB,UAAU,GAAG,MAAM3D,IAAI,CAACU,UAAU,CAACrB,OAAO,EAAEY,KAAK,EAAEkD,cAAc,CAAC;;EAExE;EACA,MAAMS,OAAO,GAAGvE,OAAO,CAACgD,GAAG,CAACzB,KAAK,CAACvC,sBAAsB,CAAC;EACzD,MAAMwF,cAAc,GAAGvB,KAAK,CAACC,OAAO,CAACqB,OAAO,CAAC,GAAG,CAAC,CAAC,GAAIA,OAAuB;EAE7E,MAAME,UAAU,GAAG9D,IAAI,CAAC+D,qBAAqB,CAAC1E,OAAO,EAAEsE,UAAU,EAAE;IACjE,GAAGE,cAAc;IACjB,GAAGV;EACL,CAAgB,CAAC;EAEjB,OAAO;IAAE,GAAGQ,UAAU;IAAE,GAAGG;EAAW,CAAC;AACzC;AAEA,OAAO,SAASE,sBAAsBA,CAACjE,MAAc,EAAEkE,OAAsB,EAAE;EAC7E;EACA,MAAM7D,MAAM,GAAGL,MAAM,CAACmE,KAAK,CAACC,SAAS,CAACC,KAAK,CAAChE,MAAM,IAAI,EAAE;EAExD,MAAM;IACJiE,QAAQ,GAAGnF,eAAe;IAC1BoF,WAAW;IACXC;EACF,CAAC,GAAGN,OAAO;EAEX,eAAeO,OAAOA,CAACnF,OAAuB,EAAEC,CAAkB,EAAE;IAClE,IAAIS,MAAM,CAACN,GAAG,CAACE,KAAK,EAAE;MACpBN,OAAO,CAACI,GAAG,CAACE,KAAK,GAAGI,MAAM,CAACN,GAAG,CAACE,KAAK;MAEpC,OAAOL,CAAC,CAACmC,QAAQ;IACnB;IAEA,MAAM;MAAE/B;IAAO,CAAC,GAAGL,OAAO;IAC1B,MAAM;MAAEoF;IAAK,CAAC,GAAG/E,MAAM;IACvB,MAAM;MAAEgF,SAAS;MAAEzE,KAAK,EAAE0E;IAAU,CAAC,GAAGlG,eAAe,CAACiB,MAAM,CAAC;IAE/D,MAAMC,KAAK,GAAG,MAAMnB,gBAAgB,CAACuB,MAAM,EAAE0E,IAAI,EAAEE,SAAS,EAAE;MAC5DN,QAAQ;MACRC,WAAW;MACXC,oBAAoB;MACpBK,WAAW,EAAExE,MAAM;MACnBsE;IACF,CAAC,CAAC;IAEFrF,OAAO,CAACI,GAAG,CAACE,KAAK,GAAGA,KAAK;IAEzB,OAAOL,CAAC,CAACmC,QAAQ;EACnB;EAEA,OAAO+C,OAAO;AAChB;AAEA,OAAO,SAASK,eAAeA,CAACxF,OAAoB,EAAEC,CAAsB,EAAE;EAC5E,MAAM;IAAEK;EAAM,CAAC,GAAGN,OAAO,CAACI,GAAG;EAE7B,MAAMqF,WAAW,GAAGnF,KAAK,GAAG,IAAIA,KAAK,CAACoF,QAAQ,EAAE,GAAG,EAAE;EACrD,OAAOjG,OAAO,CAACO,OAAO,EAAEC,CAAC,EAAE,GAAGwF,WAAW,GAAGjG,YAAY,CAACc,KAAK,CAAC,EAAE,CAAC;AACpE","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isPaymentPage","Boom","EXTERNAL_STATE_APPENDAGE","EXTERNAL_STATE_PAYLOAD","FormComponent","isFormState","resolveFormModel","checkFormStatus","findPage","getCacheService","getPage","getPluginOptions","getStartPath","proceed","checkSaveAndExitRepeater","copyNotYetValidatedState","DEFAULT_REFERENCE_NUMBER","defaultServices","resolveLanguage","redirectOrMakeHandler","request","h","onRequest","makeHandler","app","params","query","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","isForce","generateReferenceNumber","referenceNumber","mergeState","importExternalComponentState","flash","getFlash","language","translator","createTranslator","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","result","continue","resumeInRepeaterUrl","startsWith","pageDef","isForceAccess","redirectTo","next","length","returnUrl","getHref","externalComponentData","yar","Array","isArray","typedStateAppendage","componentName","component","stateAppendage","data","componentMap","get","Error","TypeError","isStateValid","isState","componentState","isAppendageStateSingleObject","Object","fromEntries","entries","map","key","value","savedState","payload","stashedPayload","localState","getStateFromValidForm","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","ordnanceSurveyApiKey","handler","slug","isPreview","formState","routePrefix","dispatchHandler","servicePath","basePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import { isPaymentPage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\n\nimport {\n EXTERNAL_STATE_APPENDAGE,\n EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport { resolveFormModel } from '~/src/server/plugins/engine/form-context.js'\nimport {\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getPluginOptions,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n checkSaveAndExitRepeater,\n copyNotYetValidatedState\n} from '~/src/server/plugins/engine/pageControllers/helpers/state.js'\nimport { DEFAULT_REFERENCE_NUMBER } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type ExternalStateAppendage,\n type FormContext,\n type FormPayload,\n type FormSubmissionState,\n type OnRequestCallback,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n onRequest: OnRequestCallback | undefined,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params, query } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const isForce = 'force' in query\n const { generateReferenceNumber } = getPluginOptions(request.server)\n const referenceNumber = isForce\n ? DEFAULT_REFERENCE_NUMBER\n : await generateReferenceNumber(prefix)\n\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n state = await importExternalComponentState(request, page, state)\n\n const flash = cacheService.getFlash(request)\n const language = resolveLanguage(request)\n const translator = model.createTranslator(language)\n const context = model.getFormContext(\n request,\n state,\n flash?.errors,\n translator\n )\n\n await copyNotYetValidatedState(request, context)\n\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n const result = await onRequest(request, h, context)\n if (result !== h.continue) {\n return result\n }\n }\n\n // Check whether save-and-exit should resume from within a repeater\n const resumeInRepeaterUrl = checkSaveAndExitRepeater(context, model)\n if (resumeInRepeaterUrl) {\n return proceed(request, h, resumeInRepeaterUrl)\n }\n\n // Return handler for relevant pages, payment pages, or preview URL direct access.\n // Payment pages are skipped in the normal page walk but must render when the user\n // is redirected there from CYA \"Pay and submit\".\n if (\n relevantPath.startsWith(page.path) ||\n isPaymentPage(page.pageDef) ||\n context.isForceAccess\n ) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nasync function importExternalComponentState(\n request: AnyFormRequest,\n page: PageControllerClass,\n state: FormSubmissionState\n): Promise<FormSubmissionState> {\n const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE)\n\n if (Array.isArray(externalComponentData)) {\n return state\n }\n\n const typedStateAppendage = externalComponentData as ExternalStateAppendage\n const componentName = typedStateAppendage.component\n const stateAppendage = typedStateAppendage.data\n\n const component = request.app.model?.componentMap.get(componentName)\n\n if (!component) {\n throw new Error(`Component ${componentName} not found in form`)\n }\n\n if (!(component instanceof FormComponent)) {\n throw new TypeError(\n `Component ${componentName} is not a FormComponent and does not support isState`\n )\n }\n\n const isStateValid = component.isState(stateAppendage)\n\n if (!isStateValid) {\n throw new Error(`State for component ${componentName} is invalid`)\n }\n\n // Create state structure from appendage state\n // Some components use a record structure with properties of the format of '<compName>__<fieldName>'\n // e.g. UKAddressField\n // Some components use a single object structure e.g. PaymentField\n const componentState =\n isFormState(stateAppendage) && !component.isAppendageStateSingleObject\n ? Object.fromEntries(\n Object.entries(stateAppendage).map(([key, value]) => [\n `${componentName}__${key}`,\n value\n ])\n )\n : { [componentName]: stateAppendage }\n\n // Save the external component state directly (already has correct key format)\n const savedState = await page.mergeState(request, state, componentState)\n\n // Merge any stashed payload into the local state\n const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD)\n const stashedPayload = Array.isArray(payload) ? {} : (payload as FormPayload)\n\n const localState = page.getStateFromValidForm(request, savedState, {\n ...stashedPayload,\n ...componentState\n } as FormPayload)\n\n return { ...savedState, ...localState }\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const {\n services = defaultServices,\n controllers,\n ordnanceSurveyApiKey\n } = options\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n const model = await resolveFormModel(server, slug, formState, {\n services,\n controllers,\n ordnanceSurveyApiKey,\n routePrefix: prefix,\n isPreview\n })\n\n request.app.model = model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,8 +10,9 @@ export let FileStatus = /*#__PURE__*/function (FileStatus) {
|
|
|
10
10
|
FileStatus["pending"] = "pending";
|
|
11
11
|
return FileStatus;
|
|
12
12
|
}({});
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
|
|
14
|
+
// Changed from an enum to enforce numeric values
|
|
15
|
+
export const FormAdapterSubmissionSchemaVersion = {
|
|
16
|
+
V1: 1
|
|
17
|
+
};
|
|
17
18
|
//# sourceMappingURL=enums.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enums.js","names":["UploadStatus","FileStatus","FormAdapterSubmissionSchemaVersion"],"sources":["../../../../../src/server/plugins/engine/types/enums.ts"],"sourcesContent":["export enum UploadStatus {\n initiated = 'initiated',\n pending = 'pending',\n ready = 'ready'\n}\n\nexport enum FileStatus {\n complete = 'complete',\n rejected = 'rejected',\n pending = 'pending'\n}\n\
|
|
1
|
+
{"version":3,"file":"enums.js","names":["UploadStatus","FileStatus","FormAdapterSubmissionSchemaVersion","V1"],"sources":["../../../../../src/server/plugins/engine/types/enums.ts"],"sourcesContent":["export enum UploadStatus {\n initiated = 'initiated',\n pending = 'pending',\n ready = 'ready'\n}\n\nexport enum FileStatus {\n complete = 'complete',\n rejected = 'rejected',\n pending = 'pending'\n}\n\n// Changed from an enum to enforce numeric values\nexport const FormAdapterSubmissionSchemaVersion = {\n V1: 1\n} as const satisfies Record<string, number>\n"],"mappings":"AAAA,WAAYA,YAAY,0BAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAZA,YAAY;EAAA,OAAZA,YAAY;AAAA;AAMxB,WAAYC,UAAU,0BAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAVA,UAAU;EAAA,OAAVA,UAAU;AAAA;;AAMtB;AACA,OAAO,MAAMC,kCAAkC,GAAG;EAChDC,EAAE,EAAE;AACN,CAA2C","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FormStatus, formVersionMetadataSchema, idSchema, notificationEmailAddressSchema, slugSchema, titleSchema } from '@defra/forms-model';
|
|
1
|
+
import { FormStatus, formSubmitConditionEvaluationSchema, formVersionMetadataSchema, idSchema, notificationEmailAddressSchema, slugSchema, titleSchema } from '@defra/forms-model';
|
|
2
2
|
import Joi from 'joi';
|
|
3
3
|
import { FormAdapterSubmissionSchemaVersion } from "./enums.js";
|
|
4
4
|
export const formAdapterSubmissionMessageMetaSchema = Joi.object().keys({
|
|
5
|
-
schemaVersion: Joi.
|
|
5
|
+
schemaVersion: Joi.number().valid(...Object.values(FormAdapterSubmissionSchemaVersion)).required(),
|
|
6
6
|
timestamp: Joi.date().required(),
|
|
7
7
|
referenceNumber: Joi.string().required(),
|
|
8
8
|
formName: titleSchema,
|
|
@@ -13,7 +13,11 @@ export const formAdapterSubmissionMessageMetaSchema = Joi.object().keys({
|
|
|
13
13
|
notificationEmail: notificationEmailAddressSchema.required(),
|
|
14
14
|
versionMetadata: formVersionMetadataSchema.optional(),
|
|
15
15
|
language: Joi.string().optional(),
|
|
16
|
-
custom: Joi.object().pattern(/^/, Joi.any()).unknown().optional().description('Custom properties for the message')
|
|
16
|
+
custom: Joi.object().pattern(/^/, Joi.any()).unknown().optional().description('Custom properties for the message'),
|
|
17
|
+
auth: Joi.object({
|
|
18
|
+
sub: Joi.string().required(),
|
|
19
|
+
issuer: Joi.string().required()
|
|
20
|
+
}).optional()
|
|
17
21
|
});
|
|
18
22
|
export const formAdapterSubmissionMessageDataSchema = Joi.object().keys({
|
|
19
23
|
main: Joi.object(),
|
|
@@ -23,6 +27,7 @@ export const formAdapterSubmissionMessageDataSchema = Joi.object().keys({
|
|
|
23
27
|
reference: Joi.string().required(),
|
|
24
28
|
amount: Joi.number().required(),
|
|
25
29
|
description: Joi.string().required(),
|
|
30
|
+
descriptionInEng: Joi.string().optional(),
|
|
26
31
|
createdAt: Joi.string().required()
|
|
27
32
|
}).optional(),
|
|
28
33
|
files: Joi.object().pattern(Joi.string(), Joi.array().items(Joi.object().keys({
|
|
@@ -40,6 +45,12 @@ export const formAdapterSubmissionMessageResultSchema = Joi.object().keys({
|
|
|
40
45
|
export const formAdapterSubmissionMessagePayloadSchema = Joi.object().keys({
|
|
41
46
|
meta: formAdapterSubmissionMessageMetaSchema.required(),
|
|
42
47
|
data: formAdapterSubmissionMessageDataSchema.required(),
|
|
43
|
-
result: formAdapterSubmissionMessageResultSchema.required()
|
|
48
|
+
result: formAdapterSubmissionMessageResultSchema.required(),
|
|
49
|
+
// Optional so that messages published before this existed - which may
|
|
50
|
+
// still be in flight or sitting on a dead-letter queue - continue to
|
|
51
|
+
// validate. Consumers treat its absence as "resolve the recipients from
|
|
52
|
+
// the form definition yourself"
|
|
53
|
+
// This should be required at a later point in time.
|
|
54
|
+
conditionEvaluations: Joi.array().items(formSubmitConditionEvaluationSchema).optional().description('Outcome of every condition in the form definition, evaluated against the final answers at submission')
|
|
44
55
|
});
|
|
45
56
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":["FormStatus","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","
|
|
1
|
+
{"version":3,"file":"schema.js","names":["FormStatus","formSubmitConditionEvaluationSchema","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","number","valid","Object","values","required","timestamp","date","referenceNumber","string","formName","formId","formSlug","status","isPreview","boolean","notificationEmail","versionMetadata","optional","language","custom","pattern","any","unknown","description","auth","sub","issuer","formAdapterSubmissionMessageDataSchema","main","repeaters","payment","paymentId","reference","amount","descriptionInEng","createdAt","files","array","items","fileName","fileId","userDownloadLink","formAdapterSubmissionMessageResultSchema","formAdapterSubmissionMessagePayloadSchema","meta","data","result","conditionEvaluations"],"sources":["../../../../../src/server/plugins/engine/types/schema.ts"],"sourcesContent":["import {\n FormStatus,\n formSubmitConditionEvaluationSchema,\n formVersionMetadataSchema,\n idSchema,\n notificationEmailAddressSchema,\n slugSchema,\n titleSchema\n} from '@defra/forms-model'\nimport Joi from 'joi'\n\nimport { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'\nimport {\n type FormAdapterSubmissionMessageData,\n type FormAdapterSubmissionMessageMeta,\n type FormAdapterSubmissionMessagePayload,\n type FormAdapterSubmissionMessageResult\n} from '~/src/server/plugins/engine/types.js'\n\nexport const formAdapterSubmissionMessageMetaSchema =\n Joi.object<FormAdapterSubmissionMessageMeta>().keys({\n schemaVersion: Joi.number()\n .valid(...Object.values(FormAdapterSubmissionSchemaVersion))\n .required(),\n timestamp: Joi.date().required(),\n referenceNumber: Joi.string().required(),\n formName: titleSchema,\n formId: idSchema,\n formSlug: slugSchema,\n status: Joi.string()\n .valid(...Object.values(FormStatus))\n .required(),\n isPreview: Joi.boolean().required(),\n notificationEmail: notificationEmailAddressSchema.required(),\n versionMetadata: formVersionMetadataSchema.optional(),\n language: Joi.string().optional(),\n custom: Joi.object()\n .pattern(/^/, Joi.any())\n .unknown()\n .optional()\n .description('Custom properties for the message'),\n auth: Joi.object({\n sub: Joi.string().required(),\n issuer: Joi.string().required()\n }).optional()\n })\n\nexport const formAdapterSubmissionMessageDataSchema =\n Joi.object<FormAdapterSubmissionMessageData>().keys({\n main: Joi.object(),\n repeaters: Joi.object(),\n payment: Joi.object()\n .keys({\n paymentId: Joi.string().required(),\n reference: Joi.string().required(),\n amount: Joi.number().required(),\n description: Joi.string().required(),\n descriptionInEng: Joi.string().optional(),\n createdAt: Joi.string().required()\n })\n .optional(),\n files: Joi.object().pattern(\n Joi.string(),\n Joi.array().items(\n Joi.object().keys({\n fileName: Joi.string().required(),\n fileId: Joi.string().required(),\n userDownloadLink: Joi.string().required()\n })\n )\n )\n })\n\nexport const formAdapterSubmissionMessageResultSchema =\n Joi.object<FormAdapterSubmissionMessageResult>().keys({\n files: Joi.object()\n .keys({\n main: Joi.string().required(),\n repeaters: Joi.object()\n })\n .required()\n })\n\nexport const formAdapterSubmissionMessagePayloadSchema =\n Joi.object<FormAdapterSubmissionMessagePayload>().keys({\n meta: formAdapterSubmissionMessageMetaSchema.required(),\n data: formAdapterSubmissionMessageDataSchema.required(),\n result: formAdapterSubmissionMessageResultSchema.required(),\n // Optional so that messages published before this existed - which may\n // still be in flight or sitting on a dead-letter queue - continue to\n // validate. Consumers treat its absence as \"resolve the recipients from\n // the form definition yourself\"\n // This should be required at a later point in time.\n conditionEvaluations: Joi.array()\n .items(formSubmitConditionEvaluationSchema)\n .optional()\n .description(\n 'Outcome of every condition in the form definition, evaluated against the final answers at submission'\n )\n })\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ComponentDef, type Event, type FormVersionMetadata, type Item, type List, type Page, type PaymentFieldComponent, type UkAddressFieldComponent } from '@defra/forms-model';
|
|
1
|
+
import { type ComponentDef, type Event, type FormVersionMetadata, type Item, type List, type Page, type PaymentFieldComponent, type SubmitConditionEvaluation, type UkAddressFieldComponent } from '@defra/forms-model';
|
|
2
2
|
import { type PluginProperties, type Request, type RequestQuery, type ResponseObject } from '@hapi/hapi';
|
|
3
3
|
import { type Yar } from '@hapi/yar';
|
|
4
4
|
import { type JoiExpression, type ValidationErrorItem } from 'joi';
|
|
@@ -167,10 +167,14 @@ export type FileUpload = {
|
|
|
167
167
|
contentLength: number;
|
|
168
168
|
} & ({
|
|
169
169
|
fileStatus: FileStatus.complete | FileStatus.rejected | FileStatus.pending;
|
|
170
|
+
errorCode?: string;
|
|
170
171
|
errorMessage?: string;
|
|
172
|
+
errorParams?: Record<string, number | string | string[]>;
|
|
171
173
|
} | {
|
|
172
174
|
fileStatus: FileStatus.complete;
|
|
175
|
+
errorCode?: string;
|
|
173
176
|
errorMessage?: undefined;
|
|
177
|
+
errorParams?: Record<string, number | string | string[]>;
|
|
174
178
|
});
|
|
175
179
|
export interface FileUploadMetadata {
|
|
176
180
|
retrievalKey: string;
|
|
@@ -349,6 +353,7 @@ export type PreparePageEventRequestOptions = (options: RequestOptions, event: Ev
|
|
|
349
353
|
export type OnRequestCallback = (request: AnyFormRequest, h: FormResponseToolkit, context: FormContext) => ResponseObject | FormResponseToolkit['continue'] | Promise<ResponseObject | FormResponseToolkit['continue']>;
|
|
350
354
|
export type SaveAndExitHandler = (request: FormRequestPayload, h: FormResponseToolkit, context: FormContext) => ResponseObject;
|
|
351
355
|
export type GetLanguageHandler = (query?: RequestQuery, yar?: Yar) => string;
|
|
356
|
+
export type GenerateReferenceNumberHandler = (prefix?: string) => Promise<string>;
|
|
352
357
|
export interface ExternalArgs {
|
|
353
358
|
component: ComponentDef;
|
|
354
359
|
controller: QuestionPageController;
|
|
@@ -387,12 +392,13 @@ export interface PluginOptions {
|
|
|
387
392
|
preparePageEventRequestOptions?: PreparePageEventRequestOptions;
|
|
388
393
|
onRequest?: OnRequestCallback;
|
|
389
394
|
getLanguage?: GetLanguageHandler;
|
|
395
|
+
generateReferenceNumber?: GenerateReferenceNumberHandler;
|
|
390
396
|
baseUrl: string;
|
|
391
397
|
ordnanceSurveyApiKey?: string;
|
|
392
398
|
ordnanceSurveyApiSecret?: string;
|
|
393
399
|
}
|
|
394
400
|
export interface FormAdapterSubmissionMessageMeta {
|
|
395
|
-
schemaVersion: FormAdapterSubmissionSchemaVersion;
|
|
401
|
+
schemaVersion: (typeof FormAdapterSubmissionSchemaVersion)[keyof typeof FormAdapterSubmissionSchemaVersion];
|
|
396
402
|
timestamp: Date;
|
|
397
403
|
referenceNumber: string;
|
|
398
404
|
formName: string;
|
|
@@ -404,6 +410,10 @@ export interface FormAdapterSubmissionMessageMeta {
|
|
|
404
410
|
versionMetadata?: FormVersionMetadata;
|
|
405
411
|
language?: string;
|
|
406
412
|
custom?: Record<string, unknown>;
|
|
413
|
+
auth?: {
|
|
414
|
+
sub: string;
|
|
415
|
+
issuer: string;
|
|
416
|
+
};
|
|
407
417
|
}
|
|
408
418
|
export type FormAdapterSubmissionMessageMetaSerialised = Omit<FormAdapterSubmissionMessageMeta, 'schemaVersion' | 'timestamp' | 'status'> & {
|
|
409
419
|
schemaVersion: number;
|
|
@@ -420,6 +430,7 @@ export interface FormAdapterPayment {
|
|
|
420
430
|
reference: string;
|
|
421
431
|
amount: number;
|
|
422
432
|
description: string;
|
|
433
|
+
descriptionInEng?: string;
|
|
423
434
|
createdAt: string;
|
|
424
435
|
}
|
|
425
436
|
export interface FormAdapterSubmissionMessageResult {
|
|
@@ -451,6 +462,17 @@ export interface FormAdapterSubmissionMessagePayload {
|
|
|
451
462
|
meta: FormAdapterSubmissionMessageMeta;
|
|
452
463
|
data: FormAdapterSubmissionMessageData;
|
|
453
464
|
result: FormAdapterSubmissionMessageResult;
|
|
465
|
+
/**
|
|
466
|
+
* The outcome of every condition in the form definition, evaluated against
|
|
467
|
+
* the final answers at the point of submission.
|
|
468
|
+
*
|
|
469
|
+
* Always emitted, empty when there is nothing to report - a V1-engine form
|
|
470
|
+
* has no stable condition ids to record against. Optional only for
|
|
471
|
+
* backwards compatibility: a message published before this existed carries
|
|
472
|
+
* no evaluations at all, and consumers fall back to resolving the recipients
|
|
473
|
+
* from the form definition themselves.
|
|
474
|
+
*/
|
|
475
|
+
conditionEvaluations?: SubmitConditionEvaluation[];
|
|
454
476
|
}
|
|
455
477
|
export interface FormAdapterSubmissionMessage extends FormAdapterSubmissionMessagePayload {
|
|
456
478
|
messageId: string;
|