@defra/forms-engine-plugin 2.1.5 → 2.1.7

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 (121) hide show
  1. package/.server/server/plugins/engine/components/ComponentBase.d.ts +2 -2
  2. package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -1
  3. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +2 -2
  4. package/.server/server/plugins/engine/components/ComponentCollection.js +1 -1
  5. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  6. package/.server/server/plugins/engine/components/TelephoneNumberField.js +1 -1
  7. package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
  8. package/.server/server/plugins/engine/components/YesNoField.js +1 -1
  9. package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
  10. package/.server/server/plugins/engine/components/{helpers.d.ts → helpers/components.d.ts} +3 -10
  11. package/.server/server/plugins/engine/components/{helpers.js → helpers/components.js} +16 -29
  12. package/.server/server/plugins/engine/components/helpers/components.js.map +1 -0
  13. package/.server/server/plugins/engine/components/helpers/index.d.ts +11 -0
  14. package/.server/server/plugins/engine/components/helpers/index.js +15 -0
  15. package/.server/server/plugins/engine/components/helpers/index.js.map +1 -0
  16. package/.server/server/plugins/engine/helpers.d.ts +1 -1
  17. package/.server/server/plugins/engine/helpers.js +1 -1
  18. package/.server/server/plugins/engine/helpers.js.map +1 -1
  19. package/.server/server/plugins/engine/models/FormModel.d.ts +2 -2
  20. package/.server/server/plugins/engine/models/FormModel.js +2 -2
  21. package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
  22. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +1 -1
  23. package/.server/server/plugins/engine/models/SummaryViewModel.js +1 -1
  24. package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
  25. package/.server/server/plugins/engine/models/types.d.ts +2 -2
  26. package/.server/server/plugins/engine/models/types.js.map +1 -1
  27. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +1 -1
  28. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  29. package/.server/server/plugins/engine/outputFormatters/human/v1.js +2 -1
  30. package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
  31. package/.server/server/plugins/engine/outputFormatters/machine/v1.js +1 -1
  32. package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -1
  33. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +1 -1
  34. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  35. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +1 -1
  36. package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
  37. package/.server/server/plugins/engine/pageControllers/helpers/index.d.ts +9 -0
  38. package/.server/server/plugins/engine/pageControllers/helpers/index.js +15 -0
  39. package/.server/server/plugins/engine/pageControllers/helpers/index.js.map +1 -0
  40. package/.server/server/plugins/engine/pageControllers/{helpers.d.ts → helpers/pages.d.ts} +1 -10
  41. package/.server/server/plugins/engine/pageControllers/{helpers.js → helpers/pages.js} +2 -17
  42. package/.server/server/plugins/engine/pageControllers/helpers/pages.js.map +1 -0
  43. package/.server/server/plugins/engine/routes/index.d.ts +1 -1
  44. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  45. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  46. package/.server/server/plugins/engine/services/notifyService.js +1 -1
  47. package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
  48. package/.server/server/plugins/engine/types/enums.d.ts +13 -0
  49. package/.server/server/plugins/engine/types/enums.js +17 -0
  50. package/.server/server/plugins/engine/types/enums.js.map +1 -0
  51. package/.server/server/plugins/engine/types/index.d.ts +2 -1
  52. package/.server/server/plugins/engine/types/index.js +2 -1
  53. package/.server/server/plugins/engine/types/index.js.map +1 -1
  54. package/.server/server/plugins/engine/types/schema.js +1 -1
  55. package/.server/server/plugins/engine/types/schema.js.map +1 -1
  56. package/.server/server/plugins/engine/types.d.ts +5 -17
  57. package/.server/server/plugins/engine/types.js +1 -16
  58. package/.server/server/plugins/engine/types.js.map +1 -1
  59. package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
  60. package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -1
  61. package/.server/server/plugins/nunjucks/filters/answer.test.js +2 -2
  62. package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/server/plugins/engine/components/AutocompleteField.test.ts +1 -1
  65. package/src/server/plugins/engine/components/CheckboxesField.test.ts +1 -1
  66. package/src/server/plugins/engine/components/ComponentBase.ts +2 -2
  67. package/src/server/plugins/engine/components/ComponentCollection.ts +2 -2
  68. package/src/server/plugins/engine/components/DatePartsField.test.ts +1 -1
  69. package/src/server/plugins/engine/components/Details.test.ts +1 -1
  70. package/src/server/plugins/engine/components/EmailAddressField.test.ts +1 -1
  71. package/src/server/plugins/engine/components/FileUploadField.test.ts +2 -2
  72. package/src/server/plugins/engine/components/Html.test.ts +1 -1
  73. package/src/server/plugins/engine/components/InsetText.test.ts +1 -1
  74. package/src/server/plugins/engine/components/List.test.ts +1 -1
  75. package/src/server/plugins/engine/components/Markdown.test.ts +1 -1
  76. package/src/server/plugins/engine/components/MonthYearField.test.ts +1 -1
  77. package/src/server/plugins/engine/components/MultilineTextField.test.ts +1 -1
  78. package/src/server/plugins/engine/components/NumberField.test.ts +1 -1
  79. package/src/server/plugins/engine/components/RadiosField.test.ts +1 -1
  80. package/src/server/plugins/engine/components/SelectField.test.ts +1 -1
  81. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +1 -1
  82. package/src/server/plugins/engine/components/TelephoneNumberField.ts +1 -1
  83. package/src/server/plugins/engine/components/TextField.test.ts +1 -1
  84. package/src/server/plugins/engine/components/UkAddressField.test.ts +1 -1
  85. package/src/server/plugins/engine/components/YesNoField.test.ts +1 -1
  86. package/src/server/plugins/engine/components/YesNoField.ts +1 -1
  87. package/src/server/plugins/engine/components/{helpers.ts → helpers/components.ts} +41 -77
  88. package/src/server/plugins/engine/components/{helpers.test.ts → helpers/helpers.test.ts} +1 -1
  89. package/src/server/plugins/engine/components/helpers/index.ts +38 -0
  90. package/src/server/plugins/engine/helpers.test.ts +1 -1
  91. package/src/server/plugins/engine/helpers.ts +2 -2
  92. package/src/server/plugins/engine/models/FormModel.ts +2 -2
  93. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +1 -1
  94. package/src/server/plugins/engine/models/SummaryViewModel.ts +2 -2
  95. package/src/server/plugins/engine/models/types.ts +4 -4
  96. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +2 -2
  97. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +1 -1
  98. package/src/server/plugins/engine/outputFormatters/human/v1.ts +2 -4
  99. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +1 -1
  100. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +1 -1
  101. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +1 -1
  102. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1 -1
  103. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +1 -1
  104. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +1 -1
  105. package/src/server/plugins/engine/pageControllers/{helpers.test.ts → helpers/helpers.test.ts} +2 -2
  106. package/src/server/plugins/engine/pageControllers/helpers/index.ts +20 -0
  107. package/src/server/plugins/engine/pageControllers/{helpers.ts → helpers/pages.ts} +1 -22
  108. package/src/server/plugins/engine/routes/index.ts +1 -1
  109. package/src/server/plugins/engine/routes/questions.test.ts +1 -1
  110. package/src/server/plugins/engine/routes/questions.ts +1 -1
  111. package/src/server/plugins/engine/services/notifyService.test.ts +1 -1
  112. package/src/server/plugins/engine/services/notifyService.ts +1 -1
  113. package/src/server/plugins/engine/types/enums.ts +15 -0
  114. package/src/server/plugins/engine/types/index.ts +2 -5
  115. package/src/server/plugins/engine/types/schema.test.ts +1 -1
  116. package/src/server/plugins/engine/types/schema.ts +1 -1
  117. package/src/server/plugins/engine/types.ts +12 -18
  118. package/src/server/plugins/nunjucks/filters/answer.js +2 -2
  119. package/src/server/plugins/nunjucks/filters/answer.test.js +7 -4
  120. package/.server/server/plugins/engine/components/helpers.js.map +0 -1
  121. package/.server/server/plugins/engine/pageControllers/helpers.js.map +0 -1
@@ -9,7 +9,7 @@ import { serverWithSaveAndReturn } from '~/src/server/plugins/engine/pageControl
9
9
  import {
10
10
  createPage,
11
11
  type PageControllerClass
12
- } from '~/src/server/plugins/engine/pageControllers/helpers.js'
12
+ } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
13
13
  import {
14
14
  type FormContext,
15
15
  type FormContextRequest,
@@ -3,7 +3,7 @@ import { type Section } from '@defra/forms-model'
3
3
  import {
4
4
  getAnswer,
5
5
  type Field
6
- } from '~/src/server/plugins/engine/components/helpers.js'
6
+ } from '~/src/server/plugins/engine/components/helpers/components.js'
7
7
  import {
8
8
  type BackLink,
9
9
  type ComponentViewModel
@@ -20,7 +20,7 @@ import {
20
20
  type DetailItemRepeat
21
21
  } from '~/src/server/plugins/engine/models/types.js'
22
22
  import { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
23
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
23
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
24
24
  import { validationOptions as opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js'
25
25
  import {
26
26
  type CheckAnswers,
@@ -6,11 +6,11 @@ import {
6
6
  import { type Expression } from 'expr-eval'
7
7
 
8
8
  import {
9
- type Field,
10
- type getAnswer
11
- } from '~/src/server/plugins/engine/components/helpers.js'
9
+ getAnswer,
10
+ type Field
11
+ } from '~/src/server/plugins/engine/components/helpers/components.js'
12
12
  import { type RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
13
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
13
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
14
14
  import {
15
15
  type FormState,
16
16
  type FormSubmissionError
@@ -1,7 +1,7 @@
1
1
  import { type FormMetadata } from '@defra/forms-model'
2
2
 
3
3
  import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
4
- import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
4
+ import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
5
5
  import { FormModel } from '~/src/server/plugins/engine/models/index.js'
6
6
  import {
7
7
  type DetailItem,
@@ -10,9 +10,9 @@ import {
10
10
  } from '~/src/server/plugins/engine/models/types.js'
11
11
  import { format } from '~/src/server/plugins/engine/outputFormatters/adapter/v1.js'
12
12
  import { buildFormContextRequest } from '~/src/server/plugins/engine/pageControllers/__stubs__/request.js'
13
+ import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/index.js'
13
14
  import {
14
15
  FileStatus,
15
- FormAdapterSubmissionSchemaVersion,
16
16
  UploadStatus,
17
17
  type FileState,
18
18
  type FormAdapterSubmissionMessagePayload
@@ -7,8 +7,8 @@ import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
7
7
  import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
8
8
  import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
9
9
  import { format as machineV2 } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
10
+ import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'
10
11
  import {
11
- FormAdapterSubmissionSchemaVersion,
12
12
  type FormAdapterSubmissionMessageData,
13
13
  type FormAdapterSubmissionMessagePayload,
14
14
  type FormContext
@@ -5,10 +5,8 @@ import {
5
5
  import { addDays, format as dateFormat } from 'date-fns'
6
6
 
7
7
  import { config } from '~/src/config/index.js'
8
- import {
9
- escapeMarkdown,
10
- getAnswer
11
- } from '~/src/server/plugins/engine/components/helpers.js'
8
+ import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
9
+ import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
12
10
  import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
13
11
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
14
12
  import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
2
 
3
3
  import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
4
- import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
4
+ import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
5
5
  import { FormModel } from '~/src/server/plugins/engine/models/index.js'
6
6
  import {
7
7
  type DetailItem,
@@ -4,7 +4,7 @@ import {
4
4
  } from '@defra/forms-model'
5
5
 
6
6
  import { config } from '~/src/config/index.js'
7
- import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
7
+ import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
8
8
  import { FileUploadField } from '~/src/server/plugins/engine/components/index.js'
9
9
  import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
10
10
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
2
 
3
3
  import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
4
- import { type Field } from '~/src/server/plugins/engine/components/helpers.js'
4
+ import { type Field } from '~/src/server/plugins/engine/components/helpers/components.js'
5
5
  import { FormModel } from '~/src/server/plugins/engine/models/index.js'
6
6
  import {
7
7
  type DetailItem,
@@ -15,7 +15,7 @@ import {
15
15
  } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'
16
16
  import { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'
17
17
  import { serverWithSaveAndReturn } from '~/src/server/plugins/engine/pageControllers/__stubs__/server.js'
18
- import * as pageHelpers from '~/src/server/plugins/engine/pageControllers/helpers.js'
18
+ import * as pageHelpers from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
19
19
  import * as uploadService from '~/src/server/plugins/engine/services/uploadService.js'
20
20
  import {
21
21
  FileStatus,
@@ -15,7 +15,7 @@ import {
15
15
  } from '~/src/server/plugins/engine/helpers.js'
16
16
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
17
17
  import { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'
18
- import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers.js'
18
+ import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
19
19
  import {
20
20
  getUploadStatus,
21
21
  initiateUpload
@@ -9,7 +9,7 @@ import { type ResponseToolkit, type RouteOptions } from '@hapi/hapi'
9
9
 
10
10
  import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
11
11
  import { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'
12
- import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
12
+ import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
13
13
  import {
14
14
  checkEmailAddressForLiveFormSubmission,
15
15
  checkFormStatus,
@@ -8,12 +8,12 @@ import {
8
8
 
9
9
  import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
10
10
  import { PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
11
+ import { getProxyUrlForLocalDevelopment } from '~/src/server/plugins/engine/pageControllers/helpers/index.js'
11
12
  import {
12
13
  createPage,
13
- getProxyUrlForLocalDevelopment,
14
14
  isPageController,
15
15
  type PageControllerType
16
- } from '~/src/server/plugins/engine/pageControllers/helpers.js'
16
+ } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
17
17
  import {
18
18
  FileUploadPageController,
19
19
  QuestionPageController,
@@ -0,0 +1,20 @@
1
+ /**
2
+ * In local development environments, we sometimes need to rewrite the
3
+ * CDP upload URL to work with CSP/CORS restrictions.
4
+ * This helper function rewrites localhost URLs to use the sslip.io proxy
5
+ * This is only used when running locally with a development proxy.
6
+ * In non-local environments, this function returns null
7
+ * @param uploadUrl - The original upload URL from CDP
8
+ */
9
+ export function getProxyUrlForLocalDevelopment(
10
+ uploadUrl?: string
11
+ ): string | null {
12
+ if (!uploadUrl?.includes('localhost:7337')) {
13
+ return null
14
+ }
15
+
16
+ return uploadUrl.replace(
17
+ /localhost:7337/g,
18
+ 'uploader.127.0.0.1.sslip.io:7300'
19
+ )
20
+ }
@@ -5,7 +5,7 @@ import {
5
5
  type Page
6
6
  } from '@defra/forms-model'
7
7
 
8
- import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
8
+ import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
9
9
  import * as PageControllers from '~/src/server/plugins/engine/pageControllers/index.js'
10
10
 
11
11
  export function isPageController(
@@ -78,24 +78,3 @@ export function createPage(model: FormModel, pageDef: Page) {
78
78
 
79
79
  return controller
80
80
  }
81
-
82
- /**
83
- * In local development environments, we sometimes need to rewrite the
84
- * CDP upload URL to work with CSP/CORS restrictions.
85
- * This helper function rewrites localhost URLs to use the sslip.io proxy
86
- * This is only used when running locally with a development proxy.
87
- * In non-local environments, this function returns null
88
- * @param uploadUrl - The original upload URL from CDP
89
- */
90
- export function getProxyUrlForLocalDevelopment(
91
- uploadUrl?: string
92
- ): string | null {
93
- if (!uploadUrl?.includes('localhost:7337')) {
94
- return null
95
- }
96
-
97
- return uploadUrl.replace(
98
- /localhost:7337/g,
99
- 'uploader.127.0.0.1.sslip.io:7300'
100
- )
101
- }
@@ -17,7 +17,7 @@ import {
17
17
  proceed
18
18
  } from '~/src/server/plugins/engine/helpers.js'
19
19
  import { FormModel } from '~/src/server/plugins/engine/models/index.js'
20
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
20
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
21
21
  import { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'
22
22
  import * as defaultServices from '~/src/server/plugins/engine/services/index.js'
23
23
  import {
@@ -4,7 +4,7 @@ import { type ResponseObject, type ResponseToolkit } from '@hapi/hapi'
4
4
  import nock from 'nock'
5
5
 
6
6
  import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
7
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
7
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
8
8
  import { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'
9
9
  import {
10
10
  makeGetHandler,
@@ -19,7 +19,7 @@ import {
19
19
  } from '~/src/server/plugins/engine/models/index.js'
20
20
  import { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'
21
21
  import { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'
22
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
22
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
23
23
  import {
24
24
  dispatchHandler,
25
25
  redirectOrMakeHandler
@@ -1,6 +1,6 @@
1
1
  import { type FormMetadata } from '@defra/forms-model'
2
2
 
3
- import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'
3
+ import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
4
4
  import { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
5
5
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
6
6
  import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
@@ -5,7 +5,7 @@ import {
5
5
  } from '@defra/forms-model'
6
6
 
7
7
  import { config } from '~/src/config/index.js'
8
- import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers.js'
8
+ import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js'
9
9
  import { checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
10
10
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
11
11
  import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
@@ -0,0 +1,15 @@
1
+ export enum UploadStatus {
2
+ initiated = 'initiated',
3
+ pending = 'pending',
4
+ ready = 'ready'
5
+ }
6
+
7
+ export enum FileStatus {
8
+ complete = 'complete',
9
+ rejected = 'rejected',
10
+ pending = 'pending'
11
+ }
12
+
13
+ export enum FormAdapterSubmissionSchemaVersion {
14
+ V1 = 1
15
+ }
@@ -41,11 +41,7 @@ export type {
41
41
  UploadStatusResponse
42
42
  } from '~/src/server/plugins/engine/types.js'
43
43
 
44
- export {
45
- FileStatus,
46
- FormAdapterSubmissionSchemaVersion,
47
- UploadStatus
48
- } from '~/src/server/plugins/engine/types.js'
44
+ export { FileStatus, UploadStatus } from '~/src/server/plugins/engine/types.js'
49
45
 
50
46
  export type {
51
47
  Detail,
@@ -94,3 +90,4 @@ export type {
94
90
  export type { RichFormValue } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
95
91
 
96
92
  export * from '~/src/server/plugins/engine/types/schema.js'
93
+ export { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'
@@ -1,12 +1,12 @@
1
1
  import { FormStatus } from '@defra/forms-model'
2
2
 
3
+ import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'
3
4
  import {
4
5
  formAdapterSubmissionMessageDataSchema,
5
6
  formAdapterSubmissionMessageMetaSchema,
6
7
  formAdapterSubmissionMessagePayloadSchema
7
8
  } from '~/src/server/plugins/engine/types/schema.js'
8
9
  import {
9
- FormAdapterSubmissionSchemaVersion,
10
10
  type FormAdapterSubmissionMessageData,
11
11
  type FormAdapterSubmissionMessageMeta,
12
12
  type FormAdapterSubmissionMessagePayload
@@ -7,8 +7,8 @@ import {
7
7
  } from '@defra/forms-model'
8
8
  import Joi from 'joi'
9
9
 
10
+ import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'
10
11
  import {
11
- FormAdapterSubmissionSchemaVersion,
12
12
  type FormAdapterSubmissionMessageData,
13
13
  type FormAdapterSubmissionMessageMeta,
14
14
  type FormAdapterSubmissionMessagePayload
@@ -11,7 +11,7 @@ import { type PluginProperties, type Request } from '@hapi/hapi'
11
11
  import { type JoiExpression, type ValidationErrorItem } from 'joi'
12
12
 
13
13
  import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'
14
- import { type Component } from '~/src/server/plugins/engine/components/helpers.js'
14
+ import { type Component } from '~/src/server/plugins/engine/components/helpers/components.js'
15
15
  import {
16
16
  type BackLink,
17
17
  type ComponentText,
@@ -20,7 +20,12 @@ import {
20
20
  import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
21
21
  import { type RichFormValue } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
22
22
  import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js'
23
- import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js'
23
+ import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
24
+ import {
25
+ type FileStatus,
26
+ type FormAdapterSubmissionSchemaVersion,
27
+ type UploadStatus
28
+ } from '~/src/server/plugins/engine/types/enums.js'
24
29
  import { type ViewContext } from '~/src/server/plugins/nunjucks/types.js'
25
30
  import {
26
31
  type FormAction,
@@ -190,17 +195,10 @@ export interface UploadInitiateResponse {
190
195
  statusUrl: string
191
196
  }
192
197
 
193
- export enum UploadStatus {
194
- initiated = 'initiated',
195
- pending = 'pending',
196
- ready = 'ready'
197
- }
198
-
199
- export enum FileStatus {
200
- complete = 'complete',
201
- rejected = 'rejected',
202
- pending = 'pending'
203
- }
198
+ export {
199
+ FileStatus,
200
+ UploadStatus
201
+ } from '~/src/server/plugins/engine/types/enums.js'
204
202
 
205
203
  export type UploadState = FileState[]
206
204
 
@@ -403,7 +401,7 @@ export type FormAdapterSubmissionMessageMetaSerialised = Omit<
403
401
  FormAdapterSubmissionMessageMeta,
404
402
  'schemaVersion' | 'timestamp' | 'status'
405
403
  > & {
406
- schemaVersion: string
404
+ schemaVersion: number
407
405
  status: string
408
406
  timestamp: string
409
407
  }
@@ -414,10 +412,6 @@ export interface FormAdapterSubmissionMessageData {
414
412
  files: Record<string, Record<string, string>[]>
415
413
  }
416
414
 
417
- export enum FormAdapterSubmissionSchemaVersion {
418
- V1 = 1
419
- }
420
-
421
415
  export interface FormAdapterSubmissionMessagePayload {
422
416
  meta: FormAdapterSubmissionMessageMeta
423
417
  data: FormAdapterSubmissionMessageData
@@ -1,4 +1,4 @@
1
- import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
1
+ import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
2
2
 
3
3
  /**
4
4
  * Nunjucks filter to get the answer for a component
@@ -23,5 +23,5 @@ export function answer(name) {
23
23
 
24
24
  /**
25
25
  * @import { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js'
26
- * @import { Field } from '~/src/server/plugins/engine/components/helpers.js'
26
+ * @import { Field } from '~/src/server/plugins/engine/components/helpers/components.js'
27
27
  */
@@ -1,9 +1,12 @@
1
- import { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'
1
+ import { getAnswer } from '~/src/server/plugins/engine/components/helpers/components.js'
2
2
  import { answer } from '~/src/server/plugins/nunjucks/filters/answer.js'
3
3
 
4
- jest.mock('~/src/server/plugins/engine/components/helpers.ts', () => ({
5
- getAnswer: jest.fn()
6
- }))
4
+ jest.mock(
5
+ '~/src/server/plugins/engine/components/helpers/components.ts',
6
+ () => ({
7
+ getAnswer: jest.fn()
8
+ })
9
+ )
7
10
 
8
11
  describe('answer Nunjucks filter', () => {
9
12
  /** @type { NunjucksContext } */
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","names":["ComponentType","Marked","config","ListFormComponent","Components","designerUrl","get","markdown","breaks","gfm","extensions","name","renderer","tokens","text","parser","parseInline","length","walkTokens","token","includes","type","hasListFormField","field","isListFieldType","allowedTypes","AutocompleteField","CheckboxesField","RadiosField","SelectField","YesNoField","createComponent","def","options","component","DatePartsField","Details","EmailAddressField","Html","InsetText","List","Markdown","MultilineTextField","NumberField","TelephoneNumberField","TextField","UkAddressField","MonthYearField","FileUploadField","Error","getAnswer","state","format","getAnswerMarkdown","context","getContextValueFromState","toString","parse","async","trim","getDisplayStringFromState","answer","answerEscaped","escapeMarkdown","files","getFormValueFromState","map","status","file","form","filename","fileId","join","values","flat","items","filter","value","item","label","line","toLowerCase","split","concat","punctuation","character","replaceAll","addClassOptionIfNone","className","classes"],"sources":["../../../../../src/server/plugins/engine/components/helpers.ts"],"sourcesContent":["import { ComponentType, type ComponentDef } from '@defra/forms-model'\nimport { Marked, type Token } from 'marked'\n\nimport { config } from '~/src/config/index.js'\nimport { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js'\nimport { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js'\nimport * as Components from '~/src/server/plugins/engine/components/index.js'\nimport { type FormState } from '~/src/server/plugins/engine/types.js'\n\nconst designerUrl = config.get('designerUrl')\n\nconst markdown = new Marked({\n breaks: true,\n gfm: true,\n\n /**\n * Render paragraphs without `<p>` wrappers\n * for check answers summary list `<dd>`\n */\n extensions: [\n {\n name: 'paragraph',\n renderer({ tokens = [] }) {\n const text = this.parser.parseInline(tokens)\n return tokens.length > 1 ? `${text}<br>` : text\n }\n }\n ],\n\n /**\n * Restrict allowed Markdown tokens\n */\n walkTokens(token) {\n const tokens: Token['type'][] = [\n 'br',\n 'escape',\n 'list',\n 'list_item',\n 'paragraph',\n 'space',\n 'text'\n ]\n\n if (!tokens.includes(token.type)) {\n token.type = 'text'\n }\n }\n})\n\n// All component instances\nexport type Component = InstanceType<\n (typeof Components)[keyof typeof Components]\n>\n\n// Field component instances only\nexport type Field = InstanceType<\n | typeof Components.AutocompleteField\n | typeof Components.RadiosField\n | typeof Components.YesNoField\n | typeof Components.CheckboxesField\n | typeof Components.DatePartsField\n | typeof Components.EmailAddressField\n | typeof Components.MonthYearField\n | typeof Components.MultilineTextField\n | typeof Components.NumberField\n | typeof Components.SelectField\n | typeof Components.TelephoneNumberField\n | typeof Components.TextField\n | typeof Components.UkAddressField\n | typeof Components.FileUploadField\n>\n\n// Guidance component instances only\nexport type Guidance = InstanceType<\n | typeof Components.Details\n | typeof Components.Html\n | typeof Components.Markdown\n | typeof Components.InsetText\n | typeof Components.List\n>\n\n// List component instances only\nexport type ListField = InstanceType<\n | typeof Components.AutocompleteField\n | typeof Components.CheckboxesField\n | typeof Components.RadiosField\n | typeof Components.SelectField\n | typeof Components.YesNoField\n>\n\n/**\n * Filter known components with lists\n */\nexport function hasListFormField(\n field?: Partial<Component>\n): field is ListFormComponent {\n return !!field && isListFieldType(field.type)\n}\n\nexport function isListFieldType(\n type?: ComponentType\n): type is ListField['type'] {\n const allowedTypes = [\n ComponentType.AutocompleteField,\n ComponentType.CheckboxesField,\n ComponentType.RadiosField,\n ComponentType.SelectField,\n ComponentType.YesNoField\n ]\n\n return !!type && allowedTypes.includes(type)\n}\n\n/**\n * Create field instance for each {@link ComponentDef} type\n */\nexport function createComponent(\n def: ComponentDef,\n options: ConstructorParameters<typeof ComponentBase>[1]\n): Component {\n let component: Component | undefined\n\n switch (def.type) {\n case ComponentType.AutocompleteField:\n component = new Components.AutocompleteField(def, options)\n break\n\n case ComponentType.CheckboxesField:\n component = new Components.CheckboxesField(def, options)\n break\n\n case ComponentType.DatePartsField:\n component = new Components.DatePartsField(def, options)\n break\n\n case ComponentType.Details:\n component = new Components.Details(def, options)\n break\n\n case ComponentType.EmailAddressField:\n component = new Components.EmailAddressField(def, options)\n break\n\n case ComponentType.Html:\n component = new Components.Html(def, options)\n break\n\n case ComponentType.InsetText:\n component = new Components.InsetText(def, options)\n break\n\n case ComponentType.List:\n component = new Components.List(def, options)\n break\n\n case ComponentType.Markdown:\n component = new Components.Markdown(def, options)\n break\n\n case ComponentType.MultilineTextField:\n component = new Components.MultilineTextField(def, options)\n break\n\n case ComponentType.NumberField:\n component = new Components.NumberField(def, options)\n break\n\n case ComponentType.RadiosField:\n component = new Components.RadiosField(def, options)\n break\n\n case ComponentType.SelectField:\n component = new Components.SelectField(def, options)\n break\n\n case ComponentType.TelephoneNumberField:\n component = new Components.TelephoneNumberField(def, options)\n break\n\n case ComponentType.TextField:\n component = new Components.TextField(def, options)\n break\n\n case ComponentType.UkAddressField:\n component = new Components.UkAddressField(def, options)\n break\n\n case ComponentType.YesNoField:\n component = new Components.YesNoField(def, options)\n break\n\n case ComponentType.MonthYearField:\n component = new Components.MonthYearField(def, options)\n break\n\n case ComponentType.FileUploadField:\n component = new Components.FileUploadField(def, options)\n break\n }\n\n if (typeof component === 'undefined') {\n throw new Error(`Component type ${def.type} does not exist`)\n }\n\n return component\n}\n\n/**\n * Get formatted answer for a field\n */\nexport function getAnswer(\n field: Field,\n state: FormState,\n options: {\n format:\n | 'data' // Submission data\n | 'email' // GOV.UK Notify emails\n | 'summary' // Check answers summary\n } = { format: 'summary' }\n) {\n // Use escaped display text for GOV.UK Notify emails\n if (options.format === 'email') {\n return getAnswerMarkdown(field, state, { format: 'email' })\n }\n\n // Use context value for submission data\n if (options.format === 'data') {\n const context = field.getContextValueFromState(state)\n return context?.toString() ?? ''\n }\n\n // Use display HTML for check answers summary (multi line)\n if (\n field instanceof ListFormComponent ||\n field instanceof Components.MultilineTextField ||\n field instanceof Components.UkAddressField\n ) {\n return markdown\n .parse(getAnswerMarkdown(field, state), { async: false })\n .trim()\n }\n\n // Use display text for check answers summary (single line)\n return field.getDisplayStringFromState(state)\n}\n\n/**\n * Get formatted answer for a field (Markdown only)\n */\nexport function getAnswerMarkdown(\n field: Field,\n state: FormState,\n options: {\n format:\n | 'email' // GOV.UK Notify emails\n | 'summary' // Check answers summary\n } = { format: 'summary' }\n) {\n const answer = field.getDisplayStringFromState(state)\n\n // Use escaped display text\n let answerEscaped = `${escapeMarkdown(answer)}\\n`\n\n if (field instanceof Components.FileUploadField) {\n const files = field.getFormValueFromState(state)\n\n // Skip empty files\n if (!files?.length) {\n return answerEscaped\n }\n\n answerEscaped = `${escapeMarkdown(answer)}:\\n\\n`\n\n // Append bullet points\n answerEscaped += files\n .map(({ status }) => {\n const { file } = status.form\n const filename = escapeMarkdown(file.filename)\n return `* [${filename}](${designerUrl}/file-download/${file.fileId})\\n`\n })\n .join('')\n } else if (field instanceof ListFormComponent) {\n const values = [field.getContextValueFromState(state)].flat()\n const items = field.items.filter(({ value }) => values.includes(value))\n\n // Skip empty values\n if (!items.length) {\n return answerEscaped\n }\n\n answerEscaped = ''\n\n // Append bullet points\n answerEscaped += items\n .map((item) => {\n const label = escapeMarkdown(item.text)\n const value = escapeMarkdown(`(${item.value})`)\n\n let line = label\n\n // Prepend bullet points for checkboxes only\n if (field instanceof Components.CheckboxesField) {\n line = `* ${line}`\n }\n\n // Append raw values in parentheses\n // e.g. `* None of the above (false)`\n return options.format === 'email' &&\n `${item.value}`.toLowerCase() !== item.text.toLowerCase()\n ? `${line} ${value}\\n`\n : `${line}\\n`\n })\n .join('')\n } else if (field instanceof Components.MultilineTextField) {\n // Preserve Multiline text new lines\n answerEscaped = answer\n .split(/\\r?\\n/)\n .map(escapeMarkdown)\n .join('\\n')\n .concat('\\n')\n } else if (field instanceof Components.UkAddressField) {\n // Format UK addresses into new lines\n answerEscaped = (field.getContextValueFromState(state) ?? [])\n .map(escapeMarkdown)\n .join('\\n')\n .concat('\\n')\n }\n\n return answerEscaped\n}\n\n/**\n * Prevent Markdown formatting\n * @see {@link https://pandoc.org/chunkedhtml-demo/8.11-backslash-escapes.html}\n */\nexport function escapeMarkdown(answer: string) {\n const punctuation = [\n '`',\n \"'\",\n '*',\n '_',\n '{',\n '}',\n '[',\n ']',\n '(',\n ')',\n '#',\n '+',\n '-',\n '.',\n '!'\n ]\n\n for (const character of punctuation) {\n answer = answer.toString().replaceAll(character, `\\\\${character}`)\n }\n\n return answer\n}\n\nexport const addClassOptionIfNone = (\n options: Extract<ComponentDef, { options: { classes?: string } }>['options'],\n className: string\n) => {\n options.classes ??= className\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","names":["ControllerType","controllerNameFromPath","isControllerName","PageControllers","isPageController","controllerName","createPage","model","pageDef","controller","QuestionPageController","Start","StartPageController","Page","Terminal","TerminalPageController","Summary","SummaryPageController","Status","StatusPageController","FileUpload","FileUploadPageController","Repeat","RepeatPageController","controllers","Ctrl","Error","getProxyUrlForLocalDevelopment","uploadUrl","includes","replace"],"sources":["../../../../../src/server/plugins/engine/pageControllers/helpers.ts"],"sourcesContent":["import {\n ControllerType,\n controllerNameFromPath,\n isControllerName,\n type Page\n} from '@defra/forms-model'\n\nimport { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'\nimport * as PageControllers from '~/src/server/plugins/engine/pageControllers/index.js'\n\nexport function isPageController(\n controllerName?: string | ControllerType\n): controllerName is keyof typeof PageControllers {\n return isControllerName(controllerName) && controllerName in PageControllers\n}\n\nexport type PageControllerClass = InstanceType<PageControllerType>\nexport type PageControllerType =\n (typeof PageControllers)[keyof typeof PageControllers]\n\n/**\n * Creates page instance for each {@link Page} type\n */\nexport function createPage(model: FormModel, pageDef: Page) {\n const controllerName = controllerNameFromPath(pageDef.controller)\n\n if (!pageDef.controller) {\n return new PageControllers.QuestionPageController(model, pageDef)\n }\n\n // Patch legacy controllers\n if (controllerName && pageDef.controller !== controllerName) {\n pageDef.controller = controllerName\n }\n\n let controller: PageControllerClass | undefined\n\n switch (pageDef.controller) {\n case ControllerType.Start:\n controller = new PageControllers.StartPageController(model, pageDef)\n break\n\n case ControllerType.Page:\n controller = new PageControllers.QuestionPageController(model, pageDef)\n break\n\n case ControllerType.Terminal:\n controller = new PageControllers.TerminalPageController(model, pageDef)\n break\n\n case ControllerType.Summary:\n controller = new PageControllers.SummaryPageController(model, pageDef)\n break\n\n case ControllerType.Status:\n controller = new PageControllers.StatusPageController(model, pageDef)\n break\n\n case ControllerType.FileUpload:\n controller = new PageControllers.FileUploadPageController(model, pageDef)\n break\n\n case ControllerType.Repeat:\n controller = new PageControllers.RepeatPageController(model, pageDef)\n break\n }\n\n if (typeof controller === 'undefined') {\n if (model.controllers?.[pageDef.controller]) {\n const Ctrl = model.controllers[pageDef.controller]\n controller = new Ctrl(model, pageDef) as unknown as PageControllerClass // type assertion needed because TS can't verify custom controller structure\n }\n }\n\n if (typeof controller === 'undefined') {\n throw new Error(`Page controller ${pageDef.controller} does not exist`)\n }\n\n return controller\n}\n\n/**\n * In local development environments, we sometimes need to rewrite the\n * CDP upload URL to work with CSP/CORS restrictions.\n * This helper function rewrites localhost URLs to use the sslip.io proxy\n * This is only used when running locally with a development proxy.\n * In non-local environments, this function returns null\n * @param uploadUrl - The original upload URL from CDP\n */\nexport function getProxyUrlForLocalDevelopment(\n uploadUrl?: string\n): string | null {\n if (!uploadUrl?.includes('localhost:7337')) {\n return null\n }\n\n return uploadUrl.replace(\n /localhost:7337/g,\n 'uploader.127.0.0.1.sslip.io:7300'\n )\n}\n"],"mappings":"AAAA,SACEA,cAAc,EACdC,sBAAsB,EACtBC,gBAAgB,QAEX,oBAAoB;AAG3B,OAAO,KAAKC,eAAe;AAE3B,OAAO,SAASC,gBAAgBA,CAC9BC,cAAwC,EACQ;EAChD,OAAOH,gBAAgB,CAACG,cAAc,CAAC,IAAIA,cAAc,IAAIF,eAAe;AAC9E;AAMA;AACA;AACA;AACA,OAAO,SAASG,UAAUA,CAACC,KAAgB,EAAEC,OAAa,EAAE;EAC1D,MAAMH,cAAc,GAAGJ,sBAAsB,CAACO,OAAO,CAACC,UAAU,CAAC;EAEjE,IAAI,CAACD,OAAO,CAACC,UAAU,EAAE;IACvB,OAAO,IAAIN,eAAe,CAACO,sBAAsB,CAACH,KAAK,EAAEC,OAAO,CAAC;EACnE;;EAEA;EACA,IAAIH,cAAc,IAAIG,OAAO,CAACC,UAAU,KAAKJ,cAAc,EAAE;IAC3DG,OAAO,CAACC,UAAU,GAAGJ,cAAc;EACrC;EAEA,IAAII,UAA2C;EAE/C,QAAQD,OAAO,CAACC,UAAU;IACxB,KAAKT,cAAc,CAACW,KAAK;MACvBF,UAAU,GAAG,IAAIN,eAAe,CAACS,mBAAmB,CAACL,KAAK,EAAEC,OAAO,CAAC;MACpE;IAEF,KAAKR,cAAc,CAACa,IAAI;MACtBJ,UAAU,GAAG,IAAIN,eAAe,CAACO,sBAAsB,CAACH,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKR,cAAc,CAACc,QAAQ;MAC1BL,UAAU,GAAG,IAAIN,eAAe,CAACY,sBAAsB,CAACR,KAAK,EAAEC,OAAO,CAAC;MACvE;IAEF,KAAKR,cAAc,CAACgB,OAAO;MACzBP,UAAU,GAAG,IAAIN,eAAe,CAACc,qBAAqB,CAACV,KAAK,EAAEC,OAAO,CAAC;MACtE;IAEF,KAAKR,cAAc,CAACkB,MAAM;MACxBT,UAAU,GAAG,IAAIN,eAAe,CAACgB,oBAAoB,CAACZ,KAAK,EAAEC,OAAO,CAAC;MACrE;IAEF,KAAKR,cAAc,CAACoB,UAAU;MAC5BX,UAAU,GAAG,IAAIN,eAAe,CAACkB,wBAAwB,CAACd,KAAK,EAAEC,OAAO,CAAC;MACzE;IAEF,KAAKR,cAAc,CAACsB,MAAM;MACxBb,UAAU,GAAG,IAAIN,eAAe,CAACoB,oBAAoB,CAAChB,KAAK,EAAEC,OAAO,CAAC;MACrE;EACJ;EAEA,IAAI,OAAOC,UAAU,KAAK,WAAW,EAAE;IACrC,IAAIF,KAAK,CAACiB,WAAW,GAAGhB,OAAO,CAACC,UAAU,CAAC,EAAE;MAC3C,MAAMgB,IAAI,GAAGlB,KAAK,CAACiB,WAAW,CAAChB,OAAO,CAACC,UAAU,CAAC;MAClDA,UAAU,GAAG,IAAIgB,IAAI,CAAClB,KAAK,EAAEC,OAAO,CAAmC,EAAC;IAC1E;EACF;EAEA,IAAI,OAAOC,UAAU,KAAK,WAAW,EAAE;IACrC,MAAM,IAAIiB,KAAK,CAAC,mBAAmBlB,OAAO,CAACC,UAAU,iBAAiB,CAAC;EACzE;EAEA,OAAOA,UAAU;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASkB,8BAA8BA,CAC5CC,SAAkB,EACH;EACf,IAAI,CAACA,SAAS,EAAEC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;IAC1C,OAAO,IAAI;EACb;EAEA,OAAOD,SAAS,CAACE,OAAO,CACtB,iBAAiB,EACjB,kCACF,CAAC;AACH","ignoreList":[]}