@defra/forms-engine-plugin 0.1.18 → 0.1.20

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 (116) hide show
  1. package/.server/client/javascripts/application.d.ts +1 -0
  2. package/.server/client/javascripts/file-upload.d.ts +9 -0
  3. package/.server/config/index.d.ts +45 -0
  4. package/.server/config/index.js +1 -1
  5. package/.server/config/index.js.map +1 -1
  6. package/.server/index.d.ts +1 -0
  7. package/.server/server/common/helpers/logging/logger-options.d.ts +80 -0
  8. package/.server/server/common/helpers/logging/logger.d.ts +1 -0
  9. package/.server/server/common/helpers/logging/request-logger.d.ts +83 -0
  10. package/.server/server/common/helpers/logging/request-tracing.d.ts +7 -0
  11. package/.server/server/common/helpers/redis-client.d.ts +9 -0
  12. package/.server/server/constants.d.ts +3 -0
  13. package/.server/server/devserver/dxt-devtool-baselayout.html +1 -1
  14. package/.server/server/index.d.ts +3 -0
  15. package/.server/server/plugins/crumb.d.ts +4 -0
  16. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +55 -0
  17. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +15 -0
  18. package/.server/server/plugins/engine/components/ComponentBase.d.ts +33 -0
  19. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +60 -0
  20. package/.server/server/plugins/engine/components/DatePartsField.d.ts +76 -0
  21. package/.server/server/plugins/engine/components/Details.d.ts +53 -0
  22. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +59 -0
  23. package/.server/server/plugins/engine/components/FileUploadField.d.ts +79 -0
  24. package/.server/server/plugins/engine/components/FormComponent.d.ts +95 -0
  25. package/.server/server/plugins/engine/components/Html.d.ts +53 -0
  26. package/.server/server/plugins/engine/components/InsetText.d.ts +52 -0
  27. package/.server/server/plugins/engine/components/List.d.ts +56 -0
  28. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +71 -0
  29. package/.server/server/plugins/engine/components/Markdown.d.ts +53 -0
  30. package/.server/server/plugins/engine/components/MonthYearField.d.ts +75 -0
  31. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +67 -0
  32. package/.server/server/plugins/engine/components/NumberField.d.ts +68 -0
  33. package/.server/server/plugins/engine/components/RadiosField.d.ts +6 -0
  34. package/.server/server/plugins/engine/components/SelectField.d.ts +55 -0
  35. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +60 -0
  36. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +62 -0
  37. package/.server/server/plugins/engine/components/TextField.d.ts +19 -0
  38. package/.server/server/plugins/engine/components/UkAddressField.d.ts +80 -0
  39. package/.server/server/plugins/engine/components/YesNoField.d.ts +15 -0
  40. package/.server/server/plugins/engine/components/constants.d.ts +1 -0
  41. package/.server/server/plugins/engine/components/helpers.d.ts +40 -0
  42. package/.server/server/plugins/engine/components/index.d.ts +24 -0
  43. package/.server/server/plugins/engine/components/types.d.ts +100 -0
  44. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +8 -0
  45. package/.server/server/plugins/engine/helpers.d.ts +74 -0
  46. package/.server/server/plugins/engine/index.d.ts +10 -0
  47. package/.server/server/plugins/engine/models/FormModel.d.ts +59 -0
  48. package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.d.ts +1 -0
  49. package/.server/server/plugins/engine/models/Section.d.ts +1 -0
  50. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +25 -0
  51. package/.server/server/plugins/engine/models/index.d.ts +2 -0
  52. package/.server/server/plugins/engine/models/types.d.ts +87 -0
  53. package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +5 -0
  54. package/.server/server/plugins/engine/outputFormatters/index.d.ts +7 -0
  55. package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +5 -0
  56. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +5 -0
  57. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +61 -0
  58. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +43 -0
  59. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +58 -0
  60. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +35 -0
  61. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +50 -0
  62. package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +12 -0
  63. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +26 -0
  64. package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +9 -0
  65. package/.server/server/plugins/engine/pageControllers/helpers.d.ts +19 -0
  66. package/.server/server/plugins/engine/pageControllers/index.d.ts +8 -0
  67. package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +8 -0
  68. package/.server/server/plugins/engine/plugin.d.ts +33 -0
  69. package/.server/server/plugins/engine/referenceNumbers.d.ts +5 -0
  70. package/.server/server/plugins/engine/services/formSubmissionService.d.ts +24 -0
  71. package/.server/server/plugins/engine/services/formsService.d.ts +16 -0
  72. package/.server/server/plugins/engine/services/index.d.ts +3 -0
  73. package/.server/server/plugins/engine/services/localFormsService.d.ts +1 -0
  74. package/.server/server/plugins/engine/services/notifyService.d.ts +5 -0
  75. package/.server/server/plugins/engine/services/uploadService.d.ts +14 -0
  76. package/.server/server/plugins/engine/types.d.ts +256 -0
  77. package/.server/server/plugins/errorPages.d.ts +7 -0
  78. package/.server/server/plugins/nunjucks/context.d.ts +16 -0
  79. package/.server/server/plugins/nunjucks/context.js +8 -10
  80. package/.server/server/plugins/nunjucks/context.js.map +1 -1
  81. package/.server/server/plugins/nunjucks/environment.d.ts +21 -0
  82. package/.server/server/plugins/nunjucks/filters/answer.d.ts +7 -0
  83. package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +8 -0
  84. package/.server/server/plugins/nunjucks/filters/field.d.ts +7 -0
  85. package/.server/server/plugins/nunjucks/filters/highlight.d.ts +7 -0
  86. package/.server/server/plugins/nunjucks/filters/href.d.ts +7 -0
  87. package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -0
  88. package/.server/server/plugins/nunjucks/filters/inspect.d.ts +6 -0
  89. package/.server/server/plugins/nunjucks/filters/page.d.ts +7 -0
  90. package/.server/server/plugins/nunjucks/index.d.ts +3 -0
  91. package/.server/server/plugins/nunjucks/plugin.d.ts +6 -0
  92. package/.server/server/plugins/nunjucks/render.d.ts +21 -0
  93. package/.server/server/plugins/nunjucks/types.d.ts +56 -0
  94. package/.server/server/plugins/nunjucks/types.js +0 -7
  95. package/.server/server/plugins/nunjucks/types.js.map +1 -1
  96. package/.server/server/plugins/pulse.d.ts +11 -0
  97. package/.server/server/plugins/session.d.ts +24 -0
  98. package/.server/server/routes/index.d.ts +1 -0
  99. package/.server/server/routes/public.d.ts +15 -0
  100. package/.server/server/routes/types.d.ts +38 -0
  101. package/.server/server/schemas/index.d.ts +10 -0
  102. package/.server/server/secure-context.d.ts +12 -0
  103. package/.server/server/services/cacheService.d.ts +49 -0
  104. package/.server/server/services/httpService.d.ts +57 -0
  105. package/.server/server/services/index.d.ts +1 -0
  106. package/.server/server/types.d.ts +31 -0
  107. package/.server/server/utils/file-form-service.d.ts +50 -0
  108. package/.server/server/utils/notify.d.ts +17 -0
  109. package/.server/server/utils/secure-context/get-trust-store-certs.d.ts +1 -0
  110. package/.server/server/utils/type-utils.d.ts +3 -0
  111. package/.server/server/utils/utils.d.ts +7 -0
  112. package/package.json +3 -2
  113. package/src/config/index.ts +1 -1
  114. package/src/server/devserver/dxt-devtool-baselayout.html +1 -1
  115. package/src/server/plugins/nunjucks/context.js +9 -10
  116. package/src/server/plugins/nunjucks/types.js +0 -7
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Build the upload status URL given the current pathname and the upload ID.
3
+ * @param {string} pathname – e.g. window.location.pathname
4
+ * @param {string} uploadId
5
+ * @returns {string} e.g. "/form/upload-status/abc123"
6
+ */
7
+ export function buildUploadStatusUrl(pathname: string, uploadId: string): string;
8
+ export function initFileUpload(): void;
9
+ export const MAX_POLLING_DURATION: 300;
@@ -0,0 +1,45 @@
1
+ import convict, { type SchemaObj } from 'convict';
2
+ import { type LevelWithSilent } from 'pino';
3
+ import 'dotenv/config';
4
+ export declare const config: convict.Config<{
5
+ appDir: string;
6
+ publicDir: string;
7
+ port: number;
8
+ env: string;
9
+ cdpEnvironment: string;
10
+ enforceCsrf: boolean;
11
+ isProduction: boolean;
12
+ isDevelopment: boolean;
13
+ isTest: boolean;
14
+ serviceName: string;
15
+ serviceVersion: SchemaObj<string>;
16
+ feedbackLink: SchemaObj<string>;
17
+ phaseTag: string;
18
+ sessionTimeout: number;
19
+ confirmationSessionTimeout: number;
20
+ sessionCookiePassword: SchemaObj<string>;
21
+ redis: {
22
+ host: SchemaObj<string>;
23
+ username: SchemaObj<string>;
24
+ password: SchemaObj<string>;
25
+ keyPrefix: SchemaObj<string>;
26
+ };
27
+ tracing: {
28
+ header: SchemaObj<string>;
29
+ };
30
+ notifyTemplateId: SchemaObj<string>;
31
+ notifyAPIKey: SchemaObj<string>;
32
+ designerUrl: SchemaObj<string>;
33
+ submissionUrl: SchemaObj<string>;
34
+ uploaderUrl: SchemaObj<string>;
35
+ uploaderBucketName: string;
36
+ log: {
37
+ enabled: boolean;
38
+ level: SchemaObj<LevelWithSilent>;
39
+ format: SchemaObj<"ecs" | "pino-pretty">;
40
+ redact: [string, string, string];
41
+ };
42
+ safelist: [string];
43
+ stagingPrefix: string;
44
+ submissionEmailAddress: SchemaObj<string>;
45
+ }>;
@@ -64,7 +64,7 @@ export const config = convict({
64
64
  serviceName: {
65
65
  doc: 'Applications Service Name',
66
66
  format: String,
67
- default: 'Submit a form to Defra'
67
+ default: 'Digital Express Toolkit'
68
68
  },
69
69
  serviceVersion: {
70
70
  doc: 'The service version, this variable is injected into your docker container in CDP environments',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["resolve","convict","isProduction","process","env","NODE_ENV","isDev","isTest","oneMinute","oneHour","config","appDir","format","String","default","import","meta","dirname","publicDir","port","doc","cdpEnvironment","enforceCsrf","Boolean","isDevelopment","serviceName","serviceVersion","nullable","feedbackLink","phaseTag","sessionTimeout","Number","confirmationSessionTimeout","sessionCookiePassword","sensitive","redis","host","username","password","keyPrefix","tracing","header","notifyTemplateId","notifyAPIKey","designerUrl","submissionUrl","uploaderUrl","uploaderBucketName","log","enabled","level","redact","Array","safelist","stagingPrefix","submissionEmailAddress","validate","allowed"],"sources":["../../src/config/index.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport convict, { type SchemaObj } from 'convict'\nimport { type LevelWithSilent } from 'pino'\n\nimport 'dotenv/config'\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst isDev = process.env.NODE_ENV !== 'production'\nconst isTest = process.env.NODE_ENV === 'test'\n\nconst oneMinute = 1000 * 60\nconst oneHour = oneMinute * 60\n\nexport const config = convict({\n appDir: {\n format: String,\n default: resolve(import.meta.dirname, '../server')\n },\n publicDir: {\n format: String,\n default: isTest\n ? resolve(import.meta.dirname, '../../test/fixtures')\n : resolve(import.meta.dirname, '../../.public')\n },\n\n /**\n * Server\n */\n port: {\n format: 'port',\n default: 3009,\n env: 'PORT'\n },\n env: {\n doc: 'The application environment.',\n format: ['production', 'development', 'test'],\n default: 'development',\n env: 'NODE_ENV'\n },\n cdpEnvironment: {\n doc: 'The CDP environment the app is currently in, with the addition of \"local\"',\n format: [\n 'local',\n 'infra-dev',\n 'management',\n 'dev',\n 'test',\n 'perf-test',\n 'ext-test',\n 'prod'\n ],\n default: 'local',\n env: 'ENVIRONMENT'\n },\n enforceCsrf: {\n format: Boolean,\n default: isProduction,\n env: 'ENFORCE_CSRF'\n },\n\n /**\n * Helper flags\n */\n isProduction: {\n doc: 'If this application running in the production environment',\n format: Boolean,\n default: isProduction\n },\n isDevelopment: {\n doc: 'If this application running in the development environment',\n format: Boolean,\n default: isDev\n },\n isTest: {\n doc: 'If this application running in the test environment',\n format: Boolean,\n default: isTest\n },\n\n /**\n * Service\n */\n serviceName: {\n doc: 'Applications Service Name',\n format: String,\n default: 'Submit a form to Defra'\n },\n serviceVersion: {\n doc: 'The service version, this variable is injected into your docker container in CDP environments',\n format: String,\n nullable: true,\n default: '',\n env: 'SERVICE_VERSION'\n } as SchemaObj<string>,\n feedbackLink: {\n doc: 'Used in your phase banner. Can be a URL or more commonly mailto mailto:feedback@department.gov.uk',\n format: String,\n default: '',\n env: 'FEEDBACK_LINK'\n } as SchemaObj<string>,\n phaseTag: {\n format: String,\n default: 'beta', // Accepts \"alpha\" |\"beta\" | \"\"\n env: 'PHASE_TAG'\n },\n\n /**\n * Session storage\n * Redis integration is optional, but recommended for production environments.\n */\n sessionTimeout: {\n format: Number,\n default: oneHour * 24, // 1 day\n env: 'SESSION_TIMEOUT'\n },\n confirmationSessionTimeout: {\n format: Number,\n default: oneMinute * 20,\n env: 'CONFIRMATION_SESSION_TIMEOUT'\n },\n sessionCookiePassword: {\n format: String,\n default: '',\n sensitive: true,\n env: 'SESSION_COOKIE_PASSWORD'\n } as SchemaObj<string>,\n redis: {\n host: {\n doc: 'Redis cache host',\n format: String,\n default: '',\n env: 'REDIS_HOST'\n } as SchemaObj<string>,\n username: {\n doc: 'Redis cache username',\n format: String,\n default: '',\n env: 'REDIS_USERNAME'\n } as SchemaObj<string>,\n password: {\n doc: 'Redis cache password',\n format: '*',\n default: '',\n sensitive: true,\n env: 'REDIS_PASSWORD'\n } as SchemaObj<string>,\n keyPrefix: {\n doc: 'Redis cache key prefix name used to isolate the cached results across multiple clients',\n format: String,\n default: '',\n env: 'REDIS_KEY_PREFIX'\n } as SchemaObj<string>\n },\n tracing: {\n header: {\n doc: 'Tracing header name',\n format: String,\n default: 'x-cdp-request-id',\n env: 'TRACING_HEADER'\n } as SchemaObj<string>\n },\n\n /**\n * Email outputs\n * Email outputs will use notify to send an email to a single inbox.\n */\n notifyTemplateId: {\n format: String,\n default: '',\n env: 'NOTIFY_TEMPLATE_ID'\n } as SchemaObj<string>,\n notifyAPIKey: {\n format: String,\n default: '',\n env: 'NOTIFY_API_KEY'\n } as SchemaObj<string>,\n\n /**\n * API integrations\n */\n designerUrl: {\n format: String,\n default: 'http://localhost:3000',\n env: 'DESIGNER_URL'\n } as SchemaObj<string>,\n\n submissionUrl: {\n format: String,\n default: 'http://localhost:3002',\n env: 'SUBMISSION_URL'\n } as SchemaObj<string>,\n\n uploaderUrl: {\n format: String,\n default: 'http://localhost:7337',\n env: 'UPLOADER_URL'\n } as SchemaObj<string>,\n\n uploaderBucketName: {\n format: String,\n default: 'files',\n env: 'UPLOADER_BUCKET_NAME'\n },\n\n /**\n * Logging\n */\n log: {\n enabled: {\n doc: 'Is logging enabled',\n format: Boolean,\n default: !isTest,\n env: 'LOG_ENABLED'\n },\n level: {\n doc: 'Logging level',\n format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'],\n default: 'info',\n env: 'LOG_LEVEL'\n } as SchemaObj<LevelWithSilent>,\n format: {\n doc: 'Format to output logs in.',\n format: ['ecs', 'pino-pretty'],\n default: isProduction ? 'ecs' : 'pino-pretty',\n env: 'LOG_FORMAT'\n } as SchemaObj<'ecs' | 'pino-pretty'>,\n redact: {\n doc: 'Log paths to redact',\n format: Array,\n default: isProduction\n ? ['req.headers.authorization', 'req.headers.cookie', 'res.headers']\n : ['req', 'res', 'responseTime']\n }\n },\n\n safelist: {\n format: Array,\n default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'],\n env: 'SAFELIST'\n },\n\n stagingPrefix: {\n doc: 'Prefix for staging files in S3',\n format: String,\n default: 'staging',\n env: 'STAGING_PREFIX'\n },\n\n submissionEmailAddress: {\n doc: 'Email address to send the form to (local devtool only)',\n format: String,\n default: '',\n env: 'SUBMISSION_EMAIL_ADDRESS'\n } as SchemaObj<string>\n})\n\nconfig.validate({ allowed: 'strict' })\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["resolve","convict","isProduction","process","env","NODE_ENV","isDev","isTest","oneMinute","oneHour","config","appDir","format","String","default","import","meta","dirname","publicDir","port","doc","cdpEnvironment","enforceCsrf","Boolean","isDevelopment","serviceName","serviceVersion","nullable","feedbackLink","phaseTag","sessionTimeout","Number","confirmationSessionTimeout","sessionCookiePassword","sensitive","redis","host","username","password","keyPrefix","tracing","header","notifyTemplateId","notifyAPIKey","designerUrl","submissionUrl","uploaderUrl","uploaderBucketName","log","enabled","level","redact","Array","safelist","stagingPrefix","submissionEmailAddress","validate","allowed"],"sources":["../../src/config/index.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport convict, { type SchemaObj } from 'convict'\nimport { type LevelWithSilent } from 'pino'\n\nimport 'dotenv/config'\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst isDev = process.env.NODE_ENV !== 'production'\nconst isTest = process.env.NODE_ENV === 'test'\n\nconst oneMinute = 1000 * 60\nconst oneHour = oneMinute * 60\n\nexport const config = convict({\n appDir: {\n format: String,\n default: resolve(import.meta.dirname, '../server')\n },\n publicDir: {\n format: String,\n default: isTest\n ? resolve(import.meta.dirname, '../../test/fixtures')\n : resolve(import.meta.dirname, '../../.public')\n },\n\n /**\n * Server\n */\n port: {\n format: 'port',\n default: 3009,\n env: 'PORT'\n },\n env: {\n doc: 'The application environment.',\n format: ['production', 'development', 'test'],\n default: 'development',\n env: 'NODE_ENV'\n },\n cdpEnvironment: {\n doc: 'The CDP environment the app is currently in, with the addition of \"local\"',\n format: [\n 'local',\n 'infra-dev',\n 'management',\n 'dev',\n 'test',\n 'perf-test',\n 'ext-test',\n 'prod'\n ],\n default: 'local',\n env: 'ENVIRONMENT'\n },\n enforceCsrf: {\n format: Boolean,\n default: isProduction,\n env: 'ENFORCE_CSRF'\n },\n\n /**\n * Helper flags\n */\n isProduction: {\n doc: 'If this application running in the production environment',\n format: Boolean,\n default: isProduction\n },\n isDevelopment: {\n doc: 'If this application running in the development environment',\n format: Boolean,\n default: isDev\n },\n isTest: {\n doc: 'If this application running in the test environment',\n format: Boolean,\n default: isTest\n },\n\n /**\n * Service\n */\n serviceName: {\n doc: 'Applications Service Name',\n format: String,\n default: 'Digital Express Toolkit'\n },\n serviceVersion: {\n doc: 'The service version, this variable is injected into your docker container in CDP environments',\n format: String,\n nullable: true,\n default: '',\n env: 'SERVICE_VERSION'\n } as SchemaObj<string>,\n feedbackLink: {\n doc: 'Used in your phase banner. Can be a URL or more commonly mailto mailto:feedback@department.gov.uk',\n format: String,\n default: '',\n env: 'FEEDBACK_LINK'\n } as SchemaObj<string>,\n phaseTag: {\n format: String,\n default: 'beta', // Accepts \"alpha\" |\"beta\" | \"\"\n env: 'PHASE_TAG'\n },\n\n /**\n * Session storage\n * Redis integration is optional, but recommended for production environments.\n */\n sessionTimeout: {\n format: Number,\n default: oneHour * 24, // 1 day\n env: 'SESSION_TIMEOUT'\n },\n confirmationSessionTimeout: {\n format: Number,\n default: oneMinute * 20,\n env: 'CONFIRMATION_SESSION_TIMEOUT'\n },\n sessionCookiePassword: {\n format: String,\n default: '',\n sensitive: true,\n env: 'SESSION_COOKIE_PASSWORD'\n } as SchemaObj<string>,\n redis: {\n host: {\n doc: 'Redis cache host',\n format: String,\n default: '',\n env: 'REDIS_HOST'\n } as SchemaObj<string>,\n username: {\n doc: 'Redis cache username',\n format: String,\n default: '',\n env: 'REDIS_USERNAME'\n } as SchemaObj<string>,\n password: {\n doc: 'Redis cache password',\n format: '*',\n default: '',\n sensitive: true,\n env: 'REDIS_PASSWORD'\n } as SchemaObj<string>,\n keyPrefix: {\n doc: 'Redis cache key prefix name used to isolate the cached results across multiple clients',\n format: String,\n default: '',\n env: 'REDIS_KEY_PREFIX'\n } as SchemaObj<string>\n },\n tracing: {\n header: {\n doc: 'Tracing header name',\n format: String,\n default: 'x-cdp-request-id',\n env: 'TRACING_HEADER'\n } as SchemaObj<string>\n },\n\n /**\n * Email outputs\n * Email outputs will use notify to send an email to a single inbox.\n */\n notifyTemplateId: {\n format: String,\n default: '',\n env: 'NOTIFY_TEMPLATE_ID'\n } as SchemaObj<string>,\n notifyAPIKey: {\n format: String,\n default: '',\n env: 'NOTIFY_API_KEY'\n } as SchemaObj<string>,\n\n /**\n * API integrations\n */\n designerUrl: {\n format: String,\n default: 'http://localhost:3000',\n env: 'DESIGNER_URL'\n } as SchemaObj<string>,\n\n submissionUrl: {\n format: String,\n default: 'http://localhost:3002',\n env: 'SUBMISSION_URL'\n } as SchemaObj<string>,\n\n uploaderUrl: {\n format: String,\n default: 'http://localhost:7337',\n env: 'UPLOADER_URL'\n } as SchemaObj<string>,\n\n uploaderBucketName: {\n format: String,\n default: 'files',\n env: 'UPLOADER_BUCKET_NAME'\n },\n\n /**\n * Logging\n */\n log: {\n enabled: {\n doc: 'Is logging enabled',\n format: Boolean,\n default: !isTest,\n env: 'LOG_ENABLED'\n },\n level: {\n doc: 'Logging level',\n format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'],\n default: 'info',\n env: 'LOG_LEVEL'\n } as SchemaObj<LevelWithSilent>,\n format: {\n doc: 'Format to output logs in.',\n format: ['ecs', 'pino-pretty'],\n default: isProduction ? 'ecs' : 'pino-pretty',\n env: 'LOG_FORMAT'\n } as SchemaObj<'ecs' | 'pino-pretty'>,\n redact: {\n doc: 'Log paths to redact',\n format: Array,\n default: isProduction\n ? ['req.headers.authorization', 'req.headers.cookie', 'res.headers']\n : ['req', 'res', 'responseTime']\n }\n },\n\n safelist: {\n format: Array,\n default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'],\n env: 'SAFELIST'\n },\n\n stagingPrefix: {\n doc: 'Prefix for staging files in S3',\n format: String,\n default: 'staging',\n env: 'STAGING_PREFIX'\n },\n\n submissionEmailAddress: {\n doc: 'Email address to send the form to (local devtool only)',\n format: String,\n default: '',\n env: 'SUBMISSION_EMAIL_ADDRESS'\n } as SchemaObj<string>\n})\n\nconfig.validate({ allowed: 'strict' })\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,WAAW;AAEnC,OAAOC,OAAO,MAA0B,SAAS;AAGjD,OAAO,eAAe;AAEtB,MAAMC,YAAY,GAAGC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY;AAC1D,MAAMC,KAAK,GAAGH,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY;AACnD,MAAME,MAAM,GAAGJ,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,MAAM;AAE9C,MAAMG,SAAS,GAAG,IAAI,GAAG,EAAE;AAC3B,MAAMC,OAAO,GAAGD,SAAS,GAAG,EAAE;AAE9B,OAAO,MAAME,MAAM,GAAGT,OAAO,CAAC;EAC5BU,MAAM,EAAE;IACNC,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAEd,OAAO,CAACe,MAAM,CAACC,IAAI,CAACC,OAAO,EAAE,WAAW;EACnD,CAAC;EACDC,SAAS,EAAE;IACTN,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAEP,MAAM,GACXP,OAAO,CAACe,MAAM,CAACC,IAAI,CAACC,OAAO,EAAE,qBAAqB,CAAC,GACnDjB,OAAO,CAACe,MAAM,CAACC,IAAI,CAACC,OAAO,EAAE,eAAe;EAClD,CAAC;EAED;AACF;AACA;EACEE,IAAI,EAAE;IACJP,MAAM,EAAE,MAAM;IACdE,OAAO,EAAE,IAAI;IACbV,GAAG,EAAE;EACP,CAAC;EACDA,GAAG,EAAE;IACHgB,GAAG,EAAE,8BAA8B;IACnCR,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAC7CE,OAAO,EAAE,aAAa;IACtBV,GAAG,EAAE;EACP,CAAC;EACDiB,cAAc,EAAE;IACdD,GAAG,EAAE,2EAA2E;IAChFR,MAAM,EAAE,CACN,OAAO,EACP,WAAW,EACX,YAAY,EACZ,KAAK,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,MAAM,CACP;IACDE,OAAO,EAAE,OAAO;IAChBV,GAAG,EAAE;EACP,CAAC;EACDkB,WAAW,EAAE;IACXV,MAAM,EAAEW,OAAO;IACfT,OAAO,EAAEZ,YAAY;IACrBE,GAAG,EAAE;EACP,CAAC;EAED;AACF;AACA;EACEF,YAAY,EAAE;IACZkB,GAAG,EAAE,2DAA2D;IAChER,MAAM,EAAEW,OAAO;IACfT,OAAO,EAAEZ;EACX,CAAC;EACDsB,aAAa,EAAE;IACbJ,GAAG,EAAE,4DAA4D;IACjER,MAAM,EAAEW,OAAO;IACfT,OAAO,EAAER;EACX,CAAC;EACDC,MAAM,EAAE;IACNa,GAAG,EAAE,qDAAqD;IAC1DR,MAAM,EAAEW,OAAO;IACfT,OAAO,EAAEP;EACX,CAAC;EAED;AACF;AACA;EACEkB,WAAW,EAAE;IACXL,GAAG,EAAE,2BAA2B;IAChCR,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE;EACX,CAAC;EACDY,cAAc,EAAE;IACdN,GAAG,EAAE,+FAA+F;IACpGR,MAAM,EAAEC,MAAM;IACdc,QAAQ,EAAE,IAAI;IACdb,OAAO,EAAE,EAAE;IACXV,GAAG,EAAE;EACP,CAAsB;EACtBwB,YAAY,EAAE;IACZR,GAAG,EAAE,mGAAmG;IACxGR,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,EAAE;IACXV,GAAG,EAAE;EACP,CAAsB;EACtByB,QAAQ,EAAE;IACRjB,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,MAAM;IAAE;IACjBV,GAAG,EAAE;EACP,CAAC;EAED;AACF;AACA;AACA;EACE0B,cAAc,EAAE;IACdlB,MAAM,EAAEmB,MAAM;IACdjB,OAAO,EAAEL,OAAO,GAAG,EAAE;IAAE;IACvBL,GAAG,EAAE;EACP,CAAC;EACD4B,0BAA0B,EAAE;IAC1BpB,MAAM,EAAEmB,MAAM;IACdjB,OAAO,EAAEN,SAAS,GAAG,EAAE;IACvBJ,GAAG,EAAE;EACP,CAAC;EACD6B,qBAAqB,EAAE;IACrBrB,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,EAAE;IACXoB,SAAS,EAAE,IAAI;IACf9B,GAAG,EAAE;EACP,CAAsB;EACtB+B,KAAK,EAAE;IACLC,IAAI,EAAE;MACJhB,GAAG,EAAE,kBAAkB;MACvBR,MAAM,EAAEC,MAAM;MACdC,OAAO,EAAE,EAAE;MACXV,GAAG,EAAE;IACP,CAAsB;IACtBiC,QAAQ,EAAE;MACRjB,GAAG,EAAE,sBAAsB;MAC3BR,MAAM,EAAEC,MAAM;MACdC,OAAO,EAAE,EAAE;MACXV,GAAG,EAAE;IACP,CAAsB;IACtBkC,QAAQ,EAAE;MACRlB,GAAG,EAAE,sBAAsB;MAC3BR,MAAM,EAAE,GAAG;MACXE,OAAO,EAAE,EAAE;MACXoB,SAAS,EAAE,IAAI;MACf9B,GAAG,EAAE;IACP,CAAsB;IACtBmC,SAAS,EAAE;MACTnB,GAAG,EAAE,wFAAwF;MAC7FR,MAAM,EAAEC,MAAM;MACdC,OAAO,EAAE,EAAE;MACXV,GAAG,EAAE;IACP;EACF,CAAC;EACDoC,OAAO,EAAE;IACPC,MAAM,EAAE;MACNrB,GAAG,EAAE,qBAAqB;MAC1BR,MAAM,EAAEC,MAAM;MACdC,OAAO,EAAE,kBAAkB;MAC3BV,GAAG,EAAE;IACP;EACF,CAAC;EAED;AACF;AACA;AACA;EACEsC,gBAAgB,EAAE;IAChB9B,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,EAAE;IACXV,GAAG,EAAE;EACP,CAAsB;EACtBuC,YAAY,EAAE;IACZ/B,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,EAAE;IACXV,GAAG,EAAE;EACP,CAAsB;EAEtB;AACF;AACA;EACEwC,WAAW,EAAE;IACXhC,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,uBAAuB;IAChCV,GAAG,EAAE;EACP,CAAsB;EAEtByC,aAAa,EAAE;IACbjC,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,uBAAuB;IAChCV,GAAG,EAAE;EACP,CAAsB;EAEtB0C,WAAW,EAAE;IACXlC,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,uBAAuB;IAChCV,GAAG,EAAE;EACP,CAAsB;EAEtB2C,kBAAkB,EAAE;IAClBnC,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,OAAO;IAChBV,GAAG,EAAE;EACP,CAAC;EAED;AACF;AACA;EACE4C,GAAG,EAAE;IACHC,OAAO,EAAE;MACP7B,GAAG,EAAE,oBAAoB;MACzBR,MAAM,EAAEW,OAAO;MACfT,OAAO,EAAE,CAACP,MAAM;MAChBH,GAAG,EAAE;IACP,CAAC;IACD8C,KAAK,EAAE;MACL9B,GAAG,EAAE,eAAe;MACpBR,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;MACtEE,OAAO,EAAE,MAAM;MACfV,GAAG,EAAE;IACP,CAA+B;IAC/BQ,MAAM,EAAE;MACNQ,GAAG,EAAE,2BAA2B;MAChCR,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC;MAC9BE,OAAO,EAAEZ,YAAY,GAAG,KAAK,GAAG,aAAa;MAC7CE,GAAG,EAAE;IACP,CAAqC;IACrC+C,MAAM,EAAE;MACN/B,GAAG,EAAE,qBAAqB;MAC1BR,MAAM,EAAEwC,KAAK;MACbtC,OAAO,EAAEZ,YAAY,GACjB,CAAC,2BAA2B,EAAE,oBAAoB,EAAE,aAAa,CAAC,GAClE,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc;IACnC;EACF,CAAC;EAEDmD,QAAQ,EAAE;IACRzC,MAAM,EAAEwC,KAAK;IACbtC,OAAO,EAAE,CAAC,oDAAoD,CAAC;IAC/DV,GAAG,EAAE;EACP,CAAC;EAEDkD,aAAa,EAAE;IACblC,GAAG,EAAE,gCAAgC;IACrCR,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,SAAS;IAClBV,GAAG,EAAE;EACP,CAAC;EAEDmD,sBAAsB,EAAE;IACtBnC,GAAG,EAAE,wDAAwD;IAC7DR,MAAM,EAAEC,MAAM;IACdC,OAAO,EAAE,EAAE;IACXV,GAAG,EAAE;EACP;AACF,CAAC,CAAC;AAEFM,MAAM,CAAC8C,QAAQ,CAAC;EAAEC,OAAO,EAAE;AAAS,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,80 @@
1
+ import { type TransportSingleOptions } from 'pino';
2
+ export declare const loggerOptions: {
3
+ mixin(): {
4
+ trace?: {
5
+ id: string;
6
+ };
7
+ };
8
+ timestamp?: ((() => string) | boolean) | undefined;
9
+ enabled: boolean;
10
+ redact: string[] | import("pino").redactOptions;
11
+ level: "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent" | (string & {});
12
+ safe?: boolean | undefined;
13
+ name?: string | undefined;
14
+ serializers?: {
15
+ [key: string]: import("pino").default.SerializerFn;
16
+ } | undefined;
17
+ customLevels?: {} | undefined;
18
+ useOnlyCustomLevels?: boolean | undefined;
19
+ levelComparison?: "ASC" | "DESC" | ((current: number, expected: number) => boolean) | undefined;
20
+ mixinMergeStrategy?: ((mergeObject: object, mixinObject: object) => object) | undefined;
21
+ levelVal?: number | undefined;
22
+ messageKey?: string | undefined;
23
+ errorKey?: string | undefined;
24
+ nestedKey?: string | undefined;
25
+ browser?: {
26
+ asObject?: boolean;
27
+ formatters?: {
28
+ level?: (label: string, number: number) => object;
29
+ log?: (object: Record<string, unknown>) => Record<string, unknown>;
30
+ };
31
+ write?: import("pino").default.WriteFn | ({
32
+ fatal?: import("pino").default.WriteFn;
33
+ error?: import("pino").default.WriteFn;
34
+ warn?: import("pino").default.WriteFn;
35
+ info?: import("pino").default.WriteFn;
36
+ debug?: import("pino").default.WriteFn;
37
+ trace?: import("pino").default.WriteFn;
38
+ } & {
39
+ [logLevel: string]: import("pino").default.WriteFn;
40
+ });
41
+ serialize?: boolean | string[];
42
+ transmit?: {
43
+ level?: import("pino").default.LevelOrString;
44
+ send: (level: import("pino").default.Level, logEvent: import("pino").default.LogEvent) => void;
45
+ };
46
+ disabled?: boolean;
47
+ } | undefined;
48
+ base?: {
49
+ [key: string]: any;
50
+ } | null | undefined;
51
+ formatters?: {
52
+ level?: (label: string, number: number) => object;
53
+ bindings?: (bindings: import("pino").default.Bindings) => object;
54
+ log?: (object: Record<string, unknown>) => Record<string, unknown>;
55
+ } | undefined;
56
+ msgPrefix?: string | undefined;
57
+ hooks?: {
58
+ logMethod?: (this: import("pino").default.Logger, args: Parameters<import("pino").default.LogFn>, method: import("pino").default.LogFn, level: number) => void;
59
+ streamWrite?: (s: string) => string;
60
+ } | undefined;
61
+ depthLimit?: number | undefined;
62
+ edgeLimit?: number | undefined;
63
+ onChild?: ((child: import("pino").default.Logger<never, boolean>) => void) | undefined;
64
+ crlf?: boolean | undefined;
65
+ ignorePaths: string[];
66
+ } | {
67
+ mixin(): {
68
+ trace?: {
69
+ id: string;
70
+ };
71
+ };
72
+ transport: TransportSingleOptions;
73
+ enabled: boolean;
74
+ ignorePaths: string[];
75
+ redact: {
76
+ paths: [string, string, string];
77
+ remove: true;
78
+ };
79
+ level: import("pino").default.LevelWithSilent;
80
+ };
@@ -0,0 +1 @@
1
+ export declare function createLogger(): import("pino").Logger<never, boolean>;
@@ -0,0 +1,83 @@
1
+ import hapiPino from 'hapi-pino';
2
+ export declare const requestLogger: {
3
+ plugin: import("@hapi/hapi").Plugin<hapiPino.Options>;
4
+ options: {
5
+ mixin(): {
6
+ trace?: {
7
+ id: string;
8
+ };
9
+ };
10
+ timestamp?: ((() => string) | boolean) | undefined;
11
+ enabled: boolean;
12
+ redact: string[] | import("pino").redactOptions;
13
+ level: "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent" | (string & {});
14
+ safe?: boolean | undefined;
15
+ name?: string | undefined;
16
+ serializers?: {
17
+ [key: string]: import("pino").default.SerializerFn;
18
+ } | undefined;
19
+ customLevels?: {} | undefined;
20
+ useOnlyCustomLevels?: boolean | undefined;
21
+ levelComparison?: "ASC" | "DESC" | ((current: number, expected: number) => boolean) | undefined;
22
+ mixinMergeStrategy?: ((mergeObject: object, mixinObject: object) => object) | undefined;
23
+ levelVal?: number | undefined;
24
+ messageKey?: string | undefined;
25
+ errorKey?: string | undefined;
26
+ nestedKey?: string | undefined;
27
+ browser?: {
28
+ asObject?: boolean;
29
+ formatters?: {
30
+ level?: (label: string, number: number) => object;
31
+ log?: (object: Record<string, unknown>) => Record<string, unknown>;
32
+ };
33
+ write?: import("pino").default.WriteFn | ({
34
+ fatal?: import("pino").default.WriteFn;
35
+ error?: import("pino").default.WriteFn;
36
+ warn?: import("pino").default.WriteFn;
37
+ info?: import("pino").default.WriteFn;
38
+ debug?: import("pino").default.WriteFn;
39
+ trace?: import("pino").default.WriteFn;
40
+ } & {
41
+ [logLevel: string]: import("pino").default.WriteFn;
42
+ });
43
+ serialize?: boolean | string[];
44
+ transmit?: {
45
+ level?: import("pino").default.LevelOrString;
46
+ send: (level: import("pino").default.Level, logEvent: import("pino").default.LogEvent) => void;
47
+ };
48
+ disabled?: boolean;
49
+ } | undefined;
50
+ base?: {
51
+ [key: string]: any;
52
+ } | null | undefined;
53
+ formatters?: {
54
+ level?: (label: string, number: number) => object;
55
+ bindings?: (bindings: import("pino").default.Bindings) => object;
56
+ log?: (object: Record<string, unknown>) => Record<string, unknown>;
57
+ } | undefined;
58
+ msgPrefix?: string | undefined;
59
+ hooks?: {
60
+ logMethod?: (this: import("pino").default.Logger, args: Parameters<import("pino").default.LogFn>, method: import("pino").default.LogFn, level: number) => void;
61
+ streamWrite?: (s: string) => string;
62
+ } | undefined;
63
+ depthLimit?: number | undefined;
64
+ edgeLimit?: number | undefined;
65
+ onChild?: ((child: import("pino").default.Logger<never, boolean>) => void) | undefined;
66
+ crlf?: boolean | undefined;
67
+ ignorePaths: string[];
68
+ } | {
69
+ mixin(): {
70
+ trace?: {
71
+ id: string;
72
+ };
73
+ };
74
+ transport: import("pino").TransportSingleOptions;
75
+ enabled: boolean;
76
+ ignorePaths: string[];
77
+ redact: {
78
+ paths: [string, string, string];
79
+ remove: true;
80
+ };
81
+ level: import("pino").default.LevelWithSilent;
82
+ };
83
+ };
@@ -0,0 +1,7 @@
1
+ export namespace requestTracing {
2
+ export { tracing as plugin };
3
+ export namespace options {
4
+ let tracingHeader: string;
5
+ }
6
+ }
7
+ import { tracing } from '@defra/hapi-tracing';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Setup Redis and provide a redis client
3
+ *
4
+ * Local development - 1 Redis instance
5
+ * Out in the wild - Elasticache / Redis Cluster with username and password
6
+ */
7
+ export function buildRedisClient(): Redis | Cluster;
8
+ import { Redis } from 'ioredis';
9
+ import { Cluster } from 'ioredis';
@@ -0,0 +1,3 @@
1
+ export const PREVIEW_PATH_PREFIX: "/preview";
2
+ export const ERROR_PREVIEW_PATH_PREFIX: "/error-preview";
3
+ export const FORM_PREFIX: "";
@@ -36,7 +36,7 @@
36
36
  homepageUrl: currentPath if context.isForceAccess else "https://defra.github.io/forms-engine-plugin/",
37
37
  containerClasses: "govuk-width-container",
38
38
  productName: productName | safe | trim,
39
- serviceName: "Digital Express Toolkit",
39
+ serviceName: config.serviceName,
40
40
  serviceUrl: currentPath if context.isForceAccess else serviceUrl
41
41
  }) }}
42
42
  {% endblock %}
@@ -0,0 +1,3 @@
1
+ import hapi from '@hapi/hapi';
2
+ import { type RouteConfig } from '~/src/server/types.js';
3
+ export declare function createServer(routeConfig?: RouteConfig): Promise<hapi.Server<hapi.ServerApplicationState>>;
@@ -0,0 +1,4 @@
1
+ import { type RegisterOptions } from '@hapi/crumb';
2
+ import { type ServerRegisterPluginObject } from '@hapi/hapi';
3
+ import { type RouteConfig } from '~/src/server/types.js';
4
+ export declare const configureCrumbPlugin: (routeConfig?: RouteConfig) => ServerRegisterPluginObject<RegisterOptions>;
@@ -0,0 +1,55 @@
1
+ import { type AutocompleteFieldComponent } from '@defra/forms-model';
2
+ import { SelectField } from '~/src/server/plugins/engine/components/SelectField.js';
3
+ import { type FormPayload, type FormSubmissionError } from '~/src/server/plugins/engine/types.js';
4
+ export declare class AutocompleteField extends SelectField {
5
+ options: AutocompleteFieldComponent['options'];
6
+ constructor(def: AutocompleteFieldComponent, props: ConstructorParameters<typeof SelectField>[1]);
7
+ getViewModel(payload: FormPayload, errors?: FormSubmissionError[]): {
8
+ formGroup: {
9
+ classes?: string;
10
+ attributes?: string | Record<string, string>;
11
+ };
12
+ items: import("./types.js").ListItem[];
13
+ label: {
14
+ text: string;
15
+ };
16
+ id: string;
17
+ name: string;
18
+ value: import("~/src/server/plugins/engine/types.js").FormValue;
19
+ type?: string;
20
+ hint?: {
21
+ id?: string;
22
+ text: string;
23
+ };
24
+ prefix?: import("./types.js").ComponentText;
25
+ suffix?: import("./types.js").ComponentText;
26
+ classes?: string;
27
+ condition?: string;
28
+ errors?: FormSubmissionError[];
29
+ errorMessage?: {
30
+ text: string;
31
+ };
32
+ summaryHtml?: string;
33
+ html?: string;
34
+ attributes: {
35
+ autocomplete?: string;
36
+ maxlength?: number;
37
+ multiple?: string;
38
+ accept?: string;
39
+ inputmode?: string;
40
+ };
41
+ content?: import("./types.js").Content | import("./types.js").Content[] | string;
42
+ maxlength?: number;
43
+ maxwords?: number;
44
+ rows?: number;
45
+ fieldset?: {
46
+ attributes?: string | Record<string, string>;
47
+ legend?: import("./types.js").Label;
48
+ };
49
+ components?: import("./types.js").ComponentViewModel[];
50
+ upload?: {
51
+ count: number;
52
+ summaryList: import("~/src/server/plugins/engine/types.js").SummaryList;
53
+ };
54
+ };
55
+ }
@@ -0,0 +1,15 @@
1
+ import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model';
2
+ import { type ArraySchema } from 'joi';
3
+ import { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js';
4
+ import { type FormState, type FormStateValue, type FormSubmissionState } from '~/src/server/plugins/engine/types.js';
5
+ export declare class CheckboxesField extends SelectionControlField {
6
+ options: CheckboxesFieldComponent['options'];
7
+ formSchema: ArraySchema<string> | ArraySchema<number>;
8
+ stateSchema: ArraySchema<string> | ArraySchema<number>;
9
+ constructor(def: CheckboxesFieldComponent, props: ConstructorParameters<typeof SelectionControlField>[1]);
10
+ getFormValueFromState(state: FormSubmissionState): (string | number | boolean)[] | undefined;
11
+ getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
12
+ getDisplayStringFromState(state: FormSubmissionState): string;
13
+ getContextValueFromState(state: FormSubmissionState): (string | number | boolean)[];
14
+ isValue(value?: FormStateValue | FormState): value is Item['value'][];
15
+ }
@@ -0,0 +1,33 @@
1
+ import { type ComponentDef } from '@defra/forms-model';
2
+ import { type ArraySchema, type BooleanSchema, type DateSchema, type NumberSchema, type ObjectSchema, type StringSchema } from 'joi';
3
+ import { type ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js';
4
+ import { type Component } from '~/src/server/plugins/engine/components/helpers.js';
5
+ import { type ViewModel } from '~/src/server/plugins/engine/components/types.js';
6
+ import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
7
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
8
+ export declare class ComponentBase {
9
+ page?: PageControllerClass;
10
+ parent: Component | undefined;
11
+ collection: ComponentCollection | undefined;
12
+ type: ComponentDef['type'];
13
+ name: ComponentDef['name'];
14
+ title: ComponentDef['title'];
15
+ schema?: Extract<ComponentDef, {
16
+ schema: object;
17
+ }>['schema'];
18
+ options?: Extract<ComponentDef, {
19
+ options: object;
20
+ }>['options'];
21
+ isFormComponent: boolean;
22
+ model: FormModel;
23
+ /** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
24
+ formSchema: ComponentSchema;
25
+ stateSchema: ComponentSchema;
26
+ constructor(def: ComponentDef, props: {
27
+ page?: PageControllerClass;
28
+ parent?: Component;
29
+ model: FormModel;
30
+ });
31
+ get viewModel(): ViewModel;
32
+ }
33
+ export type ComponentSchema = ArraySchema<string> | ArraySchema<number> | ArraySchema<boolean> | ArraySchema<object> | BooleanSchema<string> | DateSchema | NumberSchema<string> | NumberSchema | ObjectSchema | StringSchema;
@@ -0,0 +1,60 @@
1
+ import { type ComponentDef } from '@defra/forms-model';
2
+ import { type CustomValidator, type ErrorReportCollection, type ObjectSchema } from 'joi';
3
+ import { type Component, type Field, type Guidance } from '~/src/server/plugins/engine/components/helpers.js';
4
+ import { type ComponentViewModel } from '~/src/server/plugins/engine/components/types.js';
5
+ import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
6
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
7
+ import { type FormPayload, type FormSubmissionError, type FormSubmissionState, type FormValidationResult } from '~/src/server/plugins/engine/types.js';
8
+ import { type FormQuery } from '~/src/server/routes/types.js';
9
+ export declare class ComponentCollection {
10
+ page?: PageControllerClass;
11
+ parent?: Component;
12
+ components: Component[];
13
+ fields: Field[];
14
+ guidance: Guidance[];
15
+ formSchema: ObjectSchema<FormPayload>;
16
+ stateSchema: ObjectSchema<FormSubmissionState>;
17
+ constructor(defs: ComponentDef[], props: {
18
+ page?: PageControllerClass;
19
+ parent?: Component;
20
+ model: FormModel;
21
+ }, schema?: {
22
+ /**
23
+ * Defines an all-or-nothing relationship between keys where if one
24
+ * of the peers is present, all of them are required as well
25
+ */
26
+ peers?: string[];
27
+ /**
28
+ * Defines a custom validation rule for the object schema
29
+ */
30
+ custom?: CustomValidator;
31
+ });
32
+ get keys(): string[];
33
+ getFormDataFromState(state: FormSubmissionState): FormPayload;
34
+ getFormValueFromState(state: FormSubmissionState): FormPayload;
35
+ getStateFromValidForm(payload: FormPayload): Partial<Record<string, import("~/src/server/plugins/engine/types.js").FormStateValue>>;
36
+ getContextValueFromState(state: FormSubmissionState): Partial<Record<string, import("~/src/server/plugins/engine/types.js").FormStateValue>>;
37
+ /**
38
+ * Get all errors for all fields in this collection
39
+ */
40
+ getErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
41
+ /**
42
+ * Get view errors for all fields in this collection.
43
+ * For most fields this means filtering to the first error in the list.
44
+ * Composite fields like UKAddress can choose to return more than one error.
45
+ */
46
+ getViewErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
47
+ getViewModel(payload: FormPayload, errors?: FormSubmissionError[], query?: FormQuery): ComponentViewModel[];
48
+ /**
49
+ * Validate form payload
50
+ */
51
+ validate(value?: FormPayload): FormValidationResult<FormPayload>;
52
+ /**
53
+ * Helper to get errors from all fields
54
+ */
55
+ private getFieldErrors;
56
+ }
57
+ /**
58
+ * Check for field local state
59
+ */
60
+ export declare function isErrorContext(value?: unknown): value is ErrorReportCollection['local'];
@@ -0,0 +1,76 @@
1
+ import { type DatePartsFieldComponent } from '@defra/forms-model';
2
+ import { type CustomValidator, type ObjectSchema } from 'joi';
3
+ import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js';
4
+ import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js';
5
+ import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js';
6
+ import { type ErrorMessageTemplateList, type FormPayload, type FormState, type FormStateValue, type FormSubmissionError, type FormSubmissionState } from '~/src/server/plugins/engine/types.js';
7
+ export declare class DatePartsField extends FormComponent {
8
+ options: DatePartsFieldComponent['options'];
9
+ formSchema: ObjectSchema<FormPayload>;
10
+ stateSchema: ObjectSchema<FormState>;
11
+ collection: ComponentCollection;
12
+ constructor(def: DatePartsFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
13
+ getFormValueFromState(state: FormSubmissionState): DatePartsState | undefined;
14
+ getDisplayStringFromState(state: FormSubmissionState): string;
15
+ getContextValueFromState(state: FormSubmissionState): string | null;
16
+ getViewModel(payload: FormPayload, errors?: FormSubmissionError[]): {
17
+ fieldset: {
18
+ attributes?: string | Record<string, string>;
19
+ legend?: import("~/src/server/plugins/engine/components/types.js").Label;
20
+ };
21
+ items: DateInputItem[];
22
+ label: {
23
+ text: string;
24
+ };
25
+ id: string;
26
+ name: string;
27
+ value: import("~/src/server/plugins/engine/types.js").FormValue;
28
+ type?: string;
29
+ hint?: {
30
+ id?: string;
31
+ text: string;
32
+ };
33
+ prefix?: import("~/src/server/plugins/engine/components/types.js").ComponentText;
34
+ suffix?: import("~/src/server/plugins/engine/components/types.js").ComponentText;
35
+ classes?: string;
36
+ condition?: string;
37
+ errors?: FormSubmissionError[];
38
+ errorMessage?: {
39
+ text: string;
40
+ };
41
+ summaryHtml?: string;
42
+ html?: string;
43
+ attributes: {
44
+ autocomplete?: string;
45
+ maxlength?: number;
46
+ multiple?: string;
47
+ accept?: string;
48
+ inputmode?: string;
49
+ };
50
+ content?: import("~/src/server/plugins/engine/components/types.js").Content | import("~/src/server/plugins/engine/components/types.js").Content[] | string;
51
+ maxlength?: number;
52
+ maxwords?: number;
53
+ rows?: number;
54
+ formGroup?: {
55
+ classes?: string;
56
+ attributes?: string | Record<string, string>;
57
+ };
58
+ components?: import("~/src/server/plugins/engine/components/types.js").ComponentViewModel[];
59
+ upload?: {
60
+ count: number;
61
+ summaryList: import("~/src/server/plugins/engine/types.js").SummaryList;
62
+ };
63
+ };
64
+ isState(value?: FormStateValue | FormState): value is DatePartsState;
65
+ /**
66
+ * For error preview page that shows all possible errors on a component
67
+ */
68
+ getAllPossibleErrors(): ErrorMessageTemplateList;
69
+ static isDateParts(value?: FormStateValue | FormState): value is DatePartsState;
70
+ }
71
+ export interface DatePartsState extends Record<string, number> {
72
+ day: number;
73
+ month: number;
74
+ year: number;
75
+ }
76
+ export declare function getValidatorDate(component: DatePartsField): CustomValidator;
@@ -0,0 +1,53 @@
1
+ import { type DetailsComponent } from '@defra/forms-model';
2
+ import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js';
3
+ export declare class Details extends ComponentBase {
4
+ options: DetailsComponent['options'];
5
+ content: DetailsComponent['content'];
6
+ constructor(def: DetailsComponent, props: ConstructorParameters<typeof ComponentBase>[1]);
7
+ getViewModel(): {
8
+ html: string;
9
+ summaryHtml: string;
10
+ label?: import("./types.js").Label;
11
+ type?: string;
12
+ id?: string;
13
+ name?: string;
14
+ value?: import("../types.js").FormValue;
15
+ hint?: {
16
+ id?: string;
17
+ text: string;
18
+ };
19
+ prefix?: import("./types.js").ComponentText;
20
+ suffix?: import("./types.js").ComponentText;
21
+ classes?: string;
22
+ condition?: string;
23
+ errors?: import("../types.js").FormSubmissionError[];
24
+ errorMessage?: {
25
+ text: string;
26
+ };
27
+ attributes: {
28
+ autocomplete?: string;
29
+ maxlength?: number;
30
+ multiple?: string;
31
+ accept?: string;
32
+ inputmode?: string;
33
+ };
34
+ content?: import("./types.js").Content | import("./types.js").Content[] | string;
35
+ maxlength?: number;
36
+ maxwords?: number;
37
+ rows?: number;
38
+ items?: import("./types.js").ListItem[] | import("./types.js").DateInputItem[];
39
+ fieldset?: {
40
+ attributes?: string | Record<string, string>;
41
+ legend?: import("./types.js").Label;
42
+ };
43
+ formGroup?: {
44
+ classes?: string;
45
+ attributes?: string | Record<string, string>;
46
+ };
47
+ components?: import("./types.js").ComponentViewModel[];
48
+ upload?: {
49
+ count: number;
50
+ summaryList: import("../types.js").SummaryList;
51
+ };
52
+ };
53
+ }