@uides/stepwise 2.2.1 → 2.2.3

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 (229) hide show
  1. package/CHANGELOG.md +11 -2
  2. package/generators/extractStepwisePossibleValues.d.mts +1 -0
  3. package/index.js +1 -1
  4. package/package.json +1 -1
  5. package/schemas/action.d.ts +48 -168
  6. package/schemas/action.js +34 -47
  7. package/schemas/field/afm/index.d.ts +158 -6
  8. package/schemas/field/afm/index.js +6 -9
  9. package/schemas/field/amka/index.d.ts +152 -8
  10. package/schemas/field/amka/index.js +3 -7
  11. package/schemas/field/attachment/index.d.ts +184 -16
  12. package/schemas/field/attachment/index.js +9 -22
  13. package/schemas/field/captcha/index.d.ts +156 -2
  14. package/schemas/field/captcha/index.js +6 -9
  15. package/schemas/field/choice/index.d.ts +188 -15
  16. package/schemas/field/choice/index.js +4 -9
  17. package/schemas/field/common.d.ts +92 -40
  18. package/schemas/field/common.js +78 -11
  19. package/schemas/field/date/index.d.ts +152 -38
  20. package/schemas/field/date/index.js +6 -33
  21. package/schemas/field/doc_subtitle/index.d.ts +158 -5
  22. package/schemas/field/doc_subtitle/index.js +5 -6
  23. package/schemas/field/doc_title/index.d.ts +154 -8
  24. package/schemas/field/doc_title/index.js +5 -12
  25. package/schemas/field/dynamically-filled-text/index.d.ts +170 -33
  26. package/schemas/field/dynamically-filled-text/index.js +6 -23
  27. package/schemas/field/email/index.d.ts +152 -8
  28. package/schemas/field/email/index.js +5 -9
  29. package/schemas/field/fillable-string/index.d.ts +156 -12
  30. package/schemas/field/fillable-string/index.js +4 -10
  31. package/schemas/field/five-block-date/index.d.ts +156 -2
  32. package/schemas/field/five-block-date/index.js +5 -4
  33. package/schemas/field/hidden/index.d.ts +161 -14
  34. package/schemas/field/hidden/index.js +7 -15
  35. package/schemas/field/hierarchical-selector/index.d.ts +176 -37
  36. package/schemas/field/hierarchical-selector/index.js +5 -21
  37. package/schemas/field/iban/index.d.ts +168 -6
  38. package/schemas/field/iban/index.js +3 -3
  39. package/schemas/field/image/index.d.ts +168 -16
  40. package/schemas/field/image/index.js +7 -23
  41. package/schemas/field/index.d.ts +2 -7
  42. package/schemas/field/index.js +8 -15
  43. package/schemas/field/int/index.d.ts +152 -8
  44. package/schemas/field/int/index.js +5 -9
  45. package/schemas/field/intl_mobile_phone/index.d.ts +156 -3
  46. package/schemas/field/intl_mobile_phone/index.js +5 -5
  47. package/schemas/field/lab-results/index.d.ts +156 -3
  48. package/schemas/field/lab-results/index.js +6 -6
  49. package/schemas/field/mobile_phone/index.d.ts +158 -5
  50. package/schemas/field/mobile_phone/index.js +5 -6
  51. package/schemas/field/multiple-choice/index.d.ts +180 -12
  52. package/schemas/field/multiple-choice/index.js +3 -8
  53. package/schemas/field/password/index.d.ts +156 -2
  54. package/schemas/field/password/index.js +5 -5
  55. package/schemas/field/pdf-image/index.d.ts +152 -14
  56. package/schemas/field/pdf-image/index.js +6 -18
  57. package/schemas/field/postal_code/index.d.ts +156 -4
  58. package/schemas/field/postal_code/index.js +6 -8
  59. package/schemas/field/preference-multiple-choice/index.d.ts +211 -17
  60. package/schemas/field/preference-multiple-choice/index.js +5 -9
  61. package/schemas/field/qrcode/index.d.ts +168 -19
  62. package/schemas/field/qrcode/index.js +6 -18
  63. package/schemas/field/quote/index.d.ts +170 -11
  64. package/schemas/field/quote/index.js +4 -12
  65. package/schemas/field/radio-choice/index.d.ts +172 -9
  66. package/schemas/field/radio-choice/index.js +4 -10
  67. package/schemas/field/rate/index.d.ts +150 -8
  68. package/schemas/field/rate/index.js +4 -7
  69. package/schemas/field/recipient/index.d.ts +158 -5
  70. package/schemas/field/recipient/index.js +5 -9
  71. package/schemas/field/redirect/index.d.ts +156 -6
  72. package/schemas/field/redirect/index.js +6 -9
  73. package/schemas/field/refcode/index.d.ts +168 -16
  74. package/schemas/field/refcode/index.js +6 -20
  75. package/schemas/field/string/index.d.ts +226 -65
  76. package/schemas/field/string/index.js +5 -54
  77. package/schemas/field/text/index.d.ts +170 -33
  78. package/schemas/field/text/index.js +5 -30
  79. package/schemas/field/three-block-date/index.d.ts +176 -12
  80. package/schemas/field/three-block-date/index.js +4 -10
  81. package/schemas/field/url/index.d.ts +204 -0
  82. package/schemas/field/url/index.js +16 -0
  83. package/schemas/fieldset/component-params.d.ts +9 -41
  84. package/schemas/fieldset/component-params.js +5 -29
  85. package/schemas/fieldset/display-components.d.ts +16 -244
  86. package/schemas/fieldset/display-components.js +6 -19
  87. package/schemas/fieldset/enums.d.ts +0 -22
  88. package/schemas/fieldset/enums.js +1 -15
  89. package/schemas/fieldset/index.d.ts +9 -93
  90. package/schemas/index.d.ts +1 -1
  91. package/schemas/index.js +1 -1
  92. package/schemas/step.d.ts +7 -0
  93. package/schemas/step.js +2 -1
  94. package/schemas/{template/template.d.ts → template.d.ts} +47 -23
  95. package/schemas/template.js +26 -0
  96. package/src/generators/actions-possible-values/document-anon-create.json +19 -0
  97. package/src/generators/actions-possible-values/document-backstep.json +19 -0
  98. package/src/generators/actions-possible-values/document-create-new.json +43 -0
  99. package/src/generators/actions-possible-values/document-create.json +20 -0
  100. package/src/generators/actions-possible-values/document-dismiss.json +36 -0
  101. package/src/generators/actions-possible-values/document-download-pdf.json +69 -0
  102. package/src/generators/actions-possible-values/document-email.json +42 -0
  103. package/src/generators/actions-possible-values/document-resend-otp.json +30 -0
  104. package/src/generators/actions-possible-values/document-revoke.json +46 -0
  105. package/src/generators/actions-possible-values/document-share.json +29 -0
  106. package/src/generators/actions-possible-values/document-sms.json +38 -0
  107. package/src/generators/actions-possible-values/document-temporary-save.json +28 -0
  108. package/src/generators/actions-possible-values/document-update.json +111 -0
  109. package/src/generators/actions-possible-values/entity-forward.json +31 -0
  110. package/src/generators/actions-possible-values/entity-reply.json +31 -0
  111. package/src/generators/actions-possible-values/entity-send-message.json +34 -0
  112. package/src/generators/actions-possible-values/hidden.json +22 -0
  113. package/src/generators/actions-possible-values/link.json +43 -0
  114. package/src/generators/extractStepwisePossibleValues.mjs +139 -0
  115. package/src/generators/fields-possible-values/afm.json +94 -0
  116. package/src/generators/fields-possible-values/amka.json +26 -0
  117. package/src/generators/fields-possible-values/attachment.json +89 -0
  118. package/src/generators/fields-possible-values/captcha.json +16 -0
  119. package/src/generators/fields-possible-values/choice.json +432 -0
  120. package/src/generators/fields-possible-values/date.json +57 -0
  121. package/src/generators/fields-possible-values/doc_subtitle.json +26 -0
  122. package/src/generators/fields-possible-values/doc_title.json +63 -0
  123. package/src/generators/fields-possible-values/dynamically-filled-text.json +47 -0
  124. package/src/generators/fields-possible-values/email.json +65 -0
  125. package/src/generators/fields-possible-values/fillable-string.json +47 -0
  126. package/src/generators/fields-possible-values/five-block-date.json +23 -0
  127. package/src/generators/fields-possible-values/hidden.json +140 -0
  128. package/src/generators/fields-possible-values/hierarchical-selector.json +84 -0
  129. package/src/generators/fields-possible-values/iban.json +35 -0
  130. package/src/generators/fields-possible-values/image.json +37 -0
  131. package/src/generators/fields-possible-values/int.json +52 -0
  132. package/src/generators/fields-possible-values/intl_mobile_phone.json +32 -0
  133. package/src/generators/fields-possible-values/lab-results.json +19 -0
  134. package/src/generators/fields-possible-values/mobile_phone.json +45 -0
  135. package/src/generators/fields-possible-values/multiple-choice.json +128 -0
  136. package/src/generators/fields-possible-values/password.json +20 -0
  137. package/src/generators/fields-possible-values/pdf-image.json +70 -0
  138. package/src/generators/fields-possible-values/postal_code.json +32 -0
  139. package/src/generators/fields-possible-values/preference-multiple-choice.json +53 -0
  140. package/src/generators/fields-possible-values/qrcode.json +75 -0
  141. package/src/generators/fields-possible-values/quote.json +71 -0
  142. package/src/generators/fields-possible-values/radio-choice.json +209 -0
  143. package/src/generators/fields-possible-values/rate.json +26 -0
  144. package/src/generators/fields-possible-values/recipient.json +46 -0
  145. package/src/generators/fields-possible-values/redirect.json +22 -0
  146. package/src/generators/fields-possible-values/refcode.json +89 -0
  147. package/src/generators/fields-possible-values/string.json +778 -0
  148. package/src/generators/fields-possible-values/text.json +105 -0
  149. package/src/generators/fields-possible-values/three-block-date.json +83 -0
  150. package/src/generators/fields-possible-values/url.json +23 -0
  151. package/src/generators/fieldsets-possible-values/form.json +311 -0
  152. package/src/generators/fieldsets-possible-values/hidden.json +107 -0
  153. package/src/generators/fieldsets-possible-values/unknown.json +69 -0
  154. package/src/generators/fieldsets-possible-values/values-list.json +364 -0
  155. package/src/schemas/action.ts +44 -58
  156. package/src/schemas/field/afm/index.ts +8 -6
  157. package/src/schemas/field/amka/index.ts +7 -9
  158. package/src/schemas/field/attachment/index.ts +9 -23
  159. package/src/schemas/field/captcha/index.ts +8 -3
  160. package/src/schemas/field/choice/index.ts +7 -5
  161. package/src/schemas/field/common.spec.ts +0 -3
  162. package/src/schemas/field/common.ts +115 -53
  163. package/src/schemas/field/date/index.ts +8 -24
  164. package/src/schemas/field/doc_subtitle/index.ts +7 -4
  165. package/src/schemas/field/doc_title/index.ts +7 -14
  166. package/src/schemas/field/dynamically-filled-text/index.ts +7 -15
  167. package/src/schemas/field/email/index.ts +7 -9
  168. package/src/schemas/field/fillable-string/index.ts +7 -11
  169. package/src/schemas/field/five-block-date/index.ts +7 -2
  170. package/src/schemas/field/hidden/index.ts +15 -40
  171. package/src/schemas/field/hierarchical-selector/index.ts +8 -18
  172. package/src/schemas/field/iban/index.ts +7 -3
  173. package/src/schemas/field/image/index.ts +8 -10
  174. package/src/schemas/field/index.ts +8 -33
  175. package/src/schemas/field/int/index.ts +7 -9
  176. package/src/schemas/field/intl_mobile_phone/index.ts +7 -3
  177. package/src/schemas/field/lab-results/index.ts +7 -3
  178. package/src/schemas/field/mobile_phone/index.ts +7 -4
  179. package/src/schemas/field/multiple-choice/index.ts +7 -5
  180. package/src/schemas/field/password/index.ts +8 -3
  181. package/src/schemas/field/pdf-image/index.ts +8 -12
  182. package/src/schemas/field/postal_code/index.ts +8 -5
  183. package/src/schemas/field/preference-multiple-choice/index.ts +8 -7
  184. package/src/schemas/field/qrcode/index.ts +7 -10
  185. package/src/schemas/field/quote/index.ts +8 -8
  186. package/src/schemas/field/radio-choice/index.ts +7 -5
  187. package/src/schemas/field/rate/index.ts +7 -8
  188. package/src/schemas/field/recipient/index.ts +7 -4
  189. package/src/schemas/field/redirect/index.ts +7 -6
  190. package/src/schemas/field/refcode/index.ts +7 -21
  191. package/src/schemas/field/string/index.ts +7 -42
  192. package/src/schemas/field/text/index.ts +8 -16
  193. package/src/schemas/field/three-block-date/index.ts +7 -6
  194. package/src/schemas/field/url/index.ts +24 -0
  195. package/src/schemas/fieldset/component-params.ts +4 -20
  196. package/src/schemas/fieldset/display-components.ts +5 -36
  197. package/src/schemas/fieldset/enums.ts +0 -38
  198. package/src/schemas/step.ts +1 -0
  199. package/src/schemas/{template/template-base.ts → template.ts} +30 -6
  200. package/src/utils/index.ts +69 -2
  201. package/utils/index.js +28 -2
  202. package/schemas/field/consent-content/index.d.ts +0 -68
  203. package/schemas/field/consent-content/index.js +0 -19
  204. package/schemas/field/image-crop/index.d.ts +0 -59
  205. package/schemas/field/image-crop/index.js +0 -19
  206. package/schemas/field/landline_phone/index.d.ts +0 -48
  207. package/schemas/field/landline_phone/index.js +0 -14
  208. package/schemas/field/link/index.d.ts +0 -50
  209. package/schemas/field/link/index.js +0 -16
  210. package/schemas/field/phone/index.d.ts +0 -48
  211. package/schemas/field/phone/index.js +0 -14
  212. package/schemas/field/url-param/index.d.ts +0 -57
  213. package/schemas/field/url-param/index.js +0 -14
  214. package/schemas/template/index.d.ts +0 -2
  215. package/schemas/template/index.js +0 -2
  216. package/schemas/template/template-base.d.ts +0 -53
  217. package/schemas/template/template-base.js +0 -15
  218. package/schemas/template/template-source.d.ts +0 -50
  219. package/schemas/template/template-source.js +0 -14
  220. package/schemas/template/template.js +0 -22
  221. package/src/schemas/field/consent-content/index.ts +0 -28
  222. package/src/schemas/field/image-crop/index.ts +0 -25
  223. package/src/schemas/field/landline_phone/index.ts +0 -18
  224. package/src/schemas/field/link/index.ts +0 -20
  225. package/src/schemas/field/phone/index.ts +0 -18
  226. package/src/schemas/field/url-param/index.ts +0 -23
  227. package/src/schemas/template/index.ts +0 -2
  228. package/src/schemas/template/template-source.ts +0 -88
  229. package/src/schemas/template/template.ts +0 -49
@@ -1,19 +1,21 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const AfmDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('afm'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const AfmSchema = v.strictObject({
11
- 'user-input-mode': v.picklist(['noinput', 'optional', 'required', 'display']),
12
- attribute: v.nullish(v.string()),
13
- datatype: v.nullish(v.literal('afm')),
15
+ const AfmSchema = createFieldSchema({
16
+ 'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
14
17
  display: AfmDisplaySchema,
15
18
  'default-value': v.nullish(v.string()),
16
- sources: v.nullish(v.string()),
17
19
  });
18
20
  export type AfmType = v.InferOutput<typeof AfmSchema>;
19
21
  export type AfmSchemaType = v.GenericSchema<AfmType>;
@@ -1,22 +1,20 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const AmkaDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('amka'),
7
- 'component-params': v.nullish(
8
- v.strictObject({
9
- textColor: v.nullish(v.string()),
10
- })
11
- ),
11
+ 'component-params': v.nullish(createComponentParams({})),
12
12
  })
13
13
  );
14
14
 
15
- const AmkaSchema = v.strictObject({
15
+ const AmkaSchema = createFieldSchema({
16
16
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
17
- attribute: v.nullish(v.string()),
18
17
  display: AmkaDisplaySchema,
19
- datatype: v.nullish(v.literal('amka')),
20
18
  'default-value': v.nullish(v.string()),
21
19
  });
22
20
 
@@ -1,40 +1,26 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
3
-
4
- const CommonAttachmentComponentParamsSchema = v.strictObject({
5
- filetype: v.nullish(v.picklist(['pdf', 'pdf-for-mark'])),
6
- 'file-max-size': v.nullish(v.number()),
7
- });
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
8
7
 
9
8
  const AttachmentDisplaySchema = createFieldDisplay(
10
9
  v.strictObject({
11
10
  component: v.literal('attachment'),
12
11
  'component-params': v.nullish(
13
- v.strictObject({
14
- ...CommonAttachmentComponentParamsSchema.entries,
12
+ createComponentParams({
13
+ filetype: v.nullish(v.picklist(['pdf', 'pdf-for-mark'])),
14
+ 'file-max-size': v.nullish(v.number()),
15
15
  multiplicity: v.nullish(v.number()),
16
16
  })
17
17
  ),
18
- }),
19
- v.strictObject({
20
- component: v.literal('attachment'),
21
- 'component-params': v.nullish(
22
- // TODO: Make pdf component-params also inherit default component-params
23
- v.strictObject({
24
- ...CommonAttachmentComponentParamsSchema.entries,
25
- coordinates: v.nullish(v.array(v.nullable(v.number()))),
26
- })
27
- ),
28
18
  })
29
19
  );
30
20
 
31
- const AttachmentSchema = v.strictObject({
21
+ const AttachmentSchema = createFieldSchema({
32
22
  'user-input-mode': v.picklist(['noinput', 'optional', 'required', 'display']),
33
- datatype: v.nullish(v.literal('attachment')),
34
- attribute: v.nullish(v.string()),
35
23
  display: AttachmentDisplaySchema,
36
- sources: v.nullish(v.string()),
37
- 'value-constructor': v.nullish(v.string()),
38
24
  'validation-download-attachment-fn': v.nullish(v.string()),
39
25
  });
40
26
 
@@ -1,14 +1,19 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const CaptchaDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('captcha'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const CaptchaSchema = v.strictObject({
11
- 'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
15
+ const CaptchaSchema = createFieldSchema({
16
+ 'user-input-mode': v.literal('required'),
12
17
  display: CaptchaDisplaySchema,
13
18
  });
14
19
 
@@ -1,5 +1,9 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const ChoiceDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
@@ -7,7 +11,7 @@ const ChoiceDisplaySchema = createFieldDisplay(
7
11
  choices: v.nullish(v.union([v.string(), v.record(v.string(), v.string())])),
8
12
  'choices-order': v.nullish(v.string()),
9
13
  'component-params': v.nullish(
10
- v.strictObject({
14
+ createComponentParams({
11
15
  autocomplete: v.nullish(v.boolean()),
12
16
  'legacy-mode': v.nullish(v.boolean()),
13
17
  'format-title': v.nullish(v.boolean()),
@@ -16,13 +20,11 @@ const ChoiceDisplaySchema = createFieldDisplay(
16
20
  })
17
21
  );
18
22
 
19
- const ChoiceSchema = v.strictObject({
23
+ const ChoiceSchema = createFieldSchema({
20
24
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
21
25
  display: ChoiceDisplaySchema,
22
26
  'default-value': v.nullish(v.string()),
23
27
  'choices-source-fn': v.nullish(v.string()),
24
- attribute: v.nullish(v.string()),
25
- datatype: v.nullish(v.picklist(['choice', 'string'])),
26
28
  });
27
29
 
28
30
  export type ChoiceType = v.InferOutput<typeof ChoiceSchema>;
@@ -39,9 +39,6 @@ const DisplaySchema = createFieldDisplay(
39
39
  v.strictObject({
40
40
  label: v.string(),
41
41
  value: v.number(),
42
- }),
43
- v.strictObject({
44
- flag: v.boolean(),
45
42
  })
46
43
  );
47
44
 
@@ -1,16 +1,13 @@
1
- /* eslint-disable @typescript-eslint/no-unused-vars */
2
1
  import * as v from 'valibot';
3
- import {
4
- DisplayLang,
5
- DisplayModeSchema,
6
- DisplayLangSchema as BaseDisplayLangSchema,
7
- } from '@uides/stepwise/schemas/common';
2
+ import { DisplayLang } from '@uides/stepwise/schemas/common';
8
3
  import { resolveDisplay } from '@uides/stepwise/schemas/resolve';
9
4
  import { isFailureDataset } from '@uides/stepwise/utils';
10
5
 
6
+ const KNOWN_DISPLAY_MODES = ['default', 'web', 'pdf'] as const;
7
+
11
8
  // TODO: Make default lang mandatory?
12
9
  const FieldDisplayLangSchema = v.pipe(
13
- v.record(BaseDisplayLangSchema, v.any()),
10
+ v.record(v.string(), v.any()),
14
11
  v.check((val) => {
15
12
  if (!val) return false;
16
13
  if (Object.keys(val).length === 0) return false;
@@ -20,20 +17,39 @@ const FieldDisplayLangSchema = v.pipe(
20
17
 
21
18
  // TODO: Make default mode mandatory?
22
19
  export const DisplayModeAndLangSchema = v.pipe(
23
- v.record(DisplayModeSchema, FieldDisplayLangSchema),
24
- v.check((val) => {
25
- if (!val) return false;
26
- if (Object.keys(val).length === 0) return false;
27
- return true;
28
- }, 'At least one display mode must be defined.')
20
+ v.record(v.string(), v.any()),
21
+ v.rawCheck<Record<string, unknown>>(({ dataset, addIssue }) => {
22
+ if (isFailureDataset(dataset)) return;
23
+ const val = dataset.value;
24
+ if (!val || Object.keys(val).length === 0) {
25
+ addIssue({ message: 'At least one display mode must be defined.' });
26
+ return;
27
+ }
28
+ for (const [key, value] of Object.entries(val)) {
29
+ if (!(KNOWN_DISPLAY_MODES as readonly string[]).includes(key)) continue;
30
+ const result = v.safeParse(FieldDisplayLangSchema, value);
31
+ if (result.issues) {
32
+ result.issues.forEach((issue) => {
33
+ addIssue({
34
+ message: issue.message,
35
+ path: issue.path,
36
+ input: issue.input,
37
+ expected: issue.expected ?? undefined,
38
+ received: issue.received,
39
+ });
40
+ });
41
+ }
42
+ }
43
+ })
29
44
  );
30
45
 
46
+ const VALIDATED_DISPLAY_MODES = ['default', 'web'] as const;
47
+
31
48
  type AnyGenericSchema = v.GenericSchema<unknown, unknown>;
32
49
 
33
50
  export interface DisplayType<
34
51
  DefaultDisplaySchema extends AnyGenericSchema,
35
52
  WebDisplaySchema extends AnyGenericSchema = AnyGenericSchema,
36
- PdfDisplaySchema extends AnyGenericSchema = AnyGenericSchema,
37
53
  > {
38
54
  default?: Partial<
39
55
  Record<
@@ -47,17 +63,11 @@ export interface DisplayType<
47
63
  v.InferOutput<WebDisplaySchema> | (unknown & Record<never, never>)
48
64
  >
49
65
  >;
50
- pdf?: Partial<
51
- Record<
52
- DisplayLang,
53
- v.InferOutput<PdfDisplaySchema> | (unknown & Record<never, never>)
54
- >
55
- >;
56
66
  }
57
67
 
58
68
  // TODO: Is type too big?
59
69
  /**
60
- * Creates a field display schema with specified default and PDF display properties.
70
+ * Creates a field display schema with specified default display properties.
61
71
  *
62
72
  * Defaults are:
63
73
  * - title
@@ -70,19 +80,10 @@ export interface DisplayType<
70
80
  * - md
71
81
  * - example
72
82
  */
73
- export function createFieldDisplay<
74
- D extends v.ObjectEntries,
75
- P extends v.ObjectEntries = never,
76
- >(
83
+ export function createFieldDisplay<D extends v.ObjectEntries>(
77
84
  DefaultDisplay:
78
85
  | v.StrictObjectSchema<D, undefined>
79
- | v.LooseObjectSchema<D, undefined>,
80
- // TODO: Add PDF validation
81
-
82
- // @ts-expect-error value not used
83
- PdfDisplay?:
84
- | v.StrictObjectSchema<P, undefined>
85
- | v.LooseObjectSchema<P, undefined>
86
+ | v.LooseObjectSchema<D, undefined>
86
87
  ) {
87
88
  // Base schema for display modes
88
89
  // Use loose or strict object based on DefaultDisplay schema type
@@ -99,34 +100,16 @@ export function createFieldDisplay<
99
100
  v.record(v.string(), defaultDisplayContent)
100
101
  );
101
102
 
102
- // const pdfDisplayContent = v.strictObject({
103
- // ...FieldDisplayModeBaseSchema.entries,
104
- // ...v.partial(DefaultDisplay).entries,
105
- // ...PdfDisplay?.entries,
106
- // });
107
- // const pdfDisplaySchema = v.record(
108
- // v.string(),
109
- // v.record(v.string(), pdfDisplayContent)
110
- // );
111
-
112
103
  const DisplaySchema = v.pipe(
113
104
  v.record(v.string(), v.any()),
114
105
  v.rawCheck<
115
- DisplayType<
116
- typeof defaultDisplayContent,
117
- typeof defaultDisplayContent,
118
- typeof defaultDisplayContent
119
- >
106
+ DisplayType<typeof defaultDisplayContent, typeof defaultDisplayContent>
120
107
  >(({ addIssue, dataset }) => {
121
108
  if (isFailureDataset(dataset)) return;
122
109
  const display = dataset.value;
123
110
 
124
- DisplayModeSchema.options.forEach((displayMode) => {
125
- if (
126
- !(displayMode in display && display[displayMode]) ||
127
- displayMode === 'pdf' // TODO: Add PDF validation
128
- )
129
- return;
111
+ VALIDATED_DISPLAY_MODES.forEach((displayMode) => {
112
+ if (!(displayMode in display && display[displayMode])) return;
130
113
  Object.keys(display[displayMode]).forEach((displayLang) => {
131
114
  const resolvedDisplay = resolveDisplay(
132
115
  displayMode,
@@ -178,3 +161,82 @@ const FieldDisplayModeBaseSchema = v.strictObject({
178
161
  })
179
162
  ),
180
163
  });
164
+
165
+ export const COMMON_FIELD_ATTRS = {
166
+ attribute: v.nullish(v.any()),
167
+ sources: v.nullish(v.any()),
168
+ 'value-constructor': v.nullish(v.any()),
169
+ datatype: v.nullish(v.any()),
170
+ 'is-display-field': v.nullish(v.any()),
171
+ 'default-on-empty': v.nullish(v.any()),
172
+ } as const;
173
+
174
+ /**
175
+ * Creates a field schema with common attributes pre-applied.
176
+ *
177
+ * Common attributes are backend-related concerns that the UI does not use, mostly related to PDF.
178
+ * Per-field entries override common ones.
179
+ *
180
+ * @param entries - Field-specific entries.
181
+ * @param mode - `'strict'` (default) or `'loose'` object schema.
182
+ */
183
+ export function createFieldSchema<E extends v.ObjectEntries>(
184
+ entries: E,
185
+ mode: 'strict' | 'loose' = 'strict'
186
+ ) {
187
+ // const factory = mode === 'loose' ? v.looseObject : v.strictObject;
188
+ if (mode === 'strict') {
189
+ return v.strictObject({
190
+ ...COMMON_FIELD_ATTRS,
191
+ ...entries,
192
+ });
193
+ } else {
194
+ return v.looseObject({
195
+ ...COMMON_FIELD_ATTRS,
196
+ ...entries,
197
+ });
198
+ }
199
+ }
200
+
201
+ export const COMMON_COMPONENT_PARAMS_ATTRS = {
202
+ coordinates: v.nullish(v.any()),
203
+ 'later-pages': v.nullish(v.any()),
204
+ fontSize: v.nullish(v.any()),
205
+ fontName: v.nullish(v.any()),
206
+ leading: v.nullish(v.any()),
207
+ textColor: v.nullish(v.any()),
208
+ backColor: v.nullish(v.any()),
209
+ bold: v.nullish(v.any()),
210
+ format: v.nullish(v.any()),
211
+ emph: v.nullish(v.any()),
212
+ ignore_emph: v.nullish(v.any()),
213
+ cell_valign: v.nullish(v.any()),
214
+ position: v.nullish(v.any()),
215
+ attachment_retrieval: v.nullish(v.any()),
216
+ } as const;
217
+
218
+ /**
219
+ * Creates a `component-params` schema with common attributes pre-applied.
220
+ *
221
+ * Common attributes are backend-related concerns that the UI does not use, mostly related to PDF.
222
+ * Per-field entries override common ones.
223
+ *
224
+ * @param entries - Field-specific entries.
225
+ * @param mode - `'strict'` (default) or `'loose'` object schema.
226
+ */
227
+ export function createComponentParams<E extends v.ObjectEntries>(
228
+ entries: E,
229
+ mode: 'strict' | 'loose' = 'strict'
230
+ ) {
231
+ if (mode === 'strict') {
232
+ return v.strictObject({
233
+ ...COMMON_COMPONENT_PARAMS_ATTRS,
234
+ ...entries,
235
+ });
236
+ } else {
237
+ return v.looseObject({
238
+ ...COMMON_COMPONENT_PARAMS_ATTRS,
239
+ ...entries,
240
+ });
241
+ }
242
+ }
@@ -1,37 +1,21 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const DateDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('date'),
7
- 'component-params': v.nullish(
8
- v.strictObject({
9
- 'format-title': v.nullish(v.boolean()),
10
- cell_valign: v.nullish(v.picklist(['BOTTOM', 'MIDDLE', 'TOP'])),
11
- bold: v.nullish(v.boolean()),
12
- position: v.nullish(v.picklist(['left', 'right', 'center', 'justify'])),
13
- textColor: v.nullish(v.string()),
14
- labels: v.nullish(
15
- v.strictObject({
16
- day: v.string(),
17
- month: v.string(),
18
- year: v.string(),
19
- })
20
- ),
21
- })
22
- ),
11
+ 'component-params': v.nullish(createComponentParams({})),
23
12
  })
24
13
  );
25
14
 
26
- const DateSchema = v.strictObject({
27
- 'user-input-mode': v.picklist(['noinput', 'required', 'optional']),
15
+ const DateSchema = createFieldSchema({
16
+ 'user-input-mode': v.picklist(['noinput']),
28
17
  display: DateDisplaySchema,
29
- attribute: v.nullish(v.string()),
30
- sources: v.nullish(v.string()),
31
- datatype: v.nullish(v.literal('date')),
32
- 'value-constructor': v.nullish(v.string()),
33
18
  value: v.nullish(v.string()),
34
- 'is-display-field': v.nullish(v.boolean()),
35
19
  });
36
20
 
37
21
  export type DateType = v.InferOutput<typeof DateSchema>;
@@ -1,18 +1,21 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const DocSubtitleDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('doc_subtitle'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const DocSubtitleSchema = v.strictObject({
15
+ const DocSubtitleSchema = createFieldSchema({
11
16
  display: DocSubtitleDisplaySchema,
12
17
  'user-input-mode': v.literal('noinput'),
13
18
  value: v.nullish(v.string()),
14
- datatype: v.nullish(v.literal('string')),
15
- attribute: v.nullish(v.string()),
16
19
  });
17
20
 
18
21
  export type DocSubtitleType = v.InferOutput<typeof DocSubtitleSchema>;
@@ -1,29 +1,22 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
3
-
4
- const CommonDocTitleParamsSchema = v.nullish(
5
- v.strictObject({
6
- leading: v.nullish(v.number()),
7
- })
8
- );
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
9
7
 
10
8
  const DocTitleDisplaySchema = createFieldDisplay(
11
9
  v.strictObject({
12
10
  component: v.literal('doc_title'),
13
- 'component-params': CommonDocTitleParamsSchema,
14
- }),
15
- v.strictObject({
16
- component: v.literal('doc_title'),
17
- 'component-params': CommonDocTitleParamsSchema,
11
+ 'component-params': v.nullish(createComponentParams({})),
18
12
  })
19
13
  );
20
14
 
21
- const DocTitleSchema = v.strictObject({
15
+ const DocTitleSchema = createFieldSchema({
22
16
  display: DocTitleDisplaySchema,
23
17
  'user-input-mode': v.literal('noinput'),
24
18
  value: v.nullish(v.string()),
25
19
  'default-value': v.nullish(v.string()),
26
- attribute: v.nullish(v.string()),
27
20
  });
28
21
 
29
22
  export type DocTitleType = v.InferOutput<typeof DocTitleSchema>;
@@ -1,34 +1,26 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const DynamicallyFilledTextDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('dynamically-filled-text'),
7
11
  'component-params': v.nullish(
8
- v.strictObject({
12
+ createComponentParams({
9
13
  fill: v.nullish(v.boolean()),
10
- position: v.nullish(v.picklist(['center', 'justify', 'left', 'right'])),
11
- format: v.nullish(v.literal('plaintext')),
12
- textColor: v.nullish(v.string()),
13
- emph: v.nullish(v.boolean()),
14
- bold: v.nullish(v.boolean()),
15
- cell_valign: v.nullish(v.string()),
16
- leading: v.nullish(v.number()),
17
14
  })
18
15
  ),
19
16
  })
20
17
  );
21
18
 
22
- const DynamicallyFilledTextSchema = v.strictObject({
19
+ const DynamicallyFilledTextSchema = createFieldSchema({
23
20
  value: v.nullish(v.string()),
24
21
  display: DynamicallyFilledTextDisplaySchema,
25
22
  'user-input-mode': v.picklist(['noinput', 'display']),
26
23
  'default-value': v.nullish(v.string()),
27
- sources: v.nullish(v.string()),
28
- 'value-constructor': v.nullish(v.string()),
29
- attribute: v.nullish(v.string()),
30
- datatype: v.nullish(v.literal('string')),
31
- 'is-display-field': v.nullish(v.boolean()),
32
24
  });
33
25
 
34
26
  export type DynamicallyFilledTextType = v.InferOutput<
@@ -1,23 +1,21 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const EmailDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('email'),
7
- 'component-params': v.nullish(
8
- v.strictObject({
9
- multiplicity: v.nullish(v.number()),
10
- })
11
- ),
11
+ 'component-params': v.nullish(createComponentParams({})),
12
12
  })
13
13
  );
14
14
 
15
- const EmailSchema = v.strictObject({
15
+ const EmailSchema = createFieldSchema({
16
16
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
17
17
  display: EmailDisplaySchema,
18
- attribute: v.nullish(v.string()),
19
18
  'default-value': v.nullish(v.string()),
20
- datatype: v.nullish(v.literal('email')),
21
19
  });
22
20
 
23
21
  export type EmailType = v.InferOutput<typeof EmailSchema>;
@@ -1,27 +1,23 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const FillableStringDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('fillable-string'),
7
- 'component-params': v.nullish(
8
- v.strictObject({
9
- emph: v.nullish(v.boolean()),
10
- })
11
- ),
11
+ 'component-params': v.nullish(createComponentParams({})),
12
12
  })
13
13
  );
14
14
 
15
- const FillableStringSchema = v.strictObject({
15
+ const FillableStringSchema = createFieldSchema({
16
16
  'user-input-mode': v.picklist(['noinput', 'display', 'optional']),
17
17
  display: FillableStringDisplaySchema,
18
- attribute: v.nullish(v.string()),
19
18
  'default-value': v.nullish(v.string()),
20
- 'value-constructor': v.nullish(v.string()),
21
19
  value: v.nullish(v.string()),
22
20
  safe: v.nullish(v.boolean()),
23
- sources: v.nullish(v.string()),
24
- datatype: v.nullish(v.literal('string')),
25
21
  });
26
22
 
27
23
  export type FillableStringType = v.InferOutput<typeof FillableStringSchema>;
@@ -1,13 +1,18 @@
1
1
  import * as v from 'valibot';
2
- import { createFieldDisplay } from '@uides/stepwise/schemas/field/common';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
3
7
 
4
8
  const FiveBlockDateDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('five-block-date'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const FiveBlockDateSchema = v.strictObject({
15
+ const FiveBlockDateSchema = createFieldSchema({
11
16
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
12
17
  display: FiveBlockDateDisplaySchema,
13
18
  });