@defra/forms-engine-plugin 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.browserslistrc +16 -0
- package/.editorconfig +9 -0
- package/.eslintrc.cjs +266 -0
- package/.github/dependabot.yml +85 -0
- package/.github/workflows/check-pull-request.yml +209 -0
- package/.github/workflows/pr-notifier.yml +98 -0
- package/.github/workflows/publish.yml +111 -0
- package/.husky/pre-commit +1 -0
- package/.lintstagedrc.js +4 -0
- package/.nvmrc +1 -0
- package/.prettierignore +8 -0
- package/.prettierrc.cjs +26 -0
- package/.server/client/javascripts/application.js +68 -0
- package/.server/client/javascripts/application.js.map +1 -0
- package/.server/client/javascripts/file-upload.js +292 -0
- package/.server/client/javascripts/file-upload.js.map +1 -0
- package/.server/client/stylesheets/_code.scss +33 -0
- package/.server/client/stylesheets/_govuk-frontend.scss +4 -0
- package/.server/client/stylesheets/_prose.scss +56 -0
- package/.server/client/stylesheets/_service-banner.scss +24 -0
- package/.server/client/stylesheets/_summary-list.scss +28 -0
- package/.server/client/stylesheets/_tag-env.scss +24 -0
- package/.server/client/stylesheets/application.scss +14 -0
- package/.server/common/cookies.js +55 -0
- package/.server/common/cookies.js.map +1 -0
- package/.server/common/cookies.test.js +15 -0
- package/.server/common/cookies.test.js.map +1 -0
- package/.server/common/types.js +6 -0
- package/.server/common/types.js.map +1 -0
- package/.server/config/index.js +241 -0
- package/.server/config/index.js.map +1 -0
- package/.server/index.js +25 -0
- package/.server/index.js.map +1 -0
- package/.server/server/common/helpers/logging/logger-options.js +44 -0
- package/.server/server/common/helpers/logging/logger-options.js.map +1 -0
- package/.server/server/common/helpers/logging/logger.js +6 -0
- package/.server/server/common/helpers/logging/logger.js.map +1 -0
- package/.server/server/common/helpers/logging/request-logger.js +7 -0
- package/.server/server/common/helpers/logging/request-logger.js.map +1 -0
- package/.server/server/common/helpers/logging/request-tracing.js +12 -0
- package/.server/server/common/helpers/logging/request-tracing.js.map +1 -0
- package/.server/server/common/helpers/redis-client.js +55 -0
- package/.server/server/common/helpers/redis-client.js.map +1 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -0
- package/.server/server/forms/README.md +10 -0
- package/.server/server/forms/components.json +1015 -0
- package/.server/server/forms/report-a-terrorist.json +270 -0
- package/.server/server/forms/runner-components-test.json +365 -0
- package/.server/server/forms/test.json +581 -0
- package/.server/server/index.js +116 -0
- package/.server/server/index.js.map +1 -0
- package/.server/server/plugins/blankie.js +29 -0
- package/.server/server/plugins/blankie.js.map +1 -0
- package/.server/server/plugins/crumb.js +15 -0
- package/.server/server/plugins/crumb.js.map +1 -0
- package/.server/server/plugins/engine/README.md +87 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js +37 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js +79 -0
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -0
- package/.server/server/plugins/engine/components/ComponentBase.js +55 -0
- package/.server/server/plugins/engine/components/ComponentBase.js.map +1 -0
- package/.server/server/plugins/engine/components/ComponentCollection.js +198 -0
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -0
- package/.server/server/plugins/engine/components/DatePartsField.js +208 -0
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -0
- package/.server/server/plugins/engine/components/Details.js +26 -0
- package/.server/server/plugins/engine/components/Details.js.map +1 -0
- package/.server/server/plugins/engine/components/EmailAddressField.js +40 -0
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -0
- package/.server/server/plugins/engine/components/FileUploadField.js +195 -0
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -0
- package/.server/server/plugins/engine/components/FormComponent.js +210 -0
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -0
- package/.server/server/plugins/engine/components/Html.js +24 -0
- package/.server/server/plugins/engine/components/Html.js.map +1 -0
- package/.server/server/plugins/engine/components/InsetText.js +22 -0
- package/.server/server/plugins/engine/components/InsetText.js.map +1 -0
- package/.server/server/plugins/engine/components/List.js +65 -0
- package/.server/server/plugins/engine/components/List.js.map +1 -0
- package/.server/server/plugins/engine/components/ListFormComponent.js +87 -0
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -0
- package/.server/server/plugins/engine/components/MonthYearField.js +172 -0
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -0
- package/.server/server/plugins/engine/components/MultilineTextField.js +115 -0
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -0
- package/.server/server/plugins/engine/components/NumberField.js +137 -0
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -0
- package/.server/server/plugins/engine/components/RadiosField.js +18 -0
- package/.server/server/plugins/engine/components/RadiosField.js.map +1 -0
- package/.server/server/plugins/engine/components/SelectField.js +33 -0
- package/.server/server/plugins/engine/components/SelectField.js.map +1 -0
- package/.server/server/plugins/engine/components/SelectionControlField.js +43 -0
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +43 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -0
- package/.server/server/plugins/engine/components/TextField.js +63 -0
- package/.server/server/plugins/engine/components/TextField.js.map +1 -0
- package/.server/server/plugins/engine/components/UkAddressField.js +130 -0
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -0
- package/.server/server/plugins/engine/components/YesNoField.js +28 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -0
- package/.server/server/plugins/engine/components/constants.js +2 -0
- package/.server/server/plugins/engine/components/constants.js.map +1 -0
- package/.server/server/plugins/engine/components/helpers.js +219 -0
- package/.server/server/plugins/engine/components/helpers.js.map +1 -0
- package/.server/server/plugins/engine/components/index.js +25 -0
- package/.server/server/plugins/engine/components/index.js.map +1 -0
- package/.server/server/plugins/engine/components/types.js +2 -0
- package/.server/server/plugins/engine/components/types.js.map +1 -0
- package/.server/server/plugins/engine/configureEnginePlugin.js +44 -0
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -0
- package/.server/server/plugins/engine/helpers.js +268 -0
- package/.server/server/plugins/engine/helpers.js.map +1 -0
- package/.server/server/plugins/engine/index.js +6 -0
- package/.server/server/plugins/engine/index.js.map +1 -0
- package/.server/server/plugins/engine/models/FormModel.js +363 -0
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -0
- package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js +2 -0
- package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.js.map +1 -0
- package/.server/server/plugins/engine/models/Section.js +2 -0
- package/.server/server/plugins/engine/models/Section.js.map +1 -0
- package/.server/server/plugins/engine/models/SummaryViewModel.js +183 -0
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -0
- package/.server/server/plugins/engine/models/index.js +3 -0
- package/.server/server/plugins/engine/models/index.js.map +1 -0
- package/.server/server/plugins/engine/models/types.js +2 -0
- package/.server/server/plugins/engine/models/types.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +44 -0
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/index.js +24 -0
- package/.server/server/plugins/engine/outputFormatters/index.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js +104 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v1.js.map +1 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +110 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +401 -0
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/PageController.js +133 -0
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +482 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/README.md +28 -0
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js +372 -0
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/StartPageController.js +16 -0
- package/.server/server/plugins/engine/pageControllers/StartPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js +43 -0
- package/.server/server/plugins/engine/pageControllers/StatusPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +195 -0
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.js +8 -0
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/helpers.js +69 -0
- package/.server/server/plugins/engine/pageControllers/helpers.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/index.js +10 -0
- package/.server/server/plugins/engine/pageControllers/index.js.map +1 -0
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +78 -0
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -0
- package/.server/server/plugins/engine/plugin.js +562 -0
- package/.server/server/plugins/engine/plugin.js.map +1 -0
- package/.server/server/plugins/engine/services/formSubmissionService.js +39 -0
- package/.server/server/plugins/engine/services/formSubmissionService.js.map +1 -0
- package/.server/server/plugins/engine/services/formsService.js +41 -0
- package/.server/server/plugins/engine/services/formsService.js.map +1 -0
- package/.server/server/plugins/engine/services/formsService.test.js +71 -0
- package/.server/server/plugins/engine/services/formsService.test.js.map +1 -0
- package/.server/server/plugins/engine/services/index.js +4 -0
- package/.server/server/plugins/engine/services/index.js.map +1 -0
- package/.server/server/plugins/engine/services/notifyService.js +45 -0
- package/.server/server/plugins/engine/services/notifyService.js.map +1 -0
- package/.server/server/plugins/engine/services/uploadService.js +51 -0
- package/.server/server/plugins/engine/services/uploadService.js.map +1 -0
- package/.server/server/plugins/engine/types.js +53 -0
- package/.server/server/plugins/engine/types.js.map +1 -0
- package/.server/server/plugins/engine/views/components/autocompletefield.html +5 -0
- package/.server/server/plugins/engine/views/components/checkboxesfield.html +5 -0
- package/.server/server/plugins/engine/views/components/datepartsfield.html +5 -0
- package/.server/server/plugins/engine/views/components/details.html +6 -0
- package/.server/server/plugins/engine/views/components/emailaddressfield.html +5 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
- package/.server/server/plugins/engine/views/components/fileuploadfield.html +24 -0
- package/.server/server/plugins/engine/views/components/html.html +3 -0
- package/.server/server/plugins/engine/views/components/insettext.html +7 -0
- package/.server/server/plugins/engine/views/components/list.html +36 -0
- package/.server/server/plugins/engine/views/components/monthyearfield.html +5 -0
- package/.server/server/plugins/engine/views/components/multilinetextfield.html +10 -0
- package/.server/server/plugins/engine/views/components/numberfield.html +5 -0
- package/.server/server/plugins/engine/views/components/radiosfield.html +5 -0
- package/.server/server/plugins/engine/views/components/selectfield.html +5 -0
- package/.server/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
- package/.server/server/plugins/engine/views/components/textfield.html +5 -0
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +25 -0
- package/.server/server/plugins/engine/views/components/yesnofield.html +5 -0
- package/.server/server/plugins/engine/views/file-upload.html +45 -0
- package/.server/server/plugins/engine/views/index.html +39 -0
- package/.server/server/plugins/engine/views/item-delete.html +56 -0
- package/.server/server/plugins/engine/views/partials/components.html +6 -0
- package/.server/server/plugins/engine/views/partials/conditional-components.html +3 -0
- package/.server/server/plugins/engine/views/partials/debug.html +44 -0
- package/.server/server/plugins/engine/views/partials/form.html +15 -0
- package/.server/server/plugins/engine/views/partials/heading.html +16 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.html +32 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.test.js +108 -0
- package/.server/server/plugins/engine/views/partials/preview-banner.test.js.map +1 -0
- package/.server/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
- package/.server/server/plugins/engine/views/repeat-list-summary.html +53 -0
- package/.server/server/plugins/errorPages.js +49 -0
- package/.server/server/plugins/errorPages.js.map +1 -0
- package/.server/server/plugins/nunjucks/context.js +79 -0
- package/.server/server/plugins/nunjucks/context.js.map +1 -0
- package/.server/server/plugins/nunjucks/context.test.js +134 -0
- package/.server/server/plugins/nunjucks/context.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js +166 -0
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/environment.js +95 -0
- package/.server/server/plugins/nunjucks/environment.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/answer.js +26 -0
- package/.server/server/plugins/nunjucks/filters/answer.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/answer.test.js +70 -0
- package/.server/server/plugins/nunjucks/filters/answer.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/evaluate.js +22 -0
- package/.server/server/plugins/nunjucks/filters/evaluate.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.js +26 -0
- package/.server/server/plugins/nunjucks/filters/field.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/field.test.js +64 -0
- package/.server/server/plugins/nunjucks/filters/field.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/highlight.js +14 -0
- package/.server/server/plugins/nunjucks/filters/highlight.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/href.js +28 -0
- package/.server/server/plugins/nunjucks/filters/href.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/href.test.js +63 -0
- package/.server/server/plugins/nunjucks/filters/href.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/index.js +9 -0
- package/.server/server/plugins/nunjucks/filters/index.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/inspect.js +16 -0
- package/.server/server/plugins/nunjucks/filters/inspect.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/page.js +23 -0
- package/.server/server/plugins/nunjucks/filters/page.js.map +1 -0
- package/.server/server/plugins/nunjucks/filters/page.test.js +51 -0
- package/.server/server/plugins/nunjucks/filters/page.test.js.map +1 -0
- package/.server/server/plugins/nunjucks/index.js +4 -0
- package/.server/server/plugins/nunjucks/index.js.map +1 -0
- package/.server/server/plugins/nunjucks/plugin.js +38 -0
- package/.server/server/plugins/nunjucks/plugin.js.map +1 -0
- package/.server/server/plugins/nunjucks/render.js +41 -0
- package/.server/server/plugins/nunjucks/render.js.map +1 -0
- package/.server/server/plugins/nunjucks/types.js +41 -0
- package/.server/server/plugins/nunjucks/types.js.map +1 -0
- package/.server/server/plugins/pulse.js +8 -0
- package/.server/server/plugins/pulse.js.map +1 -0
- package/.server/server/plugins/router.js +169 -0
- package/.server/server/plugins/router.js.map +1 -0
- package/.server/server/plugins/session.js +28 -0
- package/.server/server/plugins/session.js.map +1 -0
- package/.server/server/routes/health.js +15 -0
- package/.server/server/routes/health.js.map +1 -0
- package/.server/server/routes/health.test.js +32 -0
- package/.server/server/routes/health.test.js.map +1 -0
- package/.server/server/routes/index.js +3 -0
- package/.server/server/routes/index.js.map +1 -0
- package/.server/server/routes/public.js +37 -0
- package/.server/server/routes/public.js.map +1 -0
- package/.server/server/routes/types.js +14 -0
- package/.server/server/routes/types.js.map +1 -0
- package/.server/server/schemas/index.js +15 -0
- package/.server/server/schemas/index.js.map +1 -0
- package/.server/server/secure-context.js +36 -0
- package/.server/server/secure-context.js.map +1 -0
- package/.server/server/services/cacheService.js +85 -0
- package/.server/server/services/cacheService.js.map +1 -0
- package/.server/server/services/httpService.js +44 -0
- package/.server/server/services/httpService.js.map +1 -0
- package/.server/server/services/httpService.test.js +504 -0
- package/.server/server/services/httpService.test.js.map +1 -0
- package/.server/server/services/index.js +2 -0
- package/.server/server/services/index.js.map +1 -0
- package/.server/server/types.js +2 -0
- package/.server/server/types.js.map +1 -0
- package/.server/server/utils/notify.js +40 -0
- package/.server/server/utils/notify.js.map +1 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.js +7 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.js.map +1 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.test.js +14 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.test.js.map +1 -0
- package/.server/server/utils/utils.js +20 -0
- package/.server/server/utils/utils.js.map +1 -0
- package/.server/server/utils/utils.test.js +49 -0
- package/.server/server/utils/utils.test.js.map +1 -0
- package/.server/server/views/404.html +16 -0
- package/.server/server/views/500.html +19 -0
- package/.server/server/views/components/debug/macro.njk +3 -0
- package/.server/server/views/components/debug/template.njk +13 -0
- package/.server/server/views/components/service-banner/macro.njk +3 -0
- package/.server/server/views/components/service-banner/template.njk +20 -0
- package/.server/server/views/components/service-banner/template.test.js +36 -0
- package/.server/server/views/components/service-banner/template.test.js.map +1 -0
- package/.server/server/views/components/tag-env/macro.njk +3 -0
- package/.server/server/views/components/tag-env/template.njk +30 -0
- package/.server/server/views/components/tag-env/template.test.js +59 -0
- package/.server/server/views/components/tag-env/template.test.js.map +1 -0
- package/.server/server/views/confirmation.html +19 -0
- package/.server/server/views/help/accessibility-statement.html +58 -0
- package/.server/server/views/help/cookie-preferences.html +57 -0
- package/.server/server/views/help/cookies.html +71 -0
- package/.server/server/views/help/get-support.html +37 -0
- package/.server/server/views/help/privacy-notice.html +68 -0
- package/.server/server/views/help/terms-and-conditions.html +83 -0
- package/.server/server/views/layout.html +199 -0
- package/.server/server/views/summary.html +50 -0
- package/.server/typings/hapi/index.d.js +2 -0
- package/.server/typings/hapi/index.d.js.map +1 -0
- package/.server/typings/hapi-tracing/index.d.js +2 -0
- package/.server/typings/hapi-tracing/index.d.js.map +1 -0
- package/.server/typings/index.d.js +2 -0
- package/.server/typings/index.d.js.map +1 -0
- package/.server/typings/joi/index.d.js +2 -0
- package/.server/typings/joi/index.d.js.map +1 -0
- package/Dockerfile +61 -0
- package/LICENCE +8 -0
- package/Procfile +1 -0
- package/README.md +87 -0
- package/babel.config.cjs +55 -0
- package/compose/aws.env +4 -0
- package/compose/start-localstack.sh +26 -0
- package/docker-compose.yaml +86 -0
- package/globals.d.ts +1 -0
- package/jest.config.cjs +54 -0
- package/jest.environment.js +4 -0
- package/jest.setup.cjs +14 -0
- package/package.json +163 -0
- package/postcss.config.js +26 -0
- package/sonar-project.properties +17 -0
- package/src/client/javascripts/application.js +87 -0
- package/src/client/javascripts/file-upload.js +386 -0
- package/src/client/stylesheets/_code.scss +33 -0
- package/src/client/stylesheets/_govuk-frontend.scss +4 -0
- package/src/client/stylesheets/_prose.scss +56 -0
- package/src/client/stylesheets/_service-banner.scss +24 -0
- package/src/client/stylesheets/_summary-list.scss +28 -0
- package/src/client/stylesheets/_tag-env.scss +24 -0
- package/src/client/stylesheets/application.scss +14 -0
- package/src/common/cookies.js +58 -0
- package/src/common/cookies.test.js +23 -0
- package/src/common/types.js +5 -0
- package/src/config/index.ts +271 -0
- package/src/index.ts +31 -0
- package/src/server/common/helpers/logging/logger-options.test.ts +50 -0
- package/src/server/common/helpers/logging/logger-options.ts +46 -0
- package/src/server/common/helpers/logging/logger.ts +7 -0
- package/src/server/common/helpers/logging/request-logger.ts +9 -0
- package/src/server/common/helpers/logging/request-tracing.js +10 -0
- package/src/server/common/helpers/redis-client.js +70 -0
- package/src/server/constants.js +1 -0
- package/src/server/forms/README.md +10 -0
- package/src/server/forms/components.json +1015 -0
- package/src/server/forms/report-a-terrorist.json +270 -0
- package/src/server/forms/runner-components-test.json +365 -0
- package/src/server/forms/test.json +581 -0
- package/src/server/index.test.ts +582 -0
- package/src/server/index.ts +140 -0
- package/src/server/plugins/blankie.test.ts +73 -0
- package/src/server/plugins/blankie.ts +48 -0
- package/src/server/plugins/crumb.ts +20 -0
- package/src/server/plugins/engine/README.md +87 -0
- package/src/server/plugins/engine/components/AutocompleteField.test.ts +294 -0
- package/src/server/plugins/engine/components/AutocompleteField.ts +49 -0
- package/src/server/plugins/engine/components/CheckboxesField.test.ts +379 -0
- package/src/server/plugins/engine/components/CheckboxesField.ts +106 -0
- package/src/server/plugins/engine/components/ComponentBase.ts +97 -0
- package/src/server/plugins/engine/components/ComponentCollection.ts +278 -0
- package/src/server/plugins/engine/components/DatePartsField.test.ts +822 -0
- package/src/server/plugins/engine/components/DatePartsField.ts +264 -0
- package/src/server/plugins/engine/components/Details.test.ts +49 -0
- package/src/server/plugins/engine/components/Details.ts +30 -0
- package/src/server/plugins/engine/components/EmailAddressField.test.ts +395 -0
- package/src/server/plugins/engine/components/EmailAddressField.ts +55 -0
- package/src/server/plugins/engine/components/FileUploadField.test.ts +778 -0
- package/src/server/plugins/engine/components/FileUploadField.ts +262 -0
- package/src/server/plugins/engine/components/FormComponent.ts +249 -0
- package/src/server/plugins/engine/components/Html.test.ts +48 -0
- package/src/server/plugins/engine/components/Html.ts +29 -0
- package/src/server/plugins/engine/components/InsetText.test.ts +48 -0
- package/src/server/plugins/engine/components/InsetText.ts +27 -0
- package/src/server/plugins/engine/components/List.test.ts +76 -0
- package/src/server/plugins/engine/components/List.ts +72 -0
- package/src/server/plugins/engine/components/ListFormComponent.ts +140 -0
- package/src/server/plugins/engine/components/MonthYearField.test.ts +567 -0
- package/src/server/plugins/engine/components/MonthYearField.ts +222 -0
- package/src/server/plugins/engine/components/MultilineTextField.test.ts +558 -0
- package/src/server/plugins/engine/components/MultilineTextField.ts +138 -0
- package/src/server/plugins/engine/components/NumberField.test.ts +701 -0
- package/src/server/plugins/engine/components/NumberField.ts +163 -0
- package/src/server/plugins/engine/components/RadiosField.test.ts +288 -0
- package/src/server/plugins/engine/components/RadiosField.ts +24 -0
- package/src/server/plugins/engine/components/SelectField.test.ts +288 -0
- package/src/server/plugins/engine/components/SelectField.ts +47 -0
- package/src/server/plugins/engine/components/SelectionControlField.ts +43 -0
- package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +356 -0
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +67 -0
- package/src/server/plugins/engine/components/TextField.test.ts +489 -0
- package/src/server/plugins/engine/components/TextField.ts +96 -0
- package/src/server/plugins/engine/components/UkAddressField.test.ts +623 -0
- package/src/server/plugins/engine/components/UkAddressField.ts +172 -0
- package/src/server/plugins/engine/components/YesNoField.test.ts +248 -0
- package/src/server/plugins/engine/components/YesNoField.ts +31 -0
- package/src/server/plugins/engine/components/constants.ts +1 -0
- package/src/server/plugins/engine/components/helpers.ts +330 -0
- package/src/server/plugins/engine/components/index.ts +24 -0
- package/src/server/plugins/engine/components/types.ts +117 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +47 -0
- package/src/server/plugins/engine/helpers.test.ts +791 -0
- package/src/server/plugins/engine/helpers.ts +379 -0
- package/src/server/plugins/engine/index.ts +7 -0
- package/src/server/plugins/engine/models/FormModel.test.ts +42 -0
- package/src/server/plugins/engine/models/FormModel.ts +443 -0
- package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
- package/src/server/plugins/engine/models/Section.ts +0 -0
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +209 -0
- package/src/server/plugins/engine/models/SummaryViewModel.ts +220 -0
- package/src/server/plugins/engine/models/index.ts +2 -0
- package/src/server/plugins/engine/models/types.ts +114 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +143 -0
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +73 -0
- package/src/server/plugins/engine/outputFormatters/index.test.ts +17 -0
- package/src/server/plugins/engine/outputFormatters/index.ts +44 -0
- package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +229 -0
- package/src/server/plugins/engine/outputFormatters/machine/v1.ts +140 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +229 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +153 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1108 -0
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +446 -0
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +205 -0
- package/src/server/plugins/engine/pageControllers/PageController.ts +176 -0
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +1264 -0
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +561 -0
- package/src/server/plugins/engine/pageControllers/README.md +28 -0
- package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +264 -0
- package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +458 -0
- package/src/server/plugins/engine/pageControllers/StartPageController.ts +18 -0
- package/src/server/plugins/engine/pageControllers/StatusPageController.ts +50 -0
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +261 -0
- package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +28 -0
- package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +19 -0
- package/src/server/plugins/engine/pageControllers/helpers.test.ts +198 -0
- package/src/server/plugins/engine/pageControllers/helpers.ts +101 -0
- package/src/server/plugins/engine/pageControllers/index.ts +10 -0
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +89 -0
- package/src/server/plugins/engine/plugin.ts +673 -0
- package/src/server/plugins/engine/services/formSubmissionService.js +46 -0
- package/src/server/plugins/engine/services/formsService.js +46 -0
- package/src/server/plugins/engine/services/formsService.test.js +90 -0
- package/src/server/plugins/engine/services/index.js +3 -0
- package/src/server/plugins/engine/services/notifyService.test.ts +132 -0
- package/src/server/plugins/engine/services/notifyService.ts +64 -0
- package/src/server/plugins/engine/services/uploadService.js +60 -0
- package/src/server/plugins/engine/types.ts +315 -0
- package/src/server/plugins/engine/views/components/autocompletefield.html +5 -0
- package/src/server/plugins/engine/views/components/checkboxesfield.html +5 -0
- package/src/server/plugins/engine/views/components/datepartsfield.html +5 -0
- package/src/server/plugins/engine/views/components/details.html +6 -0
- package/src/server/plugins/engine/views/components/emailaddressfield.html +5 -0
- package/src/server/plugins/engine/views/components/fileuploadfield-key.html +8 -0
- package/src/server/plugins/engine/views/components/fileuploadfield-value.html +3 -0
- package/src/server/plugins/engine/views/components/fileuploadfield.html +24 -0
- package/src/server/plugins/engine/views/components/html.html +3 -0
- package/src/server/plugins/engine/views/components/insettext.html +7 -0
- package/src/server/plugins/engine/views/components/list.html +36 -0
- package/src/server/plugins/engine/views/components/monthyearfield.html +5 -0
- package/src/server/plugins/engine/views/components/multilinetextfield.html +10 -0
- package/src/server/plugins/engine/views/components/numberfield.html +5 -0
- package/src/server/plugins/engine/views/components/radiosfield.html +5 -0
- package/src/server/plugins/engine/views/components/selectfield.html +5 -0
- package/src/server/plugins/engine/views/components/telephonenumberfield.html +5 -0
- package/src/server/plugins/engine/views/components/textfield.html +5 -0
- package/src/server/plugins/engine/views/components/ukaddressfield.html +25 -0
- package/src/server/plugins/engine/views/components/yesnofield.html +5 -0
- package/src/server/plugins/engine/views/file-upload.html +45 -0
- package/src/server/plugins/engine/views/index.html +39 -0
- package/src/server/plugins/engine/views/item-delete.html +56 -0
- package/src/server/plugins/engine/views/partials/components.html +6 -0
- package/src/server/plugins/engine/views/partials/conditional-components.html +3 -0
- package/src/server/plugins/engine/views/partials/debug.html +44 -0
- package/src/server/plugins/engine/views/partials/form.html +15 -0
- package/src/server/plugins/engine/views/partials/heading.html +16 -0
- package/src/server/plugins/engine/views/partials/preview-banner.html +32 -0
- package/src/server/plugins/engine/views/partials/preview-banner.test.js +122 -0
- package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +10 -0
- package/src/server/plugins/engine/views/repeat-list-summary.html +53 -0
- package/src/server/plugins/errorPages.ts +58 -0
- package/src/server/plugins/nunjucks/context.js +88 -0
- package/src/server/plugins/nunjucks/context.test.js +142 -0
- package/src/server/plugins/nunjucks/enviroment.test.js +201 -0
- package/src/server/plugins/nunjucks/environment.js +116 -0
- package/src/server/plugins/nunjucks/filters/answer.js +27 -0
- package/src/server/plugins/nunjucks/filters/answer.test.js +89 -0
- package/src/server/plugins/nunjucks/filters/evaluate.js +21 -0
- package/src/server/plugins/nunjucks/filters/field.js +28 -0
- package/src/server/plugins/nunjucks/filters/field.test.js +75 -0
- package/src/server/plugins/nunjucks/filters/highlight.js +11 -0
- package/src/server/plugins/nunjucks/filters/href.js +30 -0
- package/src/server/plugins/nunjucks/filters/href.test.js +80 -0
- package/src/server/plugins/nunjucks/filters/index.js +8 -0
- package/src/server/plugins/nunjucks/filters/inspect.js +15 -0
- package/src/server/plugins/nunjucks/filters/page.js +24 -0
- package/src/server/plugins/nunjucks/filters/page.test.js +65 -0
- package/src/server/plugins/nunjucks/index.js +3 -0
- package/src/server/plugins/nunjucks/plugin.js +40 -0
- package/src/server/plugins/nunjucks/render.js +42 -0
- package/src/server/plugins/nunjucks/types.js +40 -0
- package/src/server/plugins/pulse.ts +11 -0
- package/src/server/plugins/router.ts +201 -0
- package/src/server/plugins/session.ts +28 -0
- package/src/server/routes/health.js +13 -0
- package/src/server/routes/health.test.js +35 -0
- package/src/server/routes/index.test.ts +125 -0
- package/src/server/routes/index.ts +2 -0
- package/src/server/routes/public.ts +47 -0
- package/src/server/routes/types.ts +48 -0
- package/src/server/schemas/index.ts +34 -0
- package/src/server/secure-context.js +43 -0
- package/src/server/services/cacheService.test.ts +276 -0
- package/src/server/services/cacheService.ts +131 -0
- package/src/server/services/httpService.test.js +491 -0
- package/src/server/services/httpService.ts +50 -0
- package/src/server/services/index.ts +1 -0
- package/src/server/types.ts +54 -0
- package/src/server/utils/notify.test.ts +37 -0
- package/src/server/utils/notify.ts +50 -0
- package/src/server/utils/secure-context/get-trust-store-certs.js +11 -0
- package/src/server/utils/secure-context/get-trust-store-certs.test.js +19 -0
- package/src/server/utils/utils.js +24 -0
- package/src/server/utils/utils.test.js +54 -0
- package/src/server/views/404.html +16 -0
- package/src/server/views/500.html +19 -0
- package/src/server/views/components/debug/macro.njk +3 -0
- package/src/server/views/components/debug/template.njk +13 -0
- package/src/server/views/components/service-banner/macro.njk +3 -0
- package/src/server/views/components/service-banner/template.njk +20 -0
- package/src/server/views/components/service-banner/template.test.js +43 -0
- package/src/server/views/components/tag-env/macro.njk +3 -0
- package/src/server/views/components/tag-env/template.njk +30 -0
- package/src/server/views/components/tag-env/template.test.js +66 -0
- package/src/server/views/confirmation.html +19 -0
- package/src/server/views/help/accessibility-statement.html +58 -0
- package/src/server/views/help/cookie-preferences.html +57 -0
- package/src/server/views/help/cookies.html +71 -0
- package/src/server/views/help/get-support.html +37 -0
- package/src/server/views/help/privacy-notice.html +68 -0
- package/src/server/views/help/terms-and-conditions.html +83 -0
- package/src/server/views/layout.html +199 -0
- package/src/server/views/summary.html +50 -0
- package/src/typings/hapi/index.d.ts +95 -0
- package/src/typings/hapi-tracing/index.d.ts +6 -0
- package/src/typings/index.d.ts +3 -0
- package/src/typings/joi/index.d.ts +22 -0
- package/stylelint.config.js +10 -0
- package/test/client/javascripts/file-upload.test.js +1197 -0
- package/test/condition/checkboxes.test.js +112 -0
- package/test/condition/radios.test.js +112 -0
- package/test/condition/text.test.js +103 -0
- package/test/fixtures/assets-manifest.json +4 -0
- package/test/fixtures/form.js +86 -0
- package/test/fixtures/index.js +2 -0
- package/test/fixtures/list.js +92 -0
- package/test/form/cookies.test.js +338 -0
- package/test/form/csrf.test.js +87 -0
- package/test/form/definitions/basic.js +101 -0
- package/test/form/definitions/blank.js +10 -0
- package/test/form/definitions/checkboxes.json +88 -0
- package/test/form/definitions/components.json +452 -0
- package/test/form/definitions/conditional-reveal.js +140 -0
- package/test/form/definitions/conditions-basic.js +187 -0
- package/test/form/definitions/conditions-complex.js +338 -0
- package/test/form/definitions/conditions-dates.js +78 -0
- package/test/form/definitions/conditions-escaping.js +143 -0
- package/test/form/definitions/demo-cph-number.js +3099 -0
- package/test/form/definitions/feedback.json +45 -0
- package/test/form/definitions/fields-optional.js +402 -0
- package/test/form/definitions/fields-required.js +402 -0
- package/test/form/definitions/file-upload-basic.js +44 -0
- package/test/form/definitions/file-upload.js +66 -0
- package/test/form/definitions/minimal.js +39 -0
- package/test/form/definitions/phase-alpha.json +33 -0
- package/test/form/definitions/phase-default.json +26 -0
- package/test/form/definitions/radios.json +88 -0
- package/test/form/definitions/repeat-mixed.js +54 -0
- package/test/form/definitions/repeat.js +70 -0
- package/test/form/definitions/status.json +126 -0
- package/test/form/definitions/templates.js +183 -0
- package/test/form/definitions/test.json +581 -0
- package/test/form/definitions/text.json +75 -0
- package/test/form/definitions/titles.json +170 -0
- package/test/form/definitions.test.js +47 -0
- package/test/form/exit-page.test.js +210 -0
- package/test/form/feedback.test.js +68 -0
- package/test/form/fields-optional.test.js +237 -0
- package/test/form/fields-required.test.js +294 -0
- package/test/form/file-upload.test.js +313 -0
- package/test/form/govuk-notify.test.js +449 -0
- package/test/form/journey-basic.test.js +444 -0
- package/test/form/persist-files.test.js +227 -0
- package/test/form/phase-banner.test.js +71 -0
- package/test/form/repeat.test.js +628 -0
- package/test/form/summary-submission-email.test.js +95 -0
- package/test/form/template.test.js +288 -0
- package/test/form/titles.test.js +204 -0
- package/test/helpers/component-helpers.js +74 -0
- package/test/utils/get-cookie.js +42 -0
- package/test/utils/get-form-definitions.js +18 -0
- package/tmp.pdf +1 -0
- package/tsconfig.json +28 -0
- package/webpack.config.js +208 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import Boom from '@hapi/boom';
|
|
2
|
+
import { FileUploadField } from "../components/FileUploadField.js";
|
|
3
|
+
import { getAnswer } from "../components/helpers.js";
|
|
4
|
+
import { checkEmailAddressForLiveFormSubmission, checkFormStatus } from "../helpers.js";
|
|
5
|
+
import { SummaryViewModel } from "../models/index.js";
|
|
6
|
+
import { QuestionPageController } from "./QuestionPageController.js";
|
|
7
|
+
export class SummaryPageController extends QuestionPageController {
|
|
8
|
+
/**
|
|
9
|
+
* The controller which is used when Page["controller"] is defined as "./pages/summary.js"
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
constructor(model, pageDef) {
|
|
13
|
+
super(model, pageDef);
|
|
14
|
+
this.viewName = 'summary';
|
|
15
|
+
}
|
|
16
|
+
getSummaryViewModel(request, context) {
|
|
17
|
+
const viewModel = new SummaryViewModel(request, this, context);
|
|
18
|
+
|
|
19
|
+
// We already figure these out in the base page controller. Take them and apply them to our page-specific model.
|
|
20
|
+
// This is a stop-gap until we can add proper inheritance in place.
|
|
21
|
+
viewModel.backLink = this.getBackLink(request, context);
|
|
22
|
+
viewModel.feedbackLink = this.feedbackLink;
|
|
23
|
+
viewModel.phaseTag = this.phaseTag;
|
|
24
|
+
return viewModel;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Returns an async function. This is called in plugin.ts when there is a GET request at `/{id}/{path*}`,
|
|
29
|
+
*/
|
|
30
|
+
makeGetRouteHandler() {
|
|
31
|
+
return async (request, context, h) => {
|
|
32
|
+
const {
|
|
33
|
+
viewName
|
|
34
|
+
} = this;
|
|
35
|
+
const viewModel = this.getSummaryViewModel(request, context);
|
|
36
|
+
viewModel.hasMissingNotificationEmail = await this.hasMissingNotificationEmail(request, context);
|
|
37
|
+
return h.view(viewName, viewModel);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns an async function. This is called in plugin.ts when there is a POST request at `/{id}/{path*}`.
|
|
43
|
+
* If a form is incomplete, a user will be redirected to the start page.
|
|
44
|
+
*/
|
|
45
|
+
makePostRouteHandler() {
|
|
46
|
+
return async (request, context, h) => {
|
|
47
|
+
const {
|
|
48
|
+
model
|
|
49
|
+
} = this;
|
|
50
|
+
const {
|
|
51
|
+
params
|
|
52
|
+
} = request;
|
|
53
|
+
const {
|
|
54
|
+
state
|
|
55
|
+
} = context;
|
|
56
|
+
const {
|
|
57
|
+
cacheService
|
|
58
|
+
} = request.services([]);
|
|
59
|
+
const {
|
|
60
|
+
formsService
|
|
61
|
+
} = this.model.services;
|
|
62
|
+
const {
|
|
63
|
+
getFormMetadata
|
|
64
|
+
} = formsService;
|
|
65
|
+
|
|
66
|
+
// Get the form metadata using the `slug` param
|
|
67
|
+
const {
|
|
68
|
+
notificationEmail
|
|
69
|
+
} = await getFormMetadata(params.slug);
|
|
70
|
+
const {
|
|
71
|
+
isPreview
|
|
72
|
+
} = checkFormStatus(request.path);
|
|
73
|
+
const emailAddress = notificationEmail ?? this.model.def.outputEmail;
|
|
74
|
+
checkEmailAddressForLiveFormSubmission(emailAddress, isPreview);
|
|
75
|
+
|
|
76
|
+
// Send submission email
|
|
77
|
+
if (emailAddress) {
|
|
78
|
+
const viewModel = this.getSummaryViewModel(request, context);
|
|
79
|
+
await submitForm(request, viewModel, model, state, emailAddress);
|
|
80
|
+
}
|
|
81
|
+
await cacheService.setConfirmationState(request, {
|
|
82
|
+
confirmed: true
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Clear all form data
|
|
86
|
+
await cacheService.clearState(request);
|
|
87
|
+
return this.proceed(request, h, this.getStatusPath());
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
get postRouteOptions() {
|
|
91
|
+
return {
|
|
92
|
+
ext: {
|
|
93
|
+
onPreHandler: {
|
|
94
|
+
method(request, h) {
|
|
95
|
+
return h.continue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function submitForm(request, summaryViewModel, model, state, emailAddress) {
|
|
103
|
+
await extendFileRetention(model, state, emailAddress);
|
|
104
|
+
const {
|
|
105
|
+
path
|
|
106
|
+
} = request;
|
|
107
|
+
const formStatus = checkFormStatus(path);
|
|
108
|
+
const logTags = ['submit', 'submissionApi'];
|
|
109
|
+
request.logger.info(logTags, 'Preparing email', formStatus);
|
|
110
|
+
|
|
111
|
+
// Get detail items
|
|
112
|
+
const items = getFormSubmissionData(summaryViewModel.context, summaryViewModel.details);
|
|
113
|
+
|
|
114
|
+
// Submit data
|
|
115
|
+
request.logger.info(logTags, 'Submitting data');
|
|
116
|
+
const submitResponse = await submitData(model, items, emailAddress, request.yar.id);
|
|
117
|
+
if (submitResponse === undefined) {
|
|
118
|
+
throw Boom.badRequest('Unexpected empty response from submit api');
|
|
119
|
+
}
|
|
120
|
+
return model.services.outputService.submit(request, model, emailAddress, items, submitResponse);
|
|
121
|
+
}
|
|
122
|
+
async function extendFileRetention(model, state, updatedRetrievalKey) {
|
|
123
|
+
const {
|
|
124
|
+
formSubmissionService
|
|
125
|
+
} = model.services;
|
|
126
|
+
const {
|
|
127
|
+
persistFiles
|
|
128
|
+
} = formSubmissionService;
|
|
129
|
+
const files = [];
|
|
130
|
+
|
|
131
|
+
// For each file upload component with files in
|
|
132
|
+
// state, add the files to the batch getting persisted
|
|
133
|
+
model.pages.forEach(page => {
|
|
134
|
+
const fileUploadComponents = page.collection.fields.filter(component => component instanceof FileUploadField);
|
|
135
|
+
fileUploadComponents.forEach(component => {
|
|
136
|
+
const values = component.getFormValueFromState(state);
|
|
137
|
+
if (!values?.length) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
files.push(...values.map(({
|
|
141
|
+
status
|
|
142
|
+
}) => ({
|
|
143
|
+
fileId: status.form.file.fileId,
|
|
144
|
+
initiatedRetrievalKey: status.metadata.retrievalKey
|
|
145
|
+
})));
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
if (files.length) {
|
|
149
|
+
return persistFiles(files, updatedRetrievalKey);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function submitData(model, items, retrievalKey, sessionId) {
|
|
153
|
+
const {
|
|
154
|
+
formSubmissionService
|
|
155
|
+
} = model.services;
|
|
156
|
+
const {
|
|
157
|
+
submit
|
|
158
|
+
} = formSubmissionService;
|
|
159
|
+
const payload = {
|
|
160
|
+
sessionId,
|
|
161
|
+
retrievalKey,
|
|
162
|
+
// Main form answers
|
|
163
|
+
main: items.filter(item => 'field' in item).map(item => ({
|
|
164
|
+
name: item.name,
|
|
165
|
+
title: item.label,
|
|
166
|
+
value: getAnswer(item.field, item.state, {
|
|
167
|
+
format: 'data'
|
|
168
|
+
})
|
|
169
|
+
})),
|
|
170
|
+
// Repeater form answers
|
|
171
|
+
repeaters: items.filter(item => 'subItems' in item).map(item => ({
|
|
172
|
+
name: item.name,
|
|
173
|
+
title: item.label,
|
|
174
|
+
// Repeater item values
|
|
175
|
+
value: item.subItems.map(detailItems => detailItems.map(subItem => ({
|
|
176
|
+
name: subItem.name,
|
|
177
|
+
title: subItem.label,
|
|
178
|
+
value: getAnswer(subItem.field, subItem.state, {
|
|
179
|
+
format: 'data'
|
|
180
|
+
})
|
|
181
|
+
})))
|
|
182
|
+
}))
|
|
183
|
+
};
|
|
184
|
+
return submit(payload);
|
|
185
|
+
}
|
|
186
|
+
export function getFormSubmissionData(context, details) {
|
|
187
|
+
return context.relevantPages.map(({
|
|
188
|
+
href
|
|
189
|
+
}) => details.flatMap(({
|
|
190
|
+
items
|
|
191
|
+
}) => items.filter(({
|
|
192
|
+
page
|
|
193
|
+
}) => page.href === href))).flat();
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=SummaryPageController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryPageController.js","names":["Boom","FileUploadField","getAnswer","checkEmailAddressForLiveFormSubmission","checkFormStatus","SummaryViewModel","QuestionPageController","SummaryPageController","constructor","model","pageDef","viewName","getSummaryViewModel","request","context","viewModel","backLink","getBackLink","feedbackLink","phaseTag","makeGetRouteHandler","h","hasMissingNotificationEmail","view","makePostRouteHandler","params","state","cacheService","services","formsService","getFormMetadata","notificationEmail","slug","isPreview","path","emailAddress","def","outputEmail","submitForm","setConfirmationState","confirmed","clearState","proceed","getStatusPath","postRouteOptions","ext","onPreHandler","method","continue","summaryViewModel","extendFileRetention","formStatus","logTags","logger","info","items","getFormSubmissionData","details","submitResponse","submitData","yar","id","undefined","badRequest","outputService","submit","updatedRetrievalKey","formSubmissionService","persistFiles","files","pages","forEach","page","fileUploadComponents","collection","fields","filter","component","values","getFormValueFromState","length","push","map","status","fileId","form","file","initiatedRetrievalKey","metadata","retrievalKey","sessionId","payload","main","item","name","title","label","value","field","format","repeaters","subItems","detailItems","subItem","relevantPages","href","flatMap","flat"],"sources":["../../../../../src/server/plugins/engine/pageControllers/SummaryPageController.ts"],"sourcesContent":["import { type PageSummary, type SubmitPayload } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type ResponseToolkit, type RouteOptions } from '@hapi/hapi'\n\nimport { FileUploadField } from '~/src/server/plugins/engine/components/FileUploadField.js'\nimport { getAnswer } from '~/src/server/plugins/engine/components/helpers.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport {\n type Detail,\n type DetailItem\n} from '~/src/server/plugins/engine/models/types.js'\nimport { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport {\n type FormContext,\n type FormContextRequest,\n type FormSubmissionState\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs\n} from '~/src/server/routes/types.js'\n\nexport class SummaryPageController extends QuestionPageController {\n declare pageDef: PageSummary\n\n /**\n * The controller which is used when Page[\"controller\"] is defined as \"./pages/summary.js\"\n */\n\n constructor(model: FormModel, pageDef: PageSummary) {\n super(model, pageDef)\n this.viewName = 'summary'\n }\n\n getSummaryViewModel(\n request: FormContextRequest,\n context: FormContext\n ): SummaryViewModel {\n const viewModel = new SummaryViewModel(request, this, context)\n\n // We already figure these out in the base page controller. Take them and apply them to our page-specific model.\n // This is a stop-gap until we can add proper inheritance in place.\n viewModel.backLink = this.getBackLink(request, context)\n viewModel.feedbackLink = this.feedbackLink\n viewModel.phaseTag = this.phaseTag\n\n return viewModel\n }\n\n /**\n * Returns an async function. This is called in plugin.ts when there is a GET request at `/{id}/{path*}`,\n */\n makeGetRouteHandler() {\n return async (\n request: FormRequest,\n context: FormContext,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { viewName } = this\n\n const viewModel = this.getSummaryViewModel(request, context)\n\n viewModel.hasMissingNotificationEmail =\n await this.hasMissingNotificationEmail(request, context)\n\n return h.view(viewName, viewModel)\n }\n }\n\n /**\n * Returns an async function. This is called in plugin.ts when there is a POST request at `/{id}/{path*}`.\n * If a form is incomplete, a user will be redirected to the start page.\n */\n makePostRouteHandler() {\n return async (\n request: FormRequestPayload,\n context: FormContext,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => {\n const { model } = this\n const { params } = request\n const { state } = context\n\n const { cacheService } = request.services([])\n const { formsService } = this.model.services\n const { getFormMetadata } = formsService\n\n // Get the form metadata using the `slug` param\n const { notificationEmail } = await getFormMetadata(params.slug)\n const { isPreview } = checkFormStatus(request.path)\n const emailAddress = notificationEmail ?? this.model.def.outputEmail\n\n checkEmailAddressForLiveFormSubmission(emailAddress, isPreview)\n\n // Send submission email\n if (emailAddress) {\n const viewModel = this.getSummaryViewModel(request, context)\n await submitForm(request, viewModel, model, state, emailAddress)\n }\n\n await cacheService.setConfirmationState(request, { confirmed: true })\n\n // Clear all form data\n await cacheService.clearState(request)\n\n return this.proceed(request, h, this.getStatusPath())\n }\n }\n\n get postRouteOptions(): RouteOptions<FormRequestPayloadRefs> {\n return {\n ext: {\n onPreHandler: {\n method(request, h) {\n return h.continue\n }\n }\n }\n }\n }\n}\n\nasync function submitForm(\n request: FormRequestPayload,\n summaryViewModel: SummaryViewModel,\n model: FormModel,\n state: FormSubmissionState,\n emailAddress: string\n) {\n await extendFileRetention(model, state, emailAddress)\n\n const { path } = request\n const formStatus = checkFormStatus(path)\n const logTags = ['submit', 'submissionApi']\n\n request.logger.info(logTags, 'Preparing email', formStatus)\n\n // Get detail items\n const items = getFormSubmissionData(\n summaryViewModel.context,\n summaryViewModel.details\n )\n\n // Submit data\n request.logger.info(logTags, 'Submitting data')\n const submitResponse = await submitData(\n model,\n items,\n emailAddress,\n request.yar.id\n )\n\n if (submitResponse === undefined) {\n throw Boom.badRequest('Unexpected empty response from submit api')\n }\n\n return model.services.outputService.submit(\n request,\n model,\n emailAddress,\n items,\n submitResponse\n )\n}\n\nasync function extendFileRetention(\n model: FormModel,\n state: FormSubmissionState,\n updatedRetrievalKey: string\n) {\n const { formSubmissionService } = model.services\n const { persistFiles } = formSubmissionService\n const files: { fileId: string; initiatedRetrievalKey: string }[] = []\n\n // For each file upload component with files in\n // state, add the files to the batch getting persisted\n model.pages.forEach((page) => {\n const fileUploadComponents = page.collection.fields.filter(\n (component) => component instanceof FileUploadField\n )\n\n fileUploadComponents.forEach((component) => {\n const values = component.getFormValueFromState(state)\n if (!values?.length) {\n return\n }\n\n files.push(\n ...values.map(({ status }) => ({\n fileId: status.form.file.fileId,\n initiatedRetrievalKey: status.metadata.retrievalKey\n }))\n )\n })\n })\n\n if (files.length) {\n return persistFiles(files, updatedRetrievalKey)\n }\n}\n\nfunction submitData(\n model: FormModel,\n items: DetailItem[],\n retrievalKey: string,\n sessionId: string\n) {\n const { formSubmissionService } = model.services\n const { submit } = formSubmissionService\n\n const payload: SubmitPayload = {\n sessionId,\n retrievalKey,\n\n // Main form answers\n main: items\n .filter((item) => 'field' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n value: getAnswer(item.field, item.state, { format: 'data' })\n })),\n\n // Repeater form answers\n repeaters: items\n .filter((item) => 'subItems' in item)\n .map((item) => ({\n name: item.name,\n title: item.label,\n\n // Repeater item values\n value: item.subItems.map((detailItems) =>\n detailItems.map((subItem) => ({\n name: subItem.name,\n title: subItem.label,\n value: getAnswer(subItem.field, subItem.state, { format: 'data' })\n }))\n )\n }))\n }\n\n return submit(payload)\n}\n\nexport function getFormSubmissionData(context: FormContext, details: Detail[]) {\n return context.relevantPages\n .map(({ href }) =>\n details.flatMap(({ items }) =>\n items.filter(({ page }) => page.href === href)\n )\n )\n .flat()\n}\n"],"mappings":"AACA,OAAOA,IAAI,MAAM,YAAY;AAG7B,SAASC,eAAe;AACxB,SAASC,SAAS;AAClB,SACEC,sCAAsC,EACtCC,eAAe;AAEjB,SACEC,gBAAgB;AAOlB,SAASC,sBAAsB;AAY/B,OAAO,MAAMC,qBAAqB,SAASD,sBAAsB,CAAC;EAGhE;AACF;AACA;;EAEEE,WAAWA,CAACC,KAAgB,EAAEC,OAAoB,EAAE;IAClD,KAAK,CAACD,KAAK,EAAEC,OAAO,CAAC;IACrB,IAAI,CAACC,QAAQ,GAAG,SAAS;EAC3B;EAEAC,mBAAmBA,CACjBC,OAA2B,EAC3BC,OAAoB,EACF;IAClB,MAAMC,SAAS,GAAG,IAAIV,gBAAgB,CAACQ,OAAO,EAAE,IAAI,EAAEC,OAAO,CAAC;;IAE9D;IACA;IACAC,SAAS,CAACC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAACJ,OAAO,EAAEC,OAAO,CAAC;IACvDC,SAAS,CAACG,YAAY,GAAG,IAAI,CAACA,YAAY;IAC1CH,SAAS,CAACI,QAAQ,GAAG,IAAI,CAACA,QAAQ;IAElC,OAAOJ,SAAS;EAClB;;EAEA;AACF;AACA;EACEK,mBAAmBA,CAAA,EAAG;IACpB,OAAO,OACLP,OAAoB,EACpBC,OAAoB,EACpBO,CAA6C,KAC1C;MACH,MAAM;QAAEV;MAAS,CAAC,GAAG,IAAI;MAEzB,MAAMI,SAAS,GAAG,IAAI,CAACH,mBAAmB,CAACC,OAAO,EAAEC,OAAO,CAAC;MAE5DC,SAAS,CAACO,2BAA2B,GACnC,MAAM,IAAI,CAACA,2BAA2B,CAACT,OAAO,EAAEC,OAAO,CAAC;MAE1D,OAAOO,CAAC,CAACE,IAAI,CAACZ,QAAQ,EAAEI,SAAS,CAAC;IACpC,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACES,oBAAoBA,CAAA,EAAG;IACrB,OAAO,OACLX,OAA2B,EAC3BC,OAAoB,EACpBO,CAA6C,KAC1C;MACH,MAAM;QAAEZ;MAAM,CAAC,GAAG,IAAI;MACtB,MAAM;QAAEgB;MAAO,CAAC,GAAGZ,OAAO;MAC1B,MAAM;QAAEa;MAAM,CAAC,GAAGZ,OAAO;MAEzB,MAAM;QAAEa;MAAa,CAAC,GAAGd,OAAO,CAACe,QAAQ,CAAC,EAAE,CAAC;MAC7C,MAAM;QAAEC;MAAa,CAAC,GAAG,IAAI,CAACpB,KAAK,CAACmB,QAAQ;MAC5C,MAAM;QAAEE;MAAgB,CAAC,GAAGD,YAAY;;MAExC;MACA,MAAM;QAAEE;MAAkB,CAAC,GAAG,MAAMD,eAAe,CAACL,MAAM,CAACO,IAAI,CAAC;MAChE,MAAM;QAAEC;MAAU,CAAC,GAAG7B,eAAe,CAACS,OAAO,CAACqB,IAAI,CAAC;MACnD,MAAMC,YAAY,GAAGJ,iBAAiB,IAAI,IAAI,CAACtB,KAAK,CAAC2B,GAAG,CAACC,WAAW;MAEpElC,sCAAsC,CAACgC,YAAY,EAAEF,SAAS,CAAC;;MAE/D;MACA,IAAIE,YAAY,EAAE;QAChB,MAAMpB,SAAS,GAAG,IAAI,CAACH,mBAAmB,CAACC,OAAO,EAAEC,OAAO,CAAC;QAC5D,MAAMwB,UAAU,CAACzB,OAAO,EAAEE,SAAS,EAAEN,KAAK,EAAEiB,KAAK,EAAES,YAAY,CAAC;MAClE;MAEA,MAAMR,YAAY,CAACY,oBAAoB,CAAC1B,OAAO,EAAE;QAAE2B,SAAS,EAAE;MAAK,CAAC,CAAC;;MAErE;MACA,MAAMb,YAAY,CAACc,UAAU,CAAC5B,OAAO,CAAC;MAEtC,OAAO,IAAI,CAAC6B,OAAO,CAAC7B,OAAO,EAAEQ,CAAC,EAAE,IAAI,CAACsB,aAAa,CAAC,CAAC,CAAC;IACvD,CAAC;EACH;EAEA,IAAIC,gBAAgBA,CAAA,EAAyC;IAC3D,OAAO;MACLC,GAAG,EAAE;QACHC,YAAY,EAAE;UACZC,MAAMA,CAAClC,OAAO,EAAEQ,CAAC,EAAE;YACjB,OAAOA,CAAC,CAAC2B,QAAQ;UACnB;QACF;MACF;IACF,CAAC;EACH;AACF;AAEA,eAAeV,UAAUA,CACvBzB,OAA2B,EAC3BoC,gBAAkC,EAClCxC,KAAgB,EAChBiB,KAA0B,EAC1BS,YAAoB,EACpB;EACA,MAAMe,mBAAmB,CAACzC,KAAK,EAAEiB,KAAK,EAAES,YAAY,CAAC;EAErD,MAAM;IAAED;EAAK,CAAC,GAAGrB,OAAO;EACxB,MAAMsC,UAAU,GAAG/C,eAAe,CAAC8B,IAAI,CAAC;EACxC,MAAMkB,OAAO,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC;EAE3CvC,OAAO,CAACwC,MAAM,CAACC,IAAI,CAACF,OAAO,EAAE,iBAAiB,EAAED,UAAU,CAAC;;EAE3D;EACA,MAAMI,KAAK,GAAGC,qBAAqB,CACjCP,gBAAgB,CAACnC,OAAO,EACxBmC,gBAAgB,CAACQ,OACnB,CAAC;;EAED;EACA5C,OAAO,CAACwC,MAAM,CAACC,IAAI,CAACF,OAAO,EAAE,iBAAiB,CAAC;EAC/C,MAAMM,cAAc,GAAG,MAAMC,UAAU,CACrClD,KAAK,EACL8C,KAAK,EACLpB,YAAY,EACZtB,OAAO,CAAC+C,GAAG,CAACC,EACd,CAAC;EAED,IAAIH,cAAc,KAAKI,SAAS,EAAE;IAChC,MAAM9D,IAAI,CAAC+D,UAAU,CAAC,2CAA2C,CAAC;EACpE;EAEA,OAAOtD,KAAK,CAACmB,QAAQ,CAACoC,aAAa,CAACC,MAAM,CACxCpD,OAAO,EACPJ,KAAK,EACL0B,YAAY,EACZoB,KAAK,EACLG,cACF,CAAC;AACH;AAEA,eAAeR,mBAAmBA,CAChCzC,KAAgB,EAChBiB,KAA0B,EAC1BwC,mBAA2B,EAC3B;EACA,MAAM;IAAEC;EAAsB,CAAC,GAAG1D,KAAK,CAACmB,QAAQ;EAChD,MAAM;IAAEwC;EAAa,CAAC,GAAGD,qBAAqB;EAC9C,MAAME,KAA0D,GAAG,EAAE;;EAErE;EACA;EACA5D,KAAK,CAAC6D,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAK;IAC5B,MAAMC,oBAAoB,GAAGD,IAAI,CAACE,UAAU,CAACC,MAAM,CAACC,MAAM,CACvDC,SAAS,IAAKA,SAAS,YAAY5E,eACtC,CAAC;IAEDwE,oBAAoB,CAACF,OAAO,CAAEM,SAAS,IAAK;MAC1C,MAAMC,MAAM,GAAGD,SAAS,CAACE,qBAAqB,CAACrD,KAAK,CAAC;MACrD,IAAI,CAACoD,MAAM,EAAEE,MAAM,EAAE;QACnB;MACF;MAEAX,KAAK,CAACY,IAAI,CACR,GAAGH,MAAM,CAACI,GAAG,CAAC,CAAC;QAAEC;MAAO,CAAC,MAAM;QAC7BC,MAAM,EAAED,MAAM,CAACE,IAAI,CAACC,IAAI,CAACF,MAAM;QAC/BG,qBAAqB,EAAEJ,MAAM,CAACK,QAAQ,CAACC;MACzC,CAAC,CAAC,CACJ,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAIpB,KAAK,CAACW,MAAM,EAAE;IAChB,OAAOZ,YAAY,CAACC,KAAK,EAAEH,mBAAmB,CAAC;EACjD;AACF;AAEA,SAASP,UAAUA,CACjBlD,KAAgB,EAChB8C,KAAmB,EACnBkC,YAAoB,EACpBC,SAAiB,EACjB;EACA,MAAM;IAAEvB;EAAsB,CAAC,GAAG1D,KAAK,CAACmB,QAAQ;EAChD,MAAM;IAAEqC;EAAO,CAAC,GAAGE,qBAAqB;EAExC,MAAMwB,OAAsB,GAAG;IAC7BD,SAAS;IACTD,YAAY;IAEZ;IACAG,IAAI,EAAErC,KAAK,CACRqB,MAAM,CAAEiB,IAAI,IAAK,OAAO,IAAIA,IAAI,CAAC,CACjCX,GAAG,CAAEW,IAAI,KAAM;MACdC,IAAI,EAAED,IAAI,CAACC,IAAI;MACfC,KAAK,EAAEF,IAAI,CAACG,KAAK;MACjBC,KAAK,EAAE/F,SAAS,CAAC2F,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACnE,KAAK,EAAE;QAAEyE,MAAM,EAAE;MAAO,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL;IACAC,SAAS,EAAE7C,KAAK,CACbqB,MAAM,CAAEiB,IAAI,IAAK,UAAU,IAAIA,IAAI,CAAC,CACpCX,GAAG,CAAEW,IAAI,KAAM;MACdC,IAAI,EAAED,IAAI,CAACC,IAAI;MACfC,KAAK,EAAEF,IAAI,CAACG,KAAK;MAEjB;MACAC,KAAK,EAAEJ,IAAI,CAACQ,QAAQ,CAACnB,GAAG,CAAEoB,WAAW,IACnCA,WAAW,CAACpB,GAAG,CAAEqB,OAAO,KAAM;QAC5BT,IAAI,EAAES,OAAO,CAACT,IAAI;QAClBC,KAAK,EAAEQ,OAAO,CAACP,KAAK;QACpBC,KAAK,EAAE/F,SAAS,CAACqG,OAAO,CAACL,KAAK,EAAEK,OAAO,CAAC7E,KAAK,EAAE;UAAEyE,MAAM,EAAE;QAAO,CAAC;MACnE,CAAC,CAAC,CACJ;IACF,CAAC,CAAC;EACN,CAAC;EAED,OAAOlC,MAAM,CAAC0B,OAAO,CAAC;AACxB;AAEA,OAAO,SAASnC,qBAAqBA,CAAC1C,OAAoB,EAAE2C,OAAiB,EAAE;EAC7E,OAAO3C,OAAO,CAAC0F,aAAa,CACzBtB,GAAG,CAAC,CAAC;IAAEuB;EAAK,CAAC,KACZhD,OAAO,CAACiD,OAAO,CAAC,CAAC;IAAEnD;EAAM,CAAC,KACxBA,KAAK,CAACqB,MAAM,CAAC,CAAC;IAAEJ;EAAK,CAAC,KAAKA,IAAI,CAACiC,IAAI,KAAKA,IAAI,CAC/C,CACF,CAAC,CACAE,IAAI,CAAC,CAAC;AACX","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Boom from '@hapi/boom';
|
|
2
|
+
import { QuestionPageController } from "./QuestionPageController.js";
|
|
3
|
+
export class TerminalPageController extends QuestionPageController {
|
|
4
|
+
makePostRouteHandler() {
|
|
5
|
+
throw Boom.methodNotAllowed('POST method not allowed for terminal pages');
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=TerminalPageController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalPageController.js","names":["Boom","QuestionPageController","TerminalPageController","makePostRouteHandler","methodNotAllowed"],"sources":["../../../../../src/server/plugins/engine/pageControllers/TerminalPageController.ts"],"sourcesContent":["import { type PageTerminal } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type ResponseObject, type ResponseToolkit } from '@hapi/hapi'\n\nimport { QuestionPageController } from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nimport { type FormContext } from '~/src/server/plugins/engine/types.js'\nimport { type FormRequestPayload } from '~/src/server/routes/types.js'\n\nexport class TerminalPageController extends QuestionPageController {\n declare pageDef: PageTerminal\n\n makePostRouteHandler(): (\n request: FormRequestPayload,\n context: FormContext,\n h: Pick<ResponseToolkit, 'redirect' | 'view'>\n ) => Promise<ResponseObject> {\n throw Boom.methodNotAllowed('POST method not allowed for terminal pages')\n }\n}\n"],"mappings":"AACA,OAAOA,IAAI,MAAM,YAAY;AAG7B,SAASC,sBAAsB;AAI/B,OAAO,MAAMC,sBAAsB,SAASD,sBAAsB,CAAC;EAGjEE,oBAAoBA,CAAA,EAIS;IAC3B,MAAMH,IAAI,CAACI,gBAAgB,CAAC,4CAA4C,CAAC;EAC3E;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ControllerType, controllerNameFromPath, isControllerName } from '@defra/forms-model';
|
|
2
|
+
import * as PageControllers from "./index.js";
|
|
3
|
+
export function isPageController(controllerName) {
|
|
4
|
+
return isControllerName(controllerName) && controllerName in PageControllers;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Creates page instance for each {@link Page} type
|
|
8
|
+
*/
|
|
9
|
+
export function createPage(model, pageDef) {
|
|
10
|
+
const controllerName = controllerNameFromPath(pageDef.controller);
|
|
11
|
+
if (!pageDef.controller) {
|
|
12
|
+
return new PageControllers.QuestionPageController(model, pageDef);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Patch legacy controllers
|
|
16
|
+
if (controllerName && pageDef.controller !== controllerName) {
|
|
17
|
+
pageDef.controller = controllerName;
|
|
18
|
+
}
|
|
19
|
+
let controller;
|
|
20
|
+
switch (pageDef.controller) {
|
|
21
|
+
case ControllerType.Start:
|
|
22
|
+
controller = new PageControllers.StartPageController(model, pageDef);
|
|
23
|
+
break;
|
|
24
|
+
case ControllerType.Page:
|
|
25
|
+
controller = new PageControllers.QuestionPageController(model, pageDef);
|
|
26
|
+
break;
|
|
27
|
+
case ControllerType.Terminal:
|
|
28
|
+
controller = new PageControllers.TerminalPageController(model, pageDef);
|
|
29
|
+
break;
|
|
30
|
+
case ControllerType.Summary:
|
|
31
|
+
controller = new PageControllers.SummaryPageController(model, pageDef);
|
|
32
|
+
break;
|
|
33
|
+
case ControllerType.Status:
|
|
34
|
+
controller = new PageControllers.StatusPageController(model, pageDef);
|
|
35
|
+
break;
|
|
36
|
+
case ControllerType.FileUpload:
|
|
37
|
+
controller = new PageControllers.FileUploadPageController(model, pageDef);
|
|
38
|
+
break;
|
|
39
|
+
case ControllerType.Repeat:
|
|
40
|
+
controller = new PageControllers.RepeatPageController(model, pageDef);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
if (typeof controller === 'undefined') {
|
|
44
|
+
if (model.controllers?.[pageDef.controller]) {
|
|
45
|
+
const Ctrl = model.controllers[pageDef.controller];
|
|
46
|
+
controller = new Ctrl(model, pageDef); // type assertion needed because TS can't verify custom controller structure
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (typeof controller === 'undefined') {
|
|
50
|
+
throw new Error(`Page controller ${pageDef.controller} does not exist`);
|
|
51
|
+
}
|
|
52
|
+
return controller;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* In local development environments, we sometimes need to rewrite the
|
|
57
|
+
* CDP upload URL to work with CSP/CORS restrictions.
|
|
58
|
+
* This helper function rewrites localhost URLs to use the sslip.io proxy
|
|
59
|
+
* This is only used when running locally with a development proxy.
|
|
60
|
+
* In non-local environments, this function returns null
|
|
61
|
+
* @param uploadUrl - The original upload URL from CDP
|
|
62
|
+
*/
|
|
63
|
+
export function getProxyUrlForLocalDevelopment(uploadUrl) {
|
|
64
|
+
if (!uploadUrl?.includes('localhost:7337')) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return uploadUrl.replace(/localhost:7337/g, 'uploader.127.0.0.1.sslip.io:7300');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { StartPageController } from "./StartPageController.js";
|
|
2
|
+
export { QuestionPageController,
|
|
3
|
+
// Export alongside alias
|
|
4
|
+
QuestionPageController as PageController } from "./QuestionPageController.js";
|
|
5
|
+
export { TerminalPageController } from "./TerminalPageController.js";
|
|
6
|
+
export { SummaryPageController } from "./SummaryPageController.js";
|
|
7
|
+
export { StatusPageController } from "./StatusPageController.js";
|
|
8
|
+
export { FileUploadPageController } from "./FileUploadPageController.js";
|
|
9
|
+
export { RepeatPageController } from "./RepeatPageController.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["StartPageController","QuestionPageController","PageController","TerminalPageController","SummaryPageController","StatusPageController","FileUploadPageController","RepeatPageController"],"sources":["../../../../../src/server/plugins/engine/pageControllers/index.ts"],"sourcesContent":["export { StartPageController } from '~/src/server/plugins/engine/pageControllers/StartPageController.js'\nexport {\n QuestionPageController, // Export alongside alias\n QuestionPageController as PageController\n} from '~/src/server/plugins/engine/pageControllers/QuestionPageController.js'\nexport { TerminalPageController } from '~/src/server/plugins/engine/pageControllers/TerminalPageController.js'\nexport { SummaryPageController } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nexport { StatusPageController } from '~/src/server/plugins/engine/pageControllers/StatusPageController.js'\nexport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nexport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\n"],"mappings":"AAAA,SAASA,mBAAmB;AAC5B,SACEC,sBAAsB;AAAE;AACxBA,sBAAsB,IAAIC,cAAc;AAE1C,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB;AAC9B,SAASC,oBAAoB;AAC7B,SAASC,wBAAwB;AACjC,SAASC,oBAAoB","ignoreList":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
+
// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064
|
|
3
|
+
|
|
4
|
+
import joi from 'joi';
|
|
5
|
+
import lowerFirst from 'lodash/lowerFirst.js';
|
|
6
|
+
const opts = {
|
|
7
|
+
functions: {
|
|
8
|
+
lowerFirst
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* see @link https://joi.dev/api/?v=17.4.2#template-syntax for template syntax
|
|
14
|
+
*/
|
|
15
|
+
export const messageTemplate = {
|
|
16
|
+
// @ts-expect-error - joi.expression options type issue
|
|
17
|
+
required: joi.expression('Enter {{lowerFirst(#label)}}', opts),
|
|
18
|
+
// @ts-expect-error - joi.expression options type issue
|
|
19
|
+
selectRequired: joi.expression('Select {{lowerFirst(#label)}}', opts),
|
|
20
|
+
max: '{{#label}} must be {{#limit}} characters or less',
|
|
21
|
+
min: '{{#label}} must be {{#limit}} characters or more',
|
|
22
|
+
// @ts-expect-error - joi.expression options type issue
|
|
23
|
+
pattern: joi.expression('Enter a valid {{lowerFirst(#label)}}', opts),
|
|
24
|
+
format: joi.expression('Enter {{lowerFirst(#label)}} in the correct format',
|
|
25
|
+
// @ts-expect-error - joi.expression options type issue
|
|
26
|
+
opts),
|
|
27
|
+
number: '{{#label}} must be a number',
|
|
28
|
+
numberPrecision: '{{#label}} must have {{#limit}} or fewer decimal places',
|
|
29
|
+
numberInteger: '{{#label}} must be a whole number',
|
|
30
|
+
numberMin: '{{#label}} must be {{#limit}} or higher',
|
|
31
|
+
numberMax: '{{#label}} must be {{#limit}} or lower',
|
|
32
|
+
maxWords: '{{#label}} must be {{#limit}} words or fewer',
|
|
33
|
+
// Nested fields use component title
|
|
34
|
+
|
|
35
|
+
// @ts-expect-error - joi.expression options type issue
|
|
36
|
+
objectRequired: joi.expression('Enter {{#label}}', opts),
|
|
37
|
+
objectMissing: joi.expression('{{#title}} must include a {{lowerFirst(#label)}}',
|
|
38
|
+
// @ts-expect-error - joi.expression options type issue
|
|
39
|
+
opts),
|
|
40
|
+
dateFormat: '{{#title}} must be a real date',
|
|
41
|
+
dateMin: '{{#title}} must be the same as or after {{#limit}}',
|
|
42
|
+
dateMax: '{{#title}} must be the same as or before {{#limit}}'
|
|
43
|
+
};
|
|
44
|
+
export const messages = {
|
|
45
|
+
'string.base': messageTemplate.required,
|
|
46
|
+
'string.min': messageTemplate.min,
|
|
47
|
+
'string.empty': messageTemplate.required,
|
|
48
|
+
'string.max': messageTemplate.max,
|
|
49
|
+
'string.email': messageTemplate.format,
|
|
50
|
+
'string.pattern.base': messageTemplate.pattern,
|
|
51
|
+
'string.maxWords': messageTemplate.maxWords,
|
|
52
|
+
'number.base': messageTemplate.number,
|
|
53
|
+
'number.precision': messageTemplate.numberPrecision,
|
|
54
|
+
'number.integer': messageTemplate.numberInteger,
|
|
55
|
+
'number.unsafe': messageTemplate.format,
|
|
56
|
+
'number.min': messageTemplate.numberMin,
|
|
57
|
+
'number.max': messageTemplate.numberMax,
|
|
58
|
+
'object.required': messageTemplate.objectRequired,
|
|
59
|
+
'object.and': messageTemplate.objectMissing,
|
|
60
|
+
'any.only': messageTemplate.selectRequired,
|
|
61
|
+
'any.required': messageTemplate.selectRequired,
|
|
62
|
+
'any.empty': messageTemplate.required,
|
|
63
|
+
'date.base': messageTemplate.dateFormat,
|
|
64
|
+
'date.format': messageTemplate.dateFormat,
|
|
65
|
+
'date.min': messageTemplate.dateMin,
|
|
66
|
+
'date.max': messageTemplate.dateMax
|
|
67
|
+
};
|
|
68
|
+
export const validationOptions = {
|
|
69
|
+
abortEarly: false,
|
|
70
|
+
messages,
|
|
71
|
+
errors: {
|
|
72
|
+
wrap: {
|
|
73
|
+
array: false,
|
|
74
|
+
label: false
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=validationOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationOptions.js","names":["joi","lowerFirst","opts","functions","messageTemplate","required","expression","selectRequired","max","min","pattern","format","number","numberPrecision","numberInteger","numberMin","numberMax","maxWords","objectRequired","objectMissing","dateFormat","dateMin","dateMax","messages","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport joi, { type LanguageMessages, type ValidationOptions } from 'joi'\nimport lowerFirst from 'lodash/lowerFirst.js'\n\nconst opts = {\n functions: {\n lowerFirst\n }\n}\n\n/**\n * see @link https://joi.dev/api/?v=17.4.2#template-syntax for template syntax\n */\nexport const messageTemplate = {\n // @ts-expect-error - joi.expression options type issue\n required: joi.expression('Enter {{lowerFirst(#label)}}', opts),\n // @ts-expect-error - joi.expression options type issue\n selectRequired: joi.expression('Select {{lowerFirst(#label)}}', opts),\n max: '{{#label}} must be {{#limit}} characters or less',\n min: '{{#label}} must be {{#limit}} characters or more',\n // @ts-expect-error - joi.expression options type issue\n pattern: joi.expression('Enter a valid {{lowerFirst(#label)}}', opts),\n format: joi.expression(\n 'Enter {{lowerFirst(#label)}} in the correct format',\n // @ts-expect-error - joi.expression options type issue\n opts\n ),\n number: '{{#label}} must be a number',\n numberPrecision: '{{#label}} must have {{#limit}} or fewer decimal places',\n numberInteger: '{{#label}} must be a whole number',\n numberMin: '{{#label}} must be {{#limit}} or higher',\n numberMax: '{{#label}} must be {{#limit}} or lower',\n maxWords: '{{#label}} must be {{#limit}} words or fewer',\n\n // Nested fields use component title\n\n // @ts-expect-error - joi.expression options type issue\n objectRequired: joi.expression('Enter {{#label}}', opts),\n objectMissing: joi.expression(\n '{{#title}} must include a {{lowerFirst(#label)}}',\n // @ts-expect-error - joi.expression options type issue\n opts\n ),\n dateFormat: '{{#title}} must be a real date',\n dateMin: '{{#title}} must be the same as or after {{#limit}}',\n dateMax: '{{#title}} must be the same as or before {{#limit}}'\n}\n\nexport const messages: LanguageMessages = {\n 'string.base': messageTemplate.required,\n 'string.min': messageTemplate.min,\n 'string.empty': messageTemplate.required,\n 'string.max': messageTemplate.max,\n 'string.email': messageTemplate.format,\n 'string.pattern.base': messageTemplate.pattern,\n 'string.maxWords': messageTemplate.maxWords,\n\n 'number.base': messageTemplate.number,\n 'number.precision': messageTemplate.numberPrecision,\n 'number.integer': messageTemplate.numberInteger,\n 'number.unsafe': messageTemplate.format,\n 'number.min': messageTemplate.numberMin,\n 'number.max': messageTemplate.numberMax,\n\n 'object.required': messageTemplate.objectRequired,\n 'object.and': messageTemplate.objectMissing,\n\n 'any.only': messageTemplate.selectRequired,\n 'any.required': messageTemplate.selectRequired,\n 'any.empty': messageTemplate.required,\n\n 'date.base': messageTemplate.dateFormat,\n 'date.format': messageTemplate.dateFormat,\n 'date.min': messageTemplate.dateMin,\n 'date.max': messageTemplate.dateMax\n}\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"AAAA;AACA;;AAEA,OAAOA,GAAG,MAAyD,KAAK;AACxE,OAAOC,UAAU,MAAM,sBAAsB;AAE7C,MAAMC,IAAI,GAAG;EACXC,SAAS,EAAE;IACTF;EACF;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMG,eAAe,GAAG;EAC7B;EACAC,QAAQ,EAAEL,GAAG,CAACM,UAAU,CAAC,8BAA8B,EAAEJ,IAAI,CAAC;EAC9D;EACAK,cAAc,EAAEP,GAAG,CAACM,UAAU,CAAC,+BAA+B,EAAEJ,IAAI,CAAC;EACrEM,GAAG,EAAE,kDAAkD;EACvDC,GAAG,EAAE,kDAAkD;EACvD;EACAC,OAAO,EAAEV,GAAG,CAACM,UAAU,CAAC,sCAAsC,EAAEJ,IAAI,CAAC;EACrES,MAAM,EAAEX,GAAG,CAACM,UAAU,CACpB,oDAAoD;EACpD;EACAJ,IACF,CAAC;EACDU,MAAM,EAAE,6BAA6B;EACrCC,eAAe,EAAE,yDAAyD;EAC1EC,aAAa,EAAE,mCAAmC;EAClDC,SAAS,EAAE,yCAAyC;EACpDC,SAAS,EAAE,wCAAwC;EACnDC,QAAQ,EAAE,8CAA8C;EAExD;;EAEA;EACAC,cAAc,EAAElB,GAAG,CAACM,UAAU,CAAC,kBAAkB,EAAEJ,IAAI,CAAC;EACxDiB,aAAa,EAAEnB,GAAG,CAACM,UAAU,CAC3B,kDAAkD;EAClD;EACAJ,IACF,CAAC;EACDkB,UAAU,EAAE,gCAAgC;EAC5CC,OAAO,EAAE,oDAAoD;EAC7DC,OAAO,EAAE;AACX,CAAC;AAED,OAAO,MAAMC,QAA0B,GAAG;EACxC,aAAa,EAAEnB,eAAe,CAACC,QAAQ;EACvC,YAAY,EAAED,eAAe,CAACK,GAAG;EACjC,cAAc,EAAEL,eAAe,CAACC,QAAQ;EACxC,YAAY,EAAED,eAAe,CAACI,GAAG;EACjC,cAAc,EAAEJ,eAAe,CAACO,MAAM;EACtC,qBAAqB,EAAEP,eAAe,CAACM,OAAO;EAC9C,iBAAiB,EAAEN,eAAe,CAACa,QAAQ;EAE3C,aAAa,EAAEb,eAAe,CAACQ,MAAM;EACrC,kBAAkB,EAAER,eAAe,CAACS,eAAe;EACnD,gBAAgB,EAAET,eAAe,CAACU,aAAa;EAC/C,eAAe,EAAEV,eAAe,CAACO,MAAM;EACvC,YAAY,EAAEP,eAAe,CAACW,SAAS;EACvC,YAAY,EAAEX,eAAe,CAACY,SAAS;EAEvC,iBAAiB,EAAEZ,eAAe,CAACc,cAAc;EACjD,YAAY,EAAEd,eAAe,CAACe,aAAa;EAE3C,UAAU,EAAEf,eAAe,CAACG,cAAc;EAC1C,cAAc,EAAEH,eAAe,CAACG,cAAc;EAC9C,WAAW,EAAEH,eAAe,CAACC,QAAQ;EAErC,WAAW,EAAED,eAAe,CAACgB,UAAU;EACvC,aAAa,EAAEhB,eAAe,CAACgB,UAAU;EACzC,UAAU,EAAEhB,eAAe,CAACiB,OAAO;EACnC,UAAU,EAAEjB,eAAe,CAACkB;AAC9B,CAAC;AAED,OAAO,MAAME,iBAAoC,GAAG;EAClDC,UAAU,EAAE,KAAK;EACjBF,QAAQ;EACRG,MAAM,EAAE;IACNC,IAAI,EAAE;MACJC,KAAK,EAAE,KAAK;MACZC,KAAK,EAAE;IACT;EACF;AACF,CAAC","ignoreList":[]}
|