@defra/forms-engine-plugin 1.0.0 → 1.0.2

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 (47) hide show
  1. package/.server/server/plugins/engine/README.md +56 -0
  2. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +2 -1
  3. package/.server/server/plugins/engine/configureEnginePlugin.js +1 -1
  4. package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
  5. package/.server/server/plugins/engine/plugin.d.ts +2 -27
  6. package/.server/server/plugins/engine/plugin.js +17 -594
  7. package/.server/server/plugins/engine/plugin.js.map +1 -1
  8. package/.server/server/plugins/engine/registrationOptions.d.ts +1 -0
  9. package/.server/server/plugins/engine/registrationOptions.js +2 -0
  10. package/.server/server/plugins/engine/registrationOptions.js.map +1 -0
  11. package/.server/server/plugins/engine/routes/file-upload.d.ts +4 -0
  12. package/.server/server/plugins/engine/routes/file-upload.js +41 -0
  13. package/.server/server/plugins/engine/routes/file-upload.js.map +1 -0
  14. package/.server/server/plugins/engine/routes/index.d.ts +7 -0
  15. package/.server/server/plugins/engine/routes/index.js +141 -0
  16. package/.server/server/plugins/engine/routes/index.js.map +1 -0
  17. package/.server/server/plugins/engine/routes/questions.d.ts +3 -0
  18. package/.server/server/plugins/engine/routes/questions.js +168 -0
  19. package/.server/server/plugins/engine/routes/questions.js.map +1 -0
  20. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +3 -0
  21. package/.server/server/plugins/engine/routes/repeaters/item-delete.js +106 -0
  22. package/.server/server/plugins/engine/routes/repeaters/item-delete.js.map +1 -0
  23. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +3 -0
  24. package/.server/server/plugins/engine/routes/repeaters/summary.js +98 -0
  25. package/.server/server/plugins/engine/routes/repeaters/summary.js.map +1 -0
  26. package/.server/server/plugins/engine/types.d.ts +19 -1
  27. package/.server/server/plugins/engine/types.js.map +1 -1
  28. package/.server/server/plugins/engine/vision.d.ts +12 -0
  29. package/.server/server/plugins/engine/vision.js +55 -0
  30. package/.server/server/plugins/engine/vision.js.map +1 -0
  31. package/.server/server/services/cacheService.d.ts +12 -3
  32. package/.server/server/services/cacheService.js +35 -8
  33. package/.server/server/services/cacheService.js.map +1 -1
  34. package/package.json +3 -3
  35. package/src/server/plugins/engine/README.md +56 -0
  36. package/src/server/plugins/engine/configureEnginePlugin.ts +3 -5
  37. package/src/server/plugins/engine/plugin.ts +35 -765
  38. package/src/server/plugins/engine/registrationOptions.ts +0 -0
  39. package/src/server/plugins/engine/routes/file-upload.ts +54 -0
  40. package/src/server/plugins/engine/routes/index.ts +187 -0
  41. package/src/server/plugins/engine/routes/questions.ts +208 -0
  42. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +157 -0
  43. package/src/server/plugins/engine/routes/repeaters/summary.ts +137 -0
  44. package/src/server/plugins/engine/types.ts +26 -1
  45. package/src/server/plugins/engine/vision.ts +95 -0
  46. package/src/server/services/cacheService.test.ts +98 -2
  47. package/src/server/services/cacheService.ts +57 -8
@@ -1 +1 @@
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
+ {"version":3,"file":"plugin.js","names":["getRoutes","getFileUploadStatusRoutes","makeLoadFormPreHandler","getQuestionRoutes","getRepeaterItemDeleteRoutes","getRepeaterSummaryRoutes","registerVision","CacheService","plugin","name","dependencies","multiple","register","server","options","model","cacheName","keyGenerator","sessionHydrator","nunjucks","nunjucksOptions","viewContext","cacheService","expose","baseLayoutPath","app","itemCache","Map","models","loadFormPreHandler","getRouteOptions","pre","method","postRouteOptions","payload","parse","routes","route"],"sources":["../../../../src/server/plugins/engine/plugin.ts"],"sourcesContent":["import {\n type Lifecycle,\n type Plugin,\n type RouteOptions,\n type Server,\n type ServerRoute\n} from '@hapi/hapi'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { getRoutes as getFileUploadStatusRoutes } from '~/src/server/plugins/engine/routes/file-upload.js'\nimport { makeLoadFormPreHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport { getRoutes as getQuestionRoutes } from '~/src/server/plugins/engine/routes/questions.js'\nimport { getRoutes as getRepeaterItemDeleteRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'\nimport { getRoutes as getRepeaterSummaryRoutes } from '~/src/server/plugins/engine/routes/repeaters/summary.js'\nimport { type PluginOptions } from '~/src/server/plugins/engine/types.js'\nimport { registerVision } from '~/src/server/plugins/engine/vision.js'\nimport {\n type FormRequestPayloadRefs,\n type FormRequestRefs\n} from '~/src/server/routes/types.js'\nimport { CacheService } from '~/src/server/services/index.js'\n\nexport const plugin = {\n name: '@defra/forms-engine-plugin',\n dependencies: ['@hapi/crumb', '@hapi/yar', 'hapi-pino'],\n multiple: true,\n async register(server: Server, options: PluginOptions) {\n const {\n model,\n cacheName,\n keyGenerator,\n sessionHydrator,\n nunjucks: nunjucksOptions,\n viewContext\n } = options\n const cacheService = new CacheService({\n server,\n cacheName,\n options: {\n keyGenerator,\n sessionHydrator\n }\n })\n\n await registerVision(server, options)\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 = makeLoadFormPreHandler(server, options)\n\n const getRouteOptions: RouteOptions<FormRequestRefs> = {\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestRefs>\n }\n ]\n }\n\n const postRouteOptions: RouteOptions<FormRequestPayloadRefs> = {\n payload: {\n parse: true\n },\n pre: [\n {\n method:\n loadFormPreHandler as unknown as Lifecycle.Method<FormRequestPayloadRefs>\n }\n ]\n }\n\n const routes = [\n ...getQuestionRoutes(getRouteOptions, postRouteOptions),\n ...getRepeaterSummaryRoutes(getRouteOptions, postRouteOptions),\n ...getRepeaterItemDeleteRoutes(getRouteOptions, postRouteOptions),\n ...getFileUploadStatusRoutes()\n ]\n\n server.route(routes as unknown as ServerRoute[]) // TODO\n }\n} satisfies Plugin<PluginOptions>\n"],"mappings":"AASA,SAASA,SAAS,IAAIC,yBAAyB;AAC/C,SAASC,sBAAsB;AAC/B,SAASF,SAAS,IAAIG,iBAAiB;AACvC,SAASH,SAAS,IAAII,2BAA2B;AACjD,SAASJ,SAAS,IAAIK,wBAAwB;AAE9C,SAASC,cAAc;AAKvB,SAASC,YAAY;AAErB,OAAO,MAAMC,MAAM,GAAG;EACpBC,IAAI,EAAE,4BAA4B;EAClCC,YAAY,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC;EACvDC,QAAQ,EAAE,IAAI;EACd,MAAMC,QAAQA,CAACC,MAAc,EAAEC,OAAsB,EAAE;IACrD,MAAM;MACJC,KAAK;MACLC,SAAS;MACTC,YAAY;MACZC,eAAe;MACfC,QAAQ,EAAEC,eAAe;MACzBC;IACF,CAAC,GAAGP,OAAO;IACX,MAAMQ,YAAY,GAAG,IAAIf,YAAY,CAAC;MACpCM,MAAM;MACNG,SAAS;MACTF,OAAO,EAAE;QACPG,YAAY;QACZC;MACF;IACF,CAAC,CAAC;IAEF,MAAMZ,cAAc,CAACO,MAAM,EAAEC,OAAO,CAAC;IAErCD,MAAM,CAACU,MAAM,CAAC,gBAAgB,EAAEH,eAAe,CAACI,cAAc,CAAC;IAC/DX,MAAM,CAACU,MAAM,CAAC,aAAa,EAAEF,WAAW,CAAC;IACzCR,MAAM,CAACU,MAAM,CAAC,cAAc,EAAED,YAAY,CAAC;IAE3CT,MAAM,CAACY,GAAG,CAACV,KAAK,GAAGA,KAAK;;IAExB;IACA;IACA,MAAMW,SAAS,GAAG,IAAIC,GAAG,CAAgD,CAAC;IAC1Ed,MAAM,CAACY,GAAG,CAACG,MAAM,GAAGF,SAAS;IAE7B,MAAMG,kBAAkB,GAAG3B,sBAAsB,CAACW,MAAM,EAAEC,OAAO,CAAC;IAElE,MAAMgB,eAA8C,GAAG;MACrDC,GAAG,EAAE,CACH;QACEC,MAAM,EACJH;MACJ,CAAC;IAEL,CAAC;IAED,MAAMI,gBAAsD,GAAG;MAC7DC,OAAO,EAAE;QACPC,KAAK,EAAE;MACT,CAAC;MACDJ,GAAG,EAAE,CACH;QACEC,MAAM,EACJH;MACJ,CAAC;IAEL,CAAC;IAED,MAAMO,MAAM,GAAG,CACb,GAAGjC,iBAAiB,CAAC2B,eAAe,EAAEG,gBAAgB,CAAC,EACvD,GAAG5B,wBAAwB,CAACyB,eAAe,EAAEG,gBAAgB,CAAC,EAC9D,GAAG7B,2BAA2B,CAAC0B,eAAe,EAAEG,gBAAgB,CAAC,EACjE,GAAGhC,yBAAyB,CAAC,CAAC,CAC/B;IAEDY,MAAM,CAACwB,KAAK,CAACD,MAAkC,CAAC,EAAC;EACnD;AACF,CAAiC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=registrationOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registrationOptions.js","names":[],"sources":["../../../../src/server/plugins/engine/registrationOptions.ts"],"sourcesContent":[""],"mappings":"","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ import { type ResponseToolkit, type ServerRoute } from '@hapi/hapi';
2
+ import { type FormRequest, type FormRequestRefs } from '~/src/server/routes/types.js';
3
+ export declare function getHandler(request: FormRequest, h: Pick<ResponseToolkit, 'response'>): Promise<import("@hapi/hapi").ResponseObject>;
4
+ export declare function getRoutes(): ServerRoute<FormRequestRefs>[];
@@ -0,0 +1,41 @@
1
+ import { getErrorMessage } from '@defra/forms-model';
2
+ import Joi from 'joi';
3
+ import { getUploadStatus } from "../services/uploadService.js";
4
+ export async function getHandler(request, h) {
5
+ const {
6
+ uploadId
7
+ } = request.params;
8
+ try {
9
+ const status = await getUploadStatus(uploadId);
10
+ if (!status) {
11
+ return h.response({
12
+ error: 'Status check failed'
13
+ }).code(400);
14
+ }
15
+ return h.response(status);
16
+ } catch (error) {
17
+ const errMsg = getErrorMessage(error);
18
+ request.logger.error(errMsg, `[uploadStatusFailed] Upload status check failed for uploadId: ${uploadId} - ${errMsg}`);
19
+ return h.response({
20
+ error: 'Status check error'
21
+ }).code(500);
22
+ }
23
+ }
24
+ export function getRoutes() {
25
+ return [{
26
+ method: 'get',
27
+ path: '/upload-status/{uploadId}',
28
+ handler: getHandler,
29
+ options: {
30
+ plugins: {
31
+ crumb: false
32
+ },
33
+ validate: {
34
+ params: Joi.object().keys({
35
+ uploadId: Joi.string().guid().required()
36
+ })
37
+ }
38
+ }
39
+ }];
40
+ }
41
+ //# sourceMappingURL=file-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.js","names":["getErrorMessage","Joi","getUploadStatus","getHandler","request","h","uploadId","params","status","response","error","code","errMsg","logger","getRoutes","method","path","handler","options","plugins","crumb","validate","object","keys","string","guid","required"],"sources":["../../../../../src/server/plugins/engine/routes/file-upload.ts"],"sourcesContent":["import { getErrorMessage } from '@defra/forms-model'\nimport { type ResponseToolkit, type ServerRoute } from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport { getUploadStatus } from '~/src/server/plugins/engine/services/uploadService.js'\nimport {\n type FormRequest,\n type FormRequestRefs\n} from '~/src/server/routes/types.js'\n\nexport async function getHandler(\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\nexport function getRoutes(): ServerRoute<FormRequestRefs>[] {\n return [\n {\n method: 'get',\n path: '/upload-status/{uploadId}',\n handler: getHandler,\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}\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,oBAAoB;AAEpD,OAAOC,GAAG,MAAM,KAAK;AAErB,SAASC,eAAe;AAMxB,OAAO,eAAeC,UAAUA,CAC9BC,OAAoB,EACpBC,CAAoC,EACpC;EACA,MAAM;IAAEC;EAAS,CAAC,GAAGF,OAAO,CAACG,MAE5B;EACD,IAAI;IACF,MAAMC,MAAM,GAAG,MAAMN,eAAe,CAACI,QAAQ,CAAC;IAE9C,IAAI,CAACE,MAAM,EAAE;MACX,OAAOH,CAAC,CAACI,QAAQ,CAAC;QAAEC,KAAK,EAAE;MAAsB,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IAC/D;IAEA,OAAON,CAAC,CAACI,QAAQ,CAACD,MAAM,CAAC;EAC3B,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,MAAME,MAAM,GAAGZ,eAAe,CAACU,KAAK,CAAC;IACrCN,OAAO,CAACS,MAAM,CAACH,KAAK,CAClBE,MAAM,EACN,iEAAiEN,QAAQ,MAAMM,MAAM,EACvF,CAAC;IACD,OAAOP,CAAC,CAACI,QAAQ,CAAC;MAAEC,KAAK,EAAE;IAAqB,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EAC9D;AACF;AAEA,OAAO,SAASG,SAASA,CAAA,EAAmC;EAC1D,OAAO,CACL;IACEC,MAAM,EAAE,KAAK;IACbC,IAAI,EAAE,2BAA2B;IACjCC,OAAO,EAAEd,UAAU;IACnBe,OAAO,EAAE;MACPC,OAAO,EAAE;QACPC,KAAK,EAAE;MACT,CAAC;MACDC,QAAQ,EAAE;QACRd,MAAM,EAAEN,GAAG,CAACqB,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC;UACxBjB,QAAQ,EAAEL,GAAG,CAACuB,MAAM,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,QAAQ,CAAC;QACzC,CAAC;MACH;IACF;EACF,CAAC,CACF;AACH","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import { type ResponseObject, type ResponseToolkit, type Server } from '@hapi/hapi';
2
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
3
+ import { type FormContext, type PluginOptions } from '~/src/server/plugins/engine/types.js';
4
+ import { type FormRequest, type FormRequestPayload } from '~/src/server/routes/types.js';
5
+ export declare function redirectOrMakeHandler(request: FormRequest | FormRequestPayload, h: Pick<ResponseToolkit, 'redirect' | 'view'>, makeHandler: (page: PageControllerClass, context: FormContext) => ResponseObject | Promise<ResponseObject>): Promise<ResponseObject>;
6
+ export declare function makeLoadFormPreHandler(server: Server, options: PluginOptions): (request: FormRequest | FormRequestPayload, h: ResponseToolkit) => Promise<symbol>;
7
+ export declare function dispatchHandler(request: FormRequest, h: Pick<ResponseToolkit, 'redirect' | 'view'>): ResponseObject;
@@ -0,0 +1,141 @@
1
+ import Boom from '@hapi/boom';
2
+ import { isEqual } from 'date-fns';
3
+ import { PREVIEW_PATH_PREFIX } from "../../../constants.js";
4
+ import { checkEmailAddressForLiveFormSubmission, checkFormStatus, findPage, getCacheService, getPage, getStartPath, proceed } from "../helpers.js";
5
+ import { FormModel } from "../models/index.js";
6
+ import { generateUniqueReference } from "../referenceNumbers.js";
7
+ import * as defaultServices from "../services/index.js";
8
+ export async function redirectOrMakeHandler(request, h, makeHandler) {
9
+ const {
10
+ app,
11
+ params
12
+ } = request;
13
+ const {
14
+ model
15
+ } = app;
16
+ if (!model) {
17
+ throw Boom.notFound(`No model found for /${params.path}`);
18
+ }
19
+ const cacheService = getCacheService(request.server);
20
+ const page = getPage(model, request);
21
+ let state = await page.getState(request);
22
+ if (!state.$$__referenceNumber) {
23
+ const prefix = model.def.metadata?.referenceNumberPrefix ?? '';
24
+ if (typeof prefix !== 'string') {
25
+ throw Boom.badImplementation('Reference number prefix must be a string or undefined');
26
+ }
27
+ const referenceNumber = generateUniqueReference(prefix);
28
+ state = await page.mergeState(request, state, {
29
+ $$__referenceNumber: referenceNumber
30
+ });
31
+ }
32
+ const flash = cacheService.getFlash(request);
33
+ const context = model.getFormContext(request, state, flash?.errors);
34
+ const relevantPath = page.getRelevantPath(request, context);
35
+ const summaryPath = page.getSummaryPath();
36
+
37
+ // Return handler for relevant pages or preview URL direct access
38
+ if (relevantPath.startsWith(page.path) || context.isForceAccess) {
39
+ return makeHandler(page, context);
40
+ }
41
+
42
+ // Redirect back to last relevant page
43
+ const redirectTo = findPage(model, relevantPath);
44
+
45
+ // Set the return URL unless an exit page
46
+ if (redirectTo?.next.length) {
47
+ request.query.returnUrl = page.getHref(summaryPath);
48
+ }
49
+ return proceed(request, h, page.getHref(relevantPath));
50
+ }
51
+ export function makeLoadFormPreHandler(server, options) {
52
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong
53
+ const prefix = server.realm.modifiers.route.prefix ?? '';
54
+ const {
55
+ services = defaultServices,
56
+ controllers
57
+ } = options;
58
+ const {
59
+ formsService
60
+ } = services;
61
+ async function handler(request, h) {
62
+ if (server.app.model) {
63
+ request.app.model = server.app.model;
64
+ return h.continue;
65
+ }
66
+ const {
67
+ params
68
+ } = request;
69
+ const {
70
+ slug
71
+ } = params;
72
+ const {
73
+ isPreview,
74
+ state: formState
75
+ } = checkFormStatus(params);
76
+
77
+ // Get the form metadata using the `slug` param
78
+ const metadata = await formsService.getFormMetadata(slug);
79
+ const {
80
+ id,
81
+ [formState]: state
82
+ } = metadata;
83
+
84
+ // Check the metadata supports the requested state
85
+ if (!state) {
86
+ throw Boom.notFound(`No '${formState}' state for form metadata ${id}`);
87
+ }
88
+
89
+ // Cache the models based on id, state and whether
90
+ // it's a preview or not. There could be up to 3 models
91
+ // cached for a single form:
92
+ // "{id}_live_false" (live/live)
93
+ // "{id}_live_true" (live/preview)
94
+ // "{id}_draft_true" (draft/preview)
95
+ const key = `${id}_${formState}_${isPreview}`;
96
+ let item = server.app.models.get(key);
97
+ if (!item || !isEqual(item.updatedAt, state.updatedAt)) {
98
+ server.logger.info(`Getting form definition ${id} (${slug}) ${formState}`);
99
+
100
+ // Get the form definition using the `id` from the metadata
101
+ const definition = await formsService.getFormDefinition(id, formState);
102
+ if (!definition) {
103
+ throw Boom.notFound(`No definition found for form metadata ${id} (${slug}) ${formState}`);
104
+ }
105
+ const emailAddress = metadata.notificationEmail ?? definition.outputEmail;
106
+ checkEmailAddressForLiveFormSubmission(emailAddress, isPreview);
107
+
108
+ // Build the form model
109
+ server.logger.info(`Building model for form definition ${id} (${slug}) ${formState}`);
110
+
111
+ // Set up the basePath for the model
112
+ const basePath = (isPreview ? `${prefix}${PREVIEW_PATH_PREFIX}/${formState}/${slug}` : `${prefix}/${slug}`).substring(1);
113
+
114
+ // Construct the form model
115
+ const model = new FormModel(definition, {
116
+ basePath
117
+ }, services, controllers);
118
+
119
+ // Create new item and add it to the item cache
120
+ item = {
121
+ model,
122
+ updatedAt: state.updatedAt
123
+ };
124
+ server.app.models.set(key, item);
125
+ }
126
+
127
+ // Assign the model to the request data
128
+ // for use in the downstream handler
129
+ request.app.model = item.model;
130
+ return h.continue;
131
+ }
132
+ return handler;
133
+ }
134
+ export function dispatchHandler(request, h) {
135
+ const {
136
+ model
137
+ } = request.app;
138
+ const servicePath = model ? `/${model.basePath}` : '';
139
+ return proceed(request, h, `${servicePath}${getStartPath(model)}`);
140
+ }
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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","formsService","handler","continue","slug","isPreview","formState","getFormMetadata","id","key","item","models","get","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","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.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type FormContext,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload\n} from '~/src/server/routes/types.js'\n\nexport async function redirectOrMakeHandler(\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\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 } = options\n\n const { formsService } = services\n\n async function handler(\n request: FormRequest | FormRequestPayload,\n h: ResponseToolkit\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 = 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 // 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 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(\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"],"mappings":"AAAA,OAAOA,IAAI,MAAM,YAAY;AAM7B,SAASC,OAAO,QAAQ,UAAU;AAElC,SAASC,mBAAmB;AAC5B,SACEC,sCAAsC,EACtCC,eAAe,EACfC,QAAQ,EACRC,eAAe,EACfC,OAAO,EACPC,YAAY,EACZC,OAAO;AAET,SAASC,SAAS;AAElB,SAASC,uBAAuB;AAChC,OAAO,KAAKC,eAAe;AAU3B,OAAO,eAAeC,qBAAqBA,CACzCC,OAAyC,EACzCC,CAA6C,EAC7CC,WAG6C,EAC7C;EACA,MAAM;IAAEC,GAAG;IAAEC;EAAO,CAAC,GAAGJ,OAAO;EAC/B,MAAM;IAAEK;EAAM,CAAC,GAAGF,GAAG;EAErB,IAAI,CAACE,KAAK,EAAE;IACV,MAAMnB,IAAI,CAACoB,QAAQ,CAAC,uBAAuBF,MAAM,CAACG,IAAI,EAAE,CAAC;EAC3D;EAEA,MAAMC,YAAY,GAAGhB,eAAe,CAACQ,OAAO,CAACS,MAAM,CAAC;EACpD,MAAMC,IAAI,GAAGjB,OAAO,CAACY,KAAK,EAAEL,OAAO,CAAC;EACpC,IAAIW,KAAK,GAAG,MAAMD,IAAI,CAACE,QAAQ,CAACZ,OAAO,CAAC;EAExC,IAAI,CAACW,KAAK,CAACE,mBAAmB,EAAE;IAC9B,MAAMC,MAAM,GAAGT,KAAK,CAACU,GAAG,CAACC,QAAQ,EAAEC,qBAAqB,IAAI,EAAE;IAE9D,IAAI,OAAOH,MAAM,KAAK,QAAQ,EAAE;MAC9B,MAAM5B,IAAI,CAACgC,iBAAiB,CAC1B,uDACF,CAAC;IACH;IAEA,MAAMC,eAAe,GAAGtB,uBAAuB,CAACiB,MAAM,CAAC;IACvDH,KAAK,GAAG,MAAMD,IAAI,CAACU,UAAU,CAACpB,OAAO,EAAEW,KAAK,EAAE;MAC5CE,mBAAmB,EAAEM;IACvB,CAAC,CAAC;EACJ;EAEA,MAAME,KAAK,GAAGb,YAAY,CAACc,QAAQ,CAACtB,OAAO,CAAC;EAC5C,MAAMuB,OAAO,GAAGlB,KAAK,CAACmB,cAAc,CAACxB,OAAO,EAAEW,KAAK,EAAEU,KAAK,EAAEI,MAAM,CAAC;EACnE,MAAMC,YAAY,GAAGhB,IAAI,CAACiB,eAAe,CAAC3B,OAAO,EAAEuB,OAAO,CAAC;EAC3D,MAAMK,WAAW,GAAGlB,IAAI,CAACmB,cAAc,CAAC,CAAC;;EAEzC;EACA,IAAIH,YAAY,CAACI,UAAU,CAACpB,IAAI,CAACH,IAAI,CAAC,IAAIgB,OAAO,CAACQ,aAAa,EAAE;IAC/D,OAAO7B,WAAW,CAACQ,IAAI,EAAEa,OAAO,CAAC;EACnC;;EAEA;EACA,MAAMS,UAAU,GAAGzC,QAAQ,CAACc,KAAK,EAAEqB,YAAY,CAAC;;EAEhD;EACA,IAAIM,UAAU,EAAEC,IAAI,CAACC,MAAM,EAAE;IAC3BlC,OAAO,CAACmC,KAAK,CAACC,SAAS,GAAG1B,IAAI,CAAC2B,OAAO,CAACT,WAAW,CAAC;EACrD;EAEA,OAAOjC,OAAO,CAACK,OAAO,EAAEC,CAAC,EAAES,IAAI,CAAC2B,OAAO,CAACX,YAAY,CAAC,CAAC;AACxD;AAEA,OAAO,SAASY,sBAAsBA,CAAC7B,MAAc,EAAE8B,OAAsB,EAAE;EAC7E;EACA,MAAMzB,MAAM,GAAGL,MAAM,CAAC+B,KAAK,CAACC,SAAS,CAACC,KAAK,CAAC5B,MAAM,IAAI,EAAE;EAExD,MAAM;IAAE6B,QAAQ,GAAG7C,eAAe;IAAE8C;EAAY,CAAC,GAAGL,OAAO;EAE3D,MAAM;IAAEM;EAAa,CAAC,GAAGF,QAAQ;EAEjC,eAAeG,OAAOA,CACpB9C,OAAyC,EACzCC,CAAkB,EAClB;IACA,IAAIQ,MAAM,CAACN,GAAG,CAACE,KAAK,EAAE;MACpBL,OAAO,CAACG,GAAG,CAACE,KAAK,GAAGI,MAAM,CAACN,GAAG,CAACE,KAAK;MAEpC,OAAOJ,CAAC,CAAC8C,QAAQ;IACnB;IAEA,MAAM;MAAE3C;IAAO,CAAC,GAAGJ,OAAO;IAC1B,MAAM;MAAEgD;IAAK,CAAC,GAAG5C,MAAM;IACvB,MAAM;MAAE6C,SAAS;MAAEtC,KAAK,EAAEuC;IAAU,CAAC,GAAG5D,eAAe,CAACc,MAAM,CAAC;;IAE/D;IACA,MAAMY,QAAQ,GAAG,MAAM6B,YAAY,CAACM,eAAe,CAACH,IAAI,CAAC;IAEzD,MAAM;MAAEI,EAAE;MAAE,CAACF,SAAS,GAAGvC;IAAM,CAAC,GAAGK,QAAQ;;IAE3C;IACA,IAAI,CAACL,KAAK,EAAE;MACV,MAAMzB,IAAI,CAACoB,QAAQ,CAAC,OAAO4C,SAAS,6BAA6BE,EAAE,EAAE,CAAC;IACxE;;IAEA;IACA;IACA;IACA;IACA;IACA;IACA,MAAMC,GAAG,GAAG,GAAGD,EAAE,IAAIF,SAAS,IAAID,SAAS,EAAE;IAC7C,IAAIK,IAAI,GAAG7C,MAAM,CAACN,GAAG,CAACoD,MAAM,CAACC,GAAG,CAACH,GAAG,CAAC;IAErC,IAAI,CAACC,IAAI,IAAI,CAACnE,OAAO,CAACmE,IAAI,CAACG,SAAS,EAAE9C,KAAK,CAAC8C,SAAS,CAAC,EAAE;MACtDhD,MAAM,CAACiD,MAAM,CAACC,IAAI,CAAC,2BAA2BP,EAAE,KAAKJ,IAAI,KAAKE,SAAS,EAAE,CAAC;;MAE1E;MACA,MAAMU,UAAU,GAAG,MAAMf,YAAY,CAACgB,iBAAiB,CAACT,EAAE,EAAEF,SAAS,CAAC;MAEtE,IAAI,CAACU,UAAU,EAAE;QACf,MAAM1E,IAAI,CAACoB,QAAQ,CACjB,yCAAyC8C,EAAE,KAAKJ,IAAI,KAAKE,SAAS,EACpE,CAAC;MACH;MAEA,MAAMY,YAAY,GAAG9C,QAAQ,CAAC+C,iBAAiB,IAAIH,UAAU,CAACI,WAAW;MAEzE3E,sCAAsC,CAACyE,YAAY,EAAEb,SAAS,CAAC;;MAE/D;MACAxC,MAAM,CAACiD,MAAM,CAACC,IAAI,CAChB,sCAAsCP,EAAE,KAAKJ,IAAI,KAAKE,SAAS,EACjE,CAAC;;MAED;MACA,MAAMe,QAAQ,GAAG,CACfhB,SAAS,GACL,GAAGnC,MAAM,GAAG1B,mBAAmB,IAAI8D,SAAS,IAAIF,IAAI,EAAE,GACtD,GAAGlC,MAAM,IAAIkC,IAAI,EAAE,EACvBkB,SAAS,CAAC,CAAC,CAAC;;MAEd;MACA,MAAM7D,KAAK,GAAG,IAAIT,SAAS,CACzBgE,UAAU,EACV;QAAEK;MAAS,CAAC,EACZtB,QAAQ,EACRC,WACF,CAAC;;MAED;MACAU,IAAI,GAAG;QAAEjD,KAAK;QAAEoD,SAAS,EAAE9C,KAAK,CAAC8C;MAAU,CAAC;MAC5ChD,MAAM,CAACN,GAAG,CAACoD,MAAM,CAACY,GAAG,CAACd,GAAG,EAAEC,IAAI,CAAC;IAClC;;IAEA;IACA;IACAtD,OAAO,CAACG,GAAG,CAACE,KAAK,GAAGiD,IAAI,CAACjD,KAAK;IAE9B,OAAOJ,CAAC,CAAC8C,QAAQ;EACnB;EAEA,OAAOD,OAAO;AAChB;AAEA,OAAO,SAASsB,eAAeA,CAC7BpE,OAAoB,EACpBC,CAA6C,EAC7C;EACA,MAAM;IAAEI;EAAM,CAAC,GAAGL,OAAO,CAACG,GAAG;EAE7B,MAAMkE,WAAW,GAAGhE,KAAK,GAAG,IAAIA,KAAK,CAAC4D,QAAQ,EAAE,GAAG,EAAE;EACrD,OAAOtE,OAAO,CAACK,OAAO,EAAEC,CAAC,EAAE,GAAGoE,WAAW,GAAG3E,YAAY,CAACW,KAAK,CAAC,EAAE,CAAC;AACpE","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
2
+ 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>)[];
@@ -0,0 +1,168 @@
1
+ import { hasFormComponents, slugSchema } from '@defra/forms-model';
2
+ import Boom from '@hapi/boom';
3
+ import Joi from 'joi';
4
+ import { normalisePath, proceed, redirectPath } from "../helpers.js";
5
+ import { SummaryViewModel } from "../models/index.js";
6
+ import { format } from "../outputFormatters/machine/v1.js";
7
+ import { getFormSubmissionData } from "../pageControllers/SummaryPageController.js";
8
+ import { dispatchHandler, redirectOrMakeHandler } from "./index.js";
9
+ import { actionSchema, crumbSchema, itemIdSchema, pathSchema, stateSchema } from "../../../schemas/index.js";
10
+ import * as httpService from "../../../services/httpService.js";
11
+ function getHandler(request, h) {
12
+ const {
13
+ params
14
+ } = request;
15
+ if (normalisePath(params.path) === '') {
16
+ return dispatchHandler(request, h);
17
+ }
18
+ return redirectOrMakeHandler(request, h, async (page, context) => {
19
+ // Check for a page onLoad HTTP event and if one exists,
20
+ // call it and assign the response to the context data
21
+ const {
22
+ events
23
+ } = page;
24
+ const {
25
+ model
26
+ } = request.app;
27
+ if (!model) {
28
+ throw Boom.notFound(`No model found for /${params.path}`);
29
+ }
30
+ if (events?.onLoad && events.onLoad.type === 'http') {
31
+ const {
32
+ options
33
+ } = events.onLoad;
34
+ const {
35
+ url
36
+ } = options;
37
+
38
+ // TODO: Update structured data POST payload with when helper
39
+ // is updated to removing the dependency on `SummaryViewModel` etc.
40
+ const viewModel = new SummaryViewModel(request, page, context);
41
+ const items = getFormSubmissionData(viewModel.context, viewModel.details);
42
+
43
+ // @ts-expect-error - function signature will be refactored in the next iteration of the formatter
44
+ const payload = format(items, model, undefined, undefined);
45
+ const {
46
+ payload: response
47
+ } = await httpService.postJson(url, {
48
+ payload
49
+ });
50
+ Object.assign(context.data, response);
51
+ }
52
+ return page.makeGetRouteHandler()(request, context, h);
53
+ });
54
+ }
55
+ function postHandler(request, h) {
56
+ const {
57
+ query
58
+ } = request;
59
+ return redirectOrMakeHandler(request, h, (page, context) => {
60
+ const {
61
+ pageDef
62
+ } = page;
63
+ const {
64
+ isForceAccess
65
+ } = context;
66
+
67
+ // Redirect to GET for preview URL direct access
68
+ if (isForceAccess && !hasFormComponents(pageDef)) {
69
+ return proceed(request, h, redirectPath(page.href, query));
70
+ }
71
+ return page.makePostRouteHandler()(request, context, h);
72
+ });
73
+ }
74
+ export function getRoutes(getRouteOptions, postRouteOptions) {
75
+ return [{
76
+ method: 'get',
77
+ path: '/{slug}',
78
+ handler: getHandler,
79
+ options: {
80
+ ...getRouteOptions,
81
+ validate: {
82
+ params: Joi.object().keys({
83
+ slug: slugSchema
84
+ })
85
+ }
86
+ }
87
+ }, {
88
+ method: 'get',
89
+ path: '/preview/{state}/{slug}',
90
+ handler: dispatchHandler,
91
+ options: {
92
+ ...getRouteOptions,
93
+ validate: {
94
+ params: Joi.object().keys({
95
+ state: stateSchema,
96
+ slug: slugSchema
97
+ })
98
+ }
99
+ }
100
+ }, {
101
+ method: 'get',
102
+ path: '/{slug}/{path}/{itemId?}',
103
+ handler: getHandler,
104
+ options: {
105
+ ...getRouteOptions,
106
+ validate: {
107
+ params: Joi.object().keys({
108
+ slug: slugSchema,
109
+ path: pathSchema,
110
+ itemId: itemIdSchema.optional()
111
+ })
112
+ }
113
+ }
114
+ }, {
115
+ method: 'get',
116
+ path: '/preview/{state}/{slug}/{path}/{itemId?}',
117
+ handler: getHandler,
118
+ options: {
119
+ ...getRouteOptions,
120
+ validate: {
121
+ params: Joi.object().keys({
122
+ state: stateSchema,
123
+ slug: slugSchema,
124
+ path: pathSchema,
125
+ itemId: itemIdSchema.optional()
126
+ })
127
+ }
128
+ }
129
+ }, {
130
+ method: 'post',
131
+ path: '/{slug}/{path}/{itemId?}',
132
+ handler: postHandler,
133
+ options: {
134
+ ...postRouteOptions,
135
+ validate: {
136
+ params: Joi.object().keys({
137
+ slug: slugSchema,
138
+ path: pathSchema,
139
+ itemId: itemIdSchema.optional()
140
+ }),
141
+ payload: Joi.object().keys({
142
+ crumb: crumbSchema,
143
+ action: actionSchema
144
+ }).unknown(true).required()
145
+ }
146
+ }
147
+ }, {
148
+ method: 'post',
149
+ path: '/preview/{state}/{slug}/{path}/{itemId?}',
150
+ handler: postHandler,
151
+ options: {
152
+ ...postRouteOptions,
153
+ validate: {
154
+ params: Joi.object().keys({
155
+ state: stateSchema,
156
+ slug: slugSchema,
157
+ path: pathSchema,
158
+ itemId: itemIdSchema.optional()
159
+ }),
160
+ payload: Joi.object().keys({
161
+ crumb: crumbSchema,
162
+ action: actionSchema
163
+ }).unknown(true).required()
164
+ }
165
+ }
166
+ }];
167
+ }
168
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +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","getHandler","request","h","params","path","page","context","events","model","app","notFound","onLoad","type","options","url","viewModel","items","details","payload","undefined","response","postJson","Object","assign","data","makeGetRouteHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","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 } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseToolkit,\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 { SummaryViewModel } 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 {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.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 crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nfunction 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(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(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\nfunction 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\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}',\n handler: getHandler,\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: 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 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 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 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"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
2
+ 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>)[];