@defra/forms-engine-plugin 4.22.0 → 5.0.0-alpha
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/.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 +6 -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 +14 -12
- package/.server/server/plugins/engine/components/GeospatialField.js +19 -13
- package/.server/server/plugins/engine/components/GeospatialField.js.map +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +6 -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 +3 -3
- package/.server/server/plugins/engine/components/LocationFieldHelpers.js +2 -2
- 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 +45 -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 +1 -1
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- 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/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 +3 -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 +36 -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 +3 -3
- 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 +53 -24
- 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 +1 -1
- package/src/server/plugins/engine/views/components/fileuploadfield.html +3 -3
- 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/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/.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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064
|
|
2
2
|
|
|
3
|
-
import joi from 'joi';
|
|
4
3
|
import { lowerFirstPreserveProperNouns } from "../components/helpers/index.js";
|
|
4
|
+
import { buildValidationMessages } from "../i18n/buildValidationMessages.js";
|
|
5
|
+
import { t } from "../i18n/index.js";
|
|
5
6
|
export const opts = {
|
|
6
7
|
functions: {
|
|
7
8
|
lowerFirst: lowerFirstPreserveProperNouns
|
|
@@ -9,39 +10,11 @@ export const opts = {
|
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Module-level English message templates — built via the same factory used per-form.
|
|
14
|
+
* Components that have not yet been migrated to use model.validationMessages still
|
|
15
|
+
* import messageTemplate directly and get the English version.
|
|
13
16
|
*/
|
|
14
|
-
export const messageTemplate =
|
|
15
|
-
declarationRequired: joi.expression('You must confirm you understand and agree with the {{lowerFirst(#label)}} to continue', opts),
|
|
16
|
-
required: joi.expression('Enter {{lowerFirst(#label)}}', opts),
|
|
17
|
-
selectRequired: joi.expression('Select {{lowerFirst(#label)}}', opts),
|
|
18
|
-
selectYesNoRequired: '{{#label}} - select yes or no',
|
|
19
|
-
max: '{{#label}} must be {{#limit}} characters or less',
|
|
20
|
-
min: '{{#label}} must be {{#limit}} characters or more',
|
|
21
|
-
minMax: '{{#label}} must be between {{#min}} and {{#max}} characters',
|
|
22
|
-
pattern: joi.expression('Enter a valid {{lowerFirst(#label)}}', opts),
|
|
23
|
-
format: joi.expression('Enter {{lowerFirst(#label)}} in the correct format', opts),
|
|
24
|
-
unicode: '{{#label}} includes invalid characters, for example, long dashes',
|
|
25
|
-
number: '{{#label}} must be a number',
|
|
26
|
-
numberPrecision: '{{#label}} must have {{#limit}} or fewer decimal places',
|
|
27
|
-
numberInteger: '{{#label}} must be a whole number',
|
|
28
|
-
numberMin: '{{#label}} must be {{#limit}} or higher',
|
|
29
|
-
numberMax: '{{#label}} must be {{#limit}} or lower',
|
|
30
|
-
maxWords: '{{#label}} must be {{#limit}} words or fewer',
|
|
31
|
-
// Nested fields use component title
|
|
32
|
-
|
|
33
|
-
objectRequired: joi.expression('Enter {{#label}}', opts),
|
|
34
|
-
objectMissing: joi.expression('{{#title}} must include a {{lowerFirst(#label)}}', opts),
|
|
35
|
-
dateFormat: '{{#title}} must be a real date',
|
|
36
|
-
dateMin: '{{#title}} must be the same as or after {{#limit}}',
|
|
37
|
-
dateMax: '{{#title}} must be the same as or before {{#limit}}',
|
|
38
|
-
arrayMin: 'Select at least {{#limit}} options from the list',
|
|
39
|
-
arrayMax: 'Only {{#limit}} can be selected from the list',
|
|
40
|
-
arrayLength: 'Select only {{#limit}} options from the list',
|
|
41
|
-
featuresMin: 'Define at least {{#limit}} features',
|
|
42
|
-
featuresMax: 'Only {{#limit}} features can be defined',
|
|
43
|
-
featuresLength: 'Define exactly {{#limit}} features'
|
|
44
|
-
};
|
|
17
|
+
export const messageTemplate = buildValidationMessages(key => t(key, 'en-GB'));
|
|
45
18
|
export const messages = {
|
|
46
19
|
'string.base': messageTemplate.required,
|
|
47
20
|
'string.min': messageTemplate.min,
|
|
@@ -69,6 +42,34 @@ export const messages = {
|
|
|
69
42
|
'object.invalidjson': messageTemplate.format
|
|
70
43
|
};
|
|
71
44
|
export const messagesPre = messages;
|
|
45
|
+
export function buildLanguageMessages(t) {
|
|
46
|
+
const vm = buildValidationMessages(t);
|
|
47
|
+
return {
|
|
48
|
+
'string.base': vm.required,
|
|
49
|
+
'string.min': vm.min,
|
|
50
|
+
'string.empty': vm.required,
|
|
51
|
+
'string.max': vm.max,
|
|
52
|
+
'string.email': vm.format,
|
|
53
|
+
'string.pattern.base': vm.pattern,
|
|
54
|
+
'string.maxWords': vm.maxWords,
|
|
55
|
+
'number.base': vm.number,
|
|
56
|
+
'number.precision': vm.numberPrecision,
|
|
57
|
+
'number.integer': vm.numberInteger,
|
|
58
|
+
'number.unsafe': vm.format,
|
|
59
|
+
'number.min': vm.numberMin,
|
|
60
|
+
'number.max': vm.numberMax,
|
|
61
|
+
'object.required': vm.objectRequired,
|
|
62
|
+
'object.and': vm.objectMissing,
|
|
63
|
+
'any.only': vm.selectRequired,
|
|
64
|
+
'any.required': vm.selectRequired,
|
|
65
|
+
'any.empty': vm.required,
|
|
66
|
+
'date.base': vm.dateFormat,
|
|
67
|
+
'date.format': vm.dateFormat,
|
|
68
|
+
'date.min': vm.dateMin,
|
|
69
|
+
'date.max': vm.dateMax,
|
|
70
|
+
'object.invalidjson': vm.format
|
|
71
|
+
};
|
|
72
|
+
}
|
|
72
73
|
export const validationOptions = {
|
|
73
74
|
abortEarly: false,
|
|
74
75
|
messages: messagesPre,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validationOptions.js","names":["
|
|
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":"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","ignoreList":[]}
|
|
@@ -20,6 +20,7 @@ export const plugin = {
|
|
|
20
20
|
model,
|
|
21
21
|
cache,
|
|
22
22
|
saveAndExit,
|
|
23
|
+
getLanguage,
|
|
23
24
|
nunjucks: nunjucksOptions,
|
|
24
25
|
viewContext,
|
|
25
26
|
preparePageEventRequestOptions,
|
|
@@ -59,6 +60,7 @@ export const plugin = {
|
|
|
59
60
|
server.expose('viewContext', viewContext);
|
|
60
61
|
server.expose('cacheService', cacheService);
|
|
61
62
|
server.expose('saveAndExit', saveAndExit);
|
|
63
|
+
server.expose('getLanguage', getLanguage);
|
|
62
64
|
server.expose('baseUrl', baseUrl);
|
|
63
65
|
server.expose('services', services);
|
|
64
66
|
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","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 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('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,GAAGnB,qBAAqB,CAACmB,OAAO,CAAC;IAExC,MAAM;MACJC,KAAK;MACLC,KAAK;MACLC,WAAW;MACXC,QAAQ,EAAEC,eAAe;MACzBC,WAAW;MACXC,8BAA8B;MAC9BC,SAAS;MACTC,oBAAoB;MACpBC,OAAO;MACPC,uBAAuB;MACvBC;IACF,CAAC,
|
|
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":"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","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ import { checkFormStatus, findPage, getCacheService, getPage, getStartPath, proc
|
|
|
7
7
|
import { checkSaveAndExitRepeater, copyNotYetValidatedState } from "../pageControllers/helpers/state.js";
|
|
8
8
|
import { generateUniqueReference } from "../referenceNumbers.js";
|
|
9
9
|
import * as defaultServices from "../services/index.js";
|
|
10
|
+
import { resolveLanguage } from "../../../utils/utils.js";
|
|
10
11
|
export async function redirectOrMakeHandler(request, h, onRequest, makeHandler) {
|
|
11
12
|
const {
|
|
12
13
|
app,
|
|
@@ -33,7 +34,9 @@ export async function redirectOrMakeHandler(request, h, onRequest, makeHandler)
|
|
|
33
34
|
}
|
|
34
35
|
state = await importExternalComponentState(request, page, state);
|
|
35
36
|
const flash = cacheService.getFlash(request);
|
|
36
|
-
const
|
|
37
|
+
const language = resolveLanguage(request);
|
|
38
|
+
const translator = model.createTranslator(language);
|
|
39
|
+
const context = model.getFormContext(request, state, flash?.errors, translator);
|
|
37
40
|
await copyNotYetValidatedState(request, context);
|
|
38
41
|
const relevantPath = page.getRelevantPath(request, context);
|
|
39
42
|
const summaryPath = page.getSummaryPath();
|
|
@@ -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","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","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'\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 context = model.getFormContext(request, state, flash?.errors)\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":[]}
|
|
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":"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","ignoreList":[]}
|
|
@@ -8,6 +8,7 @@ import { getFormSubmissionData } from "../pageControllers/SummaryPageController.
|
|
|
8
8
|
import { dispatchHandler, redirectOrMakeHandler } from "./index.js";
|
|
9
9
|
import { actionSchema, crumbSchema, itemIdSchema, pathSchema, stateSchema } from "../../../schemas/index.js";
|
|
10
10
|
import * as httpService from "../../../services/httpService.js";
|
|
11
|
+
import { resolveLanguage } from "../../../utils/utils.js";
|
|
11
12
|
async function handleHttpEvent(request, page, context, event, model, preparePageEventRequestOptions) {
|
|
12
13
|
const {
|
|
13
14
|
options
|
|
@@ -18,8 +19,10 @@ async function handleHttpEvent(request, page, context, event, model, preparePage
|
|
|
18
19
|
|
|
19
20
|
// TODO: Update structured data POST payload with when helper
|
|
20
21
|
// is updated to removing the dependency on `SummaryViewModel` etc.
|
|
21
|
-
const
|
|
22
|
-
const
|
|
22
|
+
const language = resolveLanguage(request);
|
|
23
|
+
const translator = model.createTranslator(language);
|
|
24
|
+
const viewModel = new SummaryViewModel(request, page, context, translator);
|
|
25
|
+
const items = getFormSubmissionData(viewModel.context, viewModel.details, translator, model);
|
|
23
26
|
|
|
24
27
|
// @ts-expect-error - function signature will be refactored in the next iteration of the formatter
|
|
25
28
|
const payload = format(context, items, model, undefined, undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","viewModel","items","details","payload","undefined","opts","timeout","response","postJson","Object","assign","data","makeGetHandler","onRequest","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type OnRequestCallback,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(\n viewModel.context,\n viewModel.details,\n model\n )\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts: httpService.RequestOptions = { payload, timeout: 5000 }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad?.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n }\n )\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (events?.onSave?.type === 'http' && isSuccessful(response)) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n }\n )\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","resolveLanguage","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","language","translator","createTranslator","viewModel","items","details","payload","undefined","opts","timeout","response","postJson","Object","assign","data","makeGetHandler","onRequest","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type OnRequestCallback,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const language = resolveLanguage(request)\n const translator = model.createTranslator(language)\n const viewModel = new SummaryViewModel(request, page, context, translator)\n const items = getFormSubmissionData(\n viewModel.context,\n viewModel.details,\n translator,\n model\n )\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts: httpService.RequestOptions = { payload, timeout: 5000 }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad?.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n }\n )\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (events?.onSave?.type === 'http' && isSuccessful(response)) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n }\n )\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,3 +8,4 @@ export { FormAction, FormStatus } from '../../../../server/routes/types.js';
|
|
|
8
8
|
export type { FormSubmissionService, FormsService, OutputService, RouteConfig, Services } from '../../../../server/types.js';
|
|
9
9
|
export * from '../../../../server/plugins/engine/types/schema.js';
|
|
10
10
|
export { FormAdapterSubmissionSchemaVersion } from '../../../../server/plugins/engine/types/enums.js';
|
|
11
|
+
export type { FormDefinitionTranslations, Translator } from '../../../../server/plugins/engine/i18n/types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["FileStatus","UploadStatus","FormAction","FormStatus","FormAdapterSubmissionSchemaVersion"],"sources":["../../../../../src/server/plugins/engine/types/index.ts"],"sourcesContent":["export type {\n AnyFormRequest,\n AnyRequest,\n CheckAnswers,\n ErrorMessageTemplate,\n ErrorMessageTemplateList,\n FeaturedFormPageViewModel,\n FileState,\n FilterFunction,\n FormAdapterSubmissionMessage,\n FormAdapterSubmissionMessageData,\n FormAdapterSubmissionMessageMeta,\n FormAdapterSubmissionMessageMetaSerialised,\n FormAdapterSubmissionMessagePayload,\n FormAdapterSubmissionService,\n FormContext,\n FormContextRequest,\n FormPageViewModel,\n FormPayload,\n FormPayloadParams,\n FormState,\n FormStateValue,\n FormSubmissionError,\n FormSubmissionState,\n FormValidationResult,\n FormValue,\n GlobalFunction,\n ItemDeletePageViewModel,\n OnRequestCallback,\n PageViewModel,\n PageViewModelBase,\n PluginOptions,\n PreparePageEventRequestOptions,\n RepeatItemState,\n RepeatListState,\n RepeaterSummaryPageViewModel,\n SummaryList,\n SummaryListAction,\n SummaryListRow,\n TempFileState,\n UploadInitiateResponse,\n UploadStatusFileResponse,\n UploadStatusResponse\n} from '~/src/server/plugins/engine/types.js'\n\nexport { FileStatus, UploadStatus } from '~/src/server/plugins/engine/types.js'\n\nexport type {\n Detail,\n DetailItem,\n DetailItemBase,\n DetailItemField,\n DetailItemRepeat,\n ExecutableCondition\n} from '~/src/server/plugins/engine/models/types.js'\n\nexport type {\n BackLink,\n ComponentText,\n ComponentViewModel,\n Content,\n DateInputItem,\n DatePartsState,\n EastingNorthingState,\n Label,\n LatLongState,\n ListItem,\n ListItemLabel,\n MonthYearState,\n ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\n\nexport type { UkAddressState } from '~/src/server/plugins/engine/components/UkAddressField.js'\n\nexport type {\n FormParams,\n FormQuery,\n FormRequest,\n FormRequestPayload,\n FormRequestPayloadRefs,\n FormRequestRefs,\n FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport { FormAction, FormStatus } from '~/src/server/routes/types.js'\n\nexport type {\n FormSubmissionService,\n FormsService,\n OutputService,\n RouteConfig,\n Services\n} from '~/src/server/types.js'\n\nexport * from '~/src/server/plugins/engine/types/schema.js'\nexport { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'\n"],"mappings":"AA6CA,SAASA,UAAU,EAAEC,YAAY;AAuCjC,SAASC,UAAU,EAAEC,UAAU;AAU/B;AACA,SAASC,kCAAkC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["FileStatus","UploadStatus","FormAction","FormStatus","FormAdapterSubmissionSchemaVersion"],"sources":["../../../../../src/server/plugins/engine/types/index.ts"],"sourcesContent":["export type {\n AnyFormRequest,\n AnyRequest,\n CheckAnswers,\n ErrorMessageTemplate,\n ErrorMessageTemplateList,\n FeaturedFormPageViewModel,\n FileState,\n FilterFunction,\n FormAdapterSubmissionMessage,\n FormAdapterSubmissionMessageData,\n FormAdapterSubmissionMessageMeta,\n FormAdapterSubmissionMessageMetaSerialised,\n FormAdapterSubmissionMessagePayload,\n FormAdapterSubmissionService,\n FormContext,\n FormContextRequest,\n FormPageViewModel,\n FormPayload,\n FormPayloadParams,\n FormState,\n FormStateValue,\n FormSubmissionError,\n FormSubmissionState,\n FormValidationResult,\n FormValue,\n GlobalFunction,\n ItemDeletePageViewModel,\n OnRequestCallback,\n PageViewModel,\n PageViewModelBase,\n PluginOptions,\n PreparePageEventRequestOptions,\n RepeatItemState,\n RepeatListState,\n RepeaterSummaryPageViewModel,\n SummaryList,\n SummaryListAction,\n SummaryListRow,\n TempFileState,\n UploadInitiateResponse,\n UploadStatusFileResponse,\n UploadStatusResponse\n} from '~/src/server/plugins/engine/types.js'\n\nexport { FileStatus, UploadStatus } from '~/src/server/plugins/engine/types.js'\n\nexport type {\n Detail,\n DetailItem,\n DetailItemBase,\n DetailItemField,\n DetailItemRepeat,\n ExecutableCondition\n} from '~/src/server/plugins/engine/models/types.js'\n\nexport type {\n BackLink,\n ComponentText,\n ComponentViewModel,\n Content,\n DateInputItem,\n DatePartsState,\n EastingNorthingState,\n Label,\n LatLongState,\n ListItem,\n ListItemLabel,\n MonthYearState,\n ViewModel\n} from '~/src/server/plugins/engine/components/types.js'\n\nexport type { UkAddressState } from '~/src/server/plugins/engine/components/UkAddressField.js'\n\nexport type {\n FormParams,\n FormQuery,\n FormRequest,\n FormRequestPayload,\n FormRequestPayloadRefs,\n FormRequestRefs,\n FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport { FormAction, FormStatus } from '~/src/server/routes/types.js'\n\nexport type {\n FormSubmissionService,\n FormsService,\n OutputService,\n RouteConfig,\n Services\n} from '~/src/server/types.js'\n\nexport * from '~/src/server/plugins/engine/types/schema.js'\nexport { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'\n\nexport type {\n FormDefinitionTranslations,\n Translator\n} from '~/src/server/plugins/engine/i18n/types.js'\n"],"mappings":"AA6CA,SAASA,UAAU,EAAEC,YAAY;AAuCjC,SAASC,UAAU,EAAEC,UAAU;AAU/B;AACA,SAASC,kCAAkC","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@ export const formAdapterSubmissionMessageMetaSchema = Joi.object().keys({
|
|
|
12
12
|
isPreview: Joi.boolean().required(),
|
|
13
13
|
notificationEmail: notificationEmailAddressSchema.required(),
|
|
14
14
|
versionMetadata: formVersionMetadataSchema.optional(),
|
|
15
|
+
language: Joi.string().optional(),
|
|
15
16
|
custom: Joi.object().pattern(/^/, Joi.any()).unknown().optional().description('Custom properties for the message')
|
|
16
17
|
});
|
|
17
18
|
export const formAdapterSubmissionMessageDataSchema = Joi.object().keys({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":["FormStatus","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","string","valid","Object","values","timestamp","date","required","referenceNumber","formName","formId","formSlug","status","isPreview","boolean","notificationEmail","versionMetadata","optional","custom","pattern","any","unknown","description","formAdapterSubmissionMessageDataSchema","main","repeaters","payment","paymentId","reference","amount","number","createdAt","files","array","items","fileName","fileId","userDownloadLink","formAdapterSubmissionMessageResultSchema","formAdapterSubmissionMessagePayloadSchema","meta","data","result"],"sources":["../../../../../src/server/plugins/engine/types/schema.ts"],"sourcesContent":["import {\n FormStatus,\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.string().valid(\n ...Object.values(FormAdapterSubmissionSchemaVersion)\n ),\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 custom: Joi.object()\n .pattern(/^/, Joi.any())\n .unknown()\n .optional()\n .description('Custom properties for the message')\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 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 })\n"],"mappings":"AAAA,SACEA,UAAU,EACVC,yBAAyB,EACzBC,QAAQ,EACRC,8BAA8B,EAC9BC,UAAU,EACVC,WAAW,QACN,oBAAoB;AAC3B,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,kCAAkC;AAQ3C,OAAO,MAAMC,sCAAsC,GACjDF,GAAG,CAACG,MAAM,CAAmC,CAAC,CAACC,IAAI,CAAC;EAClDC,aAAa,EAAEL,GAAG,CAACM,MAAM,CAAC,CAAC,CAACC,KAAK,CAC/B,GAAGC,MAAM,CAACC,MAAM,CAACR,kCAAkC,CACrD,CAAC;EACDS,SAAS,EAAEV,GAAG,CAACW,IAAI,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAChCC,eAAe,EAAEb,GAAG,CAACM,MAAM,CAAC,CAAC,CAACM,QAAQ,CAAC,CAAC;EACxCE,QAAQ,EAAEf,WAAW;EACrBgB,MAAM,EAAEnB,QAAQ;EAChBoB,QAAQ,EAAElB,UAAU;EACpBmB,MAAM,EAAEjB,GAAG,CAACM,MAAM,CAAC,CAAC,CACjBC,KAAK,CAAC,GAAGC,MAAM,CAACC,MAAM,CAACf,UAAU,CAAC,CAAC,CACnCkB,QAAQ,CAAC,CAAC;EACbM,SAAS,EAAElB,GAAG,CAACmB,OAAO,CAAC,CAAC,CAACP,QAAQ,CAAC,CAAC;EACnCQ,iBAAiB,EAAEvB,8BAA8B,CAACe,QAAQ,CAAC,CAAC;EAC5DS,eAAe,EAAE1B,yBAAyB,CAAC2B,QAAQ,CAAC,CAAC;EACrDC,
|
|
1
|
+
{"version":3,"file":"schema.js","names":["FormStatus","formVersionMetadataSchema","idSchema","notificationEmailAddressSchema","slugSchema","titleSchema","Joi","FormAdapterSubmissionSchemaVersion","formAdapterSubmissionMessageMetaSchema","object","keys","schemaVersion","string","valid","Object","values","timestamp","date","required","referenceNumber","formName","formId","formSlug","status","isPreview","boolean","notificationEmail","versionMetadata","optional","language","custom","pattern","any","unknown","description","formAdapterSubmissionMessageDataSchema","main","repeaters","payment","paymentId","reference","amount","number","createdAt","files","array","items","fileName","fileId","userDownloadLink","formAdapterSubmissionMessageResultSchema","formAdapterSubmissionMessagePayloadSchema","meta","data","result"],"sources":["../../../../../src/server/plugins/engine/types/schema.ts"],"sourcesContent":["import {\n FormStatus,\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.string().valid(\n ...Object.values(FormAdapterSubmissionSchemaVersion)\n ),\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 })\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 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 })\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { type ComponentDef, type Event, type FormVersionMetadata, type Item, type List, type Page, type PaymentFieldComponent, type UkAddressFieldComponent } from '@defra/forms-model';
|
|
2
|
-
import { type PluginProperties, type Request, type ResponseObject } from '@hapi/hapi';
|
|
2
|
+
import { type PluginProperties, type Request, type RequestQuery, type ResponseObject } from '@hapi/hapi';
|
|
3
|
+
import { type Yar } from '@hapi/yar';
|
|
3
4
|
import { type JoiExpression, type ValidationErrorItem } from 'joi';
|
|
4
5
|
import { type UkAddressState } from '../../../server/plugins/engine/components/UkAddressField.js';
|
|
5
6
|
import { type Component } from '../../../server/plugins/engine/components/helpers/components.js';
|
|
6
7
|
import { type FileUploadField, type PaymentField } from '../../../server/plugins/engine/components/index.js';
|
|
7
8
|
import { type BackLink, type ComponentText, type ComponentViewModel, type DatePartsState, type EastingNorthingState, type LatLongState, type MonthYearState } from '../../../server/plugins/engine/components/types.js';
|
|
9
|
+
import { type Translator } from '../../../server/plugins/engine/i18n/types.js';
|
|
8
10
|
import { type FormModel } from '../../../server/plugins/engine/models/index.js';
|
|
9
11
|
import { type DetailItemField } from '../../../server/plugins/engine/models/types.js';
|
|
10
12
|
import { type PageController } from '../../../server/plugins/engine/pageControllers/PageController.js';
|
|
@@ -136,6 +138,11 @@ export interface FormContext {
|
|
|
136
138
|
pageMap: Map<string, PageControllerClass>;
|
|
137
139
|
componentMap: Map<string, Component>;
|
|
138
140
|
referenceNumber: string;
|
|
141
|
+
languages: {
|
|
142
|
+
name: string;
|
|
143
|
+
code: string;
|
|
144
|
+
}[];
|
|
145
|
+
translator: Translator | undefined;
|
|
139
146
|
}
|
|
140
147
|
export type FormContextRequest = ({
|
|
141
148
|
method: 'get';
|
|
@@ -295,6 +302,7 @@ export interface PageViewModelBase extends Partial<ViewContext> {
|
|
|
295
302
|
feedbackLink?: string;
|
|
296
303
|
serviceUrl: string;
|
|
297
304
|
phaseTag?: string;
|
|
305
|
+
t?: (key: string, opts?: Record<string, unknown>) => string;
|
|
298
306
|
}
|
|
299
307
|
export interface ItemDeletePageViewModel extends PageViewModelBase {
|
|
300
308
|
context: FormContext;
|
|
@@ -340,6 +348,7 @@ export interface ErrorMessageTemplateList {
|
|
|
340
348
|
export type PreparePageEventRequestOptions = (options: RequestOptions, event: Event, page: PageControllerClass, context: FormContext) => void;
|
|
341
349
|
export type OnRequestCallback = (request: AnyFormRequest, h: FormResponseToolkit, context: FormContext) => ResponseObject | FormResponseToolkit['continue'] | Promise<ResponseObject | FormResponseToolkit['continue']>;
|
|
342
350
|
export type SaveAndExitHandler = (request: FormRequestPayload, h: FormResponseToolkit, context: FormContext) => ResponseObject;
|
|
351
|
+
export type GetLanguageHandler = (query?: RequestQuery, yar?: Yar) => string;
|
|
343
352
|
export interface ExternalArgs {
|
|
344
353
|
component: ComponentDef;
|
|
345
354
|
controller: QuestionPageController;
|
|
@@ -377,6 +386,7 @@ export interface PluginOptions {
|
|
|
377
386
|
viewContext: PluginProperties['forms-engine-plugin']['viewContext'];
|
|
378
387
|
preparePageEventRequestOptions?: PreparePageEventRequestOptions;
|
|
379
388
|
onRequest?: OnRequestCallback;
|
|
389
|
+
getLanguage?: GetLanguageHandler;
|
|
380
390
|
baseUrl: string;
|
|
381
391
|
ordnanceSurveyApiKey?: string;
|
|
382
392
|
ordnanceSurveyApiSecret?: string;
|
|
@@ -392,6 +402,7 @@ export interface FormAdapterSubmissionMessageMeta {
|
|
|
392
402
|
isPreview: boolean;
|
|
393
403
|
notificationEmail: string;
|
|
394
404
|
versionMetadata?: FormVersionMetadata;
|
|
405
|
+
language?: string;
|
|
395
406
|
custom?: Record<string, unknown>;
|
|
396
407
|
}
|
|
397
408
|
export type FormAdapterSubmissionMessageMetaSerialised = Omit<FormAdapterSubmissionMessageMeta, 'schemaVersion' | 'timestamp' | 'status'> & {
|