@defra/forms-engine-plugin 4.23.0 → 5.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/assets-manifest.json +3 -5
- package/.public/javascripts/im-core.min.js +2 -0
- package/.public/javascripts/im-core.min.js.map +1 -0
- package/.public/javascripts/shared.min.js +1 -1
- 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/stylesheets/application.min.css +1 -1
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/geospatial-map.js +8 -6
- package/.server/client/javascripts/geospatial-map.js.map +1 -1
- package/.server/client/javascripts/location-map.js +8 -1
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/client/javascripts/map.d.ts +6 -0
- package/.server/client/javascripts/map.js +10 -0
- package/.server/client/javascripts/map.js.map +1 -1
- package/.server/client/javascripts/sssi-dataset.d.ts +34 -0
- package/.server/client/javascripts/sssi-dataset.js +101 -0
- package/.server/client/javascripts/sssi-dataset.js.map +1 -0
- package/.server/client/stylesheets/shared.scss +0 -2
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/.server/server/forms/simple-form.yaml +106 -3
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +11 -11
- package/.server/server/plugins/engine/components/AutocompleteField.js +2 -2
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +3 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +4 -9
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -7
- package/.server/server/plugins/engine/components/ComponentCollection.js +106 -51
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +8 -6
- package/.server/server/plugins/engine/components/DatePartsField.js +27 -9
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +13 -11
- package/.server/server/plugins/engine/components/DeclarationField.js +31 -9
- package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +8 -5
- package/.server/server/plugins/engine/components/EastingNorthingField.js +42 -22
- package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +11 -14
- package/.server/server/plugins/engine/components/EmailAddressField.js +2 -2
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +14 -12
- package/.server/server/plugins/engine/components/FileUploadField.js +22 -12
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.d.ts +21 -12
- package/.server/server/plugins/engine/components/FormComponent.js +33 -14
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +15 -12
- package/.server/server/plugins/engine/components/GeospatialField.js +21 -13
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +8 -5
- package/.server/server/plugins/engine/components/LatLongField.js +32 -20
- package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +7 -6
- package/.server/server/plugins/engine/components/ListFormComponent.js +19 -7
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +17 -16
- package/.server/server/plugins/engine/components/LocationFieldBase.js +2 -2
- package/.server/server/plugins/engine/components/LocationFieldBase.js.map +1 -1
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +8 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +14 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.d.ts +8 -7
- package/.server/server/plugins/engine/components/Markdown.js +5 -2
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +9 -7
- package/.server/server/plugins/engine/components/MonthYearField.js +26 -8
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +10 -9
- package/.server/server/plugins/engine/components/MultilineTextField.js +2 -2
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +2 -1
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js +14 -6
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/NumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/NumberField.js +2 -2
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +2 -1
- package/.server/server/plugins/engine/components/OsGridRefField.js +14 -6
- package/.server/server/plugins/engine/components/OsGridRefField.js.map +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -10
- package/.server/server/plugins/engine/components/PaymentField.js +21 -8
- package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +11 -11
- package/.server/server/plugins/engine/components/SelectField.js +2 -2
- package/.server/server/plugins/engine/components/SelectField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +4 -4
- package/.server/server/plugins/engine/components/SelectionControlField.js +2 -2
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +10 -9
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +2 -2
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +12 -10
- package/.server/server/plugins/engine/components/UkAddressField.js +29 -17
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -0
- package/.server/server/plugins/engine/components/YesNoField.js +9 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +3 -2
- package/.server/server/plugins/engine/components/helpers/components.js +11 -8
- package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
- package/.server/server/plugins/engine/components/types.d.ts +8 -1
- package/.server/server/plugins/engine/components/types.js.map +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js +8 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
- package/.server/server/plugins/engine/form-context.d.ts +1 -0
- package/.server/server/plugins/engine/form-context.js +4 -2
- package/.server/server/plugins/engine/form-context.js.map +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +1 -1
- package/.server/server/plugins/engine/helpers.js +8 -13
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/i18n/buildValidationMessages.d.ts +39 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js +50 -0
- package/.server/server/plugins/engine/i18n/buildValidationMessages.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js +18 -0
- package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/createTranslator.d.ts +9 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js +51 -0
- package/.server/server/plugins/engine/i18n/createTranslator.js.map +1 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +5 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +57 -0
- package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -0
- package/.server/server/plugins/engine/i18n/index.d.ts +18 -0
- package/.server/server/plugins/engine/i18n/index.js +71 -0
- package/.server/server/plugins/engine/i18n/index.js.map +1 -0
- package/.server/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/.server/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/.server/server/plugins/engine/i18n/types.d.ts +41 -0
- package/.server/server/plugins/engine/i18n/types.js +2 -0
- package/.server/server/plugins/engine/i18n/types.js.map +1 -0
- package/.server/server/plugins/engine/index.js +3 -2
- package/.server/server/plugins/engine/index.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +9 -1
- package/.server/server/plugins/engine/models/FormModel.js +44 -18
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +5 -2
- package/.server/server/plugins/engine/models/SummaryViewModel.js +44 -18
- package/.server/server/plugins/engine/models/SummaryViewModel.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 +4 -0
- 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/v1.js +7 -6
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +2 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +6 -3
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/PageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js +11 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +4 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +52 -21
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +63 -26
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +3 -1
- package/.server/server/plugins/engine/pageControllers/StartPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js +12 -2
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +4 -3
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +44 -28
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.d.ts +2 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js +24 -0
- package/.server/server/plugins/engine/pageControllers/__stubs__/translator.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/errors.js +3 -2
- package/.server/server/plugins/engine/pageControllers/errors.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +3 -2
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js +4 -4
- package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +7 -3
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +34 -33
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +2 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.js +4 -1
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/routes/questions.js +5 -2
- package/.server/server/plugins/engine/routes/questions.js.map +1 -1
- package/.server/server/plugins/engine/types/index.d.ts +1 -0
- package/.server/server/plugins/engine/types/index.js.map +1 -1
- package/.server/server/plugins/engine/types/schema.js +1 -0
- package/.server/server/plugins/engine/types/schema.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +12 -1
- package/.server/server/plugins/engine/types.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 +3 -3
- package/.server/server/plugins/engine/views/components/geospatialfield.html +4 -1
- package/.server/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/.server/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/.server/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/.server/server/plugins/engine/views/confirmation.html +4 -4
- package/.server/server/plugins/engine/views/exit.html +4 -4
- package/.server/server/plugins/engine/views/file-upload.html +3 -3
- package/.server/server/plugins/engine/views/index.html +3 -3
- package/.server/server/plugins/engine/views/item-delete.html +1 -1
- package/.server/server/plugins/engine/views/partials/form.html +3 -3
- package/.server/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/.server/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/.server/server/plugins/engine/views/summary.html +14 -7
- package/.server/server/plugins/map/routes/index.js +1 -1
- package/.server/server/plugins/map/routes/index.js.map +1 -1
- package/.server/server/plugins/map/types.d.ts +1 -25
- package/.server/server/plugins/map/types.js +1 -16
- package/.server/server/plugins/map/types.js.map +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +10 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/environment.d.ts +8 -0
- package/.server/server/plugins/nunjucks/environment.js +13 -0
- package/.server/server/plugins/nunjucks/environment.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.js +9 -1
- package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.test.js +13 -2
- package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +24 -19
- package/.server/server/plugins/postcode-lookup/models/index.js +83 -76
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.js +7 -13
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/types.d.ts +1 -0
- package/.server/server/plugins/postcode-lookup/types.js +1 -0
- 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/types.d.ts +2 -1
- package/.server/server/types.js.map +1 -1
- package/.server/server/utils/utils.d.ts +5 -0
- package/.server/server/utils/utils.js +16 -0
- package/.server/server/utils/utils.js.map +1 -1
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +5 -4
- package/src/client/javascripts/geospatial-map.js +10 -6
- package/src/client/javascripts/location-map.js +11 -0
- package/src/client/javascripts/map.js +10 -0
- package/src/client/javascripts/sssi-dataset.js +106 -0
- package/src/client/stylesheets/shared.scss +0 -2
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +0 -14
- package/src/server/forms/simple-form.yaml +106 -3
- package/src/server/plugins/engine/components/AutocompleteField.ts +3 -6
- package/src/server/plugins/engine/components/CheckboxesField.ts +12 -11
- package/src/server/plugins/engine/components/ComponentCollection.ts +143 -61
- package/src/server/plugins/engine/components/DatePartsField.ts +33 -11
- package/src/server/plugins/engine/components/DeclarationField.ts +37 -14
- package/src/server/plugins/engine/components/EastingNorthingField.ts +83 -22
- package/src/server/plugins/engine/components/EmailAddressField.ts +4 -7
- package/src/server/plugins/engine/components/FileUploadField.ts +28 -22
- package/src/server/plugins/engine/components/FormComponent.ts +49 -12
- package/src/server/plugins/engine/components/GeospatialField.ts +38 -21
- package/src/server/plugins/engine/components/LatLongField.ts +52 -21
- package/src/server/plugins/engine/components/ListFormComponent.ts +26 -10
- package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -8
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +24 -4
- package/src/server/plugins/engine/components/Markdown.ts +7 -3
- package/src/server/plugins/engine/components/MonthYearField.ts +32 -10
- package/src/server/plugins/engine/components/MultilineTextField.ts +5 -8
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +25 -11
- package/src/server/plugins/engine/components/NumberField.ts +3 -4
- package/src/server/plugins/engine/components/OsGridRefField.ts +25 -9
- package/src/server/plugins/engine/components/PaymentField.ts +22 -12
- package/src/server/plugins/engine/components/SelectField.ts +3 -6
- package/src/server/plugins/engine/components/SelectionControlField.ts +7 -8
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -7
- package/src/server/plugins/engine/components/UkAddressField.ts +33 -18
- package/src/server/plugins/engine/components/YesNoField.ts +10 -0
- package/src/server/plugins/engine/components/helpers/components.ts +13 -6
- package/src/server/plugins/engine/components/types.ts +9 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +12 -1
- package/src/server/plugins/engine/form-context.ts +8 -2
- package/src/server/plugins/engine/helpers.ts +10 -18
- package/src/server/plugins/engine/i18n/buildValidationMessages.ts +69 -0
- package/src/server/plugins/engine/i18n/createFormTranslator.ts +33 -0
- package/src/server/plugins/engine/i18n/createTranslator.ts +61 -0
- package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +61 -0
- package/src/server/plugins/engine/i18n/index.ts +80 -0
- package/src/server/plugins/engine/i18n/translations/cy.json +271 -0
- package/src/server/plugins/engine/i18n/translations/en-GB.json +271 -0
- package/src/server/plugins/engine/i18n/types.ts +62 -0
- package/src/server/plugins/engine/index.ts +4 -2
- package/src/server/plugins/engine/models/FormModel.ts +59 -23
- package/src/server/plugins/engine/models/SummaryViewModel.ts +68 -25
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +5 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -3
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +9 -8
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +7 -3
- package/src/server/plugins/engine/pageControllers/PageController.ts +12 -1
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +53 -21
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +66 -29
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +7 -2
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +10 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +48 -22
- package/src/server/plugins/engine/pageControllers/__stubs__/translator.ts +28 -0
- package/src/server/plugins/engine/pageControllers/errors.ts +4 -2
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +11 -4
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +43 -53
- package/src/server/plugins/engine/plugin.ts +2 -0
- package/src/server/plugins/engine/routes/index.ts +9 -1
- package/src/server/plugins/engine/routes/questions.ts +5 -1
- package/src/server/plugins/engine/types/index.ts +5 -0
- package/src/server/plugins/engine/types/schema.ts +1 -0
- package/src/server/plugins/engine/types.ts +10 -0
- package/src/server/plugins/engine/views/components/_location-field-base.html +4 -2
- package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- package/src/server/plugins/engine/views/components/geospatialfield.html +4 -1
- package/src/server/plugins/engine/views/components/nationalgridfieldnumberfield.html +1 -1
- package/src/server/plugins/engine/views/components/osgridreffield.html +1 -1
- package/src/server/plugins/engine/views/components/paymentfield.html +8 -8
- package/src/server/plugins/engine/views/components/ukaddressfield.html +4 -4
- package/src/server/plugins/engine/views/confirmation.html +4 -4
- package/src/server/plugins/engine/views/exit.html +4 -4
- package/src/server/plugins/engine/views/file-upload.html +3 -3
- package/src/server/plugins/engine/views/index.html +3 -3
- package/src/server/plugins/engine/views/item-delete.html +1 -1
- package/src/server/plugins/engine/views/partials/form.html +3 -3
- package/src/server/plugins/engine/views/partials/preview-banner.html +4 -4
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +4 -5
- package/src/server/plugins/engine/views/repeat-list-summary.html +4 -4
- package/src/server/plugins/engine/views/summary.html +14 -7
- package/src/server/plugins/map/routes/index.js +1 -1
- package/src/server/plugins/map/types.js +1 -16
- package/src/server/plugins/nunjucks/environment.js +14 -0
- package/src/server/plugins/nunjucks/filters/answer.js +12 -1
- package/src/server/plugins/postcode-lookup/models/index.js +144 -87
- package/src/server/plugins/postcode-lookup/routes/index.js +13 -16
- package/src/server/plugins/postcode-lookup/types.js +1 -0
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
- package/src/server/types.ts +2 -0
- package/src/server/utils/utils.js +14 -0
- package/src/typings/hapi/index.d.ts +1 -0
- package/.public/javascripts/im-search-plugin.min.js +0 -2
- package/.public/javascripts/im-search-plugin.min.js.map +0 -1
- package/.public/javascripts/vendor/preact.min.js +0 -2
- package/.public/javascripts/vendor/preact.min.js.map +0 -1
- package/.server/server/plugins/engine/components/constants.d.ts +0 -1
- package/.server/server/plugins/engine/components/constants.js +0 -2
- package/.server/server/plugins/engine/components/constants.js.map +0 -1
- package/src/server/plugins/engine/components/constants.ts +0 -1
|
@@ -21,13 +21,6 @@
|
|
|
21
21
|
* @property {string} query - name query
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
* Map reverse geocode query params
|
|
26
|
-
* @typedef {object} MapReverseGeocodeQuery
|
|
27
|
-
* @property {number} easting - the Easting point
|
|
28
|
-
* @property {number} northing - the Northing point
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
24
|
/**
|
|
32
25
|
* Geospatial countries query params
|
|
33
26
|
* @typedef {object} GeospatialCountriesQuery
|
|
@@ -47,12 +40,6 @@
|
|
|
47
40
|
* @property {MapGeocodeQuery} Query - Request query
|
|
48
41
|
*/
|
|
49
42
|
|
|
50
|
-
/**
|
|
51
|
-
* Map reverse geocode get request
|
|
52
|
-
* @typedef {object} MapReverseGeocodeGetRequestRefs
|
|
53
|
-
* @property {MapReverseGeocodeQuery} Query - Request query
|
|
54
|
-
*/
|
|
55
|
-
|
|
56
43
|
/**
|
|
57
44
|
* Map countries geojson get request
|
|
58
45
|
* @typedef {object} GeospatialCountriesGetRequestRefs
|
|
@@ -62,11 +49,9 @@
|
|
|
62
49
|
/**
|
|
63
50
|
* @typedef {MapProxyGetRequestRefs} MapProxyRequestRefs
|
|
64
51
|
* @typedef {MapGeocodeGetRequestRefs} MapGeocodeRequestRefs
|
|
65
|
-
* @typedef {MapReverseGeocodeGetRequestRefs} MapReverseGeocodeRequestRefs
|
|
66
52
|
* @typedef {Request<MapGeocodeGetRequestRefs>} MapProxyGetRequest
|
|
67
53
|
* @typedef {Request<MapGeocodeGetRequestRefs>} MapGeocodeGetRequest
|
|
68
|
-
* @typedef {
|
|
69
|
-
* @typedef {MapProxyGetRequest | MapGeocodeGetRequest | MapReverseGeocodeGetRequest} MapRequest
|
|
54
|
+
* @typedef {MapProxyGetRequest | MapGeocodeGetRequest } MapRequest
|
|
70
55
|
*/
|
|
71
56
|
|
|
72
57
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/map/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * ordnanceSurveyApiSecret: string\n * }} MapConfiguration\n */\n\n//\n// Route types\n//\n\n/**\n * Map proxy query params\n * @typedef {object} MapProxyQuery\n * @property {string} url - the proxied url\n */\n\n/**\n * Map geocode query params\n * @typedef {object} MapGeocodeQuery\n * @property {string} query - name query\n */\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/map/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * ordnanceSurveyApiSecret: string\n * }} MapConfiguration\n */\n\n//\n// Route types\n//\n\n/**\n * Map proxy query params\n * @typedef {object} MapProxyQuery\n * @property {string} url - the proxied url\n */\n\n/**\n * Map geocode query params\n * @typedef {object} MapGeocodeQuery\n * @property {string} query - name query\n */\n\n/**\n * Geospatial countries query params\n * @typedef {object} GeospatialCountriesQuery\n * @property {string} omit - the country to omit\n * @property {string} only - the country to include\n */\n\n/**\n * Map geocode get request\n * @typedef {object} MapProxyGetRequestRefs\n * @property {MapProxyQuery} Query - Request query\n */\n\n/**\n * Map geocode get request\n * @typedef {object} MapGeocodeGetRequestRefs\n * @property {MapGeocodeQuery} Query - Request query\n */\n\n/**\n * Map countries geojson get request\n * @typedef {object} GeospatialCountriesGetRequestRefs\n * @property {GeospatialCountriesQuery} Query - Request query\n */\n\n/**\n * @typedef {MapProxyGetRequestRefs} MapProxyRequestRefs\n * @typedef {MapGeocodeGetRequestRefs} MapGeocodeRequestRefs\n * @typedef {Request<MapGeocodeGetRequestRefs>} MapProxyGetRequest\n * @typedef {Request<MapGeocodeGetRequestRefs>} MapGeocodeGetRequest\n * @typedef {MapProxyGetRequest | MapGeocodeGetRequest } MapRequest\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} OsNamesFindResponse\n * @property {OsNamesFindHeader} header - Metadata about the search request and results.\n * @property {OsNamesFindResult[]} results - An array of matched place records from the search.\n */\n\n/**\n * @typedef {object} OsNamesFindHeader\n * @property {string} uri - The query URI (usually same as search text).\n * @property {string} query - The original text query string passed to the API.\n * @property {string} format - The response format returned (e.g., \"JSON\").\n * @property {number} maxresults - The maximum number of results requested.\n * @property {number} offset - The offset used in the search results.\n * @property {number} totalresults - The total number of results that matched the query.\n * @property {string} filter - The original filter string passed to the API.\n */\n\n/**\n * @typedef {object} OsNamesFindGazetteerEntry\n * @property {string} ID - Unique identifier for the place/feature.\n * @property {string} NAMES_URI - A URI (identifier) for this named feature.\n * @property {string} NAME1 - Primary name of the feature.\n * @property {string} TYPE - General type classification of the feature.\n * @property {string} LOCAL_TYPE - Local or more specific type classification.\n * @property {number} GEOMETRY_X - Easting coordinate (British National Grid).\n * @property {number} GEOMETRY_Y - Northing coordinate (British National Grid).\n * @property {number} MOST_DETAIL_VIEW_RES - Most detailed resolution available.\n * @property {number} LEAST_DETAIL_VIEW_RES - Least detailed resolution available.\n * @property {number} [MBR_XMIN] - Minimum bounding box X (easting).\n * @property {number} [MBR_YMIN] - Minimum bounding box Y (northing).\n * @property {number} [MBR_XMAX] - Maximum bounding box X (easting).\n * @property {number} [MBR_YMAX] - Maximum bounding box Y (northing).\n * @property {string} [DISTRICT_BOROUGH] - (Optional) District borough.\n * @property {string} [DISTRICT_BOROUGH_URI] - (Optional) URI for the district borough.\n * @property {string} [DISTRICT_BOROUGH_TYPE] - (Optional) Type of the district borough.\n * @property {string} [POSTCODE_DISTRICT] - (Optional) Postcode district.\n * @property {string} [POSTCODE_DISTRICT_URI] - (Optional) URI for the postcode district.\n * @property {string} [POPULATED_PLACE] - (Optional) Name of associated populated place.\n * @property {string} [POPULATED_PLACE_URI] - (Optional) URI of populated place.\n * @property {string} [POPULATED_PLACE_TYPE] - (Optional) Type of populated place.\n * @property {string} [COUNTY_UNITARY] - (Optional) County or unitary authority name.\n * @property {string} [COUNTY_UNITARY_URI] - (Optional) URI for county/unitary authority.\n * @property {string} [COUNTY_UNITARY_TYPE] - (Optional) Classification of county/unitary authority.\n * @property {string} [REGION] - (Optional) Region name.\n * @property {string} [REGION_URI] - (Optional) URI for region.\n * @property {string} [COUNTRY] - (Optional) Country name.\n * @property {string} [COUNTRY_URI] - (Optional) URI for country.\n */\n\n/**\n * OS names GAZETTEER_ENTRY response\n * @typedef {object} OsNamesFindResult\n * @property {OsNamesFindGazetteerEntry} GAZETTEER_ENTRY - Gazetteer entry\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA","ignoreList":[]}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import * as helpers from "../engine/helpers.js";
|
|
2
2
|
import { environment } from "./environment.js";
|
|
3
3
|
describe('Nunjucks environment', () => {
|
|
4
|
+
describe('t global function', () => {
|
|
5
|
+
it('has t as a global function', () => {
|
|
6
|
+
const globals = /** @type {any} */environment.globals;
|
|
7
|
+
expect(typeof globals.t).toBe('function');
|
|
8
|
+
});
|
|
9
|
+
it('t global returns the English string for a known key', () => {
|
|
10
|
+
const globals = /** @type {any} */environment.globals;
|
|
11
|
+
expect(globals.t('errors.title')).toBe('There is a problem');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
4
14
|
describe('checkErrorTemplates function', () => {
|
|
5
15
|
/** @type {Function} */
|
|
6
16
|
let checkErrorTemplates;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","expect","toBe","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = /** @type {{ model: { label?: { text: string } } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","it","globals","expect","t","toBe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('t global function', () => {\n it('has t as a global function', () => {\n const globals = /** @type {any} */ (environment).globals\n expect(typeof globals.t).toBe('function')\n })\n\n it('t global returns the English string for a known key', () => {\n const globals = /** @type {any} */ (environment).globals\n expect(globals.t('errors.title')).toBe('There is a problem')\n })\n })\n\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = /** @type {{ model: { label?: { text: string } } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,6 +14,14 @@ export function checkComponentTemplates(this: NunjucksContext, component: Compon
|
|
|
14
14
|
*/
|
|
15
15
|
export function evaluate(this: NunjucksContext, template: string): string;
|
|
16
16
|
export function govukRebrand(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Global t() function — en-GB fallback for templates not wired to a specific language.
|
|
19
|
+
* Per-request page controllers override this by passing t in their view model.
|
|
20
|
+
* @param {string} key
|
|
21
|
+
* @param {Record<string, unknown>} [opts]
|
|
22
|
+
* @returns {string}
|
|
23
|
+
*/
|
|
24
|
+
export function tGlobal(key: string, opts?: Record<string, unknown>): string;
|
|
17
25
|
export const paths: string[];
|
|
18
26
|
export const environment: nunjucks.Environment;
|
|
19
27
|
import type { FormSubmissionError } from '../../../server/plugins/engine/types.js';
|
|
@@ -4,6 +4,7 @@ import nunjucks from 'nunjucks';
|
|
|
4
4
|
import resolvePkg from 'resolve';
|
|
5
5
|
import { config } from "../../../config/index.js";
|
|
6
6
|
import { evaluateTemplate } from "../engine/helpers.js";
|
|
7
|
+
import { t as i18nT } from "../engine/i18n/index.js";
|
|
7
8
|
import * as filters from "./filters/index.js";
|
|
8
9
|
const govukFrontendPath = dirname(resolvePkg.sync('govuk-frontend/package.json'));
|
|
9
10
|
export const paths = [join(config.get('appDir'), 'plugins/engine/views'), join(config.get('appDir'), 'views')];
|
|
@@ -91,6 +92,18 @@ export function govukRebrand() {
|
|
|
91
92
|
}
|
|
92
93
|
environment.addGlobal('govukRebrand', govukRebrand());
|
|
93
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Global t() function — en-GB fallback for templates not wired to a specific language.
|
|
97
|
+
* Per-request page controllers override this by passing t in their view model.
|
|
98
|
+
* @param {string} key
|
|
99
|
+
* @param {Record<string, unknown>} [opts]
|
|
100
|
+
* @returns {string}
|
|
101
|
+
*/
|
|
102
|
+
export function tGlobal(key, opts) {
|
|
103
|
+
return i18nT(key, 'en-GB', opts);
|
|
104
|
+
}
|
|
105
|
+
environment.addGlobal('t', tGlobal);
|
|
106
|
+
|
|
94
107
|
/**
|
|
95
108
|
* @import { NunjucksContext } from '../../../server/plugins/nunjucks/types.js'
|
|
96
109
|
* @import { FormSubmissionError } from '../../../server/plugins/engine/types.js'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,IAAI,QAAQ,WAAW;AAEzC,SAASC,aAAa,QAAQ,oBAAoB;AAClD,OAAOC,QAAQ,MAAM,UAAU;AAC/B,OAAOC,UAAU,MAAM,SAAS;AAEhC,SAASC,MAAM;AACf,SAASC,gBAAgB;AACzB,OAAO,KAAKC,OAAO;AAEnB,MAAMC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","t","i18nT","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template","govukRebrand","tGlobal","key","opts"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport { t as i18nT } from '~/src/server/plugins/engine/i18n/index.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\nexport function govukRebrand() {\n return true\n}\n\nenvironment.addGlobal('govukRebrand', govukRebrand())\n\n/**\n * Global t() function — en-GB fallback for templates not wired to a specific language.\n * Per-request page controllers override this by passing t in their view model.\n * @param {string} key\n * @param {Record<string, unknown>} [opts]\n * @returns {string}\n */\nexport function tGlobal(key, opts) {\n return i18nT(key, 'en-GB', opts)\n}\n\nenvironment.addGlobal('t', tGlobal)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,15 @@ export function answer(name) {
|
|
|
16
16
|
if (!component?.isFormComponent) {
|
|
17
17
|
return undefined;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
const field = /** @type {Field} */component;
|
|
20
|
+
const {
|
|
21
|
+
translator
|
|
22
|
+
} = context;
|
|
23
|
+
|
|
24
|
+
// Fallback if no translator in the context
|
|
25
|
+
return getAnswer(field, context.relevantState, translator ?? field.model.createTranslator(), {
|
|
26
|
+
format: 'summary'
|
|
27
|
+
});
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","relevantState"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n
|
|
1
|
+
{"version":3,"file":"answer.js","names":["getAnswer","answer","name","context","ctx","undefined","component","componentMap","get","isFormComponent","field","translator","relevantState","model","createTranslator","format"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\n\n/**\n * Nunjucks filter to get the answer for a component\n * @this {NunjucksContext}\n * @param {string} name - The name of the component to check\n */\nexport function answer(name) {\n const { context } = this.ctx\n\n if (!context) {\n return undefined\n }\n\n const component = context.componentMap.get(name)\n\n if (!component?.isFormComponent) {\n return undefined\n }\n\n const field = /** @type {Field} */ (component)\n const { translator } = context\n\n // Fallback if no translator in the context\n return getAnswer(\n field,\n context.relevantState,\n translator ?? field.model.createTranslator(),\n {\n format: 'summary'\n }\n )\n}\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,IAAI,EAAE;EAC3B,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAI,CAACC,GAAG;EAE5B,IAAI,CAACD,OAAO,EAAE;IACZ,OAAOE,SAAS;EAClB;EAEA,MAAMC,SAAS,GAAGH,OAAO,CAACI,YAAY,CAACC,GAAG,CAACN,IAAI,CAAC;EAEhD,IAAI,CAACI,SAAS,EAAEG,eAAe,EAAE;IAC/B,OAAOJ,SAAS;EAClB;EAEA,MAAMK,KAAK,GAAG,oBAAsBJ,SAAU;EAC9C,MAAM;IAAEK;EAAW,CAAC,GAAGR,OAAO;;EAE9B;EACA,OAAOH,SAAS,CACdU,KAAK,EACLP,OAAO,CAACS,aAAa,EACrBD,UAAU,IAAID,KAAK,CAACG,KAAK,CAACC,gBAAgB,CAAC,CAAC,EAC5C;IACEC,MAAM,EAAE;EACV,CACF,CAAC;AACH;;AAEA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -52,13 +52,24 @@ describe('answer Nunjucks filter', () => {
|
|
|
52
52
|
it('returns the answer', () => {
|
|
53
53
|
const mockFormComponent = {
|
|
54
54
|
isFormComponent: true,
|
|
55
|
-
someProperty: 'value'
|
|
55
|
+
someProperty: 'value',
|
|
56
|
+
model: {
|
|
57
|
+
createTranslator: jest.fn().mockImplementation(() => {
|
|
58
|
+
return {
|
|
59
|
+
t: jest.fn().mockReturnValue('translated text')
|
|
60
|
+
};
|
|
61
|
+
})
|
|
62
|
+
}
|
|
56
63
|
};
|
|
57
64
|
mockThis.ctx.context?.componentMap.set('validFormComponent',
|
|
58
65
|
// @ts-expect-error - simplified mock component for testing
|
|
59
66
|
mockFormComponent);
|
|
60
67
|
const result = answer.call(mockThis, 'validFormComponent');
|
|
61
|
-
expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState
|
|
68
|
+
expect(getAnswer).toHaveBeenCalledWith(mockFormComponent, mockThis.ctx.context?.relevantState, {
|
|
69
|
+
t: expect.anything()
|
|
70
|
+
}, {
|
|
71
|
+
format: 'summary'
|
|
72
|
+
});
|
|
62
73
|
expect(result).toBe('test answer');
|
|
63
74
|
});
|
|
64
75
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","toHaveBeenCalledWith","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value'\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,SAASC,MAAM;AAEfC,IAAI,CAACC,IAAI,kDAEP,OAAO;EACLH,SAAS,EAAEE,IAAI,CAACE,EAAE,CAAC;AACrB,CAAC,CACH,CAAC;AAEDC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC;EACA,IAAIC,QAAQ;EAEZC,UAAU,CAAC,MAAM;IACfL,IAAI,CAACM,aAAa,CAAC,CAAC;IAEpBF,QAAQ,GAAG;IACT,sBAAwB;MACtBG,GAAG,EAAE;QACHC,OAAO,EAAE;UACPC,YAAY,EAAE,IAAIC,GAAG,CAAC,CAAC;UACvBC,aAAa,EAAE;YAAEC,SAAS,EAAE;UAAQ;QACtC;MACF;IACF,CACD;IAEDZ,IAAI,CAACa,MAAM,CAACf,SAAS,CAAC,CAACgB,eAAe,CAAC,aAAa,CAAC;EACvD,CAAC,CAAC;EAEFX,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,GAAGQ,SAAS;MAEhC,MAAMC,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,eAAe,CAAC;MAErDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,kBAAkB,EAAE,MAAM;IACjCY,EAAE,CAAC,8CAA8C,EAAE,MAAM;MACvD,MAAME,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,sBAAsB,CAAC;MAE5De,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,oBAAoB,EAAE,MAAM;IACnCY,EAAE,CAAC,mBAAmB,EAAE,MAAM;MAC5BX,QAAQ,CAACG,GAAG,CAACC,OAAO,EAAEC,YAAY,CAACc,GAAG,CACpC,kBAAkB;MAClB;MACA;QAAEC,eAAe,EAAE;MAAM,CAC3B,CAAC;MAED,MAAMP,MAAM,GAAGlB,MAAM,CAACmB,IAAI,CAACd,QAAQ,EAAE,kBAAkB,CAAC;MAExDe,MAAM,CAACF,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;MAC9BD,MAAM,CAACrB,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnB,QAAQ,CAAC,sBAAsB,EAAE,MAAM;IACrCY,EAAE,CAAC,oBAAoB,EAAE,MAAM;MAC7B,MAAMU,iBAAiB,GAAG;QACxBD,eAAe,EAAE,IAAI;QACrBE,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"answer.test.js","names":["getAnswer","answer","jest","mock","fn","describe","mockThis","beforeEach","clearAllMocks","ctx","context","componentMap","Map","relevantState","someState","mocked","mockReturnValue","it","undefined","result","call","expect","toBeUndefined","not","toHaveBeenCalled","set","isFormComponent","mockFormComponent","someProperty","model","createTranslator","mockImplementation","t","toHaveBeenCalledWith","anything","format","toBe"],"sources":["../../../../../src/server/plugins/nunjucks/filters/answer.test.js"],"sourcesContent":["import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'\nimport { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'\n\njest.mock(\n '~/src/server/plugins/engine/components/helpers/components.ts',\n () => ({\n getAnswer: jest.fn()\n })\n)\n\ndescribe('answer Nunjucks filter', () => {\n /** @type { NunjucksContext } */\n let mockThis\n\n beforeEach(() => {\n jest.clearAllMocks()\n\n mockThis = /** @type {NunjucksContext} */ (\n /** @type {unknown} */ ({\n ctx: {\n context: {\n componentMap: new Map(),\n relevantState: { someState: 'value' }\n }\n }\n })\n )\n\n jest.mocked(getAnswer).mockReturnValue('test answer')\n })\n\n describe('missing context', () => {\n it('returns undefined', () => {\n mockThis.ctx.context = undefined\n\n const result = answer.call(mockThis, 'componentName')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('component lookup', () => {\n it('returns undefined for non-existent component', () => {\n const result = answer.call(mockThis, 'nonExistentComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('non-form component', () => {\n it('returns undefined', () => {\n mockThis.ctx.context?.componentMap.set(\n 'nonFormComponent',\n // @ts-expect-error - simplified mock component for testing\n { isFormComponent: false }\n )\n\n const result = answer.call(mockThis, 'nonFormComponent')\n\n expect(result).toBeUndefined()\n expect(getAnswer).not.toHaveBeenCalled()\n })\n })\n\n describe('valid form component', () => {\n it('returns the answer', () => {\n const mockFormComponent = {\n isFormComponent: true,\n someProperty: 'value',\n model: {\n createTranslator: jest.fn().mockImplementation(() => {\n return {\n t: jest.fn().mockReturnValue('translated text')\n }\n })\n }\n }\n mockThis.ctx.context?.componentMap.set(\n 'validFormComponent',\n // @ts-expect-error - simplified mock component for testing\n mockFormComponent\n )\n\n const result = answer.call(mockThis, 'validFormComponent')\n\n expect(getAnswer).toHaveBeenCalledWith(\n mockFormComponent,\n mockThis.ctx.context?.relevantState,\n { t: expect.anything() },\n { format: 'summary' }\n )\n expect(result).toBe('test answer')\n })\n })\n})\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* @this {NunjucksContext}
|
|
4
4
|
* @param {string} name - The name of the component
|
|
5
5
|
*/
|
|
6
|
-
export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/
|
|
6
|
+
export function field(this: NunjucksContext, name: string): import("../../engine/components/TextField.js").TextField | import("../../engine/components/PaymentField.js").PaymentField | import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/DeclarationField.js").DeclarationField | import("../../engine/components/EastingNorthingField.js").EastingNorthingField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/LatLongField.js").LatLongField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NationalGridFieldNumberField.js").NationalGridFieldNumberField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/OsGridRefField.js").OsGridRefField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/HiddenField.js").HiddenField | import("../../engine/components/GeospatialField.js").GeospatialField | import("../../engine/components/Details.js").Details | import("../../engine/components/Html.js").Html | import("../../engine/components/InsetText.js").InsetText | import("../../engine/components/List.js").List | import("../../engine/components/Markdown.js").Markdown | import("../../engine/components/NotificationBanner.js").NotificationBanner | undefined;
|
|
7
7
|
import type { NunjucksContext } from '../../../../server/plugins/nunjucks/types.js';
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postcode lookup details form payload schema
|
|
3
|
+
* @param {string} [language]
|
|
4
|
+
* @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
|
|
5
|
+
*/
|
|
6
|
+
export function createDetailsPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
|
|
7
|
+
/**
|
|
8
|
+
* Postcode lookup select form payload schema
|
|
9
|
+
* @param {string} [language]
|
|
10
|
+
* @returns {ObjectSchema<PostcodeLookupSelectPayload>}
|
|
11
|
+
*/
|
|
12
|
+
export function createSelectPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupSelectPayload>;
|
|
13
|
+
/**
|
|
14
|
+
* Postcode lookup manual form payload schema
|
|
15
|
+
* @param {string} [language]
|
|
16
|
+
* @returns {ObjectSchema<PostcodeLookupManualPayload>}
|
|
17
|
+
*/
|
|
18
|
+
export function createManualPayloadSchema(language?: string): Joi.ObjectSchema<PostcodeLookupManualPayload>;
|
|
1
19
|
/**
|
|
2
20
|
* The postcode lookup details form view model
|
|
3
21
|
* @param {PostcodeLookupSessionData} data
|
|
@@ -119,6 +137,8 @@ export function selectViewModel(data: {
|
|
|
119
137
|
singleAddress: Address | undefined;
|
|
120
138
|
hasAddresses: boolean;
|
|
121
139
|
hasMultipleAddresses: boolean;
|
|
140
|
+
addressesFoundText: string | undefined;
|
|
141
|
+
noAddressFoundText: string | undefined;
|
|
122
142
|
buttons: {
|
|
123
143
|
continueButton: {
|
|
124
144
|
href: string | undefined;
|
|
@@ -230,26 +250,11 @@ export namespace steps {
|
|
|
230
250
|
}
|
|
231
251
|
export const JOURNEY_BASE_URL: "/postcode-lookup";
|
|
232
252
|
export const stepSchema: Joi.StringSchema<string>;
|
|
233
|
-
/**
|
|
234
|
-
* Postcode lookup details form payload schema
|
|
235
|
-
* @type {ObjectSchema<PostcodeLookupDetailsPayload>}
|
|
236
|
-
*/
|
|
237
|
-
export const detailsPayloadSchema: Joi.ObjectSchema<PostcodeLookupDetailsPayload>;
|
|
238
|
-
/**
|
|
239
|
-
* Postcode lookup select form payload schema
|
|
240
|
-
* @type {ObjectSchema<PostcodeLookupSelectPayload>}
|
|
241
|
-
*/
|
|
242
|
-
export const selectPayloadSchema: Joi.ObjectSchema<PostcodeLookupSelectPayload>;
|
|
243
|
-
/**
|
|
244
|
-
* Postcode lookup manual form payload schema
|
|
245
|
-
* @type {ObjectSchema<PostcodeLookupManualPayload>}
|
|
246
|
-
*/
|
|
247
|
-
export const manualPayloadSchema: Joi.ObjectSchema<PostcodeLookupManualPayload>;
|
|
248
253
|
export type OptionalValidationErrorItem = Joi.ValidationErrorItem | undefined;
|
|
254
|
+
import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
255
|
+
import Joi from 'joi';
|
|
256
|
+
import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
257
|
+
import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
249
258
|
import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
250
259
|
import type { PostcodeLookupDetailsData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
251
|
-
import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
252
260
|
import type { Address } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
253
|
-
import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
254
|
-
import Joi from 'joi';
|
|
255
|
-
import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|