@defra/forms-engine-plugin 5.0.0-alpha.8 → 5.0.0-alpha.9

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.
Files changed (162) hide show
  1. package/.server/server/constants.d.ts +1 -0
  2. package/.server/server/constants.js +2 -1
  3. package/.server/server/constants.js.map +1 -1
  4. package/.server/server/plugins/engine/components/ComponentCollection.js +10 -6
  5. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  6. package/.server/server/plugins/engine/components/DatePartsField.d.ts +4 -2
  7. package/.server/server/plugins/engine/components/DatePartsField.js +14 -11
  8. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  9. package/.server/server/plugins/engine/components/DeclarationField.d.ts +4 -2
  10. package/.server/server/plugins/engine/components/DeclarationField.js +5 -3
  11. package/.server/server/plugins/engine/components/DeclarationField.js.map +1 -1
  12. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +24 -2
  13. package/.server/server/plugins/engine/components/EastingNorthingField.js +93 -52
  14. package/.server/server/plugins/engine/components/EastingNorthingField.js.map +1 -1
  15. package/.server/server/plugins/engine/components/FormComponent.d.ts +4 -1
  16. package/.server/server/plugins/engine/components/FormComponent.js +3 -0
  17. package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
  18. package/.server/server/plugins/engine/components/LatLongField.d.ts +24 -2
  19. package/.server/server/plugins/engine/components/LatLongField.js +85 -46
  20. package/.server/server/plugins/engine/components/LatLongField.js.map +1 -1
  21. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +3 -2
  22. package/.server/server/plugins/engine/components/LocationFieldHelpers.js +10 -11
  23. package/.server/server/plugins/engine/components/LocationFieldHelpers.js.map +1 -1
  24. package/.server/server/plugins/engine/components/MonthYearField.d.ts +4 -2
  25. package/.server/server/plugins/engine/components/MonthYearField.js +16 -13
  26. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  27. package/.server/server/plugins/engine/components/PaymentField.d.ts +1 -0
  28. package/.server/server/plugins/engine/components/PaymentField.js +9 -5
  29. package/.server/server/plugins/engine/components/PaymentField.js.map +1 -1
  30. package/.server/server/plugins/engine/components/UkAddressField.js +22 -7
  31. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  32. package/.server/server/plugins/engine/components/YesNoField.d.ts +3 -2
  33. package/.server/server/plugins/engine/components/YesNoField.js +5 -3
  34. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  35. package/.server/server/plugins/engine/components/helpers/components.js +1 -2
  36. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -1
  37. package/.server/server/plugins/engine/components/helpers/index.d.ts +7 -0
  38. package/.server/server/plugins/engine/components/helpers/index.js +13 -1
  39. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -1
  40. package/.server/server/plugins/engine/helpers.d.ts +21 -2
  41. package/.server/server/plugins/engine/helpers.js +43 -5
  42. package/.server/server/plugins/engine/helpers.js.map +1 -1
  43. package/.server/server/plugins/engine/i18n/createFormTranslator.d.ts +4 -4
  44. package/.server/server/plugins/engine/i18n/createFormTranslator.js +27 -5
  45. package/.server/server/plugins/engine/i18n/createFormTranslator.js.map +1 -1
  46. package/.server/server/plugins/engine/i18n/extractBaseTranslations.d.ts +1 -1
  47. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js +9 -0
  48. package/.server/server/plugins/engine/i18n/extractBaseTranslations.js.map +1 -1
  49. package/.server/server/plugins/engine/i18n/form.d.ts +13 -0
  50. package/.server/server/plugins/engine/i18n/form.js +35 -0
  51. package/.server/server/plugins/engine/i18n/form.js.map +1 -0
  52. package/.server/server/plugins/engine/i18n/languages.d.ts +10 -0
  53. package/.server/server/plugins/engine/i18n/languages.js +19 -0
  54. package/.server/server/plugins/engine/i18n/languages.js.map +1 -0
  55. package/.server/server/plugins/engine/i18n/translations/cy.json +3 -1
  56. package/.server/server/plugins/engine/i18n/translations/en-GB.json +3 -1
  57. package/.server/server/plugins/engine/index.d.ts +3 -0
  58. package/.server/server/plugins/engine/index.js +3 -0
  59. package/.server/server/plugins/engine/index.js.map +1 -1
  60. package/.server/server/plugins/engine/models/FormModel.d.ts +0 -4
  61. package/.server/server/plugins/engine/models/FormModel.js +9 -15
  62. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  63. package/.server/server/plugins/engine/models/SummaryViewModel.js +2 -1
  64. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  65. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  66. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  67. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +2 -0
  68. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +2 -0
  69. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  70. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +1 -1
  71. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +2 -2
  72. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  73. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -1
  74. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
  75. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  76. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +6 -3
  77. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  78. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  79. package/.server/server/plugins/engine/pageControllers/helpers/submission.js +3 -3
  80. package/.server/server/plugins/engine/pageControllers/helpers/submission.js.map +1 -1
  81. package/.server/server/plugins/engine/types/schema.js +1 -0
  82. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  83. package/.server/server/plugins/engine/types.d.ts +1 -0
  84. package/.server/server/plugins/engine/types.js.map +1 -1
  85. package/.server/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  86. package/.server/server/plugins/nunjucks/filters/applyUrlParam.d.ts +9 -0
  87. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  88. package/.server/server/plugins/nunjucks/filters/applyUrlParam.js.map +1 -0
  89. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js +17 -0
  90. package/.server/server/plugins/nunjucks/filters/applyUrlParam.test.js.map +1 -0
  91. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  92. package/.server/server/plugins/nunjucks/filters/index.d.ts +1 -0
  93. package/.server/server/plugins/nunjucks/filters/index.js +1 -0
  94. package/.server/server/plugins/nunjucks/filters/index.js.map +1 -1
  95. package/.server/server/plugins/payment/helper.d.ts +11 -1
  96. package/.server/server/plugins/payment/helper.js +18 -2
  97. package/.server/server/plugins/payment/helper.js.map +1 -1
  98. package/.server/server/plugins/payment/helper.test.js +2 -1
  99. package/.server/server/plugins/payment/helper.test.js.map +1 -1
  100. package/.server/server/plugins/payment/service.d.ts +2 -1
  101. package/.server/server/plugins/payment/service.js +5 -2
  102. package/.server/server/plugins/payment/service.js.map +1 -1
  103. package/.server/server/plugins/payment/service.test.js +7 -3
  104. package/.server/server/plugins/payment/service.test.js.map +1 -1
  105. package/.server/server/plugins/payment/types.d.ts +4 -0
  106. package/.server/server/plugins/payment/types.js +1 -0
  107. package/.server/server/plugins/payment/types.js.map +1 -1
  108. package/.server/server/plugins/postcode-lookup/models/index.d.ts +247 -3
  109. package/.server/server/plugins/postcode-lookup/models/index.js +86 -33
  110. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  111. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +15 -1
  112. package/.server/server/plugins/postcode-lookup/routes/index.js +47 -15
  113. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  114. package/.server/server/plugins/postcode-lookup/routes/index.test.js +84 -0
  115. package/.server/server/plugins/postcode-lookup/routes/index.test.js.map +1 -0
  116. package/.server/server/plugins/postcode-lookup/types.d.ts +12 -0
  117. package/.server/server/plugins/postcode-lookup/types.js +6 -1
  118. package/.server/server/plugins/postcode-lookup/types.js.map +1 -1
  119. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
  120. package/package.json +2 -1
  121. package/src/server/constants.js +2 -1
  122. package/src/server/plugins/engine/components/ComponentCollection.ts +15 -9
  123. package/src/server/plugins/engine/components/DatePartsField.ts +16 -12
  124. package/src/server/plugins/engine/components/DeclarationField.ts +6 -4
  125. package/src/server/plugins/engine/components/EastingNorthingField.ts +156 -88
  126. package/src/server/plugins/engine/components/FormComponent.ts +4 -1
  127. package/src/server/plugins/engine/components/LatLongField.ts +129 -57
  128. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +14 -11
  129. package/src/server/plugins/engine/components/MonthYearField.ts +16 -11
  130. package/src/server/plugins/engine/components/PaymentField.ts +9 -4
  131. package/src/server/plugins/engine/components/UkAddressField.ts +29 -6
  132. package/src/server/plugins/engine/components/YesNoField.ts +6 -5
  133. package/src/server/plugins/engine/components/helpers/components.ts +1 -2
  134. package/src/server/plugins/engine/components/helpers/index.ts +19 -0
  135. package/src/server/plugins/engine/helpers.ts +51 -5
  136. package/src/server/plugins/engine/i18n/createFormTranslator.ts +43 -12
  137. package/src/server/plugins/engine/i18n/extractBaseTranslations.ts +7 -1
  138. package/src/server/plugins/engine/i18n/form.ts +54 -0
  139. package/src/server/plugins/engine/i18n/languages.ts +19 -0
  140. package/src/server/plugins/engine/i18n/translations/cy.json +3 -1
  141. package/src/server/plugins/engine/i18n/translations/en-GB.json +3 -1
  142. package/src/server/plugins/engine/index.ts +6 -0
  143. package/src/server/plugins/engine/models/FormModel.ts +9 -15
  144. package/src/server/plugins/engine/models/SummaryViewModel.ts +2 -1
  145. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -1
  146. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +3 -0
  147. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +2 -2
  148. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
  149. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +9 -3
  150. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +6 -3
  151. package/src/server/plugins/engine/types/schema.ts +1 -0
  152. package/src/server/plugins/engine/types.ts +1 -0
  153. package/src/server/plugins/engine/views/components/ukaddressfield.html +1 -1
  154. package/src/server/plugins/nunjucks/filters/applyUrlParam.js +17 -0
  155. package/src/server/plugins/nunjucks/filters/index.js +1 -0
  156. package/src/server/plugins/payment/helper.js +22 -2
  157. package/src/server/plugins/payment/service.js +6 -2
  158. package/src/server/plugins/payment/types.js +1 -0
  159. package/src/server/plugins/postcode-lookup/models/index.js +75 -43
  160. package/src/server/plugins/postcode-lookup/routes/index.js +73 -16
  161. package/src/server/plugins/postcode-lookup/types.js +6 -1
  162. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","JOURNEY_BASE_URL","createDetailsPayloadSchema","createManualPayloadSchema","createSelectPayloadSchema","detailsViewModel","manualViewModel","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","language","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 createDetailsPayloadSchema,\n createManualPayloadSchema,\n createSelectPayloadSchema,\n detailsViewModel,\n manualViewModel,\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 const language = session.initial.language ?? 'en-GB'\n const { value: details, error } = createDetailsPayloadSchema(\n language\n ).validate(request.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 session = getSessionState(request)\n const { ordnanceSurveyApiKey: apiKey } = options\n const language = session.initial.language ?? 'en-GB'\n const { value: select, error } = createSelectPayloadSchema(language).validate(\n request.payload\n )\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 const language = session.initial.language ?? 'en-GB'\n\n const { value: manual, error } = createManualPayloadSchema(language).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":[]}
1
+ {"version":3,"file":"index.js","names":["Boom","StatusCodes","Joi","EXTERNAL_STATE_APPENDAGE","getCachedPluginTranslator","JOURNEY_BASE_URL","createDetailsPayloadSchema","createManualPayloadSchema","createSelectPayloadSchema","detailsViewModel","manualViewModel","selectViewModel","stepSchema","steps","service","resolveLanguage","viewName","getSessionState","request","state","yar","get","badRequest","flashComponentState","componentName","address","addressState","addressLine1","addressLine2","town","county","postcode","uprn","undefined","appendage","component","data","flash","getDispatchTranslator","initial","language","formId","formStatus","set","typedReq","lang","translator","id","dispatch","h","details","postcodeQuery","buildingNameQuery","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 { getCachedPluginTranslator } from '~/src/server/plugins/engine/i18n/form.js'\nimport {\n JOURNEY_BASE_URL,\n createDetailsPayloadSchema,\n createManualPayloadSchema,\n createSelectPayloadSchema,\n detailsViewModel,\n manualViewModel,\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'\nimport { resolveLanguage } from '~/src/server/utils/utils.js'\n\nconst viewName = 'postcode-lookup-details'\n\n/**\n * Get the session state associated with this journey\n * @param {PostcodeLookupRequest} request\n */\nexport function 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 * Get a cached translator, or create a new one if not in the cache\n * @param {PostcodeLookupRequest} request\n * @param {PostcodeLookupDispatchData} initial\n * @param { string | string[] | undefined } language\n */\nexport async function getDispatchTranslator(request, initial, language) {\n const { formId, formStatus } = initial\n\n // Override language if passed as a query param\n if (language) {\n request.yar.set('language', language)\n }\n\n const typedReq = /** @type {AnyFormRequest} */ (/** @type {any} */ (request))\n const lang = resolveLanguage(typedReq)\n\n const translator = await getCachedPluginTranslator(\n typedReq,\n /** @type {FormMetadata} */ ({ id: formId }),\n formStatus,\n lang\n )\n\n return translator\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 async handler(request, h) {\n const { query } = request\n const { step, language } = query\n const session = getSessionState(request)\n\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n language\n )\n\n const model =\n step === steps.manual\n ? manualViewModel(session, translator)\n : detailsViewModel(session, translator)\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 language: Joi.string().allow('en-GB', 'cy').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 const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n\n const { value: details, error } = createDetailsPayloadSchema(\n language\n ).validate(request.payload)\n\n let model\n\n if (error) {\n model = detailsViewModel(session, translator, 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 }, translator)\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 const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n const { value: select, error } = createSelectPayloadSchema(language).validate(\n request.payload\n )\n\n if (error) {\n const model = await selectViewModel(\n { session, apiKey },\n translator,\n select,\n error\n )\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 */\nasync function manualPostHandler(request, h) {\n const session = getSessionState(request)\n const translator = await getDispatchTranslator(\n request,\n session.initial,\n request.query.language\n )\n const language = translator.language\n\n const { value: manual, error } = createManualPayloadSchema(language).validate(\n request.payload,\n {\n abortEarly: false\n }\n )\n\n if (error) {\n const model = manualViewModel(session, translator, 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 { FormMetadata } from '@defra/forms-model'\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 { AnyFormRequest, ExternalStateAppendage } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,84 @@
1
+ import { EN_GB } from "../../../constants.js";
2
+ import { getCachedPluginTranslator } from "../../engine/i18n/form.js";
3
+ import { getDispatchTranslator, getSessionState } from "./index.js";
4
+ jest.mock("../../engine/i18n/form.ts");
5
+ describe('postcode-lookup routes', () => {
6
+ describe('getSessionState', () => {
7
+ test('should throw if missing state', () => {
8
+ const mockRequest = /** @type { PostcodeLookupRequest} */
9
+ /** @type {any} */
10
+ {
11
+ yar: {
12
+ get: jest.fn()
13
+ }
14
+ };
15
+ expect(() => getSessionState(mockRequest)).toThrow('No postcode lookup data found for /postcode-lookup');
16
+ });
17
+ });
18
+ describe('getDispatchTranslator', () => {
19
+ test('should get default translator', async () => {
20
+ const mockSet = jest.fn();
21
+ const mockRequest = /** @type { PostcodeLookupRequest} */
22
+ /** @type {any} */
23
+ {
24
+ yar: {
25
+ get: jest.fn(),
26
+ set: mockSet
27
+ },
28
+ query: {},
29
+ server: {
30
+ // eslint-disable-next-line no-useless-computed-key
31
+ plugins: {
32
+ ['forms-engine-plugin']: {
33
+ getLanguage: () => 'en-GB'
34
+ }
35
+ }
36
+ }
37
+ };
38
+ const mockTranslator = /** @type {Translator} */{
39
+ language: EN_GB
40
+ };
41
+ jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator);
42
+ const initial = /** @type {PostcodeLookupDispatchData} */{};
43
+ const res = await getDispatchTranslator(mockRequest, initial, EN_GB);
44
+ expect(mockSet).toHaveBeenCalledWith('language', EN_GB);
45
+ expect(res).toBeDefined();
46
+ expect(res.language).toBe(EN_GB);
47
+ });
48
+ test('should get welsh translator', async () => {
49
+ const mockSet = jest.fn();
50
+ const mockRequest = /** @type { PostcodeLookupRequest} */
51
+ /** @type {any} */
52
+ {
53
+ yar: {
54
+ get: jest.fn().mockResolvedValueOnce('cy'),
55
+ set: mockSet
56
+ },
57
+ query: {},
58
+ server: {
59
+ // eslint-disable-next-line no-useless-computed-key
60
+ plugins: {
61
+ ['forms-engine-plugin']: {
62
+ getLanguage: () => 'en-GB'
63
+ }
64
+ }
65
+ }
66
+ };
67
+ const mockTranslator = /** @type {Translator} */{
68
+ language: 'cy'
69
+ };
70
+ jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator);
71
+ const initial = /** @type {PostcodeLookupDispatchData} */{};
72
+ const res = await getDispatchTranslator(mockRequest, initial, 'cy');
73
+ expect(mockSet).toHaveBeenCalledWith('language', 'cy');
74
+ expect(res).toBeDefined();
75
+ expect(res.language).toBe('cy');
76
+ });
77
+ });
78
+ });
79
+
80
+ /**
81
+ * @import { PostcodeLookupDispatchData, PostcodeLookupRequest } from '../../../../server/plugins/postcode-lookup/types.js'
82
+ * @import { Translator } from '../../../../server/plugins/engine/i18n/types.js'
83
+ */
84
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","names":["EN_GB","getCachedPluginTranslator","getDispatchTranslator","getSessionState","jest","mock","describe","test","mockRequest","yar","get","fn","expect","toThrow","mockSet","set","query","server","plugins","getLanguage","mockTranslator","language","mocked","mockResolvedValue","initial","res","toHaveBeenCalledWith","toBeDefined","toBe","mockResolvedValueOnce"],"sources":["../../../../../src/server/plugins/postcode-lookup/routes/index.test.js"],"sourcesContent":["import { EN_GB } from '~/src/server/constants.js'\nimport { getCachedPluginTranslator } from '~/src/server/plugins/engine/i18n/form.js'\nimport {\n getDispatchTranslator,\n getSessionState\n} from '~/src/server/plugins/postcode-lookup/routes/index.js'\n\njest.mock('~/src/server/plugins/engine/i18n/form.ts')\n\ndescribe('postcode-lookup routes', () => {\n describe('getSessionState', () => {\n test('should throw if missing state', () => {\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn()\n }\n })\n )\n expect(() => getSessionState(mockRequest)).toThrow(\n 'No postcode lookup data found for /postcode-lookup'\n )\n })\n })\n\n describe('getDispatchTranslator', () => {\n test('should get default translator', async () => {\n const mockSet = jest.fn()\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn(),\n set: mockSet\n },\n query: {},\n server: {\n // eslint-disable-next-line no-useless-computed-key\n plugins: { ['forms-engine-plugin']: { getLanguage: () => 'en-GB' } }\n }\n })\n )\n const mockTranslator = /** @type {Translator} */ ({ language: EN_GB })\n jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator)\n const initial = /** @type {PostcodeLookupDispatchData} */ ({})\n const res = await getDispatchTranslator(mockRequest, initial, EN_GB)\n expect(mockSet).toHaveBeenCalledWith('language', EN_GB)\n expect(res).toBeDefined()\n expect(res.language).toBe(EN_GB)\n })\n\n test('should get welsh translator', async () => {\n const mockSet = jest.fn()\n const mockRequest = /** @type { PostcodeLookupRequest} */ (\n /** @type {any} */\n ({\n yar: {\n get: jest.fn().mockResolvedValueOnce('cy'),\n set: mockSet\n },\n query: {},\n server: {\n // eslint-disable-next-line no-useless-computed-key\n plugins: { ['forms-engine-plugin']: { getLanguage: () => 'en-GB' } }\n }\n })\n )\n const mockTranslator = /** @type {Translator} */ ({ language: 'cy' })\n jest.mocked(getCachedPluginTranslator).mockResolvedValue(mockTranslator)\n const initial = /** @type {PostcodeLookupDispatchData} */ ({})\n const res = await getDispatchTranslator(mockRequest, initial, 'cy')\n expect(mockSet).toHaveBeenCalledWith('language', 'cy')\n expect(res).toBeDefined()\n expect(res.language).toBe('cy')\n })\n })\n})\n\n/**\n * @import { PostcodeLookupDispatchData, PostcodeLookupRequest } from '~/src/server/plugins/postcode-lookup/types.js'\n * @import { Translator } from '~/src/server/plugins/engine/i18n/types.js'\n */\n"],"mappings":"AAAA,SAASA,KAAK;AACd,SAASC,yBAAyB;AAClC,SACEC,qBAAqB,EACrBC,eAAe;AAGjBC,IAAI,CAACC,IAAI,4BAA2C,CAAC;AAErDC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCA,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCC,IAAI,CAAC,+BAA+B,EAAE,MAAM;MAC1C,MAAMC,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC;QACf;MACF,CACD;MACDC,MAAM,CAAC,MAAMT,eAAe,CAACK,WAAW,CAAC,CAAC,CAACK,OAAO,CAChD,oDACF,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFP,QAAQ,CAAC,uBAAuB,EAAE,MAAM;IACtCC,IAAI,CAAC,+BAA+B,EAAE,YAAY;MAChD,MAAMO,OAAO,GAAGV,IAAI,CAACO,EAAE,CAAC,CAAC;MACzB,MAAMH,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC,CAAC;UACdI,GAAG,EAAED;QACP,CAAC;QACDE,KAAK,EAAE,CAAC,CAAC;QACTC,MAAM,EAAE;UACN;UACAC,OAAO,EAAE;YAAE,CAAC,qBAAqB,GAAG;cAAEC,WAAW,EAAEA,CAAA,KAAM;YAAQ;UAAE;QACrE;MACF,CACD;MACD,MAAMC,cAAc,GAAG,yBAA2B;QAAEC,QAAQ,EAAErB;MAAM,CAAE;MACtEI,IAAI,CAACkB,MAAM,CAACrB,yBAAyB,CAAC,CAACsB,iBAAiB,CAACH,cAAc,CAAC;MACxE,MAAMI,OAAO,GAAG,yCAA2C,CAAC,CAAE;MAC9D,MAAMC,GAAG,GAAG,MAAMvB,qBAAqB,CAACM,WAAW,EAAEgB,OAAO,EAAExB,KAAK,CAAC;MACpEY,MAAM,CAACE,OAAO,CAAC,CAACY,oBAAoB,CAAC,UAAU,EAAE1B,KAAK,CAAC;MACvDY,MAAM,CAACa,GAAG,CAAC,CAACE,WAAW,CAAC,CAAC;MACzBf,MAAM,CAACa,GAAG,CAACJ,QAAQ,CAAC,CAACO,IAAI,CAAC5B,KAAK,CAAC;IAClC,CAAC,CAAC;IAEFO,IAAI,CAAC,6BAA6B,EAAE,YAAY;MAC9C,MAAMO,OAAO,GAAGV,IAAI,CAACO,EAAE,CAAC,CAAC;MACzB,MAAMH,WAAW,GAAG;MAClB;MACC;QACCC,GAAG,EAAE;UACHC,GAAG,EAAEN,IAAI,CAACO,EAAE,CAAC,CAAC,CAACkB,qBAAqB,CAAC,IAAI,CAAC;UAC1Cd,GAAG,EAAED;QACP,CAAC;QACDE,KAAK,EAAE,CAAC,CAAC;QACTC,MAAM,EAAE;UACN;UACAC,OAAO,EAAE;YAAE,CAAC,qBAAqB,GAAG;cAAEC,WAAW,EAAEA,CAAA,KAAM;YAAQ;UAAE;QACrE;MACF,CACD;MACD,MAAMC,cAAc,GAAG,yBAA2B;QAAEC,QAAQ,EAAE;MAAK,CAAE;MACrEjB,IAAI,CAACkB,MAAM,CAACrB,yBAAyB,CAAC,CAACsB,iBAAiB,CAACH,cAAc,CAAC;MACxE,MAAMI,OAAO,GAAG,yCAA2C,CAAC,CAAE;MAC9D,MAAMC,GAAG,GAAG,MAAMvB,qBAAqB,CAACM,WAAW,EAAEgB,OAAO,EAAE,IAAI,CAAC;MACnEZ,MAAM,CAACE,OAAO,CAAC,CAACY,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC;MACtDd,MAAM,CAACa,GAAG,CAAC,CAACE,WAAW,CAAC,CAAC;MACzBf,MAAM,CAACa,GAAG,CAACJ,QAAQ,CAAC,CAACO,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;AACA","ignoreList":[]}
@@ -7,12 +7,19 @@ export type PostcodeLookupDispatchArgs = {
7
7
  };
8
8
  export type PostcodeLookupDispatchData = {
9
9
  sourceUrl: string;
10
+ formId: string;
10
11
  formName: string;
12
+ formStatus: FormStatus;
13
+ componentId: string;
11
14
  componentName: string;
12
15
  componentTitle: string;
13
16
  componentHint?: string;
14
17
  step?: string;
15
18
  language?: string;
19
+ languages?: {
20
+ name: string;
21
+ code: string;
22
+ }[];
16
23
  };
17
24
  export type PostcodeLookupSessionData = {
18
25
  initial: PostcodeLookupDispatchData;
@@ -39,6 +46,10 @@ export type PostcodeLookupQuery = {
39
46
  * - step
40
47
  */
41
48
  step?: string | undefined;
49
+ /**
50
+ * - language
51
+ */
52
+ language?: string | undefined;
42
53
  };
43
54
  export type PostcodeLookupDetailsPayloadProperties = {
44
55
  /**
@@ -202,4 +213,5 @@ export type DeliveryPointAddressResult = {
202
213
  */
203
214
  results?: DeliveryPointAddressItem[] | undefined;
204
215
  };
216
+ import type { FormStatus } from '@defra/forms-model';
205
217
  import type { Request } from '@hapi/hapi';
@@ -14,12 +14,16 @@
14
14
  /**
15
15
  * @typedef {{
16
16
  * sourceUrl: string,
17
+ * formId: string
17
18
  * formName: string
19
+ * formStatus: FormStatus
20
+ * componentId: string
18
21
  * componentName: string
19
22
  * componentTitle: string,
20
23
  * componentHint?: string
21
24
  * step?: string
22
25
  * language?: string
26
+ * languages?: { name: string, code: string}[]
23
27
  * }} PostcodeLookupDispatchData
24
28
  */
25
29
 
@@ -49,6 +53,7 @@
49
53
  * Postcode lookup query params
50
54
  * @typedef {object} PostcodeLookupQuery
51
55
  * @property {string} [step] - step
56
+ * @property {string} [language] - language
52
57
  */
53
58
 
54
59
  /**
@@ -140,6 +145,6 @@
140
145
 
141
146
  /**
142
147
  * @import { Request } from '@hapi/hapi'
143
- * @import { FormPayload } from '../../../server/plugins/engine/types.js'
148
+ * @import { FormStatus } from '@defra/forms-model'
144
149
  */
145
150
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formName: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * language?: string\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormPayload } from '~/src/server/plugins/engine/types.js'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/server/plugins/postcode-lookup/types.js"],"sourcesContent":["/**\n * @typedef {{\n * ordnanceSurveyApiKey: string\n * }} PostcodeLookupConfiguration\n */\n\n/**\n * @typedef {{\n * name: string\n * step?: string\n * }} PostcodeLookupDispatchArgs\n */\n\n/**\n * @typedef {{\n * sourceUrl: string,\n * formId: string\n * formName: string\n * formStatus: FormStatus\n * componentId: string\n * componentName: string\n * componentTitle: string,\n * componentHint?: string\n * step?: string\n * language?: string\n * languages?: { name: string, code: string}[]\n * }} PostcodeLookupDispatchData\n */\n\n/**\n * @typedef {{\n * initial: PostcodeLookupDispatchData\n * details: PostcodeLookupDetailsData\n * }} PostcodeLookupSessionData\n */\n\n//\n// Model types\n//\n\n/**\n * The postcode lookup details form view model data\n * @typedef {object} PostcodeLookupDetailsData\n * @property {string} postcodeQuery - postcode query\n * @property {string} buildingNameQuery - Building name or number query\n */\n\n//\n// Route types\n//\n\n/**\n * Postcode lookup query params\n * @typedef {object} PostcodeLookupQuery\n * @property {string} [step] - step\n * @property {string} [language] - language\n */\n\n/**\n * @typedef {object} PostcodeLookupDetailsPayloadProperties\n * @property {string} step - step\n */\n\n/**\n * @typedef {PostcodeLookupDetailsData & PostcodeLookupDetailsPayloadProperties} PostcodeLookupDetailsPayload\n */\n\n/**\n * @typedef {object} PostcodeLookupSelectPayload\n * @property {string} step - step\n * @property {string} uprn - postcode\n */\n\n/**\n * Postcode lookup get request\n * @typedef {object} PostcodeLookupGetRequestRefs\n * @property {PostcodeLookupQuery} Query - Request query\n */\n\n/**\n * Postcode lookup post request\n * @typedef {object} PostcodeLookupPostRequestRefs\n * @property {PostcodeLookupDetailsPayload | PostcodeLookupSelectPayload} Payload - Request payload\n */\n\n/**\n * @typedef {PostcodeLookupGetRequestRefs | PostcodeLookupPostRequestRefs} PostcodeLookupRequestRefs\n * @typedef {Request<PostcodeLookupGetRequestRefs>} PostcodeLookupGetRequest\n * @typedef {Request<PostcodeLookupPostRequestRefs>} PostcodeLookupPostRequest\n * @typedef {PostcodeLookupGetRequest | PostcodeLookupPostRequest} PostcodeLookupRequest\n */\n\n/**\n * @typedef {object} PostcodeLookupManualPayload\n * @property {string} addressLine1 - The address line 1\n * @property {string} addressLine2 - The address line 2\n * @property {string} town - The address town or city\n * @property {string} county - The address county\n * @property {string} postcode - The address postcode\n */\n\n//\n// Service types\n//\n\n/**\n * @typedef {object} Address\n * @property {string} uprn - The unique property reference\n * @property {string} address - The full address\n * @property {string} addressLine1 - Address line 1\n * @property {string} addressLine2 - Address line 2\n * @property {string} town - Address town\n * @property {string} county - Address county\n * @property {string} postcode - Address postcode\n * @property {string} formatted - The full formatted address\n */\n\n/**\n * OS places address response\n * @typedef {object} DeliveryPointAddress\n * @property {string} UPRN - Unique property reference number\n * @property {string} UDPRN - Unique delivery point Reference Number\n * @property {string} ADDRESS - Address\n * @property {string} ORGANISATION_NAME - Organisation name\n * @property {string} SUB_BUILDING_NAME - Sub building name\n * @property {string} BUILDING_NAME - Building name\n * @property {string} BUILDING_NUMBER - Building number\n * @property {string} THOROUGHFARE_NAME - Throughfare name\n * @property {string} DEPENDENT_LOCALITY - Dependent locality\n * @property {string} POST_TOWN - Post town\n * @property {string} POSTCODE - Postcode\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressItem\n * @property {DeliveryPointAddress} DPA - Delivery point address\n */\n\n/**\n * OS places DPA response\n * @typedef {object} DeliveryPointAddressResult\n * @property {DeliveryPointAddressItem[]} [results] - Delivery point address results\n */\n\n/**\n * @import { Request } from '@hapi/hapi'\n * @import { FormStatus } from '@defra/forms-model'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -33,7 +33,7 @@
33
33
  <!-- Postcode lookup select -->
34
34
  <!-- Postcode lookup details display -->
35
35
  {%- set detailsHtml -%}
36
- <strong>{{ details.postcodeQuery }}</strong>{% if details.buildingNameQuery %} and <strong>{{ details.buildingNameQuery }}</strong>{% endif %}
36
+ <strong>{{ details.postcodeQuery }}</strong>{% if details.buildingNameQuery %} {{ t('common.or')}} <strong>{{ details.buildingNameQuery }}</strong>{% endif %}
37
37
  {%- endset -%}
38
38
 
39
39
  {% if hasAddresses %}
@@ -72,9 +72,9 @@
72
72
  {{ govukButton(buttons.continueButton) }}
73
73
 
74
74
  {% if buttons.manualLink %}
75
- <p class="govuk-body">or <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.manualLink.href }}">{{buttons.manualLink.text}}</a></p>
75
+ <p class="govuk-body">{{ t('common.or')}} <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.manualLink.href }}">{{buttons.manualLink.text}}</a></p>
76
76
  {% elif buttons.detailsLink %}
77
- <p class="govuk-body">or <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.detailsLink.href }}">{{buttons.detailsLink.text}}</a></p>
77
+ <p class="govuk-body">{{ t('common.or')}} <a class="govuk-link govuk-link--no-visited-state" href="{{ buttons.detailsLink.href }}">{{buttons.detailsLink.text}}</a></p>
78
78
  {% endif %}
79
79
  </div>
80
80
  </form>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "5.0.0-alpha.8",
3
+ "version": "5.0.0-alpha.9",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -136,6 +136,7 @@
136
136
  "joi": "^17.13.3",
137
137
  "liquidjs": "^10.24.0",
138
138
  "lodash": "^4.17.21",
139
+ "lru-cache": "^11.5.1",
139
140
  "maplibre-gl": "^5.24.0",
140
141
  "marked": "^15.0.12",
141
142
  "nunjucks": "^3.2.4",
@@ -5,4 +5,5 @@ export const EXTERNAL_STATE_PAYLOAD = 'EXTERNAL_STATE_PAYLOAD'
5
5
  export const EXTERNAL_STATE_APPENDAGE = 'EXTERNAL_STATE_APPENDAGE'
6
6
  export const COMPONENT_STATE_ERROR = 'COMPONENT_STATE_ERROR'
7
7
  export const PAYMENT_EXPIRED_NOTIFICATION = 'PAYMENT_EXPIRED_NOTIFICATION'
8
- export const EN_GB = 'en-GB'
8
+ export const EN_GB = 'en-GB' // English language
9
+ export const CY = 'cy' // Welsh language
@@ -15,6 +15,7 @@ import {
15
15
  type Field,
16
16
  type Guidance
17
17
  } from './helpers/components.js'
18
+ import { getTranslatedLabel } from './helpers/index.js'
18
19
  import {
19
20
  type ComponentViewModel,
20
21
  type RenderContext
@@ -302,25 +303,28 @@ export class ComponentCollection {
302
303
  for (const subField of field.collection.fields) {
303
304
  const translatedSubLabel = t(subField.title) || subField.label
304
305
  let patchedSchema = subField.formSchema.label(translatedSubLabel)
305
- if (messagesOverride) {
306
- patchedSchema = patchedSchema.messages(messagesOverride)
306
+ const subFieldMessages = messagesOverride
307
+ ? messagesOverride[subField.name]
308
+ : undefined
309
+ if (subFieldMessages) {
310
+ patchedSchema = patchedSchema.messages(subFieldMessages)
307
311
  }
308
312
  labelOverrides[subField.name] = patchedSchema
309
313
  }
310
314
  } else {
311
315
  const fieldDef = field.def
312
- const translatedLabel =
313
- translator.tComponent(fieldDef, 'errorDescription') ||
314
- translator.tComponent(fieldDef, 'shortDescription') ||
315
- translator.tComponent(fieldDef, 'title')
316
+ const translatedLabel = getTranslatedLabel(fieldDef, translator)
316
317
  const messagesOverride =
317
318
  field.getValidationMessagesOverride(translator)
318
319
  let patchedSchema = field.formSchema
319
320
  if (translatedLabel && translatedLabel !== field.label) {
320
321
  patchedSchema = patchedSchema.label(translatedLabel)
321
322
  }
322
- if (messagesOverride) {
323
- patchedSchema = patchedSchema.messages(messagesOverride)
323
+ const fieldMessages = messagesOverride
324
+ ? messagesOverride[field.name]
325
+ : undefined
326
+ if (fieldMessages) {
327
+ patchedSchema = patchedSchema.messages(fieldMessages)
324
328
  }
325
329
  if (patchedSchema !== field.formSchema) {
326
330
  labelOverrides[field.name] = patchedSchema
@@ -339,10 +343,12 @@ export class ComponentCollection {
339
343
  })
340
344
 
341
345
  const details = result.error?.details
346
+ const language = translator?.language
342
347
 
343
348
  return {
344
349
  value: (result.value ?? {}) as typeof value,
345
- errors: this.page?.getErrors(details) ?? getErrors(details)
350
+ errors:
351
+ this.page?.getErrors(details, language) ?? getErrors(language, details)
346
352
  }
347
353
  }
348
354
 
@@ -25,6 +25,7 @@ import {
25
25
  type FormStateValue,
26
26
  type FormSubmissionState
27
27
  } from '../types.js'
28
+ import { formatDateForLanguage } from '../../payment/helper.js'
28
29
  import { convertToLanguageMessages } from '../../../utils/type-utils.js'
29
30
 
30
31
  export class DatePartsField extends FormComponent {
@@ -111,15 +112,16 @@ export class DatePartsField extends FormComponent {
111
112
 
112
113
  getDisplayStringFromFormValue(
113
114
  formValue: DatePartsState | undefined,
114
- _translator: Translator
115
+ translator: Translator
115
116
  ) {
116
117
  if (!formValue) {
117
118
  return ''
118
119
  }
119
120
 
120
- return format(
121
+ return formatDateForLanguage(
121
122
  `${formValue.year}-${formValue.month}-${formValue.day}`,
122
- 'd MMMM yyyy'
123
+ 'd MMMM yyyy',
124
+ translator.language
123
125
  )
124
126
  }
125
127
 
@@ -158,15 +160,17 @@ export class DatePartsField extends FormComponent {
158
160
 
159
161
  getValidationMessagesOverride(translator: Translator) {
160
162
  const { t } = translator
161
- return convertToLanguageMessages({
162
- 'any.required': buildValidationMessages(t).objectMissing,
163
- 'number.base': buildValidationMessages(t).objectMissing,
164
- 'number.precision': buildValidationMessages(t).dateFormat,
165
- 'number.integer': buildValidationMessages(t).dateFormat,
166
- 'number.unsafe': buildValidationMessages(t).dateFormat,
167
- 'number.min': buildValidationMessages(t).dateFormat,
168
- 'number.max': buildValidationMessages(t).dateFormat
169
- })
163
+ return {
164
+ [this.name]: convertToLanguageMessages({
165
+ 'any.required': buildValidationMessages(t).objectMissing,
166
+ 'number.base': buildValidationMessages(t).objectMissing,
167
+ 'number.precision': buildValidationMessages(t).dateFormat,
168
+ 'number.integer': buildValidationMessages(t).dateFormat,
169
+ 'number.unsafe': buildValidationMessages(t).dateFormat,
170
+ 'number.min': buildValidationMessages(t).dateFormat,
171
+ 'number.max': buildValidationMessages(t).dateFormat
172
+ })
173
+ }
170
174
  }
171
175
 
172
176
  getViewModel(context: RenderContext) {
@@ -120,10 +120,12 @@ export class DeclarationField extends FormComponent {
120
120
  const { declarationRequired } = buildValidationMessages(translator.t)
121
121
  const msg = declarationRequired as unknown as string
122
122
  return {
123
- 'any.required': msg,
124
- 'any.unknown': msg,
125
- 'array.includesRequiredUnknowns': msg
126
- } as unknown as LanguageMessages
123
+ [this.name]: {
124
+ 'any.required': msg,
125
+ 'any.unknown': msg,
126
+ 'array.includesRequiredUnknowns': msg
127
+ } as unknown as LanguageMessages
128
+ }
127
129
  }
128
130
 
129
131
  getDisplayStringFromFormValue(