@defra/forms-engine-plugin 4.0.58 → 4.0.60
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/.public/javascripts/application.min.js +1 -1
- package/.public/javascripts/application.min.js.map +1 -1
- package/.public/javascripts/shared.min.js +1 -1
- package/.public/javascripts/shared.min.js.map +1 -1
- package/.public/stylesheets/application.min.css +2 -2
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/javascripts/location-map.js +1 -1
- package/.server/client/javascripts/location-map.js.map +1 -1
- package/.server/server/plugins/engine/components/AutocompleteField.js +0 -2
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.js +0 -2
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.js +0 -1
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/MonthYearField.js +0 -2
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/NumberField.js +0 -1
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +0 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/typings/hapi/index.d.js.map +1 -1
- package/package.json +25 -11
- package/src/client/javascripts/location-map.js +1 -1
- package/src/server/plugins/engine/components/AutocompleteField.ts +0 -2
- package/src/server/plugins/engine/components/DatePartsField.ts +0 -2
- package/src/server/plugins/engine/components/FormComponent.ts +0 -1
- package/src/server/plugins/engine/components/MonthYearField.ts +0 -2
- package/src/server/plugins/engine/components/NumberField.ts +0 -1
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -1
- package/src/server/plugins/engine/routes/questions.test.ts +0 -1
- package/src/server/routes/dummy-api.test.ts +0 -1
- package/src/typings/hapi/index.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validationOptions.js","names":["joi","lowerFirstPreserveProperNouns","opts","functions","lowerFirst","messageTemplate","declarationRequired","expression","required","selectRequired","selectYesNoRequired","max","min","minMax","pattern","format","number","numberPrecision","numberInteger","numberMin","numberMax","maxWords","objectRequired","objectMissing","dateFormat","dateMin","dateMax","messages","messagesPre","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"validationOptions.js","names":["joi","lowerFirstPreserveProperNouns","opts","functions","lowerFirst","messageTemplate","declarationRequired","expression","required","selectRequired","selectYesNoRequired","max","min","minMax","pattern","format","number","numberPrecision","numberInteger","numberMin","numberMax","maxWords","objectRequired","objectMissing","dateFormat","dateMin","dateMax","messages","messagesPre","validationOptions","abortEarly","errors","wrap","array","label"],"sources":["../../../../../src/server/plugins/engine/pageControllers/validationOptions.ts"],"sourcesContent":["// Declaration above is needed for: https://github.com/hapijs/joi/issues/3064\n\nimport joi, {\n type JoiExpression,\n type LanguageMessages,\n type LanguageMessagesExt,\n type ReferenceOptions,\n type ValidationOptions\n} from 'joi'\n\nimport { lowerFirstPreserveProperNouns } from '~/src/server/plugins/engine/components/helpers/index.js'\n\nconst opts = {\n functions: {\n lowerFirst: lowerFirstPreserveProperNouns\n }\n} as ReferenceOptions\n\n/**\n * see @link https://joi.dev/api/?v=17.4.2#template-syntax for template syntax\n */\nexport const messageTemplate: Record<string, JoiExpression> = {\n declarationRequired: joi.expression(\n 'You must confirm you understand and agree with the {{lowerFirst(#label)}} to continue',\n opts\n ) as JoiExpression,\n required: joi.expression(\n 'Enter {{lowerFirst(#label)}}',\n opts\n ) as JoiExpression,\n selectRequired: joi.expression(\n 'Select {{lowerFirst(#label)}}',\n opts\n ) as JoiExpression,\n selectYesNoRequired: '{{#label}} - select yes or no',\n max: '{{#label}} must be {{#limit}} characters or less',\n min: '{{#label}} must be {{#limit}} characters or more',\n minMax: '{{#label}} must be between {{#min}} and {{#max}} characters',\n pattern: joi.expression(\n 'Enter a valid {{lowerFirst(#label)}}',\n opts\n ) as JoiExpression,\n format: joi.expression(\n 'Enter {{lowerFirst(#label)}} in the correct format',\n opts\n ) as JoiExpression,\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 objectRequired: joi.expression('Enter {{#label}}', opts) as JoiExpression,\n objectMissing: joi.expression(\n '{{#title}} must include a {{lowerFirst(#label)}}',\n opts\n ) as JoiExpression,\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: LanguageMessagesExt = {\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 messagesPre: LanguageMessages =\n messages as unknown as LanguageMessages\n\nexport const validationOptions: ValidationOptions = {\n abortEarly: false,\n messages: messagesPre,\n errors: {\n wrap: {\n array: false,\n label: false\n }\n }\n}\n"],"mappings":"AAAA;;AAEA,OAAOA,GAAG,MAMH,KAAK;AAEZ,SAASC,6BAA6B;AAEtC,MAAMC,IAAI,GAAG;EACXC,SAAS,EAAE;IACTC,UAAU,EAAEH;EACd;AACF,CAAqB;;AAErB;AACA;AACA;AACA,OAAO,MAAMI,eAA8C,GAAG;EAC5DC,mBAAmB,EAAEN,GAAG,CAACO,UAAU,CACjC,uFAAuF,EACvFL,IACF,CAAkB;EAClBM,QAAQ,EAAER,GAAG,CAACO,UAAU,CACtB,8BAA8B,EAC9BL,IACF,CAAkB;EAClBO,cAAc,EAAET,GAAG,CAACO,UAAU,CAC5B,+BAA+B,EAC/BL,IACF,CAAkB;EAClBQ,mBAAmB,EAAE,+BAA+B;EACpDC,GAAG,EAAE,kDAAkD;EACvDC,GAAG,EAAE,kDAAkD;EACvDC,MAAM,EAAE,6DAA6D;EACrEC,OAAO,EAAEd,GAAG,CAACO,UAAU,CACrB,sCAAsC,EACtCL,IACF,CAAkB;EAClBa,MAAM,EAAEf,GAAG,CAACO,UAAU,CACpB,oDAAoD,EACpDL,IACF,CAAkB;EAClBc,MAAM,EAAE,6BAA6B;EACrCC,eAAe,EAAE,yDAAyD;EAC1EC,aAAa,EAAE,mCAAmC;EAClDC,SAAS,EAAE,yCAAyC;EACpDC,SAAS,EAAE,wCAAwC;EACnDC,QAAQ,EAAE,8CAA8C;EAExD;;EAEAC,cAAc,EAAEtB,GAAG,CAACO,UAAU,CAAC,kBAAkB,EAAEL,IAAI,CAAkB;EACzEqB,aAAa,EAAEvB,GAAG,CAACO,UAAU,CAC3B,kDAAkD,EAClDL,IACF,CAAkB;EAClBsB,UAAU,EAAE,gCAAgC;EAC5CC,OAAO,EAAE,oDAAoD;EAC7DC,OAAO,EAAE;AACX,CAAC;AAED,OAAO,MAAMC,QAA6B,GAAG;EAC3C,aAAa,EAAEtB,eAAe,CAACG,QAAQ;EACvC,YAAY,EAAEH,eAAe,CAACO,GAAG;EACjC,cAAc,EAAEP,eAAe,CAACG,QAAQ;EACxC,YAAY,EAAEH,eAAe,CAACM,GAAG;EACjC,cAAc,EAAEN,eAAe,CAACU,MAAM;EACtC,qBAAqB,EAAEV,eAAe,CAACS,OAAO;EAC9C,iBAAiB,EAAET,eAAe,CAACgB,QAAQ;EAE3C,aAAa,EAAEhB,eAAe,CAACW,MAAM;EACrC,kBAAkB,EAAEX,eAAe,CAACY,eAAe;EACnD,gBAAgB,EAAEZ,eAAe,CAACa,aAAa;EAC/C,eAAe,EAAEb,eAAe,CAACU,MAAM;EACvC,YAAY,EAAEV,eAAe,CAACc,SAAS;EACvC,YAAY,EAAEd,eAAe,CAACe,SAAS;EAEvC,iBAAiB,EAAEf,eAAe,CAACiB,cAAc;EACjD,YAAY,EAAEjB,eAAe,CAACkB,aAAa;EAE3C,UAAU,EAAElB,eAAe,CAACI,cAAc;EAC1C,cAAc,EAAEJ,eAAe,CAACI,cAAc;EAC9C,WAAW,EAAEJ,eAAe,CAACG,QAAQ;EAErC,WAAW,EAAEH,eAAe,CAACmB,UAAU;EACvC,aAAa,EAAEnB,eAAe,CAACmB,UAAU;EACzC,UAAU,EAAEnB,eAAe,CAACoB,OAAO;EACnC,UAAU,EAAEpB,eAAe,CAACqB;AAC9B,CAAC;AAED,OAAO,MAAME,WAA6B,GACxCD,QAAuC;AAEzC,OAAO,MAAME,iBAAoC,GAAG;EAClDC,UAAU,EAAE,KAAK;EACjBH,QAAQ,EAAEC,WAAW;EACrBG,MAAM,EAAE;IACNC,IAAI,EAAE;MACJC,KAAK,EAAE,KAAK;MACZC,KAAK,EAAE;IACT;EACF;AACF,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/hapi/index.d.ts"],"sourcesContent":["import { type Plugin } from '@hapi/hapi'\nimport { type ServerYar, type Yar } from '@hapi/yar'\nimport { type Logger } from 'pino'\n\nimport {\n type COMPONENT_STATE_ERROR,\n type EXTERNAL_STATE_APPENDAGE,\n type EXTERNAL_STATE_PAYLOAD\n} from '~/src/server/constants.js'\nimport { type FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport {\n type AnyFormRequest,\n type FormSubmissionError,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.ts'\nimport { type CacheService } from '~/src/server/services/index.js'\n\ndeclare module '@hapi/yar' {\n interface YarFlashes {\n [EXTERNAL_STATE_APPENDAGE]: object\n [EXTERNAL_STATE_PAYLOAD]: object\n [COMPONENT_STATE_ERROR]: string\n [key: string]: { errors: FormSubmissionError[] }\n }\n}\n\ndeclare module '@hapi/hapi' {\n // Here we are decorating Hapi interface types with\n // props from plugins which doesn't export @types\n interface PluginProperties {\n crumb: {\n generate?: (request: AnyRequest) => string\n }\n 'forms-engine-plugin': {\n baseLayoutPath: string\n cacheService: CacheService\n viewContext?: (\n request: AnyFormRequest | null\n ) => Record<string, unknown> | Promise<Record<string, unknown>>\n saveAndExit?: PluginOptions['saveAndExit']\n baseUrl: string\n }\n }\n\n interface Request {\n logger: Logger\n yar: Yar\n }\n\n interface RequestApplicationState {\n model?: FormModel\n }\n\n interface Server {\n logger: Logger\n yar: ServerYar\n }\n\n interface ServerApplicationState {\n model?: FormModel\n models: Map<string, { model: FormModel; updatedAt: Date }>\n }\n}\n\ndeclare module 'blankie' {\n declare const blankie: {\n plugin: Plugin<Record<string, boolean | string | string[]>>\n }\n\n export = blankie\n}\n\ndeclare module 'blipp' {\n declare const blipp: {\n plugin: Plugin\n }\n\n export = blipp\n}\n\ndeclare module 'hapi-pulse' {\n declare const hapiPulse: {\n plugin: Plugin<{\n timeout: number\n }>\n }\n\n export = hapiPulse\n}\n"],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defra/forms-engine-plugin",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.60",
|
|
4
4
|
"description": "Defra forms engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -42,12 +42,17 @@
|
|
|
42
42
|
"dev:debug": "concurrently \"npm run client:watch\" \"npm run server:watch:debug\" --kill-others --names \"client,server\" --prefix-colors \"red.dim,blue.dim\"",
|
|
43
43
|
"format": "npm run format:check -- --write",
|
|
44
44
|
"format:check": "prettier --cache --cache-location .cache/prettier --cache-strategy content --check \"**/*.{cjs,js,json,md,mjs,scss,ts}\"",
|
|
45
|
+
"docs:dev": "BROWSERSLIST_ENV=javascripts docusaurus start --host 0.0.0.0",
|
|
46
|
+
"docs:build": "BROWSERSLIST_ENV=javascripts docusaurus build",
|
|
47
|
+
"docs:build:all": "node scripts/generate-schema-docs.js && npm run docs:build",
|
|
48
|
+
"docs:serve": "docusaurus serve --host 0.0.0.0",
|
|
49
|
+
"docs:clear": "docusaurus clear",
|
|
45
50
|
"generate-schema-docs": "node scripts/generate-schema-docs.js",
|
|
46
51
|
"postinstall": "npm run setup:husky",
|
|
47
52
|
"lint": "npm run lint:editorconfig && npm run lint:js && npm run lint:types",
|
|
48
53
|
"lint:editorconfig": "editorconfig-checker",
|
|
49
54
|
"lint:fix": "npm run lint:js -- --fix",
|
|
50
|
-
"lint:js": "eslint --cache --cache-location .cache/eslint --cache-strategy content --color
|
|
55
|
+
"lint:js": "eslint --cache --cache-location .cache/eslint --cache-strategy content --color .",
|
|
51
56
|
"lint:scss": "stylelint --cache --cache-location .cache/stylelint --cache-strategy content --color --ignore-path .gitignore --max-warnings 0 \"**/*.scss\"",
|
|
52
57
|
"lint:types": "tsc --noEmit",
|
|
53
58
|
"test": "jest --color --coverage --verbose",
|
|
@@ -64,6 +69,12 @@
|
|
|
64
69
|
"type": "git",
|
|
65
70
|
"url": "git+https://github.com/DEFRA/forms-engine-plugin.git"
|
|
66
71
|
},
|
|
72
|
+
"overrides": {
|
|
73
|
+
"serve-handler": {
|
|
74
|
+
"minimatch": "3.1.5"
|
|
75
|
+
},
|
|
76
|
+
"serialize-javascript": ">=7.0.3"
|
|
77
|
+
},
|
|
67
78
|
"engines": {
|
|
68
79
|
"node": ">=22.11.0 <25.0.0",
|
|
69
80
|
"npm": ">=10.9.0 <11.6.4"
|
|
@@ -124,7 +135,12 @@
|
|
|
124
135
|
"@babel/plugin-syntax-import-attributes": "^7.27.1",
|
|
125
136
|
"@babel/preset-env": "^7.28.5",
|
|
126
137
|
"@babel/preset-typescript": "^7.28.5",
|
|
138
|
+
"@defra/docusaurus-theme-govuk": "^0.0.12-alpha",
|
|
139
|
+
"@docusaurus/core": "^3.9.2",
|
|
140
|
+
"@docusaurus/plugin-content-docs": "^3.9.2",
|
|
141
|
+
"@easyops-cn/docusaurus-search-local": "^0.55.0",
|
|
127
142
|
"@hapi/basic": "^7.0.2",
|
|
143
|
+
"@mdx-js/react": "^3.1.1",
|
|
128
144
|
"@testing-library/dom": "^10.4.1",
|
|
129
145
|
"@testing-library/jest-dom": "^6.9.1",
|
|
130
146
|
"@types/atob": "^2.1.4",
|
|
@@ -148,8 +164,6 @@
|
|
|
148
164
|
"@types/url-parse": "^1.4.11",
|
|
149
165
|
"@types/webpack-assets-manifest": "^5.1.4",
|
|
150
166
|
"@types/wreck": "^14.0.5",
|
|
151
|
-
"@typescript-eslint/eslint-plugin": "^8.46.4",
|
|
152
|
-
"@typescript-eslint/parser": "^8.46.4",
|
|
153
167
|
"autoprefixer": "^10.4.22",
|
|
154
168
|
"babel-loader": "^10.0.0",
|
|
155
169
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
@@ -163,15 +177,13 @@
|
|
|
163
177
|
"cssnano": "^7.1.2",
|
|
164
178
|
"cssnano-preset-default": "^7.0.10",
|
|
165
179
|
"editorconfig-checker": "^6.1.1",
|
|
166
|
-
"eslint": "^
|
|
167
|
-
"eslint-config-prettier": "^
|
|
168
|
-
"eslint-config-standard": "^17.1.0",
|
|
169
|
-
"eslint-import-resolver-typescript": "^3.10.1",
|
|
170
|
-
"eslint-plugin-import": "^2.32.0",
|
|
180
|
+
"eslint": "^9.39.3",
|
|
181
|
+
"eslint-config-prettier": "^10.1.8",
|
|
171
182
|
"eslint-plugin-jest": "^28.14.0",
|
|
172
183
|
"eslint-plugin-jsdoc": "^50.8.0",
|
|
173
|
-
"
|
|
174
|
-
"
|
|
184
|
+
"globals": "^17.3.0",
|
|
185
|
+
"neostandard": "^0.12.2",
|
|
186
|
+
"typescript-eslint": "^8.56.1",
|
|
175
187
|
"global-jsdom": "^26.0.0",
|
|
176
188
|
"husky": "^9.1.7",
|
|
177
189
|
"jest": "^30.2.0",
|
|
@@ -185,6 +197,8 @@
|
|
|
185
197
|
"postcss-loader": "^8.2.0",
|
|
186
198
|
"postcss-scss": "^4.0.9",
|
|
187
199
|
"prettier": "^3.6.2",
|
|
200
|
+
"react": "^19.2.4",
|
|
201
|
+
"react-dom": "^19.2.4",
|
|
188
202
|
"sass-embedded": "^1.93.3",
|
|
189
203
|
"sass-loader": "^16.0.6",
|
|
190
204
|
"source-map-loader": "^5.0.0",
|
|
@@ -112,7 +112,7 @@ export function initMaps(config = {}) {
|
|
|
112
112
|
// If there are location components on the page fix up the main form submit
|
|
113
113
|
// handler so it doesn't fire when using the integrated map search feature
|
|
114
114
|
if (locations.length) {
|
|
115
|
-
const form =
|
|
115
|
+
const form = locations[0].closest('form')
|
|
116
116
|
|
|
117
117
|
if (form === null) {
|
|
118
118
|
return
|
|
@@ -23,10 +23,8 @@ export class AutocompleteField extends SelectField {
|
|
|
23
23
|
const messages = options.customValidationMessages
|
|
24
24
|
|
|
25
25
|
formSchema = formSchema.messages({
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
27
26
|
'any.only':
|
|
28
27
|
messages?.['any.only'] ?? (messageTemplate.required as string),
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
30
28
|
'any.required':
|
|
31
29
|
messages?.['any.required'] ?? (messageTemplate.required as string)
|
|
32
30
|
})
|
|
@@ -42,9 +42,7 @@ export class DatePartsField extends FormComponent {
|
|
|
42
42
|
const isRequired = options.required !== false
|
|
43
43
|
|
|
44
44
|
const customValidationMessages = convertToLanguageMessages({
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
46
45
|
'any.required': messageTemplate.objectMissing,
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
48
46
|
'number.base': messageTemplate.objectMissing,
|
|
49
47
|
'number.precision': messageTemplate.dateFormat,
|
|
50
48
|
'number.integer': messageTemplate.dateFormat,
|
|
@@ -174,7 +174,6 @@ export class FormComponent extends ComponentBase {
|
|
|
174
174
|
|
|
175
175
|
getDisplayStringFromState(state: FormSubmissionState): string {
|
|
176
176
|
const value = this.getFormValueFromState(state)
|
|
177
|
-
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
178
177
|
return this.getDisplayStringFromFormValue(value)
|
|
179
178
|
}
|
|
180
179
|
|
|
@@ -48,9 +48,7 @@ export class MonthYearField extends FormComponent {
|
|
|
48
48
|
|
|
49
49
|
const customValidationMessages: LanguageMessages =
|
|
50
50
|
convertToLanguageMessages({
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
52
51
|
'any.required': messageTemplate.objectMissing,
|
|
53
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
54
52
|
'number.base': messageTemplate.objectMissing,
|
|
55
53
|
'number.precision': messageTemplate.dateFormat,
|
|
56
54
|
'number.integer': messageTemplate.dateFormat,
|
|
@@ -41,7 +41,6 @@ export class NumberField extends FormComponent {
|
|
|
41
41
|
const messages = options.customValidationMessages
|
|
42
42
|
|
|
43
43
|
formSchema = formSchema.empty('').messages({
|
|
44
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
45
44
|
'any.required':
|
|
46
45
|
messages?.['any.required'] ?? (messageTemplate.required as string)
|
|
47
46
|
})
|