@defra/forms-model 3.0.643 → 3.0.644

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/module/form/form-audit/index.js +5 -4
  2. package/dist/module/form/form-audit/index.js.map +1 -1
  3. package/dist/module/form/form-definition/constants.js +3 -0
  4. package/dist/module/form/form-definition/constants.js.map +1 -0
  5. package/dist/module/form/form-definition/index.js +6 -9
  6. package/dist/module/form/form-definition/index.js.map +1 -1
  7. package/dist/module/form/form-editor/index.js +4 -1
  8. package/dist/module/form/form-editor/index.js.map +1 -1
  9. package/dist/module/form/form-metadata/index.js +4 -3
  10. package/dist/module/form/form-metadata/index.js.map +1 -1
  11. package/dist/module/form/utils/index.js +1 -0
  12. package/dist/module/form/utils/index.js.map +1 -1
  13. package/dist/module/form/utils/prevent-unicode.js +20 -0
  14. package/dist/module/form/utils/prevent-unicode.js.map +1 -0
  15. package/dist/types/form/form-definition/constants.d.ts +3 -0
  16. package/dist/types/form/form-definition/constants.d.ts.map +1 -0
  17. package/dist/types/form/form-definition/index.d.ts +1 -2
  18. package/dist/types/form/form-definition/index.d.ts.map +1 -1
  19. package/dist/types/form/form-editor/index.d.ts +2 -0
  20. package/dist/types/form/form-editor/index.d.ts.map +1 -1
  21. package/dist/types/form/form-metadata/index.d.ts.map +1 -1
  22. package/dist/types/form/utils/index.d.ts +1 -0
  23. package/dist/types/form/utils/index.d.ts.map +1 -1
  24. package/dist/types/form/utils/prevent-unicode.d.ts +10 -0
  25. package/dist/types/form/utils/prevent-unicode.d.ts.map +1 -0
  26. package/package.json +1 -1
  27. package/src/form/form-audit/index.ts +4 -4
  28. package/src/form/form-definition/constants.ts +2 -0
  29. package/src/form/form-definition/index.ts +13 -14
  30. package/src/form/form-editor/index.ts +11 -1
  31. package/src/form/form-metadata/index.ts +7 -8
  32. package/src/form/utils/index.ts +1 -0
  33. package/src/form/utils/prevent-unicode.js +19 -0
@@ -1,4 +1,5 @@
1
1
  import Joi from 'joi';
2
+ import { emailAddressNoUnicodeSchema } from "../form-editor/index.js";
2
3
  export const organisations = ['Animal and Plant Health Agency – APHA', 'Centre for Environment, Fisheries and Aquaculture Science – Cefas', 'Defra', 'Environment Agency', 'Forestry Commission', 'Marine Management Organisation – MMO', 'Natural England', 'Rural Payments Agency – RPA', 'Veterinary Medicines Directorate – VMD'];
3
4
  export const idSchema = Joi.string().hex().length(24).required().description('Unique identifier for the form, 24-character hexadecimal string');
4
5
  export const titleSchema = Joi.string().max(250).trim().required().description('Title of the form, displayed to users');
@@ -7,13 +8,13 @@ export const slugSchema = Joi.string().pattern(/^[a-z0-9-]+$/, {
7
8
  }).required().description('URL-friendly identifier used in form paths');
8
9
  export const organisationSchema = Joi.string().valid(...organisations).required().description('Defra organisation responsible for the form');
9
10
  export const teamNameSchema = Joi.string().max(100).trim().required().description('Name of the team responsible for the form');
10
- export const teamEmailSchema = Joi.string().email({
11
+ export const teamEmailSchema = emailAddressNoUnicodeSchema.email({
11
12
  tlds: {
12
13
  allow: ['uk']
13
14
  }
14
15
  }).trim().required().description('Contact email for the team responsible for the form');
15
16
  export const phoneSchema = Joi.string().trim().description('Phone number for form-related inquiries');
16
- export const emailAddressSchema = Joi.string().email().trim().required().description('Email address for form-related inquiries');
17
+ export const emailAddressSchema = emailAddressNoUnicodeSchema.required().description('Email address for form-related inquiries');
17
18
  export const emailResponseTimeSchema = Joi.string().trim().required().description('Expected response time for email inquiries');
18
19
  export const emailSchema = Joi.object().keys({
19
20
  address: emailAddressSchema,
@@ -39,7 +40,7 @@ export const privacyNoticeUrlSchema = Joi.string().uri({
39
40
  scheme: ['http', 'https']
40
41
  }).trim().description('URL to the privacy notice for this form');
41
42
  export const termsAndConditionsAgreedSchema = Joi.boolean().description('Whether the data protection terms and conditions have been agreed to');
42
- export const notificationEmailAddressSchema = Joi.string().email().trim().description('Email address to receive form submission notifications');
43
+ export const notificationEmailAddressSchema = emailAddressNoUnicodeSchema.description('Email address to receive form submission notifications');
43
44
  export const authoredAtSchema = Joi.date().iso().required().description('ISO format timestamp of when an action occurred');
44
45
  export const authorIdSchema = Joi.string().trim().required().description('Unique identifier for the author');
45
46
  export const authorDisplayNameSchema = Joi.string().trim().required().description('Human-readable name of the author');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Joi","organisations","idSchema","string","hex","length","required","description","titleSchema","max","trim","slugSchema","pattern","name","organisationSchema","valid","teamNameSchema","teamEmailSchema","email","tlds","allow","phoneSchema","emailAddressSchema","emailResponseTimeSchema","emailSchema","object","keys","address","responseTime","onlineUrlSchema","uri","scheme","onlineTextSchema","onlineSchema","url","text","contactSchema","phone","online","submissionGuidanceSchema","privacyNoticeTypeSchema","privacyNoticeTextSchema","privacyNoticeUrlSchema","termsAndConditionsAgreedSchema","boolean","notificationEmailAddressSchema","authoredAtSchema","date","iso","authorIdSchema","authorDisplayNameSchema","formMetadataInputKeys","title","organisation","teamName","teamEmail","contact","submissionGuidance","privacyNoticeType","privacyNoticeText","when","is","then","otherwise","privacyNoticeUrl","termsAndConditionsAgreed","notificationEmail","formMetadataInputSchema","formMetadataAuthorSchema","id","displayName","formMetadataStateSchema","createdAt","createdBy","updatedAt","updatedBy","formVersionMetadataSchema","versionNumber","number","integer","min","formMetadataSchema","append","slug","draft","live","versions","array","items","optional"],"sources":["../../../../src/form/form-metadata/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport {\n type FormMetadata,\n type FormMetadataAuthor,\n type FormMetadataContact,\n type FormMetadataContactEmail,\n type FormMetadataContactOnline,\n type FormMetadataInput,\n type FormMetadataState,\n type FormVersionMetadata\n} from '~/src/form/form-metadata/types.js'\n\nexport const organisations = [\n 'Animal and Plant Health Agency – APHA',\n 'Centre for Environment, Fisheries and Aquaculture Science – Cefas',\n 'Defra',\n 'Environment Agency',\n 'Forestry Commission',\n 'Marine Management Organisation – MMO',\n 'Natural England',\n 'Rural Payments Agency – RPA',\n 'Veterinary Medicines Directorate – VMD'\n]\n\nexport const idSchema = Joi.string()\n .hex()\n .length(24)\n .required()\n .description(\n 'Unique identifier for the form, 24-character hexadecimal string'\n )\n\nexport const titleSchema = Joi.string()\n .max(250)\n .trim()\n .required()\n .description('Title of the form, displayed to users')\n\nexport const slugSchema = Joi.string()\n .pattern(/^[a-z0-9-]+$/, { name: 'letters, numbers and hyphens only' })\n .required()\n .description('URL-friendly identifier used in form paths')\n\nexport const organisationSchema = Joi.string()\n .valid(...organisations)\n .required()\n .description('Defra organisation responsible for the form')\n\nexport const teamNameSchema = Joi.string()\n .max(100)\n .trim()\n .required()\n .description('Name of the team responsible for the form')\n\nexport const teamEmailSchema = Joi.string()\n .email({ tlds: { allow: ['uk'] } })\n .trim()\n .required()\n .description('Contact email for the team responsible for the form')\n\nexport const phoneSchema = Joi.string()\n .trim()\n .description('Phone number for form-related inquiries')\n\nexport const emailAddressSchema = Joi.string()\n .email()\n .trim()\n .required()\n .description('Email address for form-related inquiries')\n\nexport const emailResponseTimeSchema = Joi.string()\n .trim()\n .required()\n .description('Expected response time for email inquiries')\n\nexport const emailSchema = Joi.object<FormMetadataContactEmail>()\n .keys({\n address: emailAddressSchema,\n responseTime: emailResponseTimeSchema\n })\n .description('Email contact details including response expectations')\n\nexport const onlineUrlSchema = Joi.string()\n .uri({\n scheme: ['http', 'https']\n })\n .trim()\n .required()\n .description('URL for online contact method')\n\nexport const onlineTextSchema = Joi.string()\n .trim()\n .required()\n .description('Descriptive text for the online contact link')\n\nexport const onlineSchema = Joi.object<FormMetadataContactOnline>()\n .keys({\n url: onlineUrlSchema,\n text: onlineTextSchema\n })\n .description('Online contact details with URL and descriptive text')\n\nexport const contactSchema = Joi.object<FormMetadataContact>()\n .keys({\n phone: phoneSchema,\n email: emailSchema,\n online: onlineSchema\n })\n .description('Complete contact information for form-related inquiries')\n\nexport const submissionGuidanceSchema = Joi.string()\n .trim()\n .description('Guidance text shown to users when submitting the form')\n\nexport const privacyNoticeTypeSchema = Joi.string()\n .valid('text', 'link')\n .description('Type of privacy notice content')\n\nexport const privacyNoticeTextSchema = Joi.string()\n .trim()\n .description('URL to the privacy notice for this form')\n\nexport const privacyNoticeUrlSchema = Joi.string()\n .uri({\n scheme: ['http', 'https']\n })\n .trim()\n .description('URL to the privacy notice for this form')\n\nexport const termsAndConditionsAgreedSchema = Joi.boolean().description(\n 'Whether the data protection terms and conditions have been agreed to'\n)\n\nexport const notificationEmailAddressSchema = Joi.string()\n .email()\n .trim()\n .description('Email address to receive form submission notifications')\n\nexport const authoredAtSchema = Joi.date()\n .iso()\n .required()\n .description('ISO format timestamp of when an action occurred')\n\nexport const authorIdSchema = Joi.string()\n .trim()\n .required()\n .description('Unique identifier for the author')\n\nexport const authorDisplayNameSchema = Joi.string()\n .trim()\n .required()\n .description('Human-readable name of the author')\n\nexport const formMetadataInputKeys = {\n title: titleSchema,\n organisation: organisationSchema,\n teamName: teamNameSchema,\n teamEmail: teamEmailSchema,\n contact: contactSchema,\n submissionGuidance: submissionGuidanceSchema,\n privacyNoticeType: privacyNoticeTypeSchema,\n privacyNoticeText: Joi.when('privacyNoticeType', {\n is: 'text',\n then: privacyNoticeTextSchema,\n otherwise: privacyNoticeTextSchema.allow('')\n }),\n privacyNoticeUrl: Joi.when('privacyNoticeType', {\n is: 'link',\n then: privacyNoticeUrlSchema,\n otherwise: privacyNoticeUrlSchema.allow('')\n }),\n termsAndConditionsAgreed: termsAndConditionsAgreedSchema,\n notificationEmail: notificationEmailAddressSchema\n}\n\n/**\n * Joi schema for `FormMetadataInput` interface\n * @see {@link FormMetadataInput}\n */\nexport const formMetadataInputSchema = Joi.object<FormMetadataInput>()\n .keys(formMetadataInputKeys)\n .required()\n .description('Input data for creating or updating form metadata')\n\n/**\n * Joi schema for `FormMetadataAuthor` interface\n * @see {@link FormMetadataAuthor}\n */\nexport const formMetadataAuthorSchema = Joi.object<FormMetadataAuthor>()\n .keys({\n id: authorIdSchema,\n displayName: authorDisplayNameSchema\n })\n .required()\n .description('Information about the author of a form or form change')\n\n/**\n * Joi schema for `FormMetadataState` interface\n * @see {@link FormMetadataState}\n */\nexport const formMetadataStateSchema = Joi.object<FormMetadataState>()\n .keys({\n createdAt: authoredAtSchema.description(\n 'When this version was first created'\n ),\n createdBy: formMetadataAuthorSchema.description('Who created this version'),\n updatedAt: authoredAtSchema.description(\n 'When this version was last updated'\n ),\n updatedBy: formMetadataAuthorSchema.description(\n 'Who last updated this version'\n )\n })\n .description('Metadata about a specific version state (draft or live)')\n\n/**\n * Joi schema for `FormVersionMetadata` interface\n * @see {@link FormVersionMetadata}\n */\nexport const formVersionMetadataSchema = Joi.object<FormVersionMetadata>()\n .keys({\n versionNumber: Joi.number()\n .integer()\n .min(1)\n .required()\n .description('The version number'),\n createdAt: authoredAtSchema.description('When this version was created')\n })\n .description('Metadata for a specific version of the form')\n\n/**\n * Joi schema for `FormMetadata` interface\n * @see {@link FormMetadata}\n */\nexport const formMetadataSchema = formMetadataInputSchema\n .append<FormMetadata>({\n id: idSchema,\n slug: slugSchema,\n draft: formMetadataStateSchema.description(\n 'Metadata for the draft version'\n ),\n live: formMetadataStateSchema.description(\n 'Metadata for the published version'\n ),\n createdAt: authoredAtSchema.description('When the form was first created'),\n createdBy: formMetadataAuthorSchema.description('Who created the form'),\n updatedAt: authoredAtSchema.description('When the form was last updated'),\n updatedBy: formMetadataAuthorSchema.description(\n 'Who last updated the form'\n ),\n versions: Joi.array()\n .items(formVersionMetadataSchema)\n .optional()\n .description('Version history for the form')\n })\n .description(\n 'Complete metadata for a form, including version information and authoring details'\n )\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Joi","emailAddressNoUnicodeSchema","organisations","idSchema","string","hex","length","required","description","titleSchema","max","trim","slugSchema","pattern","name","organisationSchema","valid","teamNameSchema","teamEmailSchema","email","tlds","allow","phoneSchema","emailAddressSchema","emailResponseTimeSchema","emailSchema","object","keys","address","responseTime","onlineUrlSchema","uri","scheme","onlineTextSchema","onlineSchema","url","text","contactSchema","phone","online","submissionGuidanceSchema","privacyNoticeTypeSchema","privacyNoticeTextSchema","privacyNoticeUrlSchema","termsAndConditionsAgreedSchema","boolean","notificationEmailAddressSchema","authoredAtSchema","date","iso","authorIdSchema","authorDisplayNameSchema","formMetadataInputKeys","title","organisation","teamName","teamEmail","contact","submissionGuidance","privacyNoticeType","privacyNoticeText","when","is","then","otherwise","privacyNoticeUrl","termsAndConditionsAgreed","notificationEmail","formMetadataInputSchema","formMetadataAuthorSchema","id","displayName","formMetadataStateSchema","createdAt","createdBy","updatedAt","updatedBy","formVersionMetadataSchema","versionNumber","number","integer","min","formMetadataSchema","append","slug","draft","live","versions","array","items","optional"],"sources":["../../../../src/form/form-metadata/index.ts"],"sourcesContent":["import Joi from 'joi'\n\nimport { emailAddressNoUnicodeSchema } from '~/src/form/form-editor/index.js'\nimport {\n type FormMetadata,\n type FormMetadataAuthor,\n type FormMetadataContact,\n type FormMetadataContactEmail,\n type FormMetadataContactOnline,\n type FormMetadataInput,\n type FormMetadataState,\n type FormVersionMetadata\n} from '~/src/form/form-metadata/types.js'\n\nexport const organisations = [\n 'Animal and Plant Health Agency – APHA',\n 'Centre for Environment, Fisheries and Aquaculture Science – Cefas',\n 'Defra',\n 'Environment Agency',\n 'Forestry Commission',\n 'Marine Management Organisation – MMO',\n 'Natural England',\n 'Rural Payments Agency – RPA',\n 'Veterinary Medicines Directorate – VMD'\n]\n\nexport const idSchema = Joi.string()\n .hex()\n .length(24)\n .required()\n .description(\n 'Unique identifier for the form, 24-character hexadecimal string'\n )\n\nexport const titleSchema = Joi.string()\n .max(250)\n .trim()\n .required()\n .description('Title of the form, displayed to users')\n\nexport const slugSchema = Joi.string()\n .pattern(/^[a-z0-9-]+$/, { name: 'letters, numbers and hyphens only' })\n .required()\n .description('URL-friendly identifier used in form paths')\n\nexport const organisationSchema = Joi.string()\n .valid(...organisations)\n .required()\n .description('Defra organisation responsible for the form')\n\nexport const teamNameSchema = Joi.string()\n .max(100)\n .trim()\n .required()\n .description('Name of the team responsible for the form')\n\nexport const teamEmailSchema = emailAddressNoUnicodeSchema\n .email({ tlds: { allow: ['uk'] } })\n .trim()\n .required()\n .description('Contact email for the team responsible for the form')\n\nexport const phoneSchema = Joi.string()\n .trim()\n .description('Phone number for form-related inquiries')\n\nexport const emailAddressSchema = emailAddressNoUnicodeSchema\n .required()\n .description('Email address for form-related inquiries')\n\nexport const emailResponseTimeSchema = Joi.string()\n .trim()\n .required()\n .description('Expected response time for email inquiries')\n\nexport const emailSchema = Joi.object<FormMetadataContactEmail>()\n .keys({\n address: emailAddressSchema,\n responseTime: emailResponseTimeSchema\n })\n .description('Email contact details including response expectations')\n\nexport const onlineUrlSchema = Joi.string()\n .uri({\n scheme: ['http', 'https']\n })\n .trim()\n .required()\n .description('URL for online contact method')\n\nexport const onlineTextSchema = Joi.string()\n .trim()\n .required()\n .description('Descriptive text for the online contact link')\n\nexport const onlineSchema = Joi.object<FormMetadataContactOnline>()\n .keys({\n url: onlineUrlSchema,\n text: onlineTextSchema\n })\n .description('Online contact details with URL and descriptive text')\n\nexport const contactSchema = Joi.object<FormMetadataContact>()\n .keys({\n phone: phoneSchema,\n email: emailSchema,\n online: onlineSchema\n })\n .description('Complete contact information for form-related inquiries')\n\nexport const submissionGuidanceSchema = Joi.string()\n .trim()\n .description('Guidance text shown to users when submitting the form')\n\nexport const privacyNoticeTypeSchema = Joi.string()\n .valid('text', 'link')\n .description('Type of privacy notice content')\n\nexport const privacyNoticeTextSchema = Joi.string()\n .trim()\n .description('URL to the privacy notice for this form')\n\nexport const privacyNoticeUrlSchema = Joi.string()\n .uri({\n scheme: ['http', 'https']\n })\n .trim()\n .description('URL to the privacy notice for this form')\n\nexport const termsAndConditionsAgreedSchema = Joi.boolean().description(\n 'Whether the data protection terms and conditions have been agreed to'\n)\n\nexport const notificationEmailAddressSchema =\n emailAddressNoUnicodeSchema.description(\n 'Email address to receive form submission notifications'\n )\n\nexport const authoredAtSchema = Joi.date()\n .iso()\n .required()\n .description('ISO format timestamp of when an action occurred')\n\nexport const authorIdSchema = Joi.string()\n .trim()\n .required()\n .description('Unique identifier for the author')\n\nexport const authorDisplayNameSchema = Joi.string()\n .trim()\n .required()\n .description('Human-readable name of the author')\n\nexport const formMetadataInputKeys = {\n title: titleSchema,\n organisation: organisationSchema,\n teamName: teamNameSchema,\n teamEmail: teamEmailSchema,\n contact: contactSchema,\n submissionGuidance: submissionGuidanceSchema,\n privacyNoticeType: privacyNoticeTypeSchema,\n privacyNoticeText: Joi.when('privacyNoticeType', {\n is: 'text',\n then: privacyNoticeTextSchema,\n otherwise: privacyNoticeTextSchema.allow('')\n }),\n privacyNoticeUrl: Joi.when('privacyNoticeType', {\n is: 'link',\n then: privacyNoticeUrlSchema,\n otherwise: privacyNoticeUrlSchema.allow('')\n }),\n termsAndConditionsAgreed: termsAndConditionsAgreedSchema,\n notificationEmail: notificationEmailAddressSchema\n}\n\n/**\n * Joi schema for `FormMetadataInput` interface\n * @see {@link FormMetadataInput}\n */\nexport const formMetadataInputSchema = Joi.object<FormMetadataInput>()\n .keys(formMetadataInputKeys)\n .required()\n .description('Input data for creating or updating form metadata')\n\n/**\n * Joi schema for `FormMetadataAuthor` interface\n * @see {@link FormMetadataAuthor}\n */\nexport const formMetadataAuthorSchema = Joi.object<FormMetadataAuthor>()\n .keys({\n id: authorIdSchema,\n displayName: authorDisplayNameSchema\n })\n .required()\n .description('Information about the author of a form or form change')\n\n/**\n * Joi schema for `FormMetadataState` interface\n * @see {@link FormMetadataState}\n */\nexport const formMetadataStateSchema = Joi.object<FormMetadataState>()\n .keys({\n createdAt: authoredAtSchema.description(\n 'When this version was first created'\n ),\n createdBy: formMetadataAuthorSchema.description('Who created this version'),\n updatedAt: authoredAtSchema.description(\n 'When this version was last updated'\n ),\n updatedBy: formMetadataAuthorSchema.description(\n 'Who last updated this version'\n )\n })\n .description('Metadata about a specific version state (draft or live)')\n\n/**\n * Joi schema for `FormVersionMetadata` interface\n * @see {@link FormVersionMetadata}\n */\nexport const formVersionMetadataSchema = Joi.object<FormVersionMetadata>()\n .keys({\n versionNumber: Joi.number()\n .integer()\n .min(1)\n .required()\n .description('The version number'),\n createdAt: authoredAtSchema.description('When this version was created')\n })\n .description('Metadata for a specific version of the form')\n\n/**\n * Joi schema for `FormMetadata` interface\n * @see {@link FormMetadata}\n */\nexport const formMetadataSchema = formMetadataInputSchema\n .append<FormMetadata>({\n id: idSchema,\n slug: slugSchema,\n draft: formMetadataStateSchema.description(\n 'Metadata for the draft version'\n ),\n live: formMetadataStateSchema.description(\n 'Metadata for the published version'\n ),\n createdAt: authoredAtSchema.description('When the form was first created'),\n createdBy: formMetadataAuthorSchema.description('Who created the form'),\n updatedAt: authoredAtSchema.description('When the form was last updated'),\n updatedBy: formMetadataAuthorSchema.description(\n 'Who last updated the form'\n ),\n versions: Joi.array()\n .items(formVersionMetadataSchema)\n .optional()\n .description('Version history for the form')\n })\n .description(\n 'Complete metadata for a form, including version information and authoring details'\n )\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
1
  export { findStartPage } from "./find-start-page.js";
2
2
  export { findDefinitionListFromComponent } from "./list.js";
3
+ export { preventUnicodeInEmail } from "./prevent-unicode.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["findStartPage","findDefinitionListFromComponent"],"sources":["../../../../src/form/utils/index.ts"],"sourcesContent":["export { findStartPage } from '~/src/form/utils/find-start-page.js'\nexport { findDefinitionListFromComponent } from '~/src/form/utils/list.js'\n"],"mappings":"AAAA,SAASA,aAAa;AACtB,SAASC,+BAA+B","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["findStartPage","findDefinitionListFromComponent","preventUnicodeInEmail"],"sources":["../../../../src/form/utils/index.ts"],"sourcesContent":["export { findStartPage } from '~/src/form/utils/find-start-page.js'\nexport { findDefinitionListFromComponent } from '~/src/form/utils/list.js'\nexport { preventUnicodeInEmail } from '~/src/form/utils/prevent-unicode.js'\n"],"mappings":"AAAA,SAASA,aAAa;AACtB,SAASC,+BAA+B;AACxC,SAASC,qBAAqB","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Custom Joi validator to prevent Unicode characters in say an email address.
3
+ * Although Joi has Joi.email({ allowUnicode: false }), we can't differentiate from a general
4
+ * email format error or a Unicode error - hance the custom validator to allow a different error message
5
+ * @param {unknown} value
6
+ * @param {CustomHelpers<string>} helpers
7
+ */
8
+ export function preventUnicodeInEmail(value, helpers) {
9
+ if (!value || typeof value !== 'string') {
10
+ return helpers.error('string.empty');
11
+ }
12
+ const invalidCharsRegex = /[^a-zA-Z0-9.!#$%&'*+/=?^_`{|}~@-]/;
13
+ const invalid = invalidCharsRegex.exec(value);
14
+ return invalid ? helpers.error('string.unicode') : value;
15
+ }
16
+
17
+ /**
18
+ * @import { type CustomHelpers } from 'joi'
19
+ */
20
+ //# sourceMappingURL=prevent-unicode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prevent-unicode.js","names":["preventUnicodeInEmail","value","helpers","error","invalidCharsRegex","invalid","exec"],"sources":["../../../../src/form/utils/prevent-unicode.js"],"sourcesContent":["/**\n * Custom Joi validator to prevent Unicode characters in say an email address.\n * Although Joi has Joi.email({ allowUnicode: false }), we can't differentiate from a general\n * email format error or a Unicode error - hance the custom validator to allow a different error message\n * @param {unknown} value\n * @param {CustomHelpers<string>} helpers\n */\nexport function preventUnicodeInEmail(value, helpers) {\n if (!value || typeof value !== 'string') {\n return helpers.error('string.empty')\n }\n const invalidCharsRegex = /[^a-zA-Z0-9.!#$%&'*+/=?^_`{|}~@-]/\n const invalid = invalidCharsRegex.exec(value)\n return invalid ? helpers.error('string.unicode') : value\n}\n\n/**\n * @import { type CustomHelpers } from 'joi'\n */\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,qBAAqBA,CAACC,KAAK,EAAEC,OAAO,EAAE;EACpD,IAAI,CAACD,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACvC,OAAOC,OAAO,CAACC,KAAK,CAAC,cAAc,CAAC;EACtC;EACA,MAAMC,iBAAiB,GAAG,mCAAmC;EAC7D,MAAMC,OAAO,GAAGD,iBAAiB,CAACE,IAAI,CAACL,KAAK,CAAC;EAC7C,OAAOI,OAAO,GAAGH,OAAO,CAACC,KAAK,CAAC,gBAAgB,CAAC,GAAGF,KAAK;AAC1D;;AAEA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export declare const MIN_NUMBER_OF_REPEAT_ITEMS = 1;
2
+ export declare const MAX_NUMBER_OF_REPEAT_ITEMS = 200;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,0BAA0B,MAAM,CAAA"}
@@ -3,8 +3,6 @@ import { type ComponentDef, type ContentComponentsDef, type FileUploadFieldCompo
3
3
  import { type ConditionDataV2, type ConditionListItemRefValueDataV2 } from '../../conditions/types.js';
4
4
  import { type ConditionWrapperV2, type FormDefinition, type List, type Page, type Repeat, type Section } from '../../form/form-definition/types.js';
5
5
  export declare const listItemIdValidator: (value: string, helpers: CustomHelpers<ConditionListItemRefValueDataV2>) => string | JoiBase.ErrorReport;
6
- export declare const MIN_NUMBER_OF_REPEAT_ITEMS = 1;
7
- export declare const MAX_NUMBER_OF_REPEAT_ITEMS = 200;
8
6
  export declare const conditionDataSchemaV2: JoiBase.ObjectSchema<ConditionDataV2>;
9
7
  export declare const conditionWrapperSchemaV2: JoiBase.ObjectSchema<ConditionWrapperV2>;
10
8
  export declare const regexCustomValidator: (value: string, helpers: CustomHelpers<string>) => string | JoiBase.ErrorReport;
@@ -40,5 +38,6 @@ export declare const sectionsSchemaV2: JoiBase.ObjectSchema<Section>;
40
38
  */
41
39
  export declare const formDefinitionSchema: JoiBase.ObjectSchema<FormDefinition>;
42
40
  export declare const formDefinitionV2Schema: JoiBase.ObjectSchema<FormDefinition>;
41
+ export { MAX_NUMBER_OF_REPEAT_ITEMS, MIN_NUMBER_OF_REPEAT_ITEMS } from '../../form/form-definition/constants.js';
43
42
  export declare const Schema: JoiBase.ObjectSchema<FormDefinition>;
44
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,EAAE,EAAE,KAAK,aAAa,EAAyB,MAAM,KAAK,CAAA;AAMxE,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAEL,KAAK,eAAe,EAIpB,KAAK,+BAA+B,EAOrC,MAAM,2BAA2B,CAAA;AAKlC,OAAO,EAGL,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAET,KAAK,MAAM,EAGX,KAAK,OAAO,EACb,MAAM,qCAAqC,CAAA;AA0C5C,eAAO,MAAM,mBAAmB,GAC9B,OAAO,MAAM,EACb,SAAS,aAAa,CAAC,+BAA+B,CAAC,iCAqCxD,CAAA;AA6ND,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C,eAAO,MAAM,qBAAqB,uCAyD9B,CAAA;AAoDJ,eAAO,MAAM,wBAAwB,0CAwBU,CAAA;AAE/C,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,SAAS,aAAa,CAAC,MAAM,CAAC,iCAW/B,CAAA;AAED,eAAO,MAAM,eAAe,oCA8HZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,oCAciB,CAAA;AAE/C,eAAO,MAAM,wBAAwB,oCASsB,CAAA;AAE3D,eAAO,MAAM,yBAAyB,oCAMpC,CAAA;AAEF,eAAO,MAAM,sBAAsB,oCAUjC,CAAA;AAuDF,eAAO,MAAM,gBAAgB,8BASzB,CAAA;AAyCJ,eAAO,MAAM,0BAA0B,sEAWmB,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4BAmDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAuCiB,CAAA;AAE1C,eAAO,MAAM,mBAAmB,4BAgBkB,CAAA;AAwDlD,eAAO,MAAM,UAAU,4BA8CnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAIiB,CAAA;AAE1C;;GAEG;AACH,eAAO,MAAM,gBAAgB,+BAIgB,CAAA;AAqD7C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sCAiG7B,CAAA;AAEJ,eAAO,MAAM,sBAAsB,sCAyDY,CAAA;AAI/C,eAAO,MAAM,MAAM,sCAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-definition/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,EAAE,EAAE,KAAK,aAAa,EAAyB,MAAM,KAAK,CAAA;AAMxE,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAEL,KAAK,eAAe,EAIpB,KAAK,+BAA+B,EAOrC,MAAM,2BAA2B,CAAA;AASlC,OAAO,EAGL,KAAK,kBAAkB,EAIvB,KAAK,cAAc,EAGnB,KAAK,IAAI,EACT,KAAK,IAAI,EAET,KAAK,MAAM,EAGX,KAAK,OAAO,EACb,MAAM,qCAAqC,CAAA;AA2C5C,eAAO,MAAM,mBAAmB,GAC9B,OAAO,MAAM,EACb,SAAS,aAAa,CAAC,+BAA+B,CAAC,iCAqCxD,CAAA;AA6ND,eAAO,MAAM,qBAAqB,uCAyD9B,CAAA;AAoDJ,eAAO,MAAM,wBAAwB,0CAwBU,CAAA;AAE/C,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,SAAS,aAAa,CAAC,MAAM,CAAC,iCAW/B,CAAA;AAED,eAAO,MAAM,eAAe,oCA8HZ,CAAA;AAEhB,eAAO,MAAM,iBAAiB,oCAciB,CAAA;AAE/C,eAAO,MAAM,wBAAwB,oCASsB,CAAA;AAE3D,eAAO,MAAM,yBAAyB,oCAMpC,CAAA;AAEF,eAAO,MAAM,sBAAsB,oCAUjC,CAAA;AAuDF,eAAO,MAAM,gBAAgB,8BASzB,CAAA;AAyCJ,eAAO,MAAM,0BAA0B,sEAWmB,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,UAAU,4BAmDnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAuCiB,CAAA;AAE1C,eAAO,MAAM,mBAAmB,4BAgBkB,CAAA;AAwDlD,eAAO,MAAM,UAAU,4BA8CnB,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,YAAY,4BAIiB,CAAA;AAE1C;;GAEG;AACH,eAAO,MAAM,gBAAgB,+BAIgB,CAAA;AA+C7C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sCA+F7B,CAAA;AAEJ,eAAO,MAAM,sBAAsB,sCAyDY,CAAA;AAE/C,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,yCAAyC,CAAA;AAIhD,eAAO,MAAM,MAAM,sCAAuB,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import Joi, { type ArraySchema } from 'joi';
2
2
  import { type FormEditorInputCheckAnswersSettings, type FormEditorInputPage, type FormEditorInputPageSettings, type FormEditorInputQuestion, type GovukField, type GovukFieldQuestionOptional, type GovukFieldUsePostcodeLookup, type GovukStringField } from '../../form/form-editor/types.js';
3
+ export declare const emailAddressNoUnicodeSchema: Joi.StringSchema<string>;
4
+ export declare const UNICODE_EMAIL_ERROR_MESSAGE = "The email address you entered includes invalid characters, for example, long dashes";
3
5
  export declare enum QuestionTypeSubGroup {
4
6
  WrittenAnswerSubGroup = "writtenAnswerSub",
5
7
  DateSubGroup = "dateSub",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-editor/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAE,KAAK,WAAW,EAAuB,MAAM,KAAK,CAAA;AAQhE,OAAO,EACL,KAAK,mCAAmC,EACxC,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACtB,MAAM,iCAAiC,CAAA;AAGxC,eAAO,MAAM,2BAA2B,0BAIqB,CAAA;AAE7D,eAAO,MAAM,2BAA2B,wFAC+C,CAAA;AAEvF,oBAAY,oBAAoB;IAC9B,qBAAqB,qBAAqB;IAC1C,YAAY,YAAY;IACxB,YAAY,YAAY;IACxB,gBAAgB,gBAAgB;CACjC;AAED,eAAO,MAAM,cAAc,0BAG6C,CAAA;AAExE,eAAO,MAAM,kBAAkB,0BAmB2C,CAAA;AAE1E,eAAO,MAAM,sBAAsB,0BAyBmC,CAAA;AAEtE,eAAO,MAAM,sBAAsB,0BAOmB,CAAA;AAEtD,eAAO,MAAM,aAAa,0BAG0B,CAAA;AAEpD,eAAO,MAAM,aAAa,0BAS0B,CAAA;AAEpD,eAAO,MAAM,iBAAiB,0BAU0B,CAAA;AAExD,eAAO,MAAM,UAAU,0BAG0B,CAAA;AAEjD,eAAO,MAAM,cAAc,0BAG8B,CAAA;AAEzD,eAAO,MAAM,cAAc,0BAI0C,CAAA;AAErE,eAAO,MAAM,qBAAqB,0BAM/B,CAAA;AAEH,eAAO,MAAM,sBAAsB,0BAMhC,CAAA;AAEH,eAAO,MAAM,qBAAqB,0BAIgC,CAAA;AAElE,eAAO,MAAM,mBAAmB,0BAEoC,CAAA;AAEpE,eAAO,MAAM,mBAAmB,0BAE8C,CAAA;AAE9E,eAAO,MAAM,gBAAgB,0BAO1B,CAAA;AAEH,eAAO,MAAM,cAAc,0BAOxB,CAAA;AAEH,eAAO,MAAM,cAAc,0BAOxB,CAAA;AAEH,eAAO,MAAM,eAAe,wBAOzB,CAAA;AAEH,eAAO,MAAM,mBAAmB,wBAO7B,CAAA;AAEH,eAAO,MAAM,gBAAgB,wBAO1B,CAAA;AAEH,eAAO,MAAM,sBAAsB,wBAIrB,CAAA;AAEd,eAAO,MAAM,oBAAoB,0BAIqC,CAAA;AAEtE,eAAO,MAAM,aAAa,0BAI2B,CAAA;AAErD,eAAO,MAAM,eAAe,0BAGkC,CAAA;AAE9D,eAAO,MAAM,eAAe,0BAMzB,CAAA;AAEH,eAAO,MAAM,gBAAgB,0BAM1B,CAAA;AAEH,eAAO,MAAM,sBAAsB,0BAGiC,CAAA;AAEpE,eAAO,MAAM,4BAA4B,0BAGmB,CAAA;AAE5D,eAAO,MAAM,iBAAiB,0BAGiC,CAAA;AAE/D,eAAO,MAAM,kBAAkB,0BAEuC,CAAA;AAEtE,eAAO,MAAM,cAAc,4BAGgC,CAAA;AAE3D,eAAO,MAAM,cAAc,0BAKxB,CAAA;AAEH,eAAO,MAAM,cAAc,0BAG2B,CAAA;AAEtD,eAAO,MAAM,cAAc,0BAG2B,CAAA;AAEtD,eAAO,MAAM,qBAAqB,0BAEc,CAAA;AAEhD,eAAO,MAAM,qBAAqB,0BAGe,CAAA;AAEjD,eAAO,MAAM,qBAAqB,0BAGgC,CAAA;AAElE,eAAO,MAAM,8BAA8B,4BAEqB,CAAA;AAEhE,eAAO,MAAM,2BAA2B,4BAEoB,CAAA;AAE5D,eAAO,MAAM,yBAAyB,4BAEoB,CAAA;AAE1D,eAAO,MAAM,SAAS,0BAG4B,CAAA;AAElD,eAAO,MAAM,SAAS,0BAG4B,CAAA;AAElD,eAAO,MAAM,eAAe,0BAI8B,CAAA;AAE1D,eAAO,MAAM,eAAe,0BAI8B,CAAA;AAE1D,eAAO,MAAM,eAAe,0BAIwC,CAAA;AAEpE,eAAO,MAAM,aAAa,0BAIwC,CAAA;AAElE,eAAO,MAAM,eAAe,0BAI0B,CAAA;AAEtD,eAAO,MAAM,YAAY,0BAImC,CAAA;AAE5D,eAAO,MAAM,WAAW,0BAGmC,CAAA;AAE3D,eAAO,MAAM,UAAU,0BAImC,CAAA;AAE1D,eAAO,MAAM,YAAY,0BAImC,CAAA;AAE5D,eAAO,MAAM,aAAa,0BAIoC,CAAA;AAE9D,eAAO,MAAM,eAAe,0BAIkC,CAAA;AAE9D,eAAO,MAAM,uBAAuB,0BAMjC,CAAA;AAEH,eAAO,MAAM,wBAAwB,0BAIwC,CAAA;AAE7E,eAAO,MAAM,mBAAmB,0BAIa,CAAA;AAE7C,eAAO,MAAM,mBAAmB,0BAEmB,CAAA;AAMnD,UAAU,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CACrD,SAAQ,WAAW,CAAC,OAAO,CAAC;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7D,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;IACpD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7D,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;CAC7C;AAED,UAAU,eAAgB,SAAQ,GAAG,CAAC,IAAI;IACxC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;CACnC;AAED,eAAO,MAAM,eAAe,EA4GtB,eAAe,CAAA;AAErB,eAAO,MAAM,yBAAyB;UACvB,MAAM;WAAS,MAAM;IAiBvB,CAAA;AAEb,eAAO,MAAM,yBAAyB;;cAnBvB,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DnC,CAAA;AAED,eAAO,MAAM,uBAAuB;;;CAGnC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uCAGmC,CAAA;AAEzE,eAAO,MAAM,sCAAsC;;CAElD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,wCAAwC,uDAIO,CAAA;AAE5D,eAAO,MAAM,2BAA2B;;;;;CAKvC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,6BAA6B,2CAMrC,CAAA;AAEL,eAAO,MAAM,+BAA+B;;;;CAI3C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,+CAI8B,CAAA;AAE5E,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,UAAU,GACrB,UAAU,IAAI,gBAAgB,CAYhC;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,GACrB,UAAU,IAAI,0BAA0B,GAAG,2BAA2B,CASxE;AAGD,eAAO,MAAM,6BAA6B,UAA+B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,mCAAmC,CAAA;AAE1C,eAAO,MAAM,aAAa,UAUzB,CAAA;AAED,eAAO,MAAM,QAAQ,0BAMlB,CAAA;AAEH,eAAO,MAAM,WAAW,0BAI+B,CAAA;AAEvD,eAAO,MAAM,UAAU,0BAGqC,CAAA;AAE5D,eAAO,MAAM,kBAAkB,0BAG8B,CAAA;AAE7D,eAAO,MAAM,cAAc,0BAIgC,CAAA;AAE3D,eAAO,MAAM,eAAe,0BAIyC,CAAA;AAErE,eAAO,MAAM,WAAW,0BAEiC,CAAA;AAEzD,eAAO,MAAM,kBAAkB,0BAI2B,CAAA;AAE1D,eAAO,MAAM,uBAAuB,0BAGwB,CAAA;AAE5D,eAAO,MAAM,WAAW,4CAK+C,CAAA;AAEvE,eAAO,MAAM,eAAe,0BAMmB,CAAA;AAE/C,eAAO,MAAM,gBAAgB,0BAGiC,CAAA;AAE9D,eAAO,MAAM,YAAY,6CAK6C,CAAA;AAEtE,eAAO,MAAM,aAAa,uCAM+C,CAAA;AAEzE,eAAO,MAAM,wBAAwB,0BAEkC,CAAA;AAEvE,eAAO,MAAM,uBAAuB,0BAEY,CAAA;AAEhD,eAAO,MAAM,uBAAuB,0BAEqB,CAAA;AAEzD,eAAO,MAAM,sBAAsB,0BAKsB,CAAA;AAEzD,eAAO,MAAM,8BAA8B,4BAE1C,CAAA;AAED,eAAO,MAAM,8BAA8B,0BAG6B,CAAA;AAExE,eAAO,MAAM,gBAAgB,sBAGoC,CAAA;AAEjE,eAAO,MAAM,cAAc,0BAGuB,CAAA;AAElD,eAAO,MAAM,uBAAuB,0BAGe,CAAA;AAEnD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAoBjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,qCAG+B,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,sCAMkC,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,qCAaqC,CAAA;AAEzE;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uCASuB,CAAA;AAE7D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,gCAuB5B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/form-metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AAGrB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,mCAAmC,CAAA;AAE1C,eAAO,MAAM,aAAa,UAUzB,CAAA;AAED,eAAO,MAAM,QAAQ,0BAMlB,CAAA;AAEH,eAAO,MAAM,WAAW,0BAI+B,CAAA;AAEvD,eAAO,MAAM,UAAU,0BAGqC,CAAA;AAE5D,eAAO,MAAM,kBAAkB,0BAG8B,CAAA;AAE7D,eAAO,MAAM,cAAc,0BAIgC,CAAA;AAE3D,eAAO,MAAM,eAAe,0BAIyC,CAAA;AAErE,eAAO,MAAM,WAAW,0BAEiC,CAAA;AAEzD,eAAO,MAAM,kBAAkB,0BAE2B,CAAA;AAE1D,eAAO,MAAM,uBAAuB,0BAGwB,CAAA;AAE5D,eAAO,MAAM,WAAW,4CAK+C,CAAA;AAEvE,eAAO,MAAM,eAAe,0BAMmB,CAAA;AAE/C,eAAO,MAAM,gBAAgB,0BAGiC,CAAA;AAE9D,eAAO,MAAM,YAAY,6CAK6C,CAAA;AAEtE,eAAO,MAAM,aAAa,uCAM+C,CAAA;AAEzE,eAAO,MAAM,wBAAwB,0BAEkC,CAAA;AAEvE,eAAO,MAAM,uBAAuB,0BAEY,CAAA;AAEhD,eAAO,MAAM,uBAAuB,0BAEqB,CAAA;AAEzD,eAAO,MAAM,sBAAsB,0BAKsB,CAAA;AAEzD,eAAO,MAAM,8BAA8B,4BAE1C,CAAA;AAED,eAAO,MAAM,8BAA8B,0BAGxC,CAAA;AAEH,eAAO,MAAM,gBAAgB,sBAGoC,CAAA;AAEjE,eAAO,MAAM,cAAc,0BAGuB,CAAA;AAElD,eAAO,MAAM,uBAAuB,0BAGe,CAAA;AAEnD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAoBjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,qCAG+B,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,sCAMkC,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,qCAaqC,CAAA;AAEzE;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uCASuB,CAAA;AAE7D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,gCAuB5B,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export { findStartPage } from '../../form/utils/find-start-page.js';
2
2
  export { findDefinitionListFromComponent } from '../../form/utils/list.js';
3
+ export { preventUnicodeInEmail } from '../../form/utils/prevent-unicode.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/form/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Custom Joi validator to prevent Unicode characters in say an email address.
3
+ * Although Joi has Joi.email({ allowUnicode: false }), we can't differentiate from a general
4
+ * email format error or a Unicode error - hance the custom validator to allow a different error message
5
+ * @param {unknown} value
6
+ * @param {CustomHelpers<string>} helpers
7
+ */
8
+ export function preventUnicodeInEmail(value: unknown, helpers: CustomHelpers<string>): string | import("joi").ErrorReport;
9
+ import type { CustomHelpers } from 'joi';
10
+ //# sourceMappingURL=prevent-unicode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prevent-unicode.d.ts","sourceRoot":"","sources":["../../../../src/form/utils/prevent-unicode.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,6CAHW,OAAO,WACP,cAAc,MAAM,CAAC,sCAS/B;mCAGsC,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/forms-model",
3
- "version": "3.0.643",
3
+ "version": "3.0.644",
4
4
  "description": "A hapi plugin providing the model for Defra forms",
5
5
  "homepage": "https://github.com/DEFRA/forms-designer/tree/main/model#readme",
6
6
  "types": "dist/types/index.d.ts",
@@ -52,9 +52,9 @@ import {
52
52
  type FormUploadedMessageData,
53
53
  type FormsBackupRequestedMessageData
54
54
  } from '~/src/form/form-audit/types.js'
55
+ import { emailAddressNoUnicodeSchema } from '~/src/form/form-editor/index.js'
55
56
  import {
56
57
  contactSchema,
57
- emailAddressSchema,
58
58
  emailResponseTimeSchema,
59
59
  idSchema,
60
60
  notificationEmailAddressSchema,
@@ -181,7 +181,7 @@ export const formSupportOnlineChanges = Joi.object<FormSupportOnlineChanges>()
181
181
 
182
182
  export const formSupportEmailChanges = Joi.object<FormSupportEmailChanges>()
183
183
  .keys({
184
- address: emailAddressSchema.optional(),
184
+ address: emailAddressNoUnicodeSchema.optional(),
185
185
  responseTime: emailResponseTimeSchema.optional()
186
186
  })
187
187
  .description('Changes schema for FORM_SUPPORT_EMAIL_UPDATED event')
@@ -238,7 +238,7 @@ export const entitlementMessageData = Joi.object<EntitlementMessageData>().keys(
238
238
  {
239
239
  userId: Joi.string().required(),
240
240
  displayName: Joi.string().required(),
241
- email: Joi.string().email().required(),
241
+ email: emailAddressNoUnicodeSchema.required(),
242
242
  roles: Joi.array().items(Joi.string())
243
243
  }
244
244
  )
@@ -260,7 +260,7 @@ export const excelGenerationMessageData =
260
260
  .keys({
261
261
  formId: Joi.string().required(),
262
262
  formName: Joi.string().required(),
263
- notificationEmail: Joi.string().email().required()
263
+ notificationEmail: emailAddressNoUnicodeSchema.required()
264
264
  })
265
265
  .required()
266
266
  .description(
@@ -0,0 +1,2 @@
1
+ export const MIN_NUMBER_OF_REPEAT_ITEMS = 1
2
+ export const MAX_NUMBER_OF_REPEAT_ITEMS = 200
@@ -25,6 +25,10 @@ import {
25
25
  type RelativeDateValueData,
26
26
  type RelativeDateValueDataV2
27
27
  } from '~/src/conditions/types.js'
28
+ import {
29
+ MAX_NUMBER_OF_REPEAT_ITEMS,
30
+ MIN_NUMBER_OF_REPEAT_ITEMS
31
+ } from '~/src/form/form-definition/constants.js'
28
32
  import {
29
33
  isConditionListItemRefValueData,
30
34
  isFormDefinition
@@ -47,6 +51,7 @@ import {
47
51
  type RepeatSchema,
48
52
  type Section
49
53
  } from '~/src/form/form-definition/types.js'
54
+ import { emailAddressNoUnicodeSchema } from '~/src/form/form-editor/index.js'
50
55
  import { checkErrors } from '~/src/form/form-manager/errors.js'
51
56
  import {
52
57
  FormDefinitionError,
@@ -348,9 +353,6 @@ const conditionSchema = Joi.object<ConditionData>()
348
353
  )
349
354
  })
350
355
 
351
- export const MIN_NUMBER_OF_REPEAT_ITEMS = 1
352
- export const MAX_NUMBER_OF_REPEAT_ITEMS = 200
353
-
354
356
  export const conditionDataSchemaV2 = Joi.object<ConditionDataV2>()
355
357
  .description('Condition definition')
356
358
  .keys({
@@ -1041,13 +1043,7 @@ const feedbackSchema = Joi.object<FormDefinition['feedback']>()
1041
1043
  .description(
1042
1044
  'URL to an external feedback form when not using built-in feedback'
1043
1045
  ),
1044
- emailAddress: Joi.string()
1045
- .trim()
1046
- .email({
1047
- tlds: {
1048
- allow: false
1049
- }
1050
- })
1046
+ emailAddress: emailAddressNoUnicodeSchema
1051
1047
  .optional()
1052
1048
  .description('Email address where feedback is sent')
1053
1049
  })
@@ -1155,8 +1151,7 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
1155
1151
  .optional()
1156
1152
  .description('Phase banner configuration'),
1157
1153
  options: optionsSchema.optional().description('Options for the form'),
1158
- outputEmail: Joi.string()
1159
- .trim()
1154
+ outputEmail: emailAddressNoUnicodeSchema
1160
1155
  .email({ tlds: { allow: ['uk'] } })
1161
1156
  .optional()
1162
1157
  .description('Email address where form submissions are sent'),
@@ -1165,8 +1160,7 @@ export const formDefinitionSchema = Joi.object<FormDefinition>()
1165
1160
  .description('Configuration for submission output format'),
1166
1161
  outputs: Joi.array()
1167
1162
  .items({
1168
- emailAddress: Joi.string()
1169
- .trim()
1163
+ emailAddress: emailAddressNoUnicodeSchema
1170
1164
  .email({ tlds: { allow: ['uk'] } })
1171
1165
  .description('Email address where form submissions are sent'),
1172
1166
  audience: Joi.string()
@@ -1244,6 +1238,11 @@ export const formDefinitionV2Schema = formDefinitionSchema
1244
1238
  })
1245
1239
  .description('Form definition schema for V2')
1246
1240
 
1241
+ export {
1242
+ MAX_NUMBER_OF_REPEAT_ITEMS,
1243
+ MIN_NUMBER_OF_REPEAT_ITEMS
1244
+ } from '~/src/form/form-definition/constants.js'
1245
+
1247
1246
  // Maintain compatibility with legacy named export
1248
1247
  // E.g. `import { Schema } from '@defra/forms-model'`
1249
1248
  export const Schema = formDefinitionSchema
@@ -5,7 +5,7 @@ import { ComponentType } from '~/src/components/enums.js'
5
5
  import {
6
6
  MAX_NUMBER_OF_REPEAT_ITEMS,
7
7
  MIN_NUMBER_OF_REPEAT_ITEMS
8
- } from '~/src/form/form-definition/index.js'
8
+ } from '~/src/form/form-definition/constants.js'
9
9
  import {
10
10
  type FormEditorInputCheckAnswersSettings,
11
11
  type FormEditorInputPage,
@@ -16,6 +16,16 @@ import {
16
16
  type GovukFieldUsePostcodeLookup,
17
17
  type GovukStringField
18
18
  } from '~/src/form/form-editor/types.js'
19
+ import { preventUnicodeInEmail } from '~/src/form/utils/prevent-unicode.js'
20
+
21
+ export const emailAddressNoUnicodeSchema = Joi.string()
22
+ .trim()
23
+ .email()
24
+ .custom((value, helpers) => preventUnicodeInEmail(value, helpers))
25
+ .description('Email address preventing unicode characters')
26
+
27
+ export const UNICODE_EMAIL_ERROR_MESSAGE =
28
+ 'The email address you entered includes invalid characters, for example, long dashes'
19
29
 
20
30
  export enum QuestionTypeSubGroup {
21
31
  WrittenAnswerSubGroup = 'writtenAnswerSub',
@@ -1,5 +1,6 @@
1
1
  import Joi from 'joi'
2
2
 
3
+ import { emailAddressNoUnicodeSchema } from '~/src/form/form-editor/index.js'
3
4
  import {
4
5
  type FormMetadata,
5
6
  type FormMetadataAuthor,
@@ -53,7 +54,7 @@ export const teamNameSchema = Joi.string()
53
54
  .required()
54
55
  .description('Name of the team responsible for the form')
55
56
 
56
- export const teamEmailSchema = Joi.string()
57
+ export const teamEmailSchema = emailAddressNoUnicodeSchema
57
58
  .email({ tlds: { allow: ['uk'] } })
58
59
  .trim()
59
60
  .required()
@@ -63,9 +64,7 @@ export const phoneSchema = Joi.string()
63
64
  .trim()
64
65
  .description('Phone number for form-related inquiries')
65
66
 
66
- export const emailAddressSchema = Joi.string()
67
- .email()
68
- .trim()
67
+ export const emailAddressSchema = emailAddressNoUnicodeSchema
69
68
  .required()
70
69
  .description('Email address for form-related inquiries')
71
70
 
@@ -132,10 +131,10 @@ export const termsAndConditionsAgreedSchema = Joi.boolean().description(
132
131
  'Whether the data protection terms and conditions have been agreed to'
133
132
  )
134
133
 
135
- export const notificationEmailAddressSchema = Joi.string()
136
- .email()
137
- .trim()
138
- .description('Email address to receive form submission notifications')
134
+ export const notificationEmailAddressSchema =
135
+ emailAddressNoUnicodeSchema.description(
136
+ 'Email address to receive form submission notifications'
137
+ )
139
138
 
140
139
  export const authoredAtSchema = Joi.date()
141
140
  .iso()
@@ -1,2 +1,3 @@
1
1
  export { findStartPage } from '~/src/form/utils/find-start-page.js'
2
2
  export { findDefinitionListFromComponent } from '~/src/form/utils/list.js'
3
+ export { preventUnicodeInEmail } from '~/src/form/utils/prevent-unicode.js'
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Custom Joi validator to prevent Unicode characters in say an email address.
3
+ * Although Joi has Joi.email({ allowUnicode: false }), we can't differentiate from a general
4
+ * email format error or a Unicode error - hance the custom validator to allow a different error message
5
+ * @param {unknown} value
6
+ * @param {CustomHelpers<string>} helpers
7
+ */
8
+ export function preventUnicodeInEmail(value, helpers) {
9
+ if (!value || typeof value !== 'string') {
10
+ return helpers.error('string.empty')
11
+ }
12
+ const invalidCharsRegex = /[^a-zA-Z0-9.!#$%&'*+/=?^_`{|}~@-]/
13
+ const invalid = invalidCharsRegex.exec(value)
14
+ return invalid ? helpers.error('string.unicode') : value
15
+ }
16
+
17
+ /**
18
+ * @import { type CustomHelpers } from 'joi'
19
+ */