@defra/forms-engine-plugin 4.7.2-alpha → 4.7.3
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/client/javascripts/geospatial-map.d.ts +6 -6
- package/.server/client/javascripts/geospatial-map.js +3 -3
- package/.server/client/javascripts/location-map.d.ts +1 -1
- package/.server/client/javascripts/location-map.js +1 -1
- package/.server/client/javascripts/map.d.ts +1 -1
- package/.server/client/javascripts/map.js +1 -1
- package/.server/client/javascripts/shared.d.ts +7 -7
- package/.server/server/index.d.ts +1 -1
- package/.server/server/plugins/crumb.d.ts +1 -1
- package/.server/server/plugins/engine/beta/form-context.d.ts +6 -6
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +4 -4
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js +2 -2
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +5 -5
- package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -8
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +11 -11
- package/.server/server/plugins/engine/components/DeclarationField.d.ts +3 -3
- package/.server/server/plugins/engine/components/Details.d.ts +1 -1
- package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +22 -22
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -4
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +3 -3
- package/.server/server/plugins/engine/components/FormComponent.d.ts +10 -10
- package/.server/server/plugins/engine/components/GeospatialField.d.ts +6 -6
- package/.server/server/plugins/engine/components/HiddenField.d.ts +2 -2
- package/.server/server/plugins/engine/components/Html.d.ts +1 -1
- package/.server/server/plugins/engine/components/InsetText.d.ts +1 -1
- package/.server/server/plugins/engine/components/LatLongField.d.ts +22 -22
- package/.server/server/plugins/engine/components/List.d.ts +8 -8
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +10 -10
- package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +6 -6
- package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +14 -14
- package/.server/server/plugins/engine/components/Markdown.d.ts +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +11 -11
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +5 -5
- package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +1 -1
- package/.server/server/plugins/engine/components/NumberField.d.ts +3 -3
- package/.server/server/plugins/engine/components/OsGridRefField.d.ts +1 -1
- package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -12
- package/.server/server/plugins/engine/components/RadiosField.d.ts +1 -1
- package/.server/server/plugins/engine/components/SelectField.d.ts +4 -4
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +10 -10
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +4 -4
- package/.server/server/plugins/engine/components/TextField.d.ts +2 -2
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +11 -11
- package/.server/server/plugins/engine/components/YesNoField.d.ts +2 -2
- package/.server/server/plugins/engine/components/helpers/__stubs__/geospatial.d.ts +1 -1
- package/.server/server/plugins/engine/components/helpers/components.d.ts +5 -5
- package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +1 -1
- package/.server/server/plugins/engine/components/index.d.ts +27 -27
- package/.server/server/plugins/engine/components/types.d.ts +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.d.ts +4 -4
- package/.server/server/plugins/engine/date-helper.d.ts +1 -1
- package/.server/server/plugins/engine/helpers.d.ts +8 -8
- package/.server/server/plugins/engine/index.d.ts +5 -5
- package/.server/server/plugins/engine/models/FormModel.d.ts +6 -6
- package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +6 -6
- package/.server/server/plugins/engine/models/index.d.ts +2 -2
- package/.server/server/plugins/engine/models/types.d.ts +4 -4
- package/.server/server/plugins/engine/options.d.ts +1 -1
- package/.server/server/plugins/engine/options.js +1 -1
- package/.server/server/plugins/engine/options.test.js +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.d.ts +4 -4
- package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +4 -4
- package/.server/server/plugins/engine/outputFormatters/index.d.ts +5 -5
- package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +4 -4
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +4 -4
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +8 -8
- package/.server/server/plugins/engine/pageControllers/PageController.d.ts +6 -6
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +8 -8
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +5 -5
- package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +4 -4
- package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +4 -4
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +5 -5
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +3 -3
- package/.server/server/plugins/engine/pageControllers/__stubs__/request.d.ts +2 -2
- package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/pages.d.ts +2 -2
- package/.server/server/plugins/engine/pageControllers/helpers/state.d.ts +5 -5
- package/.server/server/plugins/engine/pageControllers/helpers/state.js +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/state.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
- package/.server/server/plugins/engine/pageControllers/index.d.ts +7 -7
- package/.server/server/plugins/engine/plugin.d.ts +1 -1
- package/.server/server/plugins/engine/routes/file-upload.d.ts +1 -1
- package/.server/server/plugins/engine/routes/index.d.ts +3 -3
- package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -3
- package/.server/server/plugins/engine/routes/payment-helper.js +2 -2
- package/.server/server/plugins/engine/routes/payment.js +5 -5
- package/.server/server/plugins/engine/routes/payment.test.js +1 -1
- package/.server/server/plugins/engine/routes/questions.d.ts +2 -2
- package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -2
- package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -2
- package/.server/server/plugins/engine/services/index.d.ts +3 -3
- package/.server/server/plugins/engine/services/notifyService.d.ts +4 -4
- package/.server/server/plugins/engine/services/uploadService.d.ts +2 -2
- package/.server/server/plugins/engine/services/uploadService.js +1 -1
- package/.server/server/plugins/engine/types/index.d.ts +10 -10
- package/.server/server/plugins/engine/types/schema.d.ts +1 -1
- package/.server/server/plugins/engine/types.d.ts +25 -16
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/validationHelpers.d.ts +2 -2
- package/.server/server/plugins/engine/vision.d.ts +1 -1
- package/.server/server/plugins/map/index.d.ts +1 -1
- package/.server/server/plugins/map/index.js +1 -1
- package/.server/server/plugins/map/routes/get-os-token.d.ts +11 -1
- package/.server/server/plugins/map/routes/get-os-token.js +12 -2
- package/.server/server/plugins/map/routes/get-os-token.js.map +1 -1
- package/.server/server/plugins/map/routes/index.d.ts +4 -4
- package/.server/server/plugins/map/routes/index.js +3 -2
- package/.server/server/plugins/map/routes/index.js.map +1 -1
- package/.server/server/plugins/map/service.d.ts +1 -1
- package/.server/server/plugins/map/service.js +5 -2
- package/.server/server/plugins/map/service.js.map +1 -1
- package/.server/server/plugins/map/test/__stubs__/find.d.ts +1 -1
- package/.server/server/plugins/map/test/__stubs__/find.js +1 -1
- package/.server/server/plugins/nunjucks/context.d.ts +2 -2
- package/.server/server/plugins/nunjucks/context.js +2 -2
- package/.server/server/plugins/nunjucks/context.test.js +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +1 -1
- package/.server/server/plugins/nunjucks/environment.d.ts +3 -3
- package/.server/server/plugins/nunjucks/environment.js +3 -3
- package/.server/server/plugins/nunjucks/filters/answer.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
- package/.server/server/plugins/nunjucks/filters/answer.test.js +1 -1
- package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/evaluate.js +1 -1
- package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/field.js +1 -1
- package/.server/server/plugins/nunjucks/filters/field.test.js +1 -1
- package/.server/server/plugins/nunjucks/filters/href.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/href.js +1 -1
- package/.server/server/plugins/nunjucks/filters/href.test.js +1 -1
- package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -8
- package/.server/server/plugins/nunjucks/filters/page.d.ts +1 -1
- package/.server/server/plugins/nunjucks/filters/page.js +1 -1
- package/.server/server/plugins/nunjucks/filters/page.test.js +1 -1
- package/.server/server/plugins/nunjucks/index.d.ts +3 -3
- package/.server/server/plugins/nunjucks/render.d.ts +2 -2
- package/.server/server/plugins/nunjucks/render.js +1 -1
- package/.server/server/plugins/nunjucks/types.d.ts +1 -1
- package/.server/server/plugins/nunjucks/types.js +1 -1
- package/.server/server/plugins/payment/helper.d.ts +2 -2
- package/.server/server/plugins/payment/helper.js +1 -1
- package/.server/server/plugins/payment/service.d.ts +3 -3
- package/.server/server/plugins/payment/service.js +1 -1
- package/.server/server/plugins/postcode-lookup/index.d.ts +1 -1
- package/.server/server/plugins/postcode-lookup/index.js +1 -1
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +6 -6
- package/.server/server/plugins/postcode-lookup/models/index.js +1 -1
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +6 -6
- package/.server/server/plugins/postcode-lookup/routes/index.js +15 -15
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/service.d.ts +1 -1
- package/.server/server/plugins/postcode-lookup/service.js +5 -2
- package/.server/server/plugins/postcode-lookup/service.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/types.js +1 -1
- package/.server/server/routes/index.d.ts +2 -2
- package/.server/server/routes/types.d.ts +1 -1
- package/.server/server/schemas/index.d.ts +2 -2
- package/.server/server/services/cacheService.d.ts +8 -8
- package/.server/server/services/cacheService.js +2 -5
- package/.server/server/services/cacheService.js.map +1 -1
- package/.server/server/services/httpService.test.js +1 -1
- package/.server/server/services/index.d.ts +1 -1
- package/.server/server/types.d.ts +7 -7
- package/.server/server/utils/file-form-service.d.ts +2 -2
- package/.server/server/utils/file-form-service.js +1 -1
- package/package.json +8 -4
- package/src/client/javascripts/application.js +1 -1
- package/src/client/javascripts/geospatial-map.js +4 -4
- package/src/client/javascripts/location-map.js +2 -2
- package/src/client/javascripts/map.js +3 -3
- package/src/client/javascripts/shared.js +7 -7
- package/src/index.ts +3 -3
- package/src/server/common/helpers/logging/logger-options.ts +1 -1
- package/src/server/common/helpers/logging/logger.ts +1 -1
- package/src/server/common/helpers/logging/request-logger.ts +1 -1
- package/src/server/common/helpers/logging/request-tracing.js +1 -1
- package/src/server/common/helpers/redis-client.js +2 -2
- package/src/server/index.ts +13 -13
- package/src/server/plugins/crumb.ts +2 -2
- package/src/server/plugins/engine/beta/form-context.ts +9 -9
- package/src/server/plugins/engine/components/AutocompleteField.ts +3 -3
- package/src/server/plugins/engine/components/CheckboxesField.ts +7 -8
- package/src/server/plugins/engine/components/ComponentBase.ts +5 -5
- package/src/server/plugins/engine/components/ComponentCollection.ts +9 -9
- package/src/server/plugins/engine/components/DatePartsField.ts +8 -8
- package/src/server/plugins/engine/components/DeclarationField.ts +3 -3
- package/src/server/plugins/engine/components/Details.ts +1 -1
- package/src/server/plugins/engine/components/EastingNorthingField.ts +9 -9
- package/src/server/plugins/engine/components/EmailAddressField.ts +3 -3
- package/src/server/plugins/engine/components/FileUploadField.ts +6 -6
- package/src/server/plugins/engine/components/FormComponent.ts +4 -4
- package/src/server/plugins/engine/components/GeospatialField.ts +5 -5
- package/src/server/plugins/engine/components/HiddenField.ts +4 -4
- package/src/server/plugins/engine/components/Html.ts +1 -1
- package/src/server/plugins/engine/components/InsetText.ts +1 -1
- package/src/server/plugins/engine/components/LatLongField.ts +9 -9
- package/src/server/plugins/engine/components/List.ts +2 -2
- package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
- package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -5
- package/src/server/plugins/engine/components/LocationFieldHelpers.ts +5 -5
- package/src/server/plugins/engine/components/Markdown.ts +1 -1
- package/src/server/plugins/engine/components/MonthYearField.ts +8 -8
- package/src/server/plugins/engine/components/MultilineTextField.ts +4 -4
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +2 -2
- package/src/server/plugins/engine/components/NumberField.ts +3 -3
- package/src/server/plugins/engine/components/OsGridRefField.ts +2 -2
- package/src/server/plugins/engine/components/PaymentField.ts +8 -8
- package/src/server/plugins/engine/components/RadiosField.ts +1 -1
- package/src/server/plugins/engine/components/SelectField.ts +2 -2
- package/src/server/plugins/engine/components/SelectionControlField.ts +4 -4
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -4
- package/src/server/plugins/engine/components/TextField.ts +3 -3
- package/src/server/plugins/engine/components/UkAddressField.ts +7 -7
- package/src/server/plugins/engine/components/YesNoField.ts +5 -5
- package/src/server/plugins/engine/components/helpers/__stubs__/geospatial.ts +1 -1
- package/src/server/plugins/engine/components/helpers/components.ts +8 -8
- package/src/server/plugins/engine/components/helpers/geospatial.ts +1 -1
- package/src/server/plugins/engine/components/index.ts +27 -27
- package/src/server/plugins/engine/components/types.ts +1 -1
- package/src/server/plugins/engine/configureEnginePlugin.ts +10 -10
- package/src/server/plugins/engine/date-helper.ts +1 -1
- package/src/server/plugins/engine/helpers.ts +8 -8
- package/src/server/plugins/engine/index.ts +8 -8
- package/src/server/plugins/engine/models/FormModel.ts +15 -15
- package/src/server/plugins/engine/models/SummaryViewModel.ts +10 -10
- package/src/server/plugins/engine/models/index.ts +2 -2
- package/src/server/plugins/engine/models/types.ts +4 -4
- package/src/server/plugins/engine/options.js +3 -3
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +6 -6
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +9 -9
- package/src/server/plugins/engine/outputFormatters/index.ts +8 -8
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +7 -7
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +6 -6
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +9 -9
- package/src/server/plugins/engine/pageControllers/PageController.ts +7 -7
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +13 -13
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +6 -6
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +3 -3
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +5 -5
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +12 -12
- package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +3 -3
- package/src/server/plugins/engine/pageControllers/__stubs__/request.ts +3 -3
- package/src/server/plugins/engine/pageControllers/__stubs__/server.ts +2 -2
- package/src/server/plugins/engine/pageControllers/errors.ts +1 -1
- package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -2
- package/src/server/plugins/engine/pageControllers/helpers/state.ts +9 -9
- package/src/server/plugins/engine/pageControllers/helpers/submission.ts +5 -5
- package/src/server/plugins/engine/pageControllers/index.ts +7 -7
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +1 -1
- package/src/server/plugins/engine/plugin.ts +14 -14
- package/src/server/plugins/engine/routes/file-upload.ts +2 -2
- package/src/server/plugins/engine/routes/index.ts +10 -10
- package/src/server/plugins/engine/routes/payment-helper.js +4 -4
- package/src/server/plugins/engine/routes/payment.js +9 -9
- package/src/server/plugins/engine/routes/questions.ts +10 -10
- package/src/server/plugins/engine/routes/repeaters/item-delete.ts +6 -6
- package/src/server/plugins/engine/routes/repeaters/summary.ts +5 -5
- package/src/server/plugins/engine/services/formSubmissionService.js +2 -2
- package/src/server/plugins/engine/services/index.js +3 -3
- package/src/server/plugins/engine/services/localFormsService.js +2 -2
- package/src/server/plugins/engine/services/notifyService.ts +9 -9
- package/src/server/plugins/engine/services/uploadService.js +3 -3
- package/src/server/plugins/engine/types/index.ts +10 -10
- package/src/server/plugins/engine/types/schema.ts +2 -2
- package/src/server/plugins/engine/types.ts +22 -17
- package/src/server/plugins/engine/validationHelpers.ts +3 -3
- package/src/server/plugins/engine/vision.ts +3 -3
- package/src/server/plugins/map/index.js +2 -2
- package/src/server/plugins/map/routes/get-os-token.js +15 -3
- package/src/server/plugins/map/routes/index.js +7 -5
- package/src/server/plugins/map/service.js +7 -4
- package/src/server/plugins/map/test/__stubs__/find.js +1 -1
- package/src/server/plugins/nunjucks/context.js +5 -5
- package/src/server/plugins/nunjucks/environment.js +6 -6
- package/src/server/plugins/nunjucks/filters/answer.js +3 -3
- package/src/server/plugins/nunjucks/filters/evaluate.js +2 -2
- package/src/server/plugins/nunjucks/filters/field.js +1 -1
- package/src/server/plugins/nunjucks/filters/href.js +2 -2
- package/src/server/plugins/nunjucks/filters/index.js +8 -8
- package/src/server/plugins/nunjucks/filters/page.js +1 -1
- package/src/server/plugins/nunjucks/index.js +3 -3
- package/src/server/plugins/nunjucks/plugin.js +3 -3
- package/src/server/plugins/nunjucks/render.js +2 -2
- package/src/server/plugins/nunjucks/types.js +1 -1
- package/src/server/plugins/payment/helper.js +2 -2
- package/src/server/plugins/payment/service.js +4 -4
- package/src/server/plugins/postcode-lookup/index.js +2 -2
- package/src/server/plugins/postcode-lookup/models/index.js +3 -3
- package/src/server/plugins/postcode-lookup/routes/index.js +24 -14
- package/src/server/plugins/postcode-lookup/service.js +7 -4
- package/src/server/plugins/postcode-lookup/types.js +1 -1
- package/src/server/plugins/session.ts +1 -1
- package/src/server/routes/index.ts +2 -2
- package/src/server/routes/public.ts +1 -1
- package/src/server/routes/types.ts +1 -1
- package/src/server/schemas/index.ts +2 -2
- package/src/server/secure-context.js +1 -1
- package/src/server/services/cacheService.ts +13 -18
- package/src/server/services/httpService.ts +1 -1
- package/src/server/services/index.ts +1 -1
- package/src/server/types.ts +7 -7
- package/src/server/utils/notify.ts +2 -2
- package/src/server/utils/utils.js +1 -1
- package/src/typings/hapi/index.d.ts +4 -4
- package/src/typings/joi/index.d.ts +1 -1
- package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
- package/src/server/index.test.ts +0 -644
- package/src/server/plugins/engine/beta/form-context.test.ts +0 -373
- package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -362
- package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -486
- package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -927
- package/src/server/plugins/engine/components/DeclarationField.test.ts +0 -560
- package/src/server/plugins/engine/components/Details.test.ts +0 -49
- package/src/server/plugins/engine/components/EastingNorthingField.test.ts +0 -727
- package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -445
- package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -1079
- package/src/server/plugins/engine/components/GeospatialField.test.ts +0 -380
- package/src/server/plugins/engine/components/HiddenField.test.ts +0 -188
- package/src/server/plugins/engine/components/Html.test.ts +0 -48
- package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
- package/src/server/plugins/engine/components/LatLongField.test.ts +0 -898
- package/src/server/plugins/engine/components/List.test.ts +0 -79
- package/src/server/plugins/engine/components/LocationFieldBase.test.ts +0 -253
- package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +0 -743
- package/src/server/plugins/engine/components/Markdown.test.ts +0 -48
- package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -617
- package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -647
- package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +0 -449
- package/src/server/plugins/engine/components/NumberField.test.ts +0 -723
- package/src/server/plugins/engine/components/OsGridRefField.test.ts +0 -460
- package/src/server/plugins/engine/components/PaymentField.test.ts +0 -745
- package/src/server/plugins/engine/components/RadiosField.test.ts +0 -297
- package/src/server/plugins/engine/components/SelectField.test.ts +0 -289
- package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -384
- package/src/server/plugins/engine/components/TextField.test.ts +0 -521
- package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -806
- package/src/server/plugins/engine/components/YesNoField.test.ts +0 -256
- package/src/server/plugins/engine/components/helpers/components.test.ts +0 -399
- package/src/server/plugins/engine/components/helpers/geospatial.test.js +0 -55
- package/src/server/plugins/engine/components/helpers/helpers.test.ts +0 -219
- package/src/server/plugins/engine/date-helper.test.ts +0 -47
- package/src/server/plugins/engine/helpers.test.ts +0 -868
- package/src/server/plugins/engine/models/FormModel.test.ts +0 -725
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -472
- package/src/server/plugins/engine/options.test.js +0 -63
- package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +0 -356
- package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +0 -871
- package/src/server/plugins/engine/outputFormatters/human/v1.payment.test.ts +0 -147
- package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -145
- package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
- package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -268
- package/src/server/plugins/engine/outputFormatters/machine/v2.location.test.ts +0 -341
- package/src/server/plugins/engine/outputFormatters/machine/v2.payment.test.ts +0 -115
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -311
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1372
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -246
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1686
- package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -279
- package/src/server/plugins/engine/pageControllers/StartPageController.test.ts +0 -32
- package/src/server/plugins/engine/pageControllers/StatusPageController.test.ts +0 -32
- package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +0 -89
- package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -37
- package/src/server/plugins/engine/pageControllers/errors.test.ts +0 -78
- package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +0 -182
- package/src/server/plugins/engine/pageControllers/helpers/state.test.ts +0 -359
- package/src/server/plugins/engine/pageControllers/helpers/submission.test.ts +0 -373
- package/src/server/plugins/engine/referenceNumbers.test.ts +0 -74
- package/src/server/plugins/engine/routes/index.test.ts +0 -332
- package/src/server/plugins/engine/routes/payment-helper.test.js +0 -136
- package/src/server/plugins/engine/routes/payment.test.js +0 -180
- package/src/server/plugins/engine/routes/questions.test.ts +0 -502
- package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +0 -83
- package/src/server/plugins/engine/routes/repeaters/summary.test.ts +0 -75
- package/src/server/plugins/engine/services/formsService.test.js +0 -26
- package/src/server/plugins/engine/services/notifyService.test.ts +0 -310
- package/src/server/plugins/engine/types/schema.test.ts +0 -234
- package/src/server/plugins/engine/views/components/service-banner/template.test.js +0 -43
- package/src/server/plugins/engine/views/components/tag-env/template.test.js +0 -28
- package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
- package/src/server/plugins/map/routes/get-os-token.test.js +0 -55
- package/src/server/plugins/map/service.test.js +0 -144
- package/src/server/plugins/nunjucks/context.test.js +0 -109
- package/src/server/plugins/nunjucks/enviroment.test.js +0 -207
- package/src/server/plugins/nunjucks/filters/answer.test.js +0 -92
- package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
- package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
- package/src/server/plugins/nunjucks/filters/merge.test.js +0 -15
- package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
- package/src/server/plugins/payment/helper.test.js +0 -29
- package/src/server/plugins/payment/service.test.js +0 -218
- package/src/server/plugins/postcode-lookup/service.test.js +0 -177
- package/src/server/postcode-lookup.test.ts +0 -64
- package/src/server/routes/dummy-api.test.ts +0 -97
- package/src/server/services/cacheService.test.ts +0 -308
- package/src/server/services/httpService.test.js +0 -491
- package/src/server/utils/file-form-service.test.js +0 -127
- package/src/server/utils/notify.test.ts +0 -37
- package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
- package/src/server/utils/utils.test.js +0 -69
|
@@ -21,5 +21,5 @@ export function formatPaymentDate(isoString: string): string;
|
|
|
21
21
|
*/
|
|
22
22
|
export function formatCurrency(amount: number, locale?: "en-GB", currency?: "GBP"): string;
|
|
23
23
|
export const DEFAULT_PAYMENT_HELP_URL: "https://www.gov.uk/government/organisations/department-for-environment-food-rural-affairs";
|
|
24
|
-
import type { FormsService } from '
|
|
25
|
-
import { PaymentService } from '
|
|
24
|
+
import type { FormsService } from '../../../server/types.js';
|
|
25
|
+
import { PaymentService } from '../../../server/plugins/payment/service.js';
|
|
@@ -38,6 +38,6 @@ export class PaymentService {
|
|
|
38
38
|
postToPayProvider(payload: CreatePaymentRequest): Promise<CreatePaymentResponse>;
|
|
39
39
|
#private;
|
|
40
40
|
}
|
|
41
|
-
import type { GetPaymentResponse } from '
|
|
42
|
-
import type { CreatePaymentRequest } from '
|
|
43
|
-
import type { CreatePaymentResponse } from '
|
|
41
|
+
import type { GetPaymentResponse } from '../../../server/plugins/payment/types.js';
|
|
42
|
+
import type { CreatePaymentRequest } from '../../../server/plugins/payment/types.js';
|
|
43
|
+
import type { CreatePaymentResponse } from '../../../server/plugins/payment/types.js';
|
|
@@ -149,6 +149,6 @@ export class PaymentService {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
|
-
* @import { CreatePaymentRequest, CreatePaymentResponse, GetPaymentApiResponse, GetPaymentResponse } from '
|
|
152
|
+
* @import { CreatePaymentRequest, CreatePaymentResponse, GetPaymentApiResponse, GetPaymentResponse } from '../../../server/plugins/payment/types.js'
|
|
153
153
|
*/
|
|
154
154
|
//# sourceMappingURL=service.js.map
|
|
@@ -5,4 +5,4 @@ export namespace postcodeLookupPlugin {
|
|
|
5
5
|
let multiple: false;
|
|
6
6
|
function register(server: import("@hapi/hapi").Server<import("@hapi/hapi").ServerApplicationState>, options: PostcodeLookupConfiguration): void;
|
|
7
7
|
}
|
|
8
|
-
import type { PostcodeLookupConfiguration } from '
|
|
8
|
+
import type { PostcodeLookupConfiguration } from '../../../server/plugins/postcode-lookup/types.js';
|
|
@@ -16,6 +16,6 @@ export const postcodeLookupPlugin = {
|
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @import { NamedPlugin } from '@hapi/hapi'
|
|
19
|
-
* @import { PostcodeLookupConfiguration } from '
|
|
19
|
+
* @import { PostcodeLookupConfiguration } from '../../../server/plugins/postcode-lookup/types.js'
|
|
20
20
|
*/
|
|
21
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -246,10 +246,10 @@ export const selectPayloadSchema: Joi.ObjectSchema<PostcodeLookupSelectPayload>;
|
|
|
246
246
|
*/
|
|
247
247
|
export const manualPayloadSchema: Joi.ObjectSchema<PostcodeLookupManualPayload>;
|
|
248
248
|
export type OptionalValidationErrorItem = Joi.ValidationErrorItem | undefined;
|
|
249
|
-
import type { PostcodeLookupSessionData } from '
|
|
250
|
-
import type { PostcodeLookupDetailsData } from '
|
|
251
|
-
import type { PostcodeLookupSelectPayload } from '
|
|
252
|
-
import type { Address } from '
|
|
253
|
-
import type { PostcodeLookupManualPayload } from '
|
|
249
|
+
import type { PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
250
|
+
import type { PostcodeLookupDetailsData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
251
|
+
import type { PostcodeLookupSelectPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
252
|
+
import type { Address } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
253
|
+
import type { PostcodeLookupManualPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
254
254
|
import Joi from 'joi';
|
|
255
|
-
import type { PostcodeLookupDetailsPayload } from '
|
|
255
|
+
import type { PostcodeLookupDetailsPayload } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
@@ -513,6 +513,6 @@ export function manualViewModel(data, payload, err) {
|
|
|
513
513
|
|
|
514
514
|
/**
|
|
515
515
|
* @import { ObjectSchema, ValidationErrorItem } from 'joi'
|
|
516
|
-
* @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '
|
|
516
|
+
* @import { Address, PostcodeLookupDetailsData, PostcodeLookupDetailsPayload, PostcodeLookupManualPayload, PostcodeLookupSelectPayload, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
|
|
517
517
|
*/
|
|
518
518
|
//# sourceMappingURL=index.js.map
|
|
@@ -10,10 +10,10 @@ export function dispatch(request: FormRequestPayload, h: FormResponseToolkit, in
|
|
|
10
10
|
* @param {PostcodeLookupConfiguration} options - ordnance survey api key
|
|
11
11
|
*/
|
|
12
12
|
export function getRoutes(options: PostcodeLookupConfiguration): (ServerRoute<PostcodeLookupGetRequestRefs> | ServerRoute<PostcodeLookupPostRequestRefs>)[];
|
|
13
|
-
import type { FormRequestPayload } from '
|
|
14
|
-
import type { FormResponseToolkit } from '
|
|
15
|
-
import type { PostcodeLookupDispatchData } from '
|
|
16
|
-
import type { PostcodeLookupConfiguration } from '
|
|
17
|
-
import type { PostcodeLookupGetRequestRefs } from '
|
|
13
|
+
import type { FormRequestPayload } from '../../../../server/routes/types.js';
|
|
14
|
+
import type { FormResponseToolkit } from '../../../../server/routes/types.js';
|
|
15
|
+
import type { PostcodeLookupDispatchData } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
16
|
+
import type { PostcodeLookupConfiguration } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
17
|
+
import type { PostcodeLookupGetRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
18
18
|
import type { ServerRoute } from '@hapi/hapi';
|
|
19
|
-
import type { PostcodeLookupPostRequestRefs } from '
|
|
19
|
+
import type { PostcodeLookupPostRequestRefs } from '../../../../server/plugins/postcode-lookup/types.js';
|
|
@@ -154,17 +154,17 @@ function postRoute(options) {
|
|
|
154
154
|
* @param {PostcodeLookupConfiguration} options
|
|
155
155
|
*/
|
|
156
156
|
async function detailsPostHandler(request, h, options) {
|
|
157
|
-
const {
|
|
158
|
-
payload
|
|
159
|
-
} = request;
|
|
160
157
|
const session = getSessionState(request);
|
|
161
158
|
const {
|
|
162
159
|
ordnanceSurveyApiKey: apiKey
|
|
163
160
|
} = options;
|
|
161
|
+
|
|
162
|
+
/** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
164
164
|
const {
|
|
165
165
|
value: details,
|
|
166
166
|
error
|
|
167
|
-
} = detailsPayloadSchema.validate(payload);
|
|
167
|
+
} = detailsPayloadSchema.validate(request.payload);
|
|
168
168
|
let model;
|
|
169
169
|
if (error) {
|
|
170
170
|
model = detailsViewModel(session, details, error);
|
|
@@ -195,17 +195,17 @@ async function detailsPostHandler(request, h, options) {
|
|
|
195
195
|
* @param {PostcodeLookupConfiguration} options
|
|
196
196
|
*/
|
|
197
197
|
async function selectPostHandler(request, h, options) {
|
|
198
|
-
const {
|
|
199
|
-
payload
|
|
200
|
-
} = request;
|
|
201
198
|
const session = getSessionState(request);
|
|
202
199
|
const {
|
|
203
200
|
ordnanceSurveyApiKey: apiKey
|
|
204
201
|
} = options;
|
|
202
|
+
|
|
203
|
+
/** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
205
205
|
const {
|
|
206
206
|
value: select,
|
|
207
207
|
error
|
|
208
|
-
} = selectPayloadSchema.validate(payload);
|
|
208
|
+
} = selectPayloadSchema.validate(request.payload);
|
|
209
209
|
if (error) {
|
|
210
210
|
const model = await selectViewModel({
|
|
211
211
|
session,
|
|
@@ -234,14 +234,14 @@ async function selectPostHandler(request, h, options) {
|
|
|
234
234
|
* @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h
|
|
235
235
|
*/
|
|
236
236
|
function manualPostHandler(request, h) {
|
|
237
|
-
const {
|
|
238
|
-
payload
|
|
239
|
-
} = request;
|
|
240
237
|
const session = getSessionState(request);
|
|
238
|
+
|
|
239
|
+
/** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */
|
|
240
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
241
241
|
const {
|
|
242
242
|
value: manual,
|
|
243
243
|
error
|
|
244
|
-
} = manualPayloadSchema.validate(payload, {
|
|
244
|
+
} = manualPayloadSchema.validate(request.payload, {
|
|
245
245
|
abortEarly: false
|
|
246
246
|
});
|
|
247
247
|
if (error) {
|
|
@@ -260,8 +260,8 @@ function manualPostHandler(request, h) {
|
|
|
260
260
|
|
|
261
261
|
/**
|
|
262
262
|
* @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'
|
|
263
|
-
* @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '
|
|
264
|
-
* @import { FormRequestPayload, FormResponseToolkit } from '
|
|
265
|
-
* @import { ExternalStateAppendage } from '
|
|
263
|
+
* @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../../../../server/plugins/postcode-lookup/types.js'
|
|
264
|
+
* @import { FormRequestPayload, FormResponseToolkit } from '../../../../server/routes/types.js'
|
|
265
|
+
* @import { ExternalStateAppendage } from '../../../../server/plugins/engine/types.js'
|
|
266
266
|
*/
|
|
267
267
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","detailsPayloadSchema","detailsViewModel","manualPayloadSchema","manualViewModel","selectPayloadSchema","selectViewModel","stepSchema","steps","service","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","dispatch","h","initial","details","postcodeQuery","buildingNameQuery","set","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","ordnanceSurveyApiKey","apiKey","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport {\n JOURNEY_BASE_URL,\n detailsPayloadSchema,\n detailsViewModel,\n manualPayloadSchema,\n manualViewModel,\n selectPayloadSchema,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nfunction getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n handler(request, h) {\n const { query } = request\n const { step } = query\n const session = getSessionState(request)\n\n const model =\n step === steps.manual\n ? manualViewModel(session)\n : detailsViewModel(session)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const { payload } = request\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const { value: details, error } = detailsPayloadSchema.validate(payload)\n\n let model\n\n if (error) {\n model = detailsViewModel(session, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey })\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const { payload } = request\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const { value: select, error } = selectPayloadSchema.validate(payload)\n\n if (error) {\n const model = await selectViewModel({ session, apiKey }, select, error)\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nfunction manualPostHandler(request, h) {\n const { payload } = request\n const session = getSessionState(request)\n\n const { value: manual, error } = manualPayloadSchema.validate(payload, {\n abortEarly: false\n })\n\n if (error) {\n const model = manualViewModel(session, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","detailsPayloadSchema","detailsViewModel","manualPayloadSchema","manualViewModel","selectPayloadSchema","selectViewModel","stepSchema","steps","service","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","dispatch","h","initial","details","postcodeQuery","buildingNameQuery","set","query","step","redirect","code","SEE_OTHER","getRoutes","options","getRoute","postRoute","method","path","handler","session","model","manual","view","validate","object","keys","string","allow","optional","payload","detailsPostHandler","select","selectPostHandler","manualPostHandler","unknown","ordnanceSurveyApiKey","apiKey","value","error","addresses","searchByUPRN","property","at","internal","sourceUrl","abortEarly"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.js"],"sourcesContent":["import Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\nimport Joi from 'joi'\n\nimport { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js'\nimport {\n JOURNEY_BASE_URL,\n detailsPayloadSchema,\n detailsViewModel,\n manualPayloadSchema,\n manualViewModel,\n selectPayloadSchema,\n selectViewModel,\n stepSchema,\n steps\n} from '~/src/server/plugins/postcode-lookup/models/index.js'\nimport * as service from '~/src/server/plugins/postcode-lookup/service.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nfunction getSessionState(request) {\n /**\n * @type {PostcodeLookupSessionData | null | undefined}\n */\n const state = request.yar.get(JOURNEY_BASE_URL)\n\n if (!state) {\n throw Boom.badRequest(\n `No postcode lookup data found for ${JOURNEY_BASE_URL}`\n )\n }\n\n return state\n}\n\n/**\n * Flash form component state\n * @param {PostcodeLookupRequest} request - the request\n * @param {string} componentName - the component name\n * @param {Address | PostcodeLookupManualPayload} address - the address from ordnance survey or manually entered\n */\nfunction flashComponentState(request, componentName, address) {\n const addressState = {\n addressLine1: address.addressLine1,\n addressLine2: address.addressLine2,\n town: address.town,\n county: address.county,\n postcode: address.postcode,\n uprn: 'uprn' in address && address.uprn ? address.uprn : undefined\n }\n\n /**\n * @type {ExternalStateAppendage}\n */\n const appendage = {\n component: componentName,\n data: addressState\n }\n\n request.yar.flash(EXTERNAL_STATE_APPENDAGE, appendage, true)\n}\n\n/**\n * Initialises and dispatches the request to the postcode lookup journey\n * @param {FormRequestPayload} request - the source page\n * @param {FormResponseToolkit} h - the source page\n * @param {PostcodeLookupDispatchData} initial - the source data\n */\nexport function dispatch(request, h, initial) {\n /**\n * @type {PostcodeLookupSessionData}\n */\n const data = {\n initial,\n details: { postcodeQuery: '', buildingNameQuery: '' }\n }\n\n request.yar.set(JOURNEY_BASE_URL, data)\n\n const query = initial.step ? `?step=${initial.step}` : ''\n\n return h.redirect(`${JOURNEY_BASE_URL}${query}`).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Gets the postcode lookup routes\n * @param {PostcodeLookupConfiguration} options - ordnance survey api key\n */\nexport function getRoutes(options) {\n return [getRoute(), postRoute(options)]\n}\n\n/**\n * @returns {ServerRoute<PostcodeLookupGetRequestRefs>}\n */\nfunction getRoute() {\n return {\n method: 'GET',\n path: JOURNEY_BASE_URL,\n handler(request, h) {\n const { query } = request\n const { step } = query\n const session = getSessionState(request)\n\n const model =\n step === steps.manual\n ? manualViewModel(session)\n : detailsViewModel(session)\n\n return h.view(viewName, model)\n },\n options: {\n validate: {\n query: Joi.object()\n .keys({\n step: Joi.string().allow(steps.details, steps.manual).optional()\n })\n .optional()\n }\n }\n }\n}\n\n/**\n * @param {PostcodeLookupConfiguration} options\n * @returns {ServerRoute<PostcodeLookupPostRequestRefs>}\n */\nfunction postRoute(options) {\n return {\n method: 'POST',\n path: JOURNEY_BASE_URL,\n async handler(request, h) {\n const { payload } = request\n const { step } = payload\n\n switch (step) {\n case steps.details: {\n return detailsPostHandler(request, h, options)\n }\n case steps.select: {\n return selectPostHandler(request, h, options)\n }\n case steps.manual: {\n return manualPostHandler(request, h)\n }\n default:\n throw Boom.badRequest(`Invalid step ${step}`)\n }\n },\n options: {\n validate: {\n payload: Joi.object()\n .keys({\n step: stepSchema\n })\n .unknown(true)\n }\n }\n }\n}\n\n/**\n * Post handler for the details step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function detailsPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n\n /** @type {{ value: PostcodeLookupDetailsPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: details, error } = detailsPayloadSchema.validate(\n request.payload\n )\n\n let model\n\n if (error) {\n model = detailsViewModel(session, details, error)\n\n return h.view(viewName, model)\n }\n\n const { postcodeQuery, buildingNameQuery } = details\n session.details = { postcodeQuery, buildingNameQuery }\n\n // Store the updated session\n request.yar.set(JOURNEY_BASE_URL, session)\n\n model = await selectViewModel({ session, apiKey })\n\n return h.view(viewName, model)\n}\n\n/**\n * Post handler for the select step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n * @param {PostcodeLookupConfiguration} options\n */\nasync function selectPostHandler(request, h, options) {\n const session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n\n /** @type {{ value: PostcodeLookupSelectPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: select, error } = selectPayloadSchema.validate(request.payload)\n\n if (error) {\n const model = await selectViewModel({ session, apiKey }, select, error)\n\n return h.view(viewName, model)\n }\n\n const addresses = await service.searchByUPRN(select.uprn, apiKey)\n const property = addresses.at(0)\n\n if (!property) {\n throw Boom.internal(`UPRN ${property} not found`)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, property)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * Post handler for the manual step\n * @param {PostcodeLookupPostRequest} request\n * @param {ResponseToolkit<PostcodeLookupPostRequestRefs>} h\n */\nfunction manualPostHandler(request, h) {\n const session = getSessionState(request)\n\n /** @type {{ value: PostcodeLookupManualPayload, error?: import('joi').ValidationError }} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value: manual, error } = manualPayloadSchema.validate(\n request.payload,\n {\n abortEarly: false\n }\n )\n\n if (error) {\n const model = manualViewModel(session, manual, error)\n\n return h.view(viewName, model)\n }\n\n const { componentName, sourceUrl } = session.initial\n flashComponentState(request, componentName, manual)\n\n // Redirect back to the source form page\n return h.redirect(sourceUrl).code(StatusCodes.SEE_OTHER)\n}\n\n/**\n * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'\n * @import { PostcodeLookupManualPayload, PostcodeLookupDetailsPayload, PostcodeLookupSelectPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { FormRequestPayload, FormResponseToolkit } from '~/src/server/routes/types.js'\n * @import { ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,4 +23,4 @@ export function searchByUPRN(uprn: string, apiKey: string): Promise<Address[]>;
|
|
|
23
23
|
* @param {string} apiKey - the OS api key
|
|
24
24
|
*/
|
|
25
25
|
export function search(postcodeQuery: string, buildingNameQuery: string, apiKey: string): Promise<Address[]>;
|
|
26
|
-
import type { Address } from '
|
|
26
|
+
import type { Address } from '../../../server/plugins/postcode-lookup/types.js';
|
|
@@ -17,7 +17,10 @@ function empty() {
|
|
|
17
17
|
* @param {string} endpoint - the OS api endpoint
|
|
18
18
|
*/
|
|
19
19
|
function logErrorAndReturnEmpty(err, endpoint) {
|
|
20
|
-
|
|
20
|
+
/** @type {{ payload?: { error?: { message?: string } } } | false} */
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
22
|
+
const boomData = Boom.isBoom(err) && err.data;
|
|
23
|
+
const msg = `${getErrorMessage(err)} ${(boomData && boomData.payload?.error?.message) ?? ''}`;
|
|
21
24
|
logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`);
|
|
22
25
|
return empty();
|
|
23
26
|
}
|
|
@@ -143,6 +146,6 @@ function titleCase(address) {
|
|
|
143
146
|
}
|
|
144
147
|
|
|
145
148
|
/**
|
|
146
|
-
* @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '
|
|
149
|
+
* @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '../../../server/plugins/postcode-lookup/types.js'
|
|
147
150
|
*/
|
|
148
151
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","names":["getErrorMessage","Boom","createLogger","getJson","logger","empty","logErrorAndReturnEmpty","err","endpoint","msg","isBoom","data","payload","error","message","getAddressData","url","getJsonByType","response","results","Array","isArray","map","result","formatAddress","DPA","searchByQuery","query","apiKey","encodeURIComponent","searchByPostcode","postcode","replaceAll","searchByUPRN","uprn","search","postcodeQuery","buildingNameQuery","addresses","filter","item","address","includes","toUpperCase","dpa","addressLine1","formatAddressLine1","addressLine2","formatAddressLine2","town","titleCase","POST_TOWN","POSTCODE","lines","formatted","i","join","UPRN","ADDRESS","county","ORGANISATION_NAME","SUB_BUILDING_NAME","BUILDING_NAME","BUILDING_NUMBER","THOROUGHFARE_NAME","DEPENDENT_LOCALITY","split","charAt","slice","toLowerCase"],"sources":["../../../../src/server/plugins/postcode-lookup/service.js"],"sourcesContent":["import { getErrorMessage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\n\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { getJson } from '~/src/server/services/httpService.js'\n\nconst logger = createLogger()\n\n/**\n * Returns an empty result set\n */\nfunction empty() {\n return []\n}\n\n/**\n * Logs OS places errors\n * @param {unknown} err - the error\n * @param {string} endpoint - the OS api endpoint\n */\nfunction logErrorAndReturnEmpty(err, endpoint) {\n const msg = `${getErrorMessage(err)} ${(Boom.isBoom(err) && err.data?.payload?.error?.message) ?? ''}`\n\n logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`)\n\n return empty()\n}\n\n/**\n * Fetch data from OS API\n * @param {string} url - the url to get address json data from\n * @param {string} endpoint - the url endpoint description for logging\n */\nasync function getAddressData(url, endpoint) {\n const getJsonByType =\n /** @type {typeof getJson<DeliveryPointAddressResult>} */ (getJson)\n\n try {\n const response = await getJsonByType(url)\n\n if (response.error) {\n return logErrorAndReturnEmpty(response.error, endpoint)\n }\n\n const results = response.payload.results\n\n if (!Array.isArray(results)) {\n return empty()\n }\n\n return results.map((result) => formatAddress(result.DPA))\n } catch (err) {\n return logErrorAndReturnEmpty(err, endpoint)\n }\n}\n\n/**\n * OS places search\n * @param {string} query - the search term\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByQuery(query, apiKey) {\n const endpoint = 'find'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?query=${encodeURIComponent(query)}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode search\n * @param {string} postcode - the postcode\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByPostcode(postcode, apiKey) {\n const endpoint = 'postcode'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?postcode=${encodeURIComponent(postcode.replaceAll(/\\s/g, ''))}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS UPRN search\n * @param {string} uprn - the unique property reference number\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByUPRN(uprn, apiKey) {\n const endpoint = 'uprn'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?uprn=${uprn}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode and building name search\n * @param {string} postcodeQuery - the postcode query\n * @param {string} buildingNameQuery - the building name query\n * @param {string} apiKey - the OS api key\n */\nexport async function search(postcodeQuery, buildingNameQuery, apiKey) {\n let addresses = await searchByPostcode(postcodeQuery, apiKey)\n\n if (buildingNameQuery) {\n addresses = addresses.filter((item) =>\n item.address.includes(buildingNameQuery.toUpperCase())\n )\n }\n\n return addresses\n}\n\n/**\n * Converts a delivery point address to an address\n * Taken from http://github.com/dwp/find-an-address-plugin/blob/main/utils/getData.js\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddress(dpa) {\n const addressLine1 = formatAddressLine1(dpa)\n const addressLine2 = formatAddressLine2(dpa)\n const town = titleCase(dpa.POST_TOWN || '')\n const postcode = dpa.POSTCODE || ''\n const lines = [addressLine1, addressLine2, town]\n const formatted = `${lines.filter((i) => !!i).join(', ')}, ${postcode}`\n\n /**\n * @type {Address}\n */\n const address = {\n uprn: dpa.UPRN,\n address: dpa.ADDRESS,\n addressLine1,\n addressLine2,\n town,\n county: '',\n postcode,\n formatted\n }\n\n return address\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine1(dpa) {\n return titleCase(\n dpa.ORGANISATION_NAME ||\n dpa.SUB_BUILDING_NAME ||\n dpa.BUILDING_NAME ||\n dpa.BUILDING_NUMBER\n ? [\n dpa.ORGANISATION_NAME || '',\n dpa.SUB_BUILDING_NAME || '',\n dpa.BUILDING_NAME || '',\n dpa.BUILDING_NUMBER || ''\n ]\n .filter((item) => !!item)\n .join(' ')\n : ''\n )\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine2(dpa) {\n return titleCase(\n dpa.THOROUGHFARE_NAME || dpa.DEPENDENT_LOCALITY\n ? [dpa.THOROUGHFARE_NAME || '', dpa.DEPENDENT_LOCALITY || '']\n .filter((item) => !!item)\n .join(', ')\n : ''\n )\n}\n\n/**\n * Title case address\n * @param {string} address\n */\nfunction titleCase(address) {\n return address\n .split(' ')\n .map((item) => item.charAt(0).toUpperCase() + item.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"service.js","names":["getErrorMessage","Boom","createLogger","getJson","logger","empty","logErrorAndReturnEmpty","err","endpoint","boomData","isBoom","data","msg","payload","error","message","getAddressData","url","getJsonByType","response","results","Array","isArray","map","result","formatAddress","DPA","searchByQuery","query","apiKey","encodeURIComponent","searchByPostcode","postcode","replaceAll","searchByUPRN","uprn","search","postcodeQuery","buildingNameQuery","addresses","filter","item","address","includes","toUpperCase","dpa","addressLine1","formatAddressLine1","addressLine2","formatAddressLine2","town","titleCase","POST_TOWN","POSTCODE","lines","formatted","i","join","UPRN","ADDRESS","county","ORGANISATION_NAME","SUB_BUILDING_NAME","BUILDING_NAME","BUILDING_NUMBER","THOROUGHFARE_NAME","DEPENDENT_LOCALITY","split","charAt","slice","toLowerCase"],"sources":["../../../../src/server/plugins/postcode-lookup/service.js"],"sourcesContent":["import { getErrorMessage } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\n\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport { getJson } from '~/src/server/services/httpService.js'\n\nconst logger = createLogger()\n\n/**\n * Returns an empty result set\n */\nfunction empty() {\n return []\n}\n\n/**\n * Logs OS places errors\n * @param {unknown} err - the error\n * @param {string} endpoint - the OS api endpoint\n */\nfunction logErrorAndReturnEmpty(err, endpoint) {\n /** @type {{ payload?: { error?: { message?: string } } } | false} */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const boomData = Boom.isBoom(err) && err.data\n const msg = `${getErrorMessage(err)} ${(boomData && boomData.payload?.error?.message) ?? ''}`\n\n logger.error(err, `Exception occured calling OS places ${endpoint} - ${msg}}`)\n\n return empty()\n}\n\n/**\n * Fetch data from OS API\n * @param {string} url - the url to get address json data from\n * @param {string} endpoint - the url endpoint description for logging\n */\nasync function getAddressData(url, endpoint) {\n const getJsonByType =\n /** @type {typeof getJson<DeliveryPointAddressResult>} */ (getJson)\n\n try {\n const response = await getJsonByType(url)\n\n if (response.error) {\n return logErrorAndReturnEmpty(response.error, endpoint)\n }\n\n const results = response.payload.results\n\n if (!Array.isArray(results)) {\n return empty()\n }\n\n return results.map((result) => formatAddress(result.DPA))\n } catch (err) {\n return logErrorAndReturnEmpty(err, endpoint)\n }\n}\n\n/**\n * OS places search\n * @param {string} query - the search term\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByQuery(query, apiKey) {\n const endpoint = 'find'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?query=${encodeURIComponent(query)}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode search\n * @param {string} postcode - the postcode\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByPostcode(postcode, apiKey) {\n const endpoint = 'postcode'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?postcode=${encodeURIComponent(postcode.replaceAll(/\\s/g, ''))}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS UPRN search\n * @param {string} uprn - the unique property reference number\n * @param {string} apiKey - the OS api key\n */\nexport async function searchByUPRN(uprn, apiKey) {\n const endpoint = 'uprn'\n const url = `https://api.os.uk/search/places/v1/${endpoint}?uprn=${uprn}&key=${apiKey}`\n\n return getAddressData(url, endpoint)\n}\n\n/**\n * OS postcode and building name search\n * @param {string} postcodeQuery - the postcode query\n * @param {string} buildingNameQuery - the building name query\n * @param {string} apiKey - the OS api key\n */\nexport async function search(postcodeQuery, buildingNameQuery, apiKey) {\n let addresses = await searchByPostcode(postcodeQuery, apiKey)\n\n if (buildingNameQuery) {\n addresses = addresses.filter((item) =>\n item.address.includes(buildingNameQuery.toUpperCase())\n )\n }\n\n return addresses\n}\n\n/**\n * Converts a delivery point address to an address\n * Taken from http://github.com/dwp/find-an-address-plugin/blob/main/utils/getData.js\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddress(dpa) {\n const addressLine1 = formatAddressLine1(dpa)\n const addressLine2 = formatAddressLine2(dpa)\n const town = titleCase(dpa.POST_TOWN || '')\n const postcode = dpa.POSTCODE || ''\n const lines = [addressLine1, addressLine2, town]\n const formatted = `${lines.filter((i) => !!i).join(', ')}, ${postcode}`\n\n /**\n * @type {Address}\n */\n const address = {\n uprn: dpa.UPRN,\n address: dpa.ADDRESS,\n addressLine1,\n addressLine2,\n town,\n county: '',\n postcode,\n formatted\n }\n\n return address\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine1(dpa) {\n return titleCase(\n dpa.ORGANISATION_NAME ||\n dpa.SUB_BUILDING_NAME ||\n dpa.BUILDING_NAME ||\n dpa.BUILDING_NUMBER\n ? [\n dpa.ORGANISATION_NAME || '',\n dpa.SUB_BUILDING_NAME || '',\n dpa.BUILDING_NAME || '',\n dpa.BUILDING_NUMBER || ''\n ]\n .filter((item) => !!item)\n .join(' ')\n : ''\n )\n}\n\n/**\n * @param {DeliveryPointAddress} dpa\n */\nfunction formatAddressLine2(dpa) {\n return titleCase(\n dpa.THOROUGHFARE_NAME || dpa.DEPENDENT_LOCALITY\n ? [dpa.THOROUGHFARE_NAME || '', dpa.DEPENDENT_LOCALITY || '']\n .filter((item) => !!item)\n .join(', ')\n : ''\n )\n}\n\n/**\n * Title case address\n * @param {string} address\n */\nfunction titleCase(address) {\n return address\n .split(' ')\n .map((item) => item.charAt(0).toUpperCase() + item.slice(1).toLowerCase())\n .join(' ')\n}\n\n/**\n * @import { Address, DeliveryPointAddress, DeliveryPointAddressResult } from '~/src/server/plugins/postcode-lookup/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default as publicRoutes } from '
|
|
2
|
-
export { default as dummyApiRoutes } from '
|
|
1
|
+
export { default as publicRoutes } from '../../server/routes/public.js';
|
|
2
|
+
export { default as dummyApiRoutes } from '../../server/routes/dummy-api.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReqRefDefaults, type Request, type ResponseToolkit } from '@hapi/hapi';
|
|
2
|
-
import { type FormPayload } from '
|
|
2
|
+
import { type FormPayload } from '../../server/plugins/engine/types.js';
|
|
3
3
|
export interface FormQuery extends Partial<Record<string, string>> {
|
|
4
4
|
/**
|
|
5
5
|
* Allow preview URL direct access without relevant page checks
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Joi from 'joi';
|
|
2
|
-
import { type FormPayloadParams } from '
|
|
3
|
-
import { FormAction, FormStatus } from '
|
|
2
|
+
import { type FormPayloadParams } from '../../server/plugins/engine/types.js';
|
|
3
|
+
import { FormAction, FormStatus } from '../../server/routes/types.js';
|
|
4
4
|
export declare const stateSchema: Joi.StringSchema<FormStatus>;
|
|
5
5
|
export declare const actionSchema: Joi.StringSchema<FormAction>;
|
|
6
6
|
export declare const pathSchema: Joi.StringSchema<string>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Server } from '@hapi/hapi';
|
|
2
|
-
import { type AnyFormRequest, type
|
|
2
|
+
import { type AnyFormRequest, type CacheRequest, type FormConfirmationState, type FormPayload, type FormState, type FormSubmissionError, type FormSubmissionState } from '../../server/plugins/engine/types.js';
|
|
3
3
|
export declare enum ADDITIONAL_IDENTIFIER {
|
|
4
4
|
Confirmation = ":confirmation"
|
|
5
5
|
}
|
|
@@ -16,11 +16,11 @@ export declare class CacheService {
|
|
|
16
16
|
server: Server;
|
|
17
17
|
cacheName?: string;
|
|
18
18
|
});
|
|
19
|
-
getState(request:
|
|
20
|
-
setState(request:
|
|
21
|
-
getConfirmationState(request:
|
|
22
|
-
setConfirmationState(request:
|
|
23
|
-
clearState(request:
|
|
19
|
+
getState(request: CacheRequest): Promise<FormSubmissionState>;
|
|
20
|
+
setState(request: CacheRequest, state: FormSubmissionState): Promise<FormSubmissionState>;
|
|
21
|
+
getConfirmationState(request: CacheRequest): Promise<FormConfirmationState>;
|
|
22
|
+
setConfirmationState(request: CacheRequest, confirmationState: FormConfirmationState): Promise<void>;
|
|
23
|
+
clearState(request: CacheRequest): Promise<void>;
|
|
24
24
|
getFlash(request: AnyFormRequest): {
|
|
25
25
|
errors: FormSubmissionError[];
|
|
26
26
|
} | undefined;
|
|
@@ -50,14 +50,14 @@ export declare class CacheService {
|
|
|
50
50
|
* ```
|
|
51
51
|
* @returns The updated state after removal
|
|
52
52
|
*/
|
|
53
|
-
resetComponentStates(request:
|
|
53
|
+
resetComponentStates(request: CacheRequest, componentNames: string[]): Promise<FormSubmissionState>;
|
|
54
54
|
/**
|
|
55
55
|
* The key used to store user session data against.
|
|
56
56
|
* If there are multiple forms on the same runner instance, for example `form-a` and `form-a-feedback` this will prevent CacheService from clearing data from `form-a` if a user gave feedback before they finished `form-a`
|
|
57
57
|
* @param request - hapi request object
|
|
58
58
|
* @param additionalIdentifier - appended to the id
|
|
59
59
|
*/
|
|
60
|
-
Key(request:
|
|
60
|
+
Key(request: CacheRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER): {
|
|
61
61
|
segment: string;
|
|
62
62
|
id: string;
|
|
63
63
|
};
|
|
@@ -104,11 +104,8 @@ export class CacheService {
|
|
|
104
104
|
if (!request.yar.id) {
|
|
105
105
|
throw new Error('No session ID found');
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const state = request.params.state || '';
|
|
110
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
111
|
-
const slug = request.params.slug || '';
|
|
107
|
+
const state = request.params.state ?? '';
|
|
108
|
+
const slug = request.params.slug ?? '';
|
|
112
109
|
const key = `${request.yar.id}:${state}:${slug}:`;
|
|
113
110
|
return {
|
|
114
111
|
segment: partition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheService.js","names":["Hoek","unset","config","partition","ADDITIONAL_IDENTIFIER","CacheService","cache","logger","constructor","server","cacheName","log","segment","getState","request","key","Key","cached","get","setState","state","ttl","set","getConfirmationState","Confirmation","value","setConfirmationState","confirmationState","clearState","yar","id","drop","getFlash","messages","flash","Array","isArray","length","at","setFlash","message","resetComponentStates","componentNames","componentName","additionalIdentifier","Error","params","slug","merge","update","mergeArrays"],"sources":["../../../src/server/services/cacheService.ts"],"sourcesContent":["import { type Server } from '@hapi/hapi'\nimport * as Hoek from '@hapi/hoek'\nimport unset from 'lodash/unset.js'\n\nimport { config } from '~/src/config/index.js'\nimport { type createServer } from '~/src/server/index.js'\nimport {\n type AnyFormRequest,\n type
|
|
1
|
+
{"version":3,"file":"cacheService.js","names":["Hoek","unset","config","partition","ADDITIONAL_IDENTIFIER","CacheService","cache","logger","constructor","server","cacheName","log","segment","getState","request","key","Key","cached","get","setState","state","ttl","set","getConfirmationState","Confirmation","value","setConfirmationState","confirmationState","clearState","yar","id","drop","getFlash","messages","flash","Array","isArray","length","at","setFlash","message","resetComponentStates","componentNames","componentName","additionalIdentifier","Error","params","slug","merge","update","mergeArrays"],"sources":["../../../src/server/services/cacheService.ts"],"sourcesContent":["import { type Server } from '@hapi/hapi'\nimport * as Hoek from '@hapi/hoek'\nimport unset from 'lodash/unset.js'\n\nimport { config } from '~/src/config/index.js'\nimport { type createServer } from '~/src/server/index.js'\nimport {\n type AnyFormRequest,\n type CacheRequest,\n type FormConfirmationState,\n type FormPayload,\n type FormState,\n type FormSubmissionError,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\n\nconst partition = 'cache'\n\nexport enum ADDITIONAL_IDENTIFIER {\n Confirmation = ':confirmation'\n}\n\nexport class CacheService {\n /**\n * This service is responsible for getting, storing or deleting a user's session data in the cache. This service has been registered by {@link createServer}\n */\n cache\n logger: Server['logger']\n\n constructor({ server, cacheName }: { server: Server; cacheName?: string }) {\n if (!cacheName) {\n server.log(\n 'warn',\n 'You are using the default hapi cache. Please provide a cache name in plugin registration options.'\n )\n }\n\n this.cache = server.cache({ cache: cacheName, segment: 'formSubmission' })\n this.logger = server.logger\n }\n\n async getState(request: CacheRequest): Promise<FormSubmissionState> {\n const key = this.Key(request)\n const cached = await this.cache.get(key)\n\n return cached ?? {}\n }\n\n async setState(request: CacheRequest, state: FormSubmissionState) {\n const key = this.Key(request)\n const ttl = config.get('sessionTimeout')\n\n await this.cache.set(key, state, ttl)\n\n return this.getState(request)\n }\n\n async getConfirmationState(\n request: CacheRequest\n ): Promise<FormConfirmationState> {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const value = await this.cache.get(key)\n\n return value ?? {}\n }\n\n async setConfirmationState(\n request: CacheRequest,\n confirmationState: FormConfirmationState\n ) {\n const key = this.Key(request, ADDITIONAL_IDENTIFIER.Confirmation)\n const ttl = config.get('confirmationSessionTimeout')\n\n return this.cache.set(key, confirmationState, ttl)\n }\n\n async clearState(request: CacheRequest) {\n if (request.yar.id) {\n await this.cache.drop(this.Key(request))\n }\n }\n\n getFlash(\n request: AnyFormRequest\n ): { errors: FormSubmissionError[] } | undefined {\n const key = this.Key(request)\n const messages = request.yar.flash(key.id)\n\n if (Array.isArray(messages) && messages.length) {\n return messages.at(0)\n }\n }\n\n setFlash(\n request: AnyFormRequest,\n message: { errors: FormSubmissionError[] }\n ) {\n const key = this.Key(request)\n\n request.yar.flash(key.id, message)\n }\n\n /**\n * Resets (removes) component states from the form state by their keys.\n * Supports both flat keys and nested paths.\n * @param request - The Hapi request object\n * @param componentNames - Array of state keys to remove. Uses lodash's unset syntax. Can be:\n * - Flat keys: `'componentName'` for top-level state\n * - Nested paths: `\"upload['/my-page']\"` or `'upload./my-page'` for nested state\n * @example\n * ```typescript\n * // Remove a flat component state\n * await cacheService.resetComponentStates(request, ['emailAddress'])\n *\n * // Remove nested upload state for a specific page\n * await cacheService.resetComponentStates(request, [\"upload['/file-upload-page']\"])\n *\n * // Remove multiple states at once\n * await cacheService.resetComponentStates(request, [\n * 'componentName',\n * \"upload['/my-page']\"\n * ])\n * ```\n * @returns The updated state after removal\n */\n async resetComponentStates(request: CacheRequest, componentNames: string[]) {\n const state = await this.getState(request)\n\n for (const componentName of componentNames) {\n unset(state, componentName)\n }\n\n return this.setState(request, state)\n }\n\n /**\n * The key used to store user session data against.\n * If there are multiple forms on the same runner instance, for example `form-a` and `form-a-feedback` this will prevent CacheService from clearing data from `form-a` if a user gave feedback before they finished `form-a`\n * @param request - hapi request object\n * @param additionalIdentifier - appended to the id\n */\n Key(request: CacheRequest, additionalIdentifier?: ADDITIONAL_IDENTIFIER) {\n if (!request.yar.id) {\n throw new Error('No session ID found')\n }\n\n const state = request.params.state ?? ''\n const slug = request.params.slug ?? ''\n const key = `${request.yar.id}:${state}:${slug}:`\n\n return {\n segment: partition,\n id: `${key}${additionalIdentifier ?? ''}`\n }\n }\n}\n\n/**\n * State merge helper\n * 1. Merges objects (form fields)\n * 2. Overwrites arrays\n */\nexport function merge<StateType extends FormState | FormPayload>(\n state: StateType,\n update: object\n): StateType {\n return Hoek.merge(state, update, {\n mergeArrays: false\n })\n}\n"],"mappings":"AACA,OAAO,KAAKA,IAAI,MAAM,YAAY;AAClC,OAAOC,KAAK,MAAM,iBAAiB;AAEnC,SAASC,MAAM;AAYf,MAAMC,SAAS,GAAG,OAAO;AAEzB,WAAYC,qBAAqB,0BAArBA,qBAAqB;EAArBA,qBAAqB;EAAA,OAArBA,qBAAqB;AAAA;AAIjC,OAAO,MAAMC,YAAY,CAAC;EACxB;AACF;AACA;EACEC,KAAK;EACLC,MAAM;EAENC,WAAWA,CAAC;IAAEC,MAAM;IAAEC;EAAkD,CAAC,EAAE;IACzE,IAAI,CAACA,SAAS,EAAE;MACdD,MAAM,CAACE,GAAG,CACR,MAAM,EACN,mGACF,CAAC;IACH;IAEA,IAAI,CAACL,KAAK,GAAGG,MAAM,CAACH,KAAK,CAAC;MAAEA,KAAK,EAAEI,SAAS;MAAEE,OAAO,EAAE;IAAiB,CAAC,CAAC;IAC1E,IAAI,CAACL,MAAM,GAAGE,MAAM,CAACF,MAAM;EAC7B;EAEA,MAAMM,QAAQA,CAACC,OAAqB,EAAgC;IAClE,MAAMC,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,CAAC;IAC7B,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACX,KAAK,CAACY,GAAG,CAACH,GAAG,CAAC;IAExC,OAAOE,MAAM,IAAI,CAAC,CAAC;EACrB;EAEA,MAAME,QAAQA,CAACL,OAAqB,EAAEM,KAA0B,EAAE;IAChE,MAAML,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,CAAC;IAC7B,MAAMO,GAAG,GAAGnB,MAAM,CAACgB,GAAG,CAAC,gBAAgB,CAAC;IAExC,MAAM,IAAI,CAACZ,KAAK,CAACgB,GAAG,CAACP,GAAG,EAAEK,KAAK,EAAEC,GAAG,CAAC;IAErC,OAAO,IAAI,CAACR,QAAQ,CAACC,OAAO,CAAC;EAC/B;EAEA,MAAMS,oBAAoBA,CACxBT,OAAqB,EACW;IAChC,MAAMC,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,EAAEV,qBAAqB,CAACoB,YAAY,CAAC;IACjE,MAAMC,KAAK,GAAG,MAAM,IAAI,CAACnB,KAAK,CAACY,GAAG,CAACH,GAAG,CAAC;IAEvC,OAAOU,KAAK,IAAI,CAAC,CAAC;EACpB;EAEA,MAAMC,oBAAoBA,CACxBZ,OAAqB,EACrBa,iBAAwC,EACxC;IACA,MAAMZ,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,EAAEV,qBAAqB,CAACoB,YAAY,CAAC;IACjE,MAAMH,GAAG,GAAGnB,MAAM,CAACgB,GAAG,CAAC,4BAA4B,CAAC;IAEpD,OAAO,IAAI,CAACZ,KAAK,CAACgB,GAAG,CAACP,GAAG,EAAEY,iBAAiB,EAAEN,GAAG,CAAC;EACpD;EAEA,MAAMO,UAAUA,CAACd,OAAqB,EAAE;IACtC,IAAIA,OAAO,CAACe,GAAG,CAACC,EAAE,EAAE;MAClB,MAAM,IAAI,CAACxB,KAAK,CAACyB,IAAI,CAAC,IAAI,CAACf,GAAG,CAACF,OAAO,CAAC,CAAC;IAC1C;EACF;EAEAkB,QAAQA,CACNlB,OAAuB,EACwB;IAC/C,MAAMC,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,CAAC;IAC7B,MAAMmB,QAAQ,GAAGnB,OAAO,CAACe,GAAG,CAACK,KAAK,CAACnB,GAAG,CAACe,EAAE,CAAC;IAE1C,IAAIK,KAAK,CAACC,OAAO,CAACH,QAAQ,CAAC,IAAIA,QAAQ,CAACI,MAAM,EAAE;MAC9C,OAAOJ,QAAQ,CAACK,EAAE,CAAC,CAAC,CAAC;IACvB;EACF;EAEAC,QAAQA,CACNzB,OAAuB,EACvB0B,OAA0C,EAC1C;IACA,MAAMzB,GAAG,GAAG,IAAI,CAACC,GAAG,CAACF,OAAO,CAAC;IAE7BA,OAAO,CAACe,GAAG,CAACK,KAAK,CAACnB,GAAG,CAACe,EAAE,EAAEU,OAAO,CAAC;EACpC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,oBAAoBA,CAAC3B,OAAqB,EAAE4B,cAAwB,EAAE;IAC1E,MAAMtB,KAAK,GAAG,MAAM,IAAI,CAACP,QAAQ,CAACC,OAAO,CAAC;IAE1C,KAAK,MAAM6B,aAAa,IAAID,cAAc,EAAE;MAC1CzC,KAAK,CAACmB,KAAK,EAAEuB,aAAa,CAAC;IAC7B;IAEA,OAAO,IAAI,CAACxB,QAAQ,CAACL,OAAO,EAAEM,KAAK,CAAC;EACtC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEJ,GAAGA,CAACF,OAAqB,EAAE8B,oBAA4C,EAAE;IACvE,IAAI,CAAC9B,OAAO,CAACe,GAAG,CAACC,EAAE,EAAE;MACnB,MAAM,IAAIe,KAAK,CAAC,qBAAqB,CAAC;IACxC;IAEA,MAAMzB,KAAK,GAAGN,OAAO,CAACgC,MAAM,CAAC1B,KAAK,IAAI,EAAE;IACxC,MAAM2B,IAAI,GAAGjC,OAAO,CAACgC,MAAM,CAACC,IAAI,IAAI,EAAE;IACtC,MAAMhC,GAAG,GAAG,GAAGD,OAAO,CAACe,GAAG,CAACC,EAAE,IAAIV,KAAK,IAAI2B,IAAI,GAAG;IAEjD,OAAO;MACLnC,OAAO,EAAET,SAAS;MAClB2B,EAAE,EAAE,GAAGf,GAAG,GAAG6B,oBAAoB,IAAI,EAAE;IACzC,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,KAAKA,CACnB5B,KAAgB,EAChB6B,MAAc,EACH;EACX,OAAOjD,IAAI,CAACgD,KAAK,CAAC5B,KAAK,EAAE6B,MAAM,EAAE;IAC/BC,WAAW,EAAE;EACf,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -499,6 +499,6 @@ describe('HTTP service', () => {
|
|
|
499
499
|
|
|
500
500
|
/**
|
|
501
501
|
* @import { IncomingMessage } from 'node:http'
|
|
502
|
-
* @import { RequestOptions } from '
|
|
502
|
+
* @import { RequestOptions } from '../../server/services/httpService.js'
|
|
503
503
|
*/
|
|
504
504
|
//# sourceMappingURL=httpService.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { CacheService } from '
|
|
1
|
+
export { CacheService } from '../../server/services/cacheService.js';
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type FormDefinition, type FormMetadata, type SubmitPayload, type SubmitResponsePayload } from '@defra/forms-model';
|
|
2
2
|
import { type Server } from '@hapi/hapi';
|
|
3
|
-
import { type FormModel } from '
|
|
4
|
-
import { type DetailItem } from '
|
|
5
|
-
import { type PageController } from '
|
|
6
|
-
import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '
|
|
7
|
-
import { type PaymentService } from '
|
|
8
|
-
import { type FormRequestPayload, type FormStatus } from '
|
|
9
|
-
import { type CacheService } from '
|
|
3
|
+
import { type FormModel } from '../server/plugins/engine/models/index.js';
|
|
4
|
+
import { type DetailItem } from '../server/plugins/engine/models/types.js';
|
|
5
|
+
import { type PageController } from '../server/plugins/engine/pageControllers/PageController.js';
|
|
6
|
+
import { type FormContext, type OnRequestCallback, type PluginOptions, type PreparePageEventRequestOptions } from '../server/plugins/engine/types.js';
|
|
7
|
+
import { type PaymentService } from '../server/plugins/payment/service.js';
|
|
8
|
+
import { type FormRequestPayload, type FormStatus } from '../server/routes/types.js';
|
|
9
|
+
import { type CacheService } from '../server/services/cacheService.js';
|
|
10
10
|
export interface FormsService {
|
|
11
11
|
getFormMetadata: (slug: string) => Promise<FormMetadata>;
|
|
12
12
|
getFormMetadataById: (id: string) => Promise<FormMetadata>;
|
|
@@ -47,9 +47,9 @@ export class FileFormService {
|
|
|
47
47
|
getFormDefinition(id: string): FormDefinition;
|
|
48
48
|
/**
|
|
49
49
|
* Returns a FormsService compliant interface
|
|
50
|
-
* @returns {import('
|
|
50
|
+
* @returns {import('../../server/types.js').FormsService}
|
|
51
51
|
*/
|
|
52
|
-
toFormsService(): import("
|
|
52
|
+
toFormsService(): import("../../server/types.js").FormsService;
|
|
53
53
|
#private;
|
|
54
54
|
}
|
|
55
55
|
import type { FormMetadata } from '@defra/forms-model';
|
|
@@ -117,7 +117,7 @@ export class FileFormService {
|
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
119
|
* Returns a FormsService compliant interface
|
|
120
|
-
* @returns {import('
|
|
120
|
+
* @returns {import('../../server/types.js').FormsService}
|
|
121
121
|
*/
|
|
122
122
|
toFormsService() {
|
|
123
123
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defra/forms-engine-plugin",
|
|
3
|
-
"version": "4.7.
|
|
3
|
+
"version": "4.7.3",
|
|
4
4
|
"description": "Defra forms engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -35,10 +35,11 @@
|
|
|
35
35
|
"./package.json": "./package.json"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
|
-
"build": "rm -rf ./.server && npm run build:server && npm run build:client && npm run build:types",
|
|
38
|
+
"build": "rm -rf ./.server ./.src && npm run build:server && npm run build:client && npm run build:types && npm run build:src",
|
|
39
39
|
"build:client": "NODE_ENV=${NODE_ENV:-production} webpack",
|
|
40
40
|
"build:server": "babel --delete-dir-on-start --extensions \".js\",\".ts\" --ignore \"**/*.test.ts\" --copy-files --no-copy-ignored --source-maps --out-dir ./.server ./src",
|
|
41
|
-
"build:
|
|
41
|
+
"build:src": "node scripts/resolve-tilde-imports.js",
|
|
42
|
+
"build:types": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.alias.json",
|
|
42
43
|
"dev": "concurrently \"npm run client:watch\" \"npm run server:watch:dev\" --kill-others --names \"client,server\" --prefix-colors \"red.dim,blue.dim\"",
|
|
43
44
|
"dev:debug": "concurrently \"npm run client:watch\" \"npm run server:watch:debug\" --kill-others --names \"client,server\" --prefix-colors \"red.dim,blue.dim\"",
|
|
44
45
|
"format": "npm run format:check -- --write",
|
|
@@ -50,10 +51,12 @@
|
|
|
50
51
|
"docs:clear": "docusaurus clear",
|
|
51
52
|
"generate-schema-docs": "node scripts/generate-schema-docs.js",
|
|
52
53
|
"postinstall": "npm run setup:husky",
|
|
54
|
+
"postpack": "mv src .src && mv .src.bak src",
|
|
55
|
+
"prepack": "mv src .src.bak && mv .src src",
|
|
53
56
|
"lint": "npm run lint:editorconfig && npm run lint:js && npm run lint:types",
|
|
54
57
|
"lint:editorconfig": "editorconfig-checker",
|
|
55
58
|
"lint:fix": "npm run lint:js -- --fix",
|
|
56
|
-
"lint:js": "eslint --cache --cache-location .cache/eslint --cache-strategy content --color .",
|
|
59
|
+
"lint:js": "node --max-old-space-size=8192 ./node_modules/.bin/eslint --cache --cache-location .cache/eslint --cache-strategy content --color .",
|
|
57
60
|
"lint:scss": "stylelint --cache --cache-location .cache/stylelint --cache-strategy content --color --ignore-path .gitignore --max-warnings 0 \"**/*.scss\"",
|
|
58
61
|
"lint:types": "tsc --noEmit",
|
|
59
62
|
"test": "jest --color --coverage --verbose",
|
|
@@ -209,6 +212,7 @@
|
|
|
209
212
|
"stylelint": "^16.25.0",
|
|
210
213
|
"stylelint-config-gds": "^2.0.0",
|
|
211
214
|
"terser-webpack-plugin": "^5.3.14",
|
|
215
|
+
"tsc-alias": "^1.8.16",
|
|
212
216
|
"tsx": "^4.20.6",
|
|
213
217
|
"typescript": "^5.9.3",
|
|
214
218
|
"typescript-eslint": "^8.56.1",
|