@defra/forms-engine-plugin 3.0.9 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/.public/stylesheets/application.min.css +3 -3
  2. package/.public/stylesheets/application.min.css.map +1 -1
  3. package/.server/client/stylesheets/application.scss +14 -0
  4. package/.server/config/index.d.ts +1 -0
  5. package/.server/config/index.js +7 -0
  6. package/.server/config/index.js.map +1 -1
  7. package/.server/index.js +6 -2
  8. package/.server/index.js.map +1 -1
  9. package/.server/server/constants.d.ts +2 -0
  10. package/.server/server/constants.js +2 -0
  11. package/.server/server/constants.js.map +1 -1
  12. package/.server/server/forms/components.json +7 -0
  13. package/.server/server/forms/register-as-a-unicorn-breeder.yaml +18 -2
  14. package/.server/server/plugins/engine/components/UkAddressField.d.ts +15 -9
  15. package/.server/server/plugins/engine/components/UkAddressField.js +67 -6
  16. package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
  17. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +1 -1
  18. package/.server/server/plugins/engine/configureEnginePlugin.js +6 -3
  19. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  20. package/.server/server/plugins/engine/models/FormModel.d.ts +2 -0
  21. package/.server/server/plugins/engine/models/FormModel.js +3 -1
  22. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  23. package/.server/server/plugins/engine/options.js +2 -1
  24. package/.server/server/plugins/engine/options.js.map +1 -1
  25. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -0
  26. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +46 -3
  27. package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
  28. package/.server/server/plugins/engine/plugin.js +15 -2
  29. package/.server/server/plugins/engine/plugin.js.map +1 -1
  30. package/.server/server/plugins/engine/routes/index.d.ts +2 -2
  31. package/.server/server/plugins/engine/routes/index.js +49 -9
  32. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  33. package/.server/server/plugins/engine/routes/questions.d.ts +4 -4
  34. package/.server/server/plugins/engine/routes/questions.js +10 -10
  35. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  36. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -1
  37. package/.server/server/plugins/engine/routes/repeaters/item-delete.js +31 -27
  38. package/.server/server/plugins/engine/routes/repeaters/item-delete.js.map +1 -1
  39. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -1
  40. package/.server/server/plugins/engine/routes/repeaters/summary.js +31 -27
  41. package/.server/server/plugins/engine/routes/repeaters/summary.js.map +1 -1
  42. package/.server/server/plugins/engine/types.d.ts +21 -3
  43. package/.server/server/plugins/engine/types.js.map +1 -1
  44. package/.server/server/plugins/engine/validationHelpers.d.ts +15 -0
  45. package/.server/server/plugins/engine/validationHelpers.js +29 -0
  46. package/.server/server/plugins/engine/validationHelpers.js.map +1 -0
  47. package/.server/server/plugins/engine/views/components/ukaddressfield.html +50 -6
  48. package/.server/server/plugins/engine/vision.js +3 -1
  49. package/.server/server/plugins/engine/vision.js.map +1 -1
  50. package/.server/server/plugins/postcode-lookup/index.d.ts +8 -0
  51. package/.server/server/plugins/postcode-lookup/index.js +21 -0
  52. package/.server/server/plugins/postcode-lookup/index.js.map +1 -0
  53. package/.server/server/plugins/postcode-lookup/models/index.d.ts +255 -0
  54. package/.server/server/plugins/postcode-lookup/models/index.js +517 -0
  55. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -0
  56. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +19 -0
  57. package/.server/server/plugins/postcode-lookup/routes/index.js +267 -0
  58. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -0
  59. package/.server/server/plugins/postcode-lookup/service.d.ts +26 -0
  60. package/.server/server/plugins/postcode-lookup/service.js +148 -0
  61. package/.server/server/plugins/postcode-lookup/service.js.map +1 -0
  62. package/.server/server/plugins/postcode-lookup/service.test.js +144 -0
  63. package/.server/server/plugins/postcode-lookup/service.test.js.map +1 -0
  64. package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.d.ts +282 -0
  65. package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.js +370 -0
  66. package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.js.map +1 -0
  67. package/.server/server/plugins/postcode-lookup/test/__stubs__/query.d.ts +131 -0
  68. package/.server/server/plugins/postcode-lookup/test/__stubs__/query.js +195 -0
  69. package/.server/server/plugins/postcode-lookup/test/__stubs__/query.js.map +1 -0
  70. package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.d.ts +51 -0
  71. package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.js +52 -0
  72. package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.js.map +1 -0
  73. package/.server/server/plugins/postcode-lookup/types.d.ts +204 -0
  74. package/.server/server/plugins/postcode-lookup/types.js +144 -0
  75. package/.server/server/plugins/postcode-lookup/types.js.map +1 -0
  76. package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +83 -0
  77. package/.server/server/routes/types.d.ts +7 -2
  78. package/.server/server/routes/types.js +6 -0
  79. package/.server/server/routes/types.js.map +1 -1
  80. package/.server/server/schemas/index.js +1 -1
  81. package/.server/server/schemas/index.js.map +1 -1
  82. package/.server/server/types.d.ts +1 -0
  83. package/.server/server/types.js.map +1 -1
  84. package/package.json +2 -2
  85. package/src/client/stylesheets/application.scss +14 -0
  86. package/src/config/index.ts +9 -1
  87. package/src/index.ts +5 -4
  88. package/src/server/constants.js +2 -0
  89. package/src/server/forms/components.json +7 -0
  90. package/src/server/forms/register-as-a-unicorn-breeder.yaml +18 -2
  91. package/src/server/plugins/engine/components/UkAddressField.test.ts +50 -27
  92. package/src/server/plugins/engine/components/UkAddressField.ts +91 -8
  93. package/src/server/plugins/engine/configureEnginePlugin.ts +5 -3
  94. package/src/server/plugins/engine/helpers.test.ts +2 -1
  95. package/src/server/plugins/engine/models/FormModel.ts +10 -2
  96. package/src/server/plugins/engine/options.js +2 -1
  97. package/src/server/plugins/engine/pageControllers/PageController.test.ts +2 -1
  98. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +9 -4
  99. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +69 -1
  100. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +2 -1
  101. package/src/server/plugins/engine/plugin.ts +22 -4
  102. package/src/server/plugins/engine/routes/index.test.ts +317 -0
  103. package/src/server/plugins/engine/routes/index.ts +81 -8
  104. package/src/server/plugins/engine/routes/questions.test.ts +126 -15
  105. package/src/server/plugins/engine/routes/questions.ts +71 -57
  106. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +83 -0
  107. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +39 -33
  108. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +75 -0
  109. package/src/server/plugins/engine/routes/repeaters/summary.ts +28 -22
  110. package/src/server/plugins/engine/types.ts +27 -8
  111. package/src/server/plugins/engine/validationHelpers.ts +48 -0
  112. package/src/server/plugins/engine/views/components/ukaddressfield.html +50 -6
  113. package/src/server/plugins/engine/vision.ts +6 -0
  114. package/src/server/plugins/postcode-lookup/index.js +21 -0
  115. package/src/server/plugins/postcode-lookup/models/index.js +549 -0
  116. package/src/server/plugins/postcode-lookup/routes/index.js +258 -0
  117. package/src/server/plugins/postcode-lookup/service.js +188 -0
  118. package/src/server/plugins/postcode-lookup/service.test.js +177 -0
  119. package/src/server/plugins/postcode-lookup/test/__stubs__/postcode.js +382 -0
  120. package/src/server/plugins/postcode-lookup/test/__stubs__/query.js +200 -0
  121. package/src/server/plugins/postcode-lookup/test/__stubs__/uprn.js +53 -0
  122. package/src/server/plugins/postcode-lookup/types.js +143 -0
  123. package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +83 -0
  124. package/src/server/postcode-lookup.test.ts +64 -0
  125. package/src/server/routes/types.ts +11 -2
  126. package/src/server/schemas/index.ts +5 -7
  127. package/src/server/types.ts +1 -0
@@ -1,11 +1,12 @@
1
1
  import Boom from '@hapi/boom';
2
2
  import { isEqual } from 'date-fns';
3
- import { PREVIEW_PATH_PREFIX } from "../../../constants.js";
3
+ import { EXTERNAL_STATE_APPENDAGE, EXTERNAL_STATE_PAYLOAD, PREVIEW_PATH_PREFIX } from "../../../constants.js";
4
+ import { FormComponent, isFormState } from "../components/FormComponent.js";
4
5
  import { checkEmailAddressForLiveFormSubmission, checkFormStatus, findPage, getCacheService, getPage, getStartPath, proceed } from "../helpers.js";
5
6
  import { FormModel } from "../models/index.js";
6
7
  import { generateUniqueReference } from "../referenceNumbers.js";
7
8
  import * as defaultServices from "../services/index.js";
8
- export async function redirectOrMakeHandler(request, h, makeHandler) {
9
+ export async function redirectOrMakeHandler(request, h, onRequest, makeHandler) {
9
10
  const {
10
11
  app,
11
12
  params
@@ -29,11 +30,20 @@ export async function redirectOrMakeHandler(request, h, makeHandler) {
29
30
  $$__referenceNumber: referenceNumber
30
31
  });
31
32
  }
33
+ state = await importExternalComponentState(request, page, state);
32
34
  const flash = cacheService.getFlash(request);
33
35
  const context = model.getFormContext(request, state, flash?.errors);
34
36
  const relevantPath = page.getRelevantPath(request, context);
35
37
  const summaryPath = page.getSummaryPath();
36
38
 
39
+ // Call the onRequest callback if it has been supplied
40
+ if (onRequest) {
41
+ const result = await onRequest(request, h, context);
42
+ if (result !== h.continue) {
43
+ return result;
44
+ }
45
+ }
46
+
37
47
  // Return handler for relevant pages or preview URL direct access
38
48
  if (relevantPath.startsWith(page.path) || context.isForceAccess) {
39
49
  return makeHandler(page, context);
@@ -48,13 +58,47 @@ export async function redirectOrMakeHandler(request, h, makeHandler) {
48
58
  }
49
59
  return proceed(request, h, page.getHref(relevantPath));
50
60
  }
61
+ async function importExternalComponentState(request, page, state) {
62
+ const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE);
63
+ if (Array.isArray(externalComponentData)) {
64
+ return state;
65
+ }
66
+ const typedStateAppendage = externalComponentData;
67
+ const componentName = typedStateAppendage.component;
68
+ const stateAppendage = typedStateAppendage.data;
69
+ const component = request.app.model?.componentMap.get(componentName);
70
+ if (!component) {
71
+ throw new Error(`Component ${componentName} not found in form`);
72
+ }
73
+ if (!(component instanceof FormComponent)) {
74
+ throw new TypeError(`Component ${componentName} is not a FormComponent and does not support isState`);
75
+ }
76
+ const isStateValid = component.isState(stateAppendage);
77
+ if (!isStateValid) {
78
+ throw new Error(`State for component ${componentName} is invalid`);
79
+ }
80
+ const componentState = isFormState(stateAppendage) ? Object.fromEntries(Object.entries(stateAppendage).map(([key, value]) => [`${componentName}__${key}`, value])) : {
81
+ [componentName]: stateAppendage
82
+ };
83
+
84
+ // Save the external component state immediately
85
+ const updatedState = await page.mergeState(request, state, componentState);
86
+
87
+ // Merge the stashed payload into the local state
88
+ const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD);
89
+ const stashedPayload = Array.isArray(payload) ? {} : payload;
90
+ return {
91
+ ...stashedPayload,
92
+ ...updatedState
93
+ };
94
+ }
51
95
  export function makeLoadFormPreHandler(server, options) {
52
96
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong
53
97
  const prefix = server.realm.modifiers.route.prefix ?? '';
54
98
  const {
55
99
  services = defaultServices,
56
100
  controllers,
57
- onRequest
101
+ ordnanceSurveyApiKey
58
102
  } = options;
59
103
  const {
60
104
  formsService
@@ -116,7 +160,8 @@ export function makeLoadFormPreHandler(server, options) {
116
160
  // Construct the form model
117
161
  const model = new FormModel(definition, {
118
162
  basePath,
119
- versionNumber
163
+ versionNumber,
164
+ ordnanceSurveyApiKey
120
165
  }, services, controllers);
121
166
 
122
167
  // Create new item and add it to the item cache
@@ -127,11 +172,6 @@ export function makeLoadFormPreHandler(server, options) {
127
172
  server.app.models.set(key, item);
128
173
  }
129
174
 
130
- // Call the onRequest callback if it has been supplied
131
- if (onRequest) {
132
- onRequest(request, params, item.model.def, metadata);
133
- }
134
-
135
175
  // Assign the model to the request data
136
176
  // for use in the downstream handler
137
177
  request.app.model = item.model;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Boom","isEqual","PREVIEW_PATH_PREFIX","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","proceed","FormModel","generateUniqueReference","defaultServices","redirectOrMakeHandler","request","h","makeHandler","app","params","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","flash","getFlash","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","startsWith","isForceAccess","redirectTo","next","length","query","returnUrl","getHref","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","onRequest","formsService","handler","continue","slug","isPreview","formState","getFormMetadata","id","key","item","models","get","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","versionNumber","versions","set","dispatchHandler","servicePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\nimport { isEqual } from 'date-fns'\n\nimport { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const referenceNumber = generateUniqueReference(prefix)\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n const flash = cacheService.getFlash(request)\n const context = model.getFormContext(request, state, flash?.errors)\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Return handler for relevant pages or preview URL direct access\n if (relevantPath.startsWith(page.path) || context.isForceAccess) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const { services = defaultServices, controllers, onRequest } = options\n\n const { formsService } = services\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n // Get the form metadata using the `slug` param\n const metadata = await formsService.getFormMetadata(slug)\n\n const { id, [formState]: state } = metadata\n\n // Check the metadata supports the requested state\n if (!state) {\n throw Boom.notFound(`No '${formState}' state for form metadata ${id}`)\n }\n\n // Cache the models based on id, state and whether\n // it's a preview or not. There could be up to 3 models\n // cached for a single form:\n // \"{id}_live_false\" (live/live)\n // \"{id}_live_true\" (live/preview)\n // \"{id}_draft_true\" (draft/preview)\n const key = `${id}_${formState}_${isPreview}`\n let item = server.app.models.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(`Getting form definition ${id} (${slug}) ${formState}`)\n\n // Get the form definition using the `id` from the metadata\n const definition = await formsService.getFormDefinition(id, formState)\n\n if (!definition) {\n throw Boom.notFound(\n `No definition found for form metadata ${id} (${slug}) ${formState}`\n )\n }\n\n const emailAddress = metadata.notificationEmail ?? definition.outputEmail\n\n checkEmailAddressForLiveFormSubmission(emailAddress, isPreview)\n\n // Build the form model\n server.logger.info(\n `Building model for form definition ${id} (${slug}) ${formState}`\n )\n\n // Set up the basePath for the model\n const basePath = (\n isPreview\n ? `${prefix}${PREVIEW_PATH_PREFIX}/${formState}/${slug}`\n : `${prefix}/${slug}`\n ).substring(1)\n\n const versionNumber = metadata.versions?.[0]?.versionNumber\n\n // Construct the form model\n const model = new FormModel(\n definition,\n { basePath, versionNumber },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n server.app.models.set(key, item)\n }\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n onRequest(request, params, item.model.def, metadata)\n }\n\n // Assign the model to the request data\n // for use in the downstream handler\n request.app.model = item.model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Boom","isEqual","EXTERNAL_STATE_APPENDAGE","EXTERNAL_STATE_PAYLOAD","PREVIEW_PATH_PREFIX","FormComponent","isFormState","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","proceed","FormModel","generateUniqueReference","defaultServices","redirectOrMakeHandler","request","h","onRequest","makeHandler","app","params","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","importExternalComponentState","flash","getFlash","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","result","continue","startsWith","isForceAccess","redirectTo","next","length","query","returnUrl","getHref","externalComponentData","yar","Array","isArray","typedStateAppendage","componentName","component","stateAppendage","data","componentMap","get","Error","TypeError","isStateValid","isState","componentState","Object","fromEntries","entries","map","key","value","updatedState","payload","stashedPayload","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","ordnanceSurveyApiKey","formsService","handler","slug","isPreview","formState","getFormMetadata","id","item","models","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","versionNumber","versions","set","dispatchHandler","servicePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\nimport { isEqual } from 'date-fns'\n\nimport {\n EXTERNAL_STATE_APPENDAGE,\n EXTERNAL_STATE_PAYLOAD,\n PREVIEW_PATH_PREFIX\n} from '~/src/server/constants.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type ExternalStateAppendage,\n type FormContext,\n type FormPayload,\n type FormSubmissionState,\n type OnRequestCallback,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n onRequest: OnRequestCallback | undefined,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const referenceNumber = generateUniqueReference(prefix)\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n state = await importExternalComponentState(request, page, state)\n\n const flash = cacheService.getFlash(request)\n const context = model.getFormContext(request, state, flash?.errors)\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n const result = await onRequest(request, h, context)\n if (result !== h.continue) {\n return result\n }\n }\n\n // Return handler for relevant pages or preview URL direct access\n if (relevantPath.startsWith(page.path) || context.isForceAccess) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nasync function importExternalComponentState(\n request: AnyFormRequest,\n page: PageControllerClass,\n state: FormSubmissionState\n): Promise<FormSubmissionState> {\n const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE)\n\n if (Array.isArray(externalComponentData)) {\n return state\n }\n\n const typedStateAppendage = externalComponentData as ExternalStateAppendage\n const componentName = typedStateAppendage.component\n const stateAppendage = typedStateAppendage.data\n const component = request.app.model?.componentMap.get(componentName)\n\n if (!component) {\n throw new Error(`Component ${componentName} not found in form`)\n }\n\n if (!(component instanceof FormComponent)) {\n throw new TypeError(\n `Component ${componentName} is not a FormComponent and does not support isState`\n )\n }\n\n const isStateValid = component.isState(stateAppendage)\n\n if (!isStateValid) {\n throw new Error(`State for component ${componentName} is invalid`)\n }\n\n const componentState = isFormState(stateAppendage)\n ? Object.fromEntries(\n Object.entries(stateAppendage).map(([key, value]) => [\n `${componentName}__${key}`,\n value\n ])\n )\n : { [componentName]: stateAppendage }\n\n // Save the external component state immediately\n const updatedState = await page.mergeState(request, state, componentState)\n\n // Merge the stashed payload into the local state\n const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD)\n const stashedPayload = Array.isArray(payload) ? {} : (payload as FormPayload)\n\n return { ...stashedPayload, ...updatedState }\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const {\n services = defaultServices,\n controllers,\n ordnanceSurveyApiKey\n } = options\n\n const { formsService } = services\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n // Get the form metadata using the `slug` param\n const metadata = await formsService.getFormMetadata(slug)\n\n const { id, [formState]: state } = metadata\n\n // Check the metadata supports the requested state\n if (!state) {\n throw Boom.notFound(`No '${formState}' state for form metadata ${id}`)\n }\n\n // Cache the models based on id, state and whether\n // it's a preview or not. There could be up to 3 models\n // cached for a single form:\n // \"{id}_live_false\" (live/live)\n // \"{id}_live_true\" (live/preview)\n // \"{id}_draft_true\" (draft/preview)\n const key = `${id}_${formState}_${isPreview}`\n let item = server.app.models.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(`Getting form definition ${id} (${slug}) ${formState}`)\n\n // Get the form definition using the `id` from the metadata\n const definition = await formsService.getFormDefinition(id, formState)\n\n if (!definition) {\n throw Boom.notFound(\n `No definition found for form metadata ${id} (${slug}) ${formState}`\n )\n }\n\n const emailAddress = metadata.notificationEmail ?? definition.outputEmail\n\n checkEmailAddressForLiveFormSubmission(emailAddress, isPreview)\n\n // Build the form model\n server.logger.info(\n `Building model for form definition ${id} (${slug}) ${formState}`\n )\n\n // Set up the basePath for the model\n const basePath = (\n isPreview\n ? `${prefix}${PREVIEW_PATH_PREFIX}/${formState}/${slug}`\n : `${prefix}/${slug}`\n ).substring(1)\n\n const versionNumber = metadata.versions?.[0]?.versionNumber\n\n // Construct the form model\n const model = new FormModel(\n definition,\n { basePath, versionNumber, ordnanceSurveyApiKey },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n server.app.models.set(key, item)\n }\n\n // Assign the model to the request data\n // for use in the downstream handler\n request.app.model = item.model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import { type ResponseObject, type RouteOptions, type ServerRoute } from '@hapi/hapi';
2
- import { type PreparePageEventRequestOptions } from '~/src/server/plugins/engine/types.js';
2
+ import { type OnRequestCallback, type PreparePageEventRequestOptions } from '~/src/server/plugins/engine/types.js';
3
3
  import { type FormRequest, type FormRequestPayload, type FormRequestPayloadRefs, type FormRequestRefs, type FormResponseToolkit } from '~/src/server/routes/types.js';
4
- export declare function makeGetHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions): (request: FormRequest, h: FormResponseToolkit) => ResponseObject | Promise<ResponseObject>;
5
- export declare function makePostHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions): (request: FormRequestPayload, h: FormResponseToolkit) => Promise<ResponseObject>;
6
- export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, preparePageEventRequestOptions?: PreparePageEventRequestOptions): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
4
+ export declare function makeGetHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (request: FormRequest, h: FormResponseToolkit) => ResponseObject | Promise<symbol | ResponseObject>;
5
+ export declare function makePostHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (request: FormRequestPayload, h: FormResponseToolkit) => Promise<symbol | ResponseObject>;
6
+ export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
@@ -34,7 +34,7 @@ async function handleHttpEvent(request, page, context, event, model, preparePage
34
34
  } = await httpService.postJson(url, opts);
35
35
  Object.assign(context.data, response);
36
36
  }
37
- export function makeGetHandler(preparePageEventRequestOptions) {
37
+ export function makeGetHandler(preparePageEventRequestOptions, onRequest) {
38
38
  return function getHandler(request, h) {
39
39
  const {
40
40
  params
@@ -42,7 +42,7 @@ export function makeGetHandler(preparePageEventRequestOptions) {
42
42
  if (normalisePath(params.path) === '') {
43
43
  return dispatchHandler(request, h);
44
44
  }
45
- return redirectOrMakeHandler(request, h, async (page, context) => {
45
+ return redirectOrMakeHandler(request, h, onRequest, async (page, context) => {
46
46
  // Check for a page onLoad HTTP event and if one exists,
47
47
  // call it and assign the response to the context data
48
48
  const {
@@ -61,12 +61,12 @@ export function makeGetHandler(preparePageEventRequestOptions) {
61
61
  });
62
62
  };
63
63
  }
64
- export function makePostHandler(preparePageEventRequestOptions) {
64
+ export function makePostHandler(preparePageEventRequestOptions, onRequest) {
65
65
  return function postHandler(request, h) {
66
66
  const {
67
67
  query
68
68
  } = request;
69
- return redirectOrMakeHandler(request, h, async (page, context) => {
69
+ return redirectOrMakeHandler(request, h, onRequest, async (page, context) => {
70
70
  const {
71
71
  pageDef
72
72
  } = page;
@@ -101,11 +101,11 @@ function isSuccessful(response) {
101
101
  } = response;
102
102
  return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400;
103
103
  }
104
- export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventRequestOptions) {
104
+ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventRequestOptions, onRequest) {
105
105
  return [{
106
106
  method: 'get',
107
107
  path: '/{slug}',
108
- handler: makeGetHandler(preparePageEventRequestOptions),
108
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
109
109
  options: {
110
110
  ...getRouteOptions,
111
111
  validate: {
@@ -130,7 +130,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
130
130
  }, {
131
131
  method: 'get',
132
132
  path: '/{slug}/{path}/{itemId?}',
133
- handler: makeGetHandler(preparePageEventRequestOptions),
133
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
134
134
  options: {
135
135
  ...getRouteOptions,
136
136
  validate: {
@@ -144,7 +144,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
144
144
  }, {
145
145
  method: 'get',
146
146
  path: '/preview/{state}/{slug}/{path}/{itemId?}',
147
- handler: makeGetHandler(preparePageEventRequestOptions),
147
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
148
148
  options: {
149
149
  ...getRouteOptions,
150
150
  validate: {
@@ -159,7 +159,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
159
159
  }, {
160
160
  method: 'post',
161
161
  path: '/{slug}/{path}/{itemId?}',
162
- handler: makePostHandler(preparePageEventRequestOptions),
162
+ handler: makePostHandler(preparePageEventRequestOptions, onRequest),
163
163
  options: {
164
164
  ...postRouteOptions,
165
165
  validate: {
@@ -177,7 +177,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
177
177
  }, {
178
178
  method: 'post',
179
179
  path: '/preview/{state}/{slug}/{path}/{itemId?}',
180
- handler: makePostHandler(preparePageEventRequestOptions),
180
+ handler: makePostHandler(preparePageEventRequestOptions, onRequest),
181
181
  options: {
182
182
  ...postRouteOptions,
183
183
  validate: {
@@ -1 +1 @@
1
- {"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","viewModel","items","details","payload","undefined","opts","response","postJson","Object","assign","data","makeGetHandler","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(viewModel.context, viewModel.details)\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts = { payload }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(request, h, async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad && events.onLoad.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n })\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(request, h, async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (\n events?.onSave &&\n events.onSave.type === 'http' &&\n isSuccessful(response)\n ) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n })\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","viewModel","items","details","payload","undefined","opts","response","postJson","Object","assign","data","makeGetHandler","onRequest","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type OnRequestCallback,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(viewModel.context, viewModel.details)\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts = { payload }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad && events.onLoad.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n }\n )\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (\n events?.onSave &&\n events.onSave.type === 'http' &&\n isSuccessful(response)\n ) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n }\n )\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
1
  import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
2
+ import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js';
2
3
  import { type FormRequestPayloadRefs, type FormRequestRefs } from '~/src/server/routes/types.js';
3
- export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
4
+ export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
@@ -7,36 +7,40 @@ import { redirectOrMakeHandler } from "../index.js";
7
7
  import { actionSchema, confirmSchema, crumbSchema, itemIdSchema, pathSchema, stateSchema } from "../../../../schemas/index.js";
8
8
 
9
9
  // Item delete GET route
10
- function getHandler(request, h) {
11
- const {
12
- params
13
- } = request;
14
- return redirectOrMakeHandler(request, h, (page, context) => {
15
- if (!(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
16
- throw Boom.notFound(`No page found for /${params.path}`);
17
- }
18
- return page.makeGetItemDeleteRouteHandler()(request, context, h);
19
- });
10
+ function getHandler(onRequest) {
11
+ return async function (request, h) {
12
+ const {
13
+ params
14
+ } = request;
15
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
16
+ if (!(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
17
+ throw Boom.notFound(`No page found for /${params.path}`);
18
+ }
19
+ return page.makeGetItemDeleteRouteHandler()(request, context, h);
20
+ });
21
+ };
20
22
  }
21
- function postHandler(request, h) {
22
- const {
23
- params
24
- } = request;
25
- return redirectOrMakeHandler(request, h, (page, context) => {
23
+ function postHandler(onRequest) {
24
+ return async function (request, h) {
26
25
  const {
27
- isForceAccess
28
- } = context;
29
- if (isForceAccess || !(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
30
- throw Boom.notFound(`No page found for /${params.path}`);
31
- }
32
- return page.makePostItemDeleteRouteHandler()(request, context, h);
33
- });
26
+ params
27
+ } = request;
28
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
29
+ const {
30
+ isForceAccess
31
+ } = context;
32
+ if (isForceAccess || !(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
33
+ throw Boom.notFound(`No page found for /${params.path}`);
34
+ }
35
+ return page.makePostItemDeleteRouteHandler()(request, context, h);
36
+ });
37
+ };
34
38
  }
35
- export function getRoutes(getRouteOptions, postRouteOptions) {
39
+ export function getRoutes(getRouteOptions, postRouteOptions, onRequest) {
36
40
  return [{
37
41
  method: 'get',
38
42
  path: '/{slug}/{path}/{itemId}/confirm-delete',
39
- handler: getHandler,
43
+ handler: getHandler(onRequest),
40
44
  options: {
41
45
  ...getRouteOptions,
42
46
  validate: {
@@ -50,7 +54,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
50
54
  }, {
51
55
  method: 'get',
52
56
  path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
53
- handler: getHandler,
57
+ handler: getHandler(onRequest),
54
58
  options: {
55
59
  ...getRouteOptions,
56
60
  validate: {
@@ -65,7 +69,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
65
69
  }, {
66
70
  method: 'post',
67
71
  path: '/{slug}/{path}/{itemId}/confirm-delete',
68
- handler: postHandler,
72
+ handler: postHandler(onRequest),
69
73
  options: {
70
74
  ...postRouteOptions,
71
75
  validate: {
@@ -84,7 +88,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
84
88
  }, {
85
89
  method: 'post',
86
90
  path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
87
- handler: postHandler,
91
+ handler: postHandler(onRequest),
88
92
  options: {
89
93
  ...postRouteOptions,
90
94
  validate: {
@@ -1 +1 @@
1
- {"version":3,"file":"item-delete.js","names":["slugSchema","Boom","Joi","FileUploadPageController","RepeatPageController","redirectOrMakeHandler","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","getHandler","request","h","params","page","context","notFound","path","makeGetItemDeleteRouteHandler","postHandler","isForceAccess","makePostItemDeleteRouteHandler","getRoutes","getRouteOptions","postRouteOptions","method","handler","options","validate","object","keys","slug","itemId","state","payload","crumb","action","confirm","required"],"sources":["../../../../../../src/server/plugins/engine/routes/repeaters/item-delete.ts"],"sourcesContent":["import { slugSchema } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type RouteOptions, type ServerRoute } from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n confirmSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\n\n// Item delete GET route\nfunction getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n if (\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makeGetItemDeleteRouteHandler()(request, context, h)\n })\n}\n\nfunction postHandler(request: FormRequestPayload, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n const { isForceAccess } = context\n\n if (\n isForceAccess ||\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makePostItemDeleteRouteHandler()(request, context, h)\n })\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n },\n\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"item-delete.js","names":["slugSchema","Boom","Joi","FileUploadPageController","RepeatPageController","redirectOrMakeHandler","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","getHandler","onRequest","request","h","params","page","context","notFound","path","makeGetItemDeleteRouteHandler","postHandler","isForceAccess","makePostItemDeleteRouteHandler","getRoutes","getRouteOptions","postRouteOptions","method","handler","options","validate","object","keys","slug","itemId","state","payload","crumb","action","confirm","required"],"sources":["../../../../../../src/server/plugins/engine/routes/repeaters/item-delete.ts"],"sourcesContent":["import { slugSchema } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type RouteOptions, type ServerRoute } from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n confirmSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\n\n// Item delete GET route\nfunction getHandler(onRequest?: OnRequestCallback) {\n return async function (request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, onRequest, (page, context) => {\n if (\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makeGetItemDeleteRouteHandler()(request, context, h)\n })\n }\n}\n\nfunction postHandler(onRequest?: OnRequestCallback) {\n return async function (request: FormRequestPayload, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, onRequest, (page, context) => {\n const { isForceAccess } = context\n\n if (\n isForceAccess ||\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makePostItemDeleteRouteHandler()(request, context, h)\n })\n }\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler(onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler(onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler(onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n },\n\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler(onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
1
  import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
2
+ import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js';
2
3
  import { type FormRequestPayloadRefs, type FormRequestRefs } from '~/src/server/routes/types.js';
3
- export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
4
+ export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
@@ -5,36 +5,40 @@ import Joi from 'joi';
5
5
  import { RepeatPageController } from "../../pageControllers/RepeatPageController.js";
6
6
  import { redirectOrMakeHandler } from "../index.js";
7
7
  import { actionSchema, crumbSchema, pathSchema, stateSchema } from "../../../../schemas/index.js";
8
- function getHandler(request, h) {
9
- const {
10
- params
11
- } = request;
12
- return redirectOrMakeHandler(request, h, (page, context) => {
13
- if (!(page instanceof RepeatPageController)) {
14
- throw Boom.notFound(`No repeater page found for /${params.path}`);
15
- }
16
- return page.makeGetListSummaryRouteHandler()(request, context, h);
17
- });
8
+ function getHandler(onRequest) {
9
+ return async function (request, h) {
10
+ const {
11
+ params
12
+ } = request;
13
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
14
+ if (!(page instanceof RepeatPageController)) {
15
+ throw Boom.notFound(`No repeater page found for /${params.path}`);
16
+ }
17
+ return page.makeGetListSummaryRouteHandler()(request, context, h);
18
+ });
19
+ };
18
20
  }
19
- function postHandler(request, h) {
20
- const {
21
- params
22
- } = request;
23
- return redirectOrMakeHandler(request, h, (page, context) => {
21
+ function postHandler(onRequest) {
22
+ return async function (request, h) {
24
23
  const {
25
- isForceAccess
26
- } = context;
27
- if (isForceAccess || !(page instanceof RepeatPageController)) {
28
- throw Boom.notFound(`No repeater page found for /${params.path}`);
29
- }
30
- return page.makePostListSummaryRouteHandler()(request, context, h);
31
- });
24
+ params
25
+ } = request;
26
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
27
+ const {
28
+ isForceAccess
29
+ } = context;
30
+ if (isForceAccess || !(page instanceof RepeatPageController)) {
31
+ throw Boom.notFound(`No repeater page found for /${params.path}`);
32
+ }
33
+ return page.makePostListSummaryRouteHandler()(request, context, h);
34
+ });
35
+ };
32
36
  }
33
- export function getRoutes(getRouteOptions, postRouteOptions) {
37
+ export function getRoutes(getRouteOptions, postRouteOptions, onRequest) {
34
38
  return [{
35
39
  method: 'get',
36
40
  path: '/{slug}/{path}/summary',
37
- handler: getHandler,
41
+ handler: getHandler(onRequest),
38
42
  options: {
39
43
  ...getRouteOptions,
40
44
  validate: {
@@ -47,7 +51,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
47
51
  }, {
48
52
  method: 'get',
49
53
  path: '/preview/{state}/{slug}/{path}/summary',
50
- handler: getHandler,
54
+ handler: getHandler(onRequest),
51
55
  options: {
52
56
  ...getRouteOptions,
53
57
  validate: {
@@ -61,7 +65,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
61
65
  }, {
62
66
  method: 'post',
63
67
  path: '/{slug}/{path}/summary',
64
- handler: postHandler,
68
+ handler: postHandler(onRequest),
65
69
  options: {
66
70
  ...postRouteOptions,
67
71
  validate: {
@@ -78,7 +82,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
78
82
  }, {
79
83
  method: 'post',
80
84
  path: '/preview/{state}/{slug}/{path}/summary',
81
- handler: postHandler,
85
+ handler: postHandler(onRequest),
82
86
  options: {
83
87
  ...postRouteOptions,
84
88
  validate: {