@defra/forms-engine-plugin 0.1.25 → 0.1.27

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 (124) hide show
  1. package/.public/assets/images/govuk-crest.svg +1 -1
  2. package/.public/assets/rebrand/images/favicon.ico +0 -0
  3. package/.public/assets/rebrand/images/favicon.svg +1 -0
  4. package/.public/assets/rebrand/images/govuk-crest.svg +1 -0
  5. package/.public/assets/rebrand/images/govuk-icon-180.png +0 -0
  6. package/.public/assets/rebrand/images/govuk-icon-192.png +0 -0
  7. package/.public/assets/rebrand/images/govuk-icon-512.png +0 -0
  8. package/.public/assets/rebrand/images/govuk-icon-mask.svg +1 -0
  9. package/.public/assets/rebrand/images/govuk-opengraph-image.png +0 -0
  10. package/.public/assets/rebrand/manifest.json +39 -0
  11. package/.public/assets-manifest.json +12 -2
  12. package/.public/javascripts/application.min.js +1 -1
  13. package/.public/javascripts/application.min.js.LICENSE.txt +5 -1
  14. package/.public/javascripts/application.min.js.map +1 -1
  15. package/.public/javascripts/shared.min.js +3 -0
  16. package/.public/javascripts/shared.min.js.LICENSE.txt +62 -0
  17. package/.public/javascripts/shared.min.js.map +1 -0
  18. package/.public/stylesheets/application.min.css +3 -3
  19. package/.public/stylesheets/application.min.css.map +1 -1
  20. package/.server/client/javascripts/application.js +2 -67
  21. package/.server/client/javascripts/application.js.map +1 -1
  22. package/.server/client/javascripts/autocomplete.d.ts +1 -0
  23. package/.server/client/javascripts/autocomplete.js +49 -0
  24. package/.server/client/javascripts/autocomplete.js.map +1 -0
  25. package/.server/client/javascripts/file-upload.js +8 -1
  26. package/.server/client/javascripts/file-upload.js.map +1 -1
  27. package/.server/client/javascripts/govuk.d.ts +1 -0
  28. package/.server/client/javascripts/govuk.js +12 -0
  29. package/.server/client/javascripts/govuk.js.map +1 -0
  30. package/.server/client/javascripts/preview-close-link.d.ts +1 -0
  31. package/.server/client/javascripts/preview-close-link.js +12 -0
  32. package/.server/client/javascripts/preview-close-link.js.map +1 -0
  33. package/.server/client/javascripts/shared.d.ts +9 -0
  34. package/.server/client/javascripts/shared.js +15 -0
  35. package/.server/client/javascripts/shared.js.map +1 -0
  36. package/.server/client/stylesheets/_tag-env.scss +9 -0
  37. package/.server/config/index.d.ts +1 -0
  38. package/.server/config/index.js +9 -0
  39. package/.server/config/index.js.map +1 -1
  40. package/.server/index.js +6 -2
  41. package/.server/index.js.map +1 -1
  42. package/.server/server/common/helpers/logging/request-tracing.js +1 -1
  43. package/.server/server/common/helpers/logging/request-tracing.js.map +1 -1
  44. package/.server/server/common/helpers/redis-client.js +5 -3
  45. package/.server/server/common/helpers/redis-client.js.map +1 -1
  46. package/.server/server/constants.d.ts +0 -1
  47. package/.server/server/constants.js +0 -1
  48. package/.server/server/constants.js.map +1 -1
  49. package/.server/server/index.js +3 -1
  50. package/.server/server/index.js.map +1 -1
  51. package/.server/server/plugins/engine/components/DatePartsField.d.ts +1 -6
  52. package/.server/server/plugins/engine/components/DatePartsField.js +2 -1
  53. package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
  54. package/.server/server/plugins/engine/components/MonthYearField.d.ts +1 -5
  55. package/.server/server/plugins/engine/components/MonthYearField.js +3 -2
  56. package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
  57. package/.server/server/plugins/engine/components/YesNoField.js +2 -1
  58. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  59. package/.server/server/plugins/engine/components/types.d.ts +9 -0
  60. package/.server/server/plugins/engine/components/types.js.map +1 -1
  61. package/.server/server/plugins/engine/date-helper.d.ts +12 -0
  62. package/.server/server/plugins/engine/date-helper.js +21 -0
  63. package/.server/server/plugins/engine/date-helper.js.map +1 -0
  64. package/.server/server/plugins/engine/helpers.js +4 -3
  65. package/.server/server/plugins/engine/helpers.js.map +1 -1
  66. package/.server/server/plugins/engine/index.d.ts +0 -1
  67. package/.server/server/plugins/engine/index.js +0 -1
  68. package/.server/server/plugins/engine/index.js.map +1 -1
  69. package/.server/server/plugins/engine/models/FormModel.d.ts +13 -6
  70. package/.server/server/plugins/engine/models/FormModel.js +51 -18
  71. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  72. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  73. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +3 -2
  74. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  75. package/.server/server/plugins/engine/plugin.js +6 -5
  76. package/.server/server/plugins/engine/plugin.js.map +1 -1
  77. package/.server/server/plugins/engine/services/notifyService.js +3 -1
  78. package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
  79. package/.server/server/plugins/engine/views/components/tag-env/template.njk +6 -2
  80. package/.server/server/plugins/engine/views/file-upload.html +0 -13
  81. package/.server/server/plugins/errorPages.js +1 -1
  82. package/.server/server/plugins/errorPages.js.map +1 -1
  83. package/.server/server/plugins/nunjucks/context.js +1 -1
  84. package/.server/server/plugins/nunjucks/context.js.map +1 -1
  85. package/.server/server/plugins/nunjucks/environment.js +1 -0
  86. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  87. package/package.json +21 -25
  88. package/src/client/javascripts/application.js +2 -86
  89. package/src/client/javascripts/autocomplete.js +57 -0
  90. package/src/client/javascripts/file-upload.js +9 -1
  91. package/src/client/javascripts/govuk.js +22 -0
  92. package/src/client/javascripts/preview-close-link.js +12 -0
  93. package/src/client/javascripts/shared.js +16 -0
  94. package/src/client/stylesheets/_tag-env.scss +9 -0
  95. package/src/config/index.ts +10 -0
  96. package/src/index.ts +7 -2
  97. package/src/server/common/helpers/logging/request-tracing.js +1 -1
  98. package/src/server/common/helpers/redis-client.js +5 -3
  99. package/src/server/constants.js +0 -1
  100. package/src/server/index.ts +5 -2
  101. package/src/server/plugins/engine/components/DatePartsField.test.ts +17 -0
  102. package/src/server/plugins/engine/components/DatePartsField.ts +7 -8
  103. package/src/server/plugins/engine/components/MonthYearField.test.ts +15 -0
  104. package/src/server/plugins/engine/components/MonthYearField.ts +12 -8
  105. package/src/server/plugins/engine/components/YesNoField.ts +16 -2
  106. package/src/server/plugins/engine/components/types.ts +11 -0
  107. package/src/server/plugins/engine/date-helper.test.ts +47 -0
  108. package/src/server/plugins/engine/date-helper.ts +32 -0
  109. package/src/server/plugins/engine/helpers.ts +9 -2
  110. package/src/server/plugins/engine/index.ts +0 -1
  111. package/src/server/plugins/engine/models/FormModel.test.ts +163 -1
  112. package/src/server/plugins/engine/models/FormModel.ts +90 -23
  113. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +4 -2
  114. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +2 -1
  115. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +6 -2
  116. package/src/server/plugins/engine/plugin.ts +11 -7
  117. package/src/server/plugins/engine/services/notifyService.ts +6 -2
  118. package/src/server/plugins/engine/views/components/tag-env/template.njk +6 -2
  119. package/src/server/plugins/engine/views/file-upload.html +0 -13
  120. package/src/server/plugins/errorPages.ts +5 -1
  121. package/src/server/plugins/nunjucks/context.js +3 -1
  122. package/src/server/plugins/nunjucks/environment.js +1 -0
  123. package/.public/javascripts/file-upload.min.js +0 -2
  124. package/.public/javascripts/file-upload.min.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":["existsSync","dirname","join","fileURLToPath","hasFormComponents","slugSchema","Boom","vision","isEqual","Joi","nunjucks","resolvePkg","PREVIEW_PATH_PREFIX","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","normalisePath","proceed","redirectPath","VIEW_PATH","context","prepareNunjucksEnvironment","FormModel","SummaryViewModel","format","FileUploadPageController","RepeatPageController","getFormSubmissionData","generateUniqueReference","defaultServices","getUploadStatus","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","CacheService","findPackageRoot","currentFileName","import","meta","url","currentDirectoryName","dir","Error","plugin","name","dependencies","multiple","register","server","options","prefix","realm","modifiers","route","model","services","controllers","cacheName","filters","nunjucksOptions","viewContext","formsService","cacheService","packageRoot","govukFrontendPath","sync","viewPathResolved","paths","engines","html","compile","path","compileOptions","template","environment","render","prepare","next","configure","expose","baseLayoutPath","app","itemCache","Map","models","loadFormPreHandler","request","h","continue","params","slug","isPreview","state","formState","metadata","getFormMetadata","id","notFound","key","item","get","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","set","dispatchHandler","servicePath","redirectOrMakeHandler","makeHandler","page","getState","$$__referenceNumber","def","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","flash","getFlash","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","startsWith","isForceAccess","redirectTo","length","query","returnUrl","getHref","getHandler","events","onLoad","type","viewModel","items","details","payload","undefined","response","postJson","Object","assign","data","makeGetRouteHandler","postHandler","pageDef","href","makePostRouteHandler","dispatchRouteOptions","pre","method","handler","validate","object","keys","getRouteOptions","itemId","optional","postRouteOptions","parse","crumb","action","unknown","required","getListSummaryHandler","makeGetListSummaryRouteHandler","postListSummaryHandler","makePostListSummaryRouteHandler","getItemDeleteHandler","makeGetItemDeleteRouteHandler","postItemDeleteHandler","makePostItemDeleteRouteHandler","confirm","uploadId","status","error","code","plugins","string","guid"],"sources":["../../../../src/server/plugins/engine/plugin.ts"],"sourcesContent":["import { existsSync } from 'fs'\nimport { dirname, join } from 'path'\nimport { fileURLToPath } from 'url'\n\nimport { hasFormComponents, slugSchema } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type Plugin,\n type PluginProperties,\n type ResponseObject,\n type ResponseToolkit,\n type RouteOptions,\n type Server\n} from '@hapi/hapi'\nimport vision from '@hapi/vision'\nimport { isEqual } from 'date-fns'\nimport Joi from 'joi'\nimport nunjucks, { type Environment } from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n VIEW_PATH,\n context,\n prepareNunjucksEnvironment\n} from '~/src/server/plugins/engine/index.js'\nimport {\n FormModel,\n SummaryViewModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport { getUploadStatus } from '~/src/server/plugins/engine/services/uploadService.js'\nimport {\n type FilterFunction,\n type FormContext\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs\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'\nimport * as httpService from '~/src/server/services/httpService.js'\nimport { CacheService } from '~/src/server/services/index.js'\nimport { type Services } from '~/src/server/types.js'\n\nexport function findPackageRoot() {\n const currentFileName = fileURLToPath(import.meta.url)\n const currentDirectoryName = dirname(currentFileName)\n\n let dir = currentDirectoryName\n while (dir !== '/') {\n if (existsSync(join(dir, 'package.json'))) {\n return dir\n }\n dir = dirname(dir)\n }\n\n throw new Error('package.json not found in parent directories')\n}\nexport interface PluginOptions {\n model?: FormModel\n services?: Services\n controllers?: Record<string, typeof PageController>\n cacheName?: string\n filters?: Record<string, FilterFunction>\n pluginPath?: string\n nunjucks: {\n baseLayoutPath: string\n paths: string[]\n }\n viewContext: PluginProperties['forms-engine-plugin']['viewContext']\n}\n\nexport const plugin = {\n name: '@defra/forms-engine-plugin',\n dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],\n multiple: true,\n async register(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n const {\n model,\n services = defaultServices,\n controllers,\n cacheName,\n filters,\n nunjucks: nunjucksOptions,\n viewContext\n } = options\n const { formsService } = services\n const cacheService = new CacheService(server, cacheName)\n\n const packageRoot = findPackageRoot()\n const govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n )\n\n const viewPathResolved = join(packageRoot, VIEW_PATH)\n\n const paths = [\n ...nunjucksOptions.paths,\n viewPathResolved,\n join(govukFrontendPath, 'dist')\n ]\n\n await server.register({\n plugin: vision,\n options: {\n engines: {\n html: {\n compile: (\n path: string,\n compileOptions: { environment: Environment }\n ) => {\n const template = nunjucks.compile(\n path,\n compileOptions.environment\n )\n\n return (context: object | undefined) => {\n return template.render(context)\n }\n },\n prepare: (\n options: EngineConfigurationObject,\n next: (err?: Error) => void\n ) => {\n // Nunjucks also needs an additional path configuration\n // to use the templates and macros from `govuk-frontend`\n const environment = nunjucks.configure(paths)\n\n // Applies custom filters and globals for nunjucks\n // that are required by the `forms-engine-plugin`\n prepareNunjucksEnvironment(environment, filters)\n\n options.compileOptions.environment = environment\n\n next()\n }\n }\n },\n path: paths,\n // Provides global context used with all templates\n context\n }\n })\n\n server.expose('baseLayoutPath', nunjucksOptions.baseLayoutPath)\n server.expose('viewContext', viewContext)\n server.expose('cacheService', cacheService)\n\n server.app.model = model\n\n // In-memory cache of FormModel items, exposed\n // (for testing purposes) through `server.app.models`\n const itemCache = new Map<string, { model: FormModel; updatedAt: Date }>()\n server.app.models = itemCache\n\n const loadFormPreHandler = async (\n request: FormRequest | FormRequestPayload,\n h: Pick<ResponseToolkit, 'continue'>\n ) => {\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 = itemCache.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(\n `Getting form definition ${id} (${slug}) ${formState}`\n )\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 =\n 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 // Construct the form model\n const model = new FormModel(\n definition,\n { basePath },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n itemCache.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 const dispatchHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n }\n\n const redirectOrMakeHandler = async (\n request: FormRequest | FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>,\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\n const getHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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 const { options } = events.onLoad\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(\n viewModel.context,\n viewModel.details\n )\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(items, model, undefined, undefined)\n\n const { payload: response } = await httpService.postJson(url, {\n payload\n })\n\n Object.assign(context.data, response)\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n })\n }\n\n const postHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { query } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\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 return page.makePostRouteHandler()(request, context, h)\n })\n }\n\n const dispatchRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method: loadFormPreHandler\n }\n ]\n }\n\n server.route({\n method: 'get',\n path: '/{slug}',\n handler: dispatchHandler,\n options: {\n ...dispatchRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n })\n\n server.route({\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...dispatchRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n })\n\n const getRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method: loadFormPreHandler\n }\n ]\n }\n\n server.route({\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: getHandler,\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 server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\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.optional()\n })\n }\n }\n })\n\n const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {\n payload: {\n parse: true\n },\n pre: [{ method: loadFormPreHandler }]\n }\n\n server.route({\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: postHandler,\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 server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\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.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 * \"AddAnother\" repeat routes\n */\n\n // List summary GET route\n const getListSummaryHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n if (!(page instanceof RepeatPageController)) {\n throw Boom.notFound(`No repeater page found for /${params.path}`)\n }\n\n return page.makeGetListSummaryRouteHandler()(request, context, h)\n })\n }\n\n server.route({\n method: 'get',\n path: '/{slug}/{path}/summary',\n handler: getListSummaryHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema\n })\n }\n }\n })\n\n server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/summary',\n handler: getListSummaryHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema\n })\n }\n }\n })\n\n // List summary POST route\n const postListSummaryHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n const { isForceAccess } = context\n\n if (isForceAccess || !(page instanceof RepeatPageController)) {\n throw Boom.notFound(`No repeater page found for /${params.path}`)\n }\n\n return page.makePostListSummaryRouteHandler()(request, context, h)\n })\n }\n\n server.route({\n method: 'post',\n path: '/{slug}/{path}/summary',\n handler: postListSummaryHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .required()\n }\n }\n })\n\n server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/summary',\n handler: postListSummaryHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .required()\n }\n }\n })\n\n // Item delete GET route\n const getItemDeleteHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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\n server.route({\n method: 'get',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: getItemDeleteHandler,\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 server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: getItemDeleteHandler,\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 // Item delete POST route\n const postItemDeleteHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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\n server.route({\n method: 'post',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: postItemDeleteHandler,\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 server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: postItemDeleteHandler,\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 server.route({\n method: 'get',\n path: '/upload-status/{uploadId}',\n handler: async (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'response'>\n ) => {\n try {\n const { uploadId } = request.params as unknown as {\n uploadId: string\n }\n const status = await getUploadStatus(uploadId)\n\n if (!status) {\n return h.response({ error: 'Status check failed' }).code(400)\n }\n\n return h.response(status)\n } catch (error) {\n request.logger.error(\n ['upload-status'],\n 'Upload status check failed',\n error\n )\n return h.response({ error: 'Status check error' }).code(500)\n }\n },\n options: {\n plugins: {\n crumb: false\n },\n validate: {\n params: Joi.object().keys({\n uploadId: Joi.string().guid().required()\n })\n }\n }\n })\n }\n} satisfies Plugin<PluginOptions>\n\ninterface CompileOptions {\n environment: Environment\n}\n\nexport interface EngineConfigurationObject {\n compileOptions: CompileOptions\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"plugin.js","names":["existsSync","dirname","join","fileURLToPath","getErrorMessage","hasFormComponents","slugSchema","Boom","vision","isEqual","Joi","nunjucks","resolvePkg","PREVIEW_PATH_PREFIX","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","normalisePath","proceed","redirectPath","VIEW_PATH","context","prepareNunjucksEnvironment","FormModel","SummaryViewModel","format","FileUploadPageController","RepeatPageController","getFormSubmissionData","generateUniqueReference","defaultServices","getUploadStatus","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","CacheService","findPackageRoot","currentFileName","import","meta","url","currentDirectoryName","dir","Error","plugin","name","dependencies","multiple","register","server","options","prefix","realm","modifiers","route","model","services","controllers","cacheName","filters","nunjucksOptions","viewContext","formsService","cacheService","packageRoot","govukFrontendPath","sync","viewPathResolved","paths","engines","html","compile","path","compileOptions","template","environment","render","prepare","next","configure","expose","baseLayoutPath","app","itemCache","Map","models","loadFormPreHandler","request","h","continue","params","slug","isPreview","state","formState","metadata","getFormMetadata","id","notFound","key","item","get","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","set","dispatchHandler","servicePath","redirectOrMakeHandler","makeHandler","page","getState","$$__referenceNumber","def","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","flash","getFlash","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","startsWith","isForceAccess","redirectTo","length","query","returnUrl","getHref","getHandler","events","onLoad","type","viewModel","items","details","payload","undefined","response","postJson","Object","assign","data","makeGetRouteHandler","postHandler","pageDef","href","makePostRouteHandler","dispatchRouteOptions","pre","method","handler","validate","object","keys","getRouteOptions","itemId","optional","postRouteOptions","parse","crumb","action","unknown","required","getListSummaryHandler","makeGetListSummaryRouteHandler","postListSummaryHandler","makePostListSummaryRouteHandler","getItemDeleteHandler","makeGetItemDeleteRouteHandler","postItemDeleteHandler","makePostItemDeleteRouteHandler","confirm","uploadId","status","error","code","errMsg","plugins","string","guid"],"sources":["../../../../src/server/plugins/engine/plugin.ts"],"sourcesContent":["import { existsSync } from 'fs'\nimport { dirname, join } from 'path'\nimport { fileURLToPath } from 'url'\n\nimport {\n getErrorMessage,\n hasFormComponents,\n slugSchema\n} from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type Plugin,\n type PluginProperties,\n type ResponseObject,\n type ResponseToolkit,\n type RouteOptions,\n type Server\n} from '@hapi/hapi'\nimport vision from '@hapi/vision'\nimport { isEqual } from 'date-fns'\nimport Joi from 'joi'\nimport nunjucks, { type Environment } from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n VIEW_PATH,\n context,\n prepareNunjucksEnvironment\n} from '~/src/server/plugins/engine/index.js'\nimport {\n FormModel,\n SummaryViewModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport { getUploadStatus } from '~/src/server/plugins/engine/services/uploadService.js'\nimport {\n type FilterFunction,\n type FormContext\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs\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'\nimport * as httpService from '~/src/server/services/httpService.js'\nimport { CacheService } from '~/src/server/services/index.js'\nimport { type Services } from '~/src/server/types.js'\n\nexport function findPackageRoot() {\n const currentFileName = fileURLToPath(import.meta.url)\n const currentDirectoryName = dirname(currentFileName)\n\n let dir = currentDirectoryName\n while (dir !== '/') {\n if (existsSync(join(dir, 'package.json'))) {\n return dir\n }\n dir = dirname(dir)\n }\n\n throw new Error('package.json not found in parent directories')\n}\nexport interface PluginOptions {\n model?: FormModel\n services?: Services\n controllers?: Record<string, typeof PageController>\n cacheName?: string\n filters?: Record<string, FilterFunction>\n pluginPath?: string\n nunjucks: {\n baseLayoutPath: string\n paths: string[]\n }\n viewContext: PluginProperties['forms-engine-plugin']['viewContext']\n}\n\nexport const plugin = {\n name: '@defra/forms-engine-plugin',\n dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],\n multiple: true,\n async register(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n const {\n model,\n services = defaultServices,\n controllers,\n cacheName,\n filters,\n nunjucks: nunjucksOptions,\n viewContext\n } = options\n const { formsService } = services\n const cacheService = new CacheService(server, cacheName)\n\n const packageRoot = findPackageRoot()\n const govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n )\n\n const viewPathResolved = join(packageRoot, VIEW_PATH)\n\n const paths = [\n ...nunjucksOptions.paths,\n viewPathResolved,\n join(govukFrontendPath, 'dist')\n ]\n\n await server.register({\n plugin: vision,\n options: {\n engines: {\n html: {\n compile: (\n path: string,\n compileOptions: { environment: Environment }\n ) => {\n const template = nunjucks.compile(\n path,\n compileOptions.environment\n )\n\n return (context: object | undefined) => {\n return template.render(context)\n }\n },\n prepare: (\n options: EngineConfigurationObject,\n next: (err?: Error) => void\n ) => {\n // Nunjucks also needs an additional path configuration\n // to use the templates and macros from `govuk-frontend`\n const environment = nunjucks.configure(paths)\n\n // Applies custom filters and globals for nunjucks\n // that are required by the `forms-engine-plugin`\n prepareNunjucksEnvironment(environment, filters)\n\n options.compileOptions.environment = environment\n\n next()\n }\n }\n },\n path: paths,\n // Provides global context used with all templates\n context\n }\n })\n\n server.expose('baseLayoutPath', nunjucksOptions.baseLayoutPath)\n server.expose('viewContext', viewContext)\n server.expose('cacheService', cacheService)\n\n server.app.model = model\n\n // In-memory cache of FormModel items, exposed\n // (for testing purposes) through `server.app.models`\n const itemCache = new Map<string, { model: FormModel; updatedAt: Date }>()\n server.app.models = itemCache\n\n const loadFormPreHandler = async (\n request: FormRequest | FormRequestPayload,\n h: Pick<ResponseToolkit, 'continue'>\n ) => {\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 = itemCache.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(\n `Getting form definition ${id} (${slug}) ${formState}`\n )\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 =\n 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 // Construct the form model\n const model = new FormModel(\n definition,\n { basePath },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n itemCache.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 const dispatchHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n }\n\n const redirectOrMakeHandler = async (\n request: FormRequest | FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>,\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\n const getHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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 const { options } = events.onLoad\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(\n viewModel.context,\n viewModel.details\n )\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(items, model, undefined, undefined)\n\n const { payload: response } = await httpService.postJson(url, {\n payload\n })\n\n Object.assign(context.data, response)\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n })\n }\n\n const postHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { query } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\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 return page.makePostRouteHandler()(request, context, h)\n })\n }\n\n const dispatchRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method: loadFormPreHandler\n }\n ]\n }\n\n server.route({\n method: 'get',\n path: '/{slug}',\n handler: dispatchHandler,\n options: {\n ...dispatchRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n })\n\n server.route({\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...dispatchRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n })\n\n const getRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method: loadFormPreHandler\n }\n ]\n }\n\n server.route({\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: getHandler,\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 server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\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.optional()\n })\n }\n }\n })\n\n const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {\n payload: {\n parse: true\n },\n pre: [{ method: loadFormPreHandler }]\n }\n\n server.route({\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: postHandler,\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 server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\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.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 * \"AddAnother\" repeat routes\n */\n\n // List summary GET route\n const getListSummaryHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n if (!(page instanceof RepeatPageController)) {\n throw Boom.notFound(`No repeater page found for /${params.path}`)\n }\n\n return page.makeGetListSummaryRouteHandler()(request, context, h)\n })\n }\n\n server.route({\n method: 'get',\n path: '/{slug}/{path}/summary',\n handler: getListSummaryHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema\n })\n }\n }\n })\n\n server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/summary',\n handler: getListSummaryHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema\n })\n }\n }\n })\n\n // List summary POST route\n const postListSummaryHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, (page, context) => {\n const { isForceAccess } = context\n\n if (isForceAccess || !(page instanceof RepeatPageController)) {\n throw Boom.notFound(`No repeater page found for /${params.path}`)\n }\n\n return page.makePostListSummaryRouteHandler()(request, context, h)\n })\n }\n\n server.route({\n method: 'post',\n path: '/{slug}/{path}/summary',\n handler: postListSummaryHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .required()\n }\n }\n })\n\n server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/summary',\n handler: postListSummaryHandler,\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .required()\n }\n }\n })\n\n // Item delete GET route\n const getItemDeleteHandler = (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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\n server.route({\n method: 'get',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: getItemDeleteHandler,\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 server.route({\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: getItemDeleteHandler,\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 // Item delete POST route\n const postItemDeleteHandler = (\n request: FormRequestPayload,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\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\n server.route({\n method: 'post',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: postItemDeleteHandler,\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 server.route({\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: postItemDeleteHandler,\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 server.route({\n method: 'get',\n path: '/upload-status/{uploadId}',\n handler: async (\n request: FormRequest,\n h: Pick<ResponseToolkit, 'response'>\n ) => {\n const { uploadId } = request.params as unknown as {\n uploadId: string\n }\n try {\n const status = await getUploadStatus(uploadId)\n\n if (!status) {\n return h.response({ error: 'Status check failed' }).code(400)\n }\n\n return h.response(status)\n } catch (error) {\n const errMsg = getErrorMessage(error)\n request.logger.error(\n errMsg,\n `[uploadStatusFailed] Upload status check failed for uploadId: ${uploadId} - ${errMsg}`\n )\n return h.response({ error: 'Status check error' }).code(500)\n }\n },\n options: {\n plugins: {\n crumb: false\n },\n validate: {\n params: Joi.object().keys({\n uploadId: Joi.string().guid().required()\n })\n }\n }\n })\n }\n} satisfies Plugin<PluginOptions>\n\ninterface CompileOptions {\n environment: Environment\n}\n\nexport interface EngineConfigurationObject {\n compileOptions: CompileOptions\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ import { getErrorMessage } from '@defra/forms-model';
1
2
  import { config } from "../../../../config/index.js";
2
3
  import { escapeMarkdown } from "../components/helpers.js";
3
4
  import { checkFormStatus } from "../helpers.js";
@@ -35,7 +36,8 @@ export async function submit(request, model, emailAddress, items, submitResponse
35
36
  });
36
37
  request.logger.info(logTags, 'Email sent successfully');
37
38
  } catch (err) {
38
- request.logger.error(logTags, 'Error sending email', err);
39
+ const errMsg = getErrorMessage(err);
40
+ request.logger.error(errMsg, `[emailSendFailed] Error sending notification email - templateId: ${templateId} - recipient: ${emailAddress} - ${errMsg}`);
39
41
  throw err;
40
42
  }
41
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notifyService.js","names":["config","escapeMarkdown","checkFormStatus","getFormatter","sendNotification","templateId","get","submit","request","model","emailAddress","items","submitResponse","logTags","formStatus","params","logger","info","formName","name","subject","isPreview","outputAudience","def","output","audience","outputVersion","version","outputFormatter","body","Buffer","from","toString","personalisation","err","error"],"sources":["../../../../../src/server/plugins/engine/services/notifyService.ts"],"sourcesContent":["import { type SubmitResponsePayload } from '@defra/forms-model'\n\nimport { config } from '~/src/config/index.js'\nimport { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'\nimport { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { getFormatter } from '~/src/server/plugins/engine/outputFormatters/index.js'\nimport { type FormRequestPayload } from '~/src/server/routes/types.js'\nimport { sendNotification } from '~/src/server/utils/notify.js'\n\nconst templateId = config.get('notifyTemplateId')\n\nexport async function submit(\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload\n) {\n const logTags = ['submit', 'email']\n const formStatus = checkFormStatus(request.params)\n\n // Get submission email personalisation\n request.logger.info(logTags, 'Getting personalisation data')\n\n const formName = escapeMarkdown(model.name)\n const subject = formStatus.isPreview\n ? `TEST FORM SUBMISSION: ${formName}`\n : `Form submission: ${formName}`\n\n const outputAudience = model.def.output?.audience ?? 'human'\n const outputVersion = model.def.output?.version ?? '1'\n\n const outputFormatter = getFormatter(outputAudience, outputVersion)\n let body = outputFormatter(items, model, submitResponse, formStatus)\n\n // GOV.UK Notify transforms quotes into curly quotes, so we can't just send the raw payload\n // This is logic specific to Notify, so we include the logic here rather than in the formatter\n if (outputAudience === 'machine') {\n body = Buffer.from(body).toString('base64')\n }\n\n request.logger.info(logTags, 'Sending email')\n\n try {\n // Send submission email\n await sendNotification({\n templateId,\n emailAddress,\n personalisation: {\n subject,\n body\n }\n })\n\n request.logger.info(logTags, 'Email sent successfully')\n } catch (err) {\n request.logger.error(logTags, 'Error sending email', err)\n\n throw err\n }\n}\n"],"mappings":"AAEA,SAASA,MAAM;AACf,SAASC,cAAc;AACvB,SAASC,eAAe;AAGxB,SAASC,YAAY;AAErB,SAASC,gBAAgB;AAEzB,MAAMC,UAAU,GAAGL,MAAM,CAACM,GAAG,CAAC,kBAAkB,CAAC;AAEjD,OAAO,eAAeC,MAAMA,CAC1BC,OAA2B,EAC3BC,KAAgB,EAChBC,YAAoB,EACpBC,KAAmB,EACnBC,cAAqC,EACrC;EACA,MAAMC,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;EACnC,MAAMC,UAAU,GAAGZ,eAAe,CAACM,OAAO,CAACO,MAAM,CAAC;;EAElD;EACAP,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,8BAA8B,CAAC;EAE5D,MAAMK,QAAQ,GAAGjB,cAAc,CAACQ,KAAK,CAACU,IAAI,CAAC;EAC3C,MAAMC,OAAO,GAAGN,UAAU,CAACO,SAAS,GAChC,yBAAyBH,QAAQ,EAAE,GACnC,oBAAoBA,QAAQ,EAAE;EAElC,MAAMI,cAAc,GAAGb,KAAK,CAACc,GAAG,CAACC,MAAM,EAAEC,QAAQ,IAAI,OAAO;EAC5D,MAAMC,aAAa,GAAGjB,KAAK,CAACc,GAAG,CAACC,MAAM,EAAEG,OAAO,IAAI,GAAG;EAEtD,MAAMC,eAAe,GAAGzB,YAAY,CAACmB,cAAc,EAAEI,aAAa,CAAC;EACnE,IAAIG,IAAI,GAAGD,eAAe,CAACjB,KAAK,EAAEF,KAAK,EAAEG,cAAc,EAAEE,UAAU,CAAC;;EAEpE;EACA;EACA,IAAIQ,cAAc,KAAK,SAAS,EAAE;IAChCO,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACF,IAAI,CAAC,CAACG,QAAQ,CAAC,QAAQ,CAAC;EAC7C;EAEAxB,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,eAAe,CAAC;EAE7C,IAAI;IACF;IACA,MAAMT,gBAAgB,CAAC;MACrBC,UAAU;MACVK,YAAY;MACZuB,eAAe,EAAE;QACfb,OAAO;QACPS;MACF;IACF,CAAC,CAAC;IAEFrB,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,yBAAyB,CAAC;EACzD,CAAC,CAAC,OAAOqB,GAAG,EAAE;IACZ1B,OAAO,CAACQ,MAAM,CAACmB,KAAK,CAACtB,OAAO,EAAE,qBAAqB,EAAEqB,GAAG,CAAC;IAEzD,MAAMA,GAAG;EACX;AACF","ignoreList":[]}
1
+ {"version":3,"file":"notifyService.js","names":["getErrorMessage","config","escapeMarkdown","checkFormStatus","getFormatter","sendNotification","templateId","get","submit","request","model","emailAddress","items","submitResponse","logTags","formStatus","params","logger","info","formName","name","subject","isPreview","outputAudience","def","output","audience","outputVersion","version","outputFormatter","body","Buffer","from","toString","personalisation","err","errMsg","error"],"sources":["../../../../../src/server/plugins/engine/services/notifyService.ts"],"sourcesContent":["import { getErrorMessage, type SubmitResponsePayload } from '@defra/forms-model'\n\nimport { config } from '~/src/config/index.js'\nimport { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'\nimport { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type DetailItem } from '~/src/server/plugins/engine/models/types.js'\nimport { getFormatter } from '~/src/server/plugins/engine/outputFormatters/index.js'\nimport { type FormRequestPayload } from '~/src/server/routes/types.js'\nimport { sendNotification } from '~/src/server/utils/notify.js'\n\nconst templateId = config.get('notifyTemplateId')\n\nexport async function submit(\n request: FormRequestPayload,\n model: FormModel,\n emailAddress: string,\n items: DetailItem[],\n submitResponse: SubmitResponsePayload\n) {\n const logTags = ['submit', 'email']\n const formStatus = checkFormStatus(request.params)\n\n // Get submission email personalisation\n request.logger.info(logTags, 'Getting personalisation data')\n\n const formName = escapeMarkdown(model.name)\n const subject = formStatus.isPreview\n ? `TEST FORM SUBMISSION: ${formName}`\n : `Form submission: ${formName}`\n\n const outputAudience = model.def.output?.audience ?? 'human'\n const outputVersion = model.def.output?.version ?? '1'\n\n const outputFormatter = getFormatter(outputAudience, outputVersion)\n let body = outputFormatter(items, model, submitResponse, formStatus)\n\n // GOV.UK Notify transforms quotes into curly quotes, so we can't just send the raw payload\n // This is logic specific to Notify, so we include the logic here rather than in the formatter\n if (outputAudience === 'machine') {\n body = Buffer.from(body).toString('base64')\n }\n\n request.logger.info(logTags, 'Sending email')\n\n try {\n // Send submission email\n await sendNotification({\n templateId,\n emailAddress,\n personalisation: {\n subject,\n body\n }\n })\n\n request.logger.info(logTags, 'Email sent successfully')\n } catch (err) {\n const errMsg = getErrorMessage(err)\n request.logger.error(\n errMsg,\n `[emailSendFailed] Error sending notification email - templateId: ${templateId} - recipient: ${emailAddress} - ${errMsg}`\n )\n\n throw err\n }\n}\n"],"mappings":"AAAA,SAASA,eAAe,QAAoC,oBAAoB;AAEhF,SAASC,MAAM;AACf,SAASC,cAAc;AACvB,SAASC,eAAe;AAGxB,SAASC,YAAY;AAErB,SAASC,gBAAgB;AAEzB,MAAMC,UAAU,GAAGL,MAAM,CAACM,GAAG,CAAC,kBAAkB,CAAC;AAEjD,OAAO,eAAeC,MAAMA,CAC1BC,OAA2B,EAC3BC,KAAgB,EAChBC,YAAoB,EACpBC,KAAmB,EACnBC,cAAqC,EACrC;EACA,MAAMC,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;EACnC,MAAMC,UAAU,GAAGZ,eAAe,CAACM,OAAO,CAACO,MAAM,CAAC;;EAElD;EACAP,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,8BAA8B,CAAC;EAE5D,MAAMK,QAAQ,GAAGjB,cAAc,CAACQ,KAAK,CAACU,IAAI,CAAC;EAC3C,MAAMC,OAAO,GAAGN,UAAU,CAACO,SAAS,GAChC,yBAAyBH,QAAQ,EAAE,GACnC,oBAAoBA,QAAQ,EAAE;EAElC,MAAMI,cAAc,GAAGb,KAAK,CAACc,GAAG,CAACC,MAAM,EAAEC,QAAQ,IAAI,OAAO;EAC5D,MAAMC,aAAa,GAAGjB,KAAK,CAACc,GAAG,CAACC,MAAM,EAAEG,OAAO,IAAI,GAAG;EAEtD,MAAMC,eAAe,GAAGzB,YAAY,CAACmB,cAAc,EAAEI,aAAa,CAAC;EACnE,IAAIG,IAAI,GAAGD,eAAe,CAACjB,KAAK,EAAEF,KAAK,EAAEG,cAAc,EAAEE,UAAU,CAAC;;EAEpE;EACA;EACA,IAAIQ,cAAc,KAAK,SAAS,EAAE;IAChCO,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACF,IAAI,CAAC,CAACG,QAAQ,CAAC,QAAQ,CAAC;EAC7C;EAEAxB,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,eAAe,CAAC;EAE7C,IAAI;IACF;IACA,MAAMT,gBAAgB,CAAC;MACrBC,UAAU;MACVK,YAAY;MACZuB,eAAe,EAAE;QACfb,OAAO;QACPS;MACF;IACF,CAAC,CAAC;IAEFrB,OAAO,CAACQ,MAAM,CAACC,IAAI,CAACJ,OAAO,EAAE,yBAAyB,CAAC;EACzD,CAAC,CAAC,OAAOqB,GAAG,EAAE;IACZ,MAAMC,MAAM,GAAGpC,eAAe,CAACmC,GAAG,CAAC;IACnC1B,OAAO,CAACQ,MAAM,CAACoB,KAAK,CAClBD,MAAM,EACN,oEAAoE9B,UAAU,iBAAiBK,YAAY,MAAMyB,MAAM,EACzH,CAAC;IAED,MAAMD,GAAG;EACX;AACF","ignoreList":[]}
@@ -1,5 +1,9 @@
1
1
  {%- from "govuk/components/tag/macro.njk" import govukTag -%}
2
-
2
+ {% if govukRebrand %}
3
+ {% set tagEnv = " app-tag--env app-tag--env-rebrand" %}
4
+ {% else %}
5
+ {% set tagEnv = " app-tag--env" %}
6
+ {% endif %}
3
7
  {%- switch params.env %}
4
8
  {% case "local" %}
5
9
  {% set text = "Local" %}
@@ -26,5 +30,5 @@
26
30
 
27
31
  {{ govukTag({
28
32
  text: text,
29
- classes: classes + " app-tag--env"
33
+ classes: classes + tagEnv
30
34
  }) }}
@@ -29,17 +29,4 @@
29
29
  {{ super() }}
30
30
 
31
31
  <div class="govuk-summary-list-container"></div>
32
-
33
- {% endblock %}
34
-
35
- {% block bodyEnd %}
36
- {{ super() }}
37
- <script type="module" nonce="{{ cspNonce }}">
38
- import { initFileUpload } from '{{ getDxtAssetPath("file-upload.js") }}';
39
- if (document.readyState === 'loading') {
40
- document.addEventListener('DOMContentLoaded', initFileUpload);
41
- } else {
42
- initFileUpload();
43
- }
44
- </script>
45
32
  {% endblock %}
@@ -16,7 +16,7 @@ export default {
16
16
  message: response.message,
17
17
  stack: response.stack
18
18
  };
19
- request.log('error', error);
19
+ request.logger.error(error, `[httpError] HTTP ${statusCode} error occurred - ${response.message} - path: ${request.path} - method: ${request.method}`);
20
20
  return h.response(error).code(statusCode);
21
21
  }
22
22
  return h.continue;
@@ -1 +1 @@
1
- {"version":3,"file":"errorPages.js","names":["plugin","name","register","server","ext","request","h","response","isBoom","statusCode","output","error","message","stack","log","code","continue"],"sources":["../../../src/server/plugins/errorPages.ts"],"sourcesContent":["import {\n type Request,\n type ResponseToolkit,\n type ServerRegisterPluginObject\n} from '@hapi/hapi'\n\n/*\n * Add an `onPreResponse` listener to return error pages\n */\nexport default {\n plugin: {\n name: 'error-pages',\n register(server) {\n server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {\n const response = request.response\n\n if ('isBoom' in response && response.isBoom) {\n // An error was raised during\n // processing the request\n const statusCode = response.output.statusCode\n\n const error = {\n statusCode,\n message: response.message,\n stack: response.stack\n }\n\n request.log('error', error)\n\n return h.response(error).code(statusCode)\n }\n return h.continue\n })\n }\n }\n} satisfies ServerRegisterPluginObject<void>\n"],"mappings":"AAMA;AACA;AACA;AACA,eAAe;EACbA,MAAM,EAAE;IACNC,IAAI,EAAE,aAAa;IACnBC,QAAQA,CAACC,MAAM,EAAE;MACfA,MAAM,CAACC,GAAG,CAAC,eAAe,EAAE,CAACC,OAAgB,EAAEC,CAAkB,KAAK;QACpE,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAQ;QAEjC,IAAI,QAAQ,IAAIA,QAAQ,IAAIA,QAAQ,CAACC,MAAM,EAAE;UAC3C;UACA;UACA,MAAMC,UAAU,GAAGF,QAAQ,CAACG,MAAM,CAACD,UAAU;UAE7C,MAAME,KAAK,GAAG;YACZF,UAAU;YACVG,OAAO,EAAEL,QAAQ,CAACK,OAAO;YACzBC,KAAK,EAAEN,QAAQ,CAACM;UAClB,CAAC;UAEDR,OAAO,CAACS,GAAG,CAAC,OAAO,EAAEH,KAAK,CAAC;UAE3B,OAAOL,CAAC,CAACC,QAAQ,CAACI,KAAK,CAAC,CAACI,IAAI,CAACN,UAAU,CAAC;QAC3C;QACA,OAAOH,CAAC,CAACU,QAAQ;MACnB,CAAC,CAAC;IACJ;EACF;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"errorPages.js","names":["plugin","name","register","server","ext","request","h","response","isBoom","statusCode","output","error","message","stack","logger","path","method","code","continue"],"sources":["../../../src/server/plugins/errorPages.ts"],"sourcesContent":["import {\n type Request,\n type ResponseToolkit,\n type ServerRegisterPluginObject\n} from '@hapi/hapi'\n\n/*\n * Add an `onPreResponse` listener to return error pages\n */\nexport default {\n plugin: {\n name: 'error-pages',\n register(server) {\n server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {\n const response = request.response\n\n if ('isBoom' in response && response.isBoom) {\n // An error was raised during\n // processing the request\n const statusCode = response.output.statusCode\n\n const error = {\n statusCode,\n message: response.message,\n stack: response.stack\n }\n\n request.logger.error(\n error,\n `[httpError] HTTP ${statusCode} error occurred - ${response.message} - path: ${request.path} - method: ${request.method}`\n )\n\n return h.response(error).code(statusCode)\n }\n\n return h.continue\n })\n }\n }\n} satisfies ServerRegisterPluginObject<void>\n"],"mappings":"AAMA;AACA;AACA;AACA,eAAe;EACbA,MAAM,EAAE;IACNC,IAAI,EAAE,aAAa;IACnBC,QAAQA,CAACC,MAAM,EAAE;MACfA,MAAM,CAACC,GAAG,CAAC,eAAe,EAAE,CAACC,OAAgB,EAAEC,CAAkB,KAAK;QACpE,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAQ;QAEjC,IAAI,QAAQ,IAAIA,QAAQ,IAAIA,QAAQ,CAACC,MAAM,EAAE;UAC3C;UACA;UACA,MAAMC,UAAU,GAAGF,QAAQ,CAACG,MAAM,CAACD,UAAU;UAE7C,MAAME,KAAK,GAAG;YACZF,UAAU;YACVG,OAAO,EAAEL,QAAQ,CAACK,OAAO;YACzBC,KAAK,EAAEN,QAAQ,CAACM;UAClB,CAAC;UAEDR,OAAO,CAACS,MAAM,CAACH,KAAK,CAClBA,KAAK,EACL,oBAAoBF,UAAU,qBAAqBF,QAAQ,CAACK,OAAO,YAAYP,OAAO,CAACU,IAAI,cAAcV,OAAO,CAACW,MAAM,EACzH,CAAC;UAED,OAAOV,CAAC,CAACC,QAAQ,CAACI,KAAK,CAAC,CAACM,IAAI,CAACR,UAAU,CAAC;QAC3C;QAEA,OAAOH,CAAC,CAACY,QAAQ;MACnB,CAAC,CAAC;IACJ;EACF;AACF,CAAC","ignoreList":[]}
@@ -63,7 +63,7 @@ export function devtoolContext(_request) {
63
63
  // eslint-disable-next-line -- Allow JSON type 'any'
64
64
  webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
65
65
  } catch {
66
- logger.error(`Webpack ${basename(manifestPath)} not found`);
66
+ logger.info(`[webpackManifestMissing] Webpack ${basename(manifestPath)} not found - running without asset manifest`);
67
67
  }
68
68
  }
69
69
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","config","createLogger","checkFormStatus","encodeUrl","safeGenerateCrumb","logger","webpackManifest","context","request","params","response","isPreview","isPreviewMode","state","formState","isResponseOK","isBoom","statusCode","OK","pluginStorage","server","plugins","consumerViewContext","Error","baseLayoutPath","viewContext","ctx","crumb","currentPath","path","url","search","previewMode","undefined","slug","devtoolContext","_request","manifestPath","get","JSON","parse","error","cdpEnvironment","designerUrl","feedbackLink","phaseTag","serviceName","serviceVersion","assetPath","getDxtAssetPath","asset"],"sources":["../../../../src/server/plugins/nunjucks/context.js"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { basename, join } from 'node:path'\n\nimport Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport {\n checkFormStatus,\n encodeUrl,\n safeGenerateCrumb\n} from '~/src/server/plugins/engine/helpers.js'\n\nconst logger = createLogger()\n\n/** @type {Record<string, string> | undefined} */\nlet webpackManifest\n\n/**\n * @param {FormRequest | FormRequestPayload | null} request\n */\nexport async function context(request) {\n const { params, response } = request ?? {}\n\n const { isPreview: isPreviewMode, state: formState } = checkFormStatus(params)\n\n // Only add the slug in to the context if the response is OK.\n // Footer meta links are not rendered when the slug is missing.\n const isResponseOK =\n !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK\n\n const pluginStorage = request?.server.plugins['forms-engine-plugin']\n\n let consumerViewContext = {}\n\n if (!pluginStorage) {\n throw Error('context called before plugin registered')\n }\n\n if (!pluginStorage.baseLayoutPath) {\n throw Error('Missing baseLayoutPath in plugin.options.nunjucks')\n }\n\n if (typeof pluginStorage.viewContext === 'function') {\n consumerViewContext = await pluginStorage.viewContext(request)\n }\n\n /** @type {ViewContext} */\n const ctx = {\n // take consumers props first so we can override it\n ...consumerViewContext,\n baseLayoutPath: pluginStorage.baseLayoutPath,\n crumb: safeGenerateCrumb(request),\n currentPath: `${request.path}${request.url.search}`,\n previewMode: isPreviewMode ? formState : undefined,\n slug: isResponseOK ? params?.slug : undefined\n }\n\n return ctx\n}\n\n/**\n * Returns the context for the devtool. Consumers won't have access to this.\n * @param {FormRequest | FormRequestPayload | null} _request\n * @returns {Record<string, unknown> & { assetPath: string, getDxtAssetPath: (asset: string) => string }}\n */\nexport function devtoolContext(_request) {\n const manifestPath = join(config.get('publicDir'), 'assets-manifest.json')\n\n if (!webpackManifest) {\n try {\n // eslint-disable-next-line -- Allow JSON type 'any'\n webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n logger.error(`Webpack ${basename(manifestPath)} not found`)\n }\n }\n\n return {\n config: {\n cdpEnvironment: config.get('cdpEnvironment'),\n designerUrl: config.get('designerUrl'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n phaseTag: config.get('phaseTag'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n },\n assetPath: '/assets',\n getDxtAssetPath: (asset = '') => {\n return `/${webpackManifest?.[asset] ?? asset}`\n }\n }\n}\n\n/**\n * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","config","createLogger","checkFormStatus","encodeUrl","safeGenerateCrumb","logger","webpackManifest","context","request","params","response","isPreview","isPreviewMode","state","formState","isResponseOK","isBoom","statusCode","OK","pluginStorage","server","plugins","consumerViewContext","Error","baseLayoutPath","viewContext","ctx","crumb","currentPath","path","url","search","previewMode","undefined","slug","devtoolContext","_request","manifestPath","get","JSON","parse","info","cdpEnvironment","designerUrl","feedbackLink","phaseTag","serviceName","serviceVersion","assetPath","getDxtAssetPath","asset"],"sources":["../../../../src/server/plugins/nunjucks/context.js"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { basename, join } from 'node:path'\n\nimport Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport {\n checkFormStatus,\n encodeUrl,\n safeGenerateCrumb\n} from '~/src/server/plugins/engine/helpers.js'\n\nconst logger = createLogger()\n\n/** @type {Record<string, string> | undefined} */\nlet webpackManifest\n\n/**\n * @param {FormRequest | FormRequestPayload | null} request\n */\nexport async function context(request) {\n const { params, response } = request ?? {}\n\n const { isPreview: isPreviewMode, state: formState } = checkFormStatus(params)\n\n // Only add the slug in to the context if the response is OK.\n // Footer meta links are not rendered when the slug is missing.\n const isResponseOK =\n !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK\n\n const pluginStorage = request?.server.plugins['forms-engine-plugin']\n\n let consumerViewContext = {}\n\n if (!pluginStorage) {\n throw Error('context called before plugin registered')\n }\n\n if (!pluginStorage.baseLayoutPath) {\n throw Error('Missing baseLayoutPath in plugin.options.nunjucks')\n }\n\n if (typeof pluginStorage.viewContext === 'function') {\n consumerViewContext = await pluginStorage.viewContext(request)\n }\n\n /** @type {ViewContext} */\n const ctx = {\n // take consumers props first so we can override it\n ...consumerViewContext,\n baseLayoutPath: pluginStorage.baseLayoutPath,\n crumb: safeGenerateCrumb(request),\n currentPath: `${request.path}${request.url.search}`,\n previewMode: isPreviewMode ? formState : undefined,\n slug: isResponseOK ? params?.slug : undefined\n }\n\n return ctx\n}\n\n/**\n * Returns the context for the devtool. Consumers won't have access to this.\n * @param {FormRequest | FormRequestPayload | null} _request\n * @returns {Record<string, unknown> & { assetPath: string, getDxtAssetPath: (asset: string) => string }}\n */\nexport function devtoolContext(_request) {\n const manifestPath = join(config.get('publicDir'), 'assets-manifest.json')\n\n if (!webpackManifest) {\n try {\n // eslint-disable-next-line -- Allow JSON type 'any'\n webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n logger.info(\n `[webpackManifestMissing] Webpack ${basename(manifestPath)} not found - running without asset manifest`\n )\n }\n }\n\n return {\n config: {\n cdpEnvironment: config.get('cdpEnvironment'),\n designerUrl: config.get('designerUrl'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n phaseTag: config.get('phaseTag'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n },\n assetPath: '/assets',\n getDxtAssetPath: (asset = '') => {\n return `/${webpackManifest?.[asset] ?? asset}`\n }\n }\n}\n\n/**\n * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'\n */\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,SAAS;AACtC,SAASC,QAAQ,EAAEC,IAAI,QAAQ,WAAW;AAE1C,OAAOC,IAAI,MAAM,YAAY;AAC7B,SAASC,WAAW,QAAQ,mBAAmB;AAE/C,SAASC,MAAM;AACf,SAASC,YAAY;AACrB,SACEC,eAAe,EACfC,SAAS,EACTC,iBAAiB;AAGnB,MAAMC,MAAM,GAAGJ,YAAY,CAAC,CAAC;;AAE7B;AACA,IAAIK,eAAe;;AAEnB;AACA;AACA;AACA,OAAO,eAAeC,OAAOA,CAACC,OAAO,EAAE;EACrC,MAAM;IAAEC,MAAM;IAAEC;EAAS,CAAC,GAAGF,OAAO,IAAI,CAAC,CAAC;EAE1C,MAAM;IAAEG,SAAS,EAAEC,aAAa;IAAEC,KAAK,EAAEC;EAAU,CAAC,GAAGZ,eAAe,CAACO,MAAM,CAAC;;EAE9E;EACA;EACA,MAAMM,YAAY,GAChB,CAACjB,IAAI,CAACkB,MAAM,CAACN,QAAQ,CAAC,IAAIA,QAAQ,EAAEO,UAAU,KAAKlB,WAAW,CAACmB,EAAE;EAEnE,MAAMC,aAAa,GAAGX,OAAO,EAAEY,MAAM,CAACC,OAAO,CAAC,qBAAqB,CAAC;EAEpE,IAAIC,mBAAmB,GAAG,CAAC,CAAC;EAE5B,IAAI,CAACH,aAAa,EAAE;IAClB,MAAMI,KAAK,CAAC,yCAAyC,CAAC;EACxD;EAEA,IAAI,CAACJ,aAAa,CAACK,cAAc,EAAE;IACjC,MAAMD,KAAK,CAAC,mDAAmD,CAAC;EAClE;EAEA,IAAI,OAAOJ,aAAa,CAACM,WAAW,KAAK,UAAU,EAAE;IACnDH,mBAAmB,GAAG,MAAMH,aAAa,CAACM,WAAW,CAACjB,OAAO,CAAC;EAChE;;EAEA;EACA,MAAMkB,GAAG,GAAG;IACV;IACA,GAAGJ,mBAAmB;IACtBE,cAAc,EAAEL,aAAa,CAACK,cAAc;IAC5CG,KAAK,EAAEvB,iBAAiB,CAACI,OAAO,CAAC;IACjCoB,WAAW,EAAE,GAAGpB,OAAO,CAACqB,IAAI,GAAGrB,OAAO,CAACsB,GAAG,CAACC,MAAM,EAAE;IACnDC,WAAW,EAAEpB,aAAa,GAAGE,SAAS,GAAGmB,SAAS;IAClDC,IAAI,EAAEnB,YAAY,GAAGN,MAAM,EAAEyB,IAAI,GAAGD;EACtC,CAAC;EAED,OAAOP,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASS,cAAcA,CAACC,QAAQ,EAAE;EACvC,MAAMC,YAAY,GAAGxC,IAAI,CAACG,MAAM,CAACsC,GAAG,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;EAE1E,IAAI,CAAChC,eAAe,EAAE;IACpB,IAAI;MACF;MACAA,eAAe,GAAGiC,IAAI,CAACC,KAAK,CAAC7C,YAAY,CAAC0C,YAAY,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,MAAM;MACNhC,MAAM,CAACoC,IAAI,CACT,oCAAoC7C,QAAQ,CAACyC,YAAY,CAAC,6CAC5D,CAAC;IACH;EACF;EAEA,OAAO;IACLrC,MAAM,EAAE;MACN0C,cAAc,EAAE1C,MAAM,CAACsC,GAAG,CAAC,gBAAgB,CAAC;MAC5CK,WAAW,EAAE3C,MAAM,CAACsC,GAAG,CAAC,aAAa,CAAC;MACtCM,YAAY,EAAEzC,SAAS,CAACH,MAAM,CAACsC,GAAG,CAAC,cAAc,CAAC,CAAC;MACnDO,QAAQ,EAAE7C,MAAM,CAACsC,GAAG,CAAC,UAAU,CAAC;MAChCQ,WAAW,EAAE9C,MAAM,CAACsC,GAAG,CAAC,aAAa,CAAC;MACtCS,cAAc,EAAE/C,MAAM,CAACsC,GAAG,CAAC,gBAAgB;IAC7C,CAAC;IACDU,SAAS,EAAE,SAAS;IACpBC,eAAe,EAAEA,CAACC,KAAK,GAAG,EAAE,KAAK;MAC/B,OAAO,IAAI5C,eAAe,GAAG4C,KAAK,CAAC,IAAIA,KAAK,EAAE;IAChD;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -86,6 +86,7 @@ export function evaluate(template) {
86
86
  return context ? evaluateTemplate(template, context) : template;
87
87
  }
88
88
  environment.addGlobal('evaluate', evaluate);
89
+ environment.addGlobal('govukRebrand', config.get('showRebrand'));
89
90
 
90
91
  /**
91
92
  * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"environment.js","names":["dirname","join","ComponentType","nunjucks","resolvePkg","config","evaluateTemplate","filters","govukFrontendPath","sync","paths","get","environment","configure","trimBlocks","lstripBlocks","watch","noCache","name","nunjucksFilter","Object","entries","addFilter","checkErrorTemplates","errors","context","ctx","forEach","error","text","addGlobal","checkComponentTemplates","component","isFormComponent","model","fieldset","legend","label","errorMessage","message","type","Html","content","evaluate","template"],"sources":["../../../../src/server/plugins/nunjucks/environment.js"],"sourcesContent":["import { dirname, join } from 'node:path'\n\nimport { ComponentType } from '@defra/forms-model'\nimport nunjucks from 'nunjucks'\nimport resolvePkg from 'resolve'\n\nimport { config } from '~/src/config/index.js'\nimport { evaluateTemplate } from '~/src/server/plugins/engine/helpers.js'\nimport * as filters from '~/src/server/plugins/nunjucks/filters/index.js'\n\nconst govukFrontendPath = dirname(\n resolvePkg.sync('govuk-frontend/package.json')\n)\n\nexport const paths = [\n join(config.get('appDir'), 'plugins/engine/views'),\n join(config.get('appDir'), 'views')\n]\n\nexport const environment = nunjucks.configure(\n [...paths, join(govukFrontendPath, 'dist')],\n {\n trimBlocks: true,\n lstripBlocks: true,\n watch: config.get('isDevelopment'),\n noCache: config.get('isDevelopment')\n }\n)\n\nfor (const [name, nunjucksFilter] of Object.entries(filters)) {\n environment.addFilter(name, nunjucksFilter)\n}\n\n/**\n * @this {NunjucksContext}\n * @param {FormSubmissionError[]} errors\n */\nexport function checkErrorTemplates(errors) {\n const { context } = this.ctx\n\n if (!context) {\n return errors\n }\n\n errors.forEach((error) => {\n error.text = evaluateTemplate(error.text, context)\n })\n\n return errors\n}\n\nenvironment.addGlobal('checkErrorTemplates', checkErrorTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {ComponentViewModel} component\n */\nexport function checkComponentTemplates(component) {\n const { context } = this.ctx\n\n if (!context) {\n return component\n }\n\n if (component.isFormComponent) {\n // Evaluate label/legend text\n if (component.model.fieldset?.legend?.text) {\n const legend = component.model.fieldset.legend\n\n legend.text = evaluateTemplate(legend.text, context)\n } else if (component.model.label?.text) {\n const label = component.model.label\n\n label.text = evaluateTemplate(label.text, context)\n } else {\n // No template evaluation needed for other component types\n }\n\n // Evaluate error message\n if (component.model.errorMessage?.text) {\n const message = component.model.errorMessage\n\n message.text = evaluateTemplate(message.text, context)\n }\n } else if (component.type === ComponentType.Html) {\n const content = component.model.content\n\n if (typeof content === 'string') {\n component.model.content = evaluateTemplate(content, context)\n }\n } else {\n // No template evaluation needed for other component types\n }\n\n return component\n}\n\nenvironment.addGlobal('checkComponentTemplates', checkComponentTemplates)\n\n/**\n * @this {NunjucksContext}\n * @param {string} template\n */\nexport function evaluate(template) {\n const { context } = this.ctx\n\n return context ? evaluateTemplate(template, context) : template\n}\n\nenvironment.addGlobal('evaluate', evaluate)\nenvironment.addGlobal('govukRebrand', config.get('showRebrand'))\n\n/**\n * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormSubmissionError } from '~/src/server/plugins/engine/types.js'\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-engine-plugin",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "Defra forms engine",
5
5
  "type": "module",
6
6
  "files": [
@@ -14,13 +14,9 @@
14
14
  "import": "./.server/server/plugins/engine/index.js",
15
15
  "default": "./.server/server/plugins/engine/index.js"
16
16
  },
17
- "./application.js": "./.server/client/javascripts/application.js",
18
- "./application.min.js": "./.public/javascripts/application.min.js",
19
- "./application.min.js.map": "./.public/javascripts/application.min.js.map",
20
- "./file-upload.js": "./.server/client/javascripts/file-upload.js",
21
- "./file-upload.min.js": "./.public/javascripts/file-upload.min.js",
22
- "./file-upload.min.js.map": "./.public/javascripts/file-upload.min.js.map",
23
- "./application.min.css": "./.public/stylesheets/application.min.css",
17
+ "./shared.js": "./.server/client/javascripts/shared.js",
18
+ "./shared.min.js": "./.public/javascripts/shared.min.js",
19
+ "./shared.min.js.map": "./.public/javascripts/shared.min.js.map",
24
20
  "./file-form-service.js": "./.server/server/utils/file-form-service.js",
25
21
  "./controllers/*": "./.server/server/plugins/engine/pageControllers/*",
26
22
  "./components": "./.server/server/plugins/engine/components/index.js",
@@ -67,7 +63,7 @@
67
63
  },
68
64
  "license": "SEE LICENSE IN LICENSE",
69
65
  "dependencies": {
70
- "@defra/forms-model": "^3.0.441",
66
+ "@defra/forms-model": "^3.0.497",
71
67
  "@defra/hapi-tracing": "^1.0.0",
72
68
  "@elastic/ecs-pino-format": "^1.5.0",
73
69
  "@hapi/boom": "^10.0.1",
@@ -91,22 +87,22 @@
91
87
  "btoa": "^1.2.1",
92
88
  "convict": "^6.2.4",
93
89
  "date-fns": "^4.1.0",
94
- "dotenv": "^16.4.7",
90
+ "dotenv": "^16.5.0",
95
91
  "expr-eval": "^2.0.2",
96
- "govuk-frontend": "^5.7.1",
92
+ "govuk-frontend": "^5.10.2",
97
93
  "hapi-pino": "^12.1.0",
98
94
  "hapi-pulse": "^3.0.1",
99
95
  "highlight.js": "^11.11.1",
100
96
  "http-status-codes": "^2.3.0",
101
- "humanize-duration": "^3.32.1",
102
- "ioredis": "^5.6.0",
97
+ "humanize-duration": "^3.33.0",
98
+ "ioredis": "^5.6.1",
103
99
  "joi": "^17.13.3",
104
- "liquidjs": "^10.21.0",
100
+ "liquidjs": "^10.21.1",
105
101
  "lodash": "^4.17.21",
106
102
  "marked": "^15.0.7",
107
103
  "nunjucks": "^3.2.3",
108
104
  "outdent": "^0.8.0",
109
- "pino": "^9.6.0",
105
+ "pino": "^9.7.0",
110
106
  "pino-pretty": "^13.0.0",
111
107
  "proxy-agent": "^6.5.0",
112
108
  "resolve": "^1.22.10",
@@ -124,18 +120,18 @@
124
120
  "@types/btoa": "^1.2.5",
125
121
  "@types/convict": "^6.1.6",
126
122
  "@types/eslint": "^9.6.1",
127
- "@types/govuk-frontend": "^5.7.0",
123
+ "@types/govuk-frontend": "^5.9.0",
128
124
  "@types/hapi": "^18.0.14",
129
125
  "@types/hapi__catbox-memory": "^4.1.8",
130
126
  "@types/hapi__cookie": "^12.0.5",
131
127
  "@types/hapi__crumb": "^7.3.7",
132
128
  "@types/hapi__yar": "^10.1.6",
133
129
  "@types/hoek": "^4.1.7",
134
- "@types/jest": "^29.5.14",
130
+ "@types/jest": "^30.0.0",
135
131
  "@types/jsdom": "^21.1.7",
136
- "@types/lodash": "^4.17.13",
137
- "@types/mysql": "^2.15.26",
138
- "@types/node": "^22.10.2",
132
+ "@types/lodash": "^4.17.17",
133
+ "@types/mysql": "^2.15.27",
134
+ "@types/node": "^24.0.2",
139
135
  "@types/nunjucks": "^3.2.6",
140
136
  "@types/resolve": "^1.20.6",
141
137
  "@types/url-parse": "^1.4.11",
@@ -149,7 +145,7 @@
149
145
  "babel-plugin-replace-import-extension": "^1.1.4",
150
146
  "babel-plugin-transform-import-meta": "^2.3.2",
151
147
  "clean-webpack-plugin": "^4.0.0",
152
- "concurrently": "^9.1.2",
148
+ "concurrently": "^9.2.0",
153
149
  "cookie": "^1.0.2",
154
150
  "copy-webpack-plugin": "^12.0.2",
155
151
  "core-js": "^3.39.0",
@@ -165,11 +161,11 @@
165
161
  "eslint-plugin-jsdoc": "^50.6.1",
166
162
  "eslint-plugin-n": "^16.6.2",
167
163
  "eslint-plugin-promise": "^6.6.0",
168
- "global-jsdom": "^25.0.0",
164
+ "global-jsdom": "^26.0.0",
169
165
  "husky": "^9.1.7",
170
- "jest": "^29.7.0",
166
+ "jest": "^30.0.2",
171
167
  "jest-extended": "^4.0.2",
172
- "jsdom": "^25.0.1",
168
+ "jsdom": "^26.1.0",
173
169
  "lint-staged": "^15.3.0",
174
170
  "postcss": "^8.4.49",
175
171
  "postcss-load-config": "^6.0.1",
@@ -182,7 +178,7 @@
182
178
  "stylelint": "^16.12.0",
183
179
  "stylelint-config-gds": "^2.0.0",
184
180
  "terser-webpack-plugin": "^5.3.11",
185
- "tsx": "^4.19.3",
181
+ "tsx": "^4.20.3",
186
182
  "typescript": "^5.7.2",
187
183
  "webpack": "^5.97.1",
188
184
  "webpack-assets-manifest": "^6.0.2",