@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,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 RadioChoiceDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
@@ -12,20 +16,18 @@ const RadioChoiceDisplaySchema = createFieldDisplay(
12
16
  ),
13
17
  'choices-order': v.nullish(v.string()),
14
18
  'component-params': v.nullish(
15
- v.strictObject({
19
+ createComponentParams({
16
20
  'legacy-mode': v.boolean(),
17
21
  })
18
22
  ),
19
23
  })
20
24
  );
21
25
 
22
- const RadioChoiceSchema = v.strictObject({
26
+ const RadioChoiceSchema = createFieldSchema({
23
27
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
24
28
  display: RadioChoiceDisplaySchema,
25
29
  'default-value': v.nullish(v.string()),
26
30
  'choices-source-fn': v.nullish(v.string()),
27
- datatype: v.nullish(v.picklist(['document_id', 'radio-choice', 'string'])),
28
- attribute: v.nullish(v.string()),
29
31
  });
30
32
 
31
33
  export type RadioChoiceType = v.InferOutput<typeof RadioChoiceSchema>;
@@ -1,19 +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 RateDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('rate'),
7
- 'component-params': v.nullish(
8
- v.strictObject({
9
- dependencies: v.array(v.string()),
10
- 'dependencies-error-message': v.string(),
11
- })
12
- ),
11
+ 'component-params': v.nullish(createComponentParams({})),
13
12
  })
14
13
  );
15
14
 
16
- const RateSchema = v.strictObject({
15
+ const RateSchema = createFieldSchema({
17
16
  'user-input-mode': v.picklist(['noinput', 'optional']),
18
17
  display: RateDisplaySchema,
19
18
  });
@@ -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 RecipientDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('recipient'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const RecipientSchema = v.strictObject({
15
+ const RecipientSchema = createFieldSchema({
11
16
  display: RecipientDisplaySchema,
12
17
  'user-input-mode': v.picklist(['noinput', 'required']),
13
- datatype: v.nullish(v.picklist(['recipient', 'entity_recipient'])),
14
18
  'default-value': v.nullish(v.string()),
15
- attribute: v.nullish(v.string()),
16
19
  });
17
20
 
18
21
  export type RecipientType = v.InferOutput<typeof RecipientSchema>;
@@ -1,19 +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 RedirectDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('redirect'),
11
+ 'component-params': v.nullish(createComponentParams({})),
7
12
  })
8
13
  );
9
14
 
10
- const RedirectSchema = v.strictObject({
15
+ const RedirectSchema = createFieldSchema({
11
16
  'user-input-mode': v.literal('noinput'),
12
17
  display: RedirectDisplaySchema,
13
- sources: v.nullish(v.string()),
14
- 'value-constructor': v.nullish(v.string()),
15
- attribute: v.nullish(v.string()),
16
- datatype: v.nullish(v.literal('string')),
17
18
  });
18
19
 
19
20
  export type RedirectType = v.InferOutput<typeof RedirectSchema>;
@@ -1,39 +1,25 @@
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 RefcodeDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('refcode'),
7
11
  'component-params': v.nullish(
8
- v.strictObject({
9
- 'later-pages': v.nullish(v.boolean()),
12
+ createComponentParams({
10
13
  label: v.nullish(v.string()),
11
- coordinates: v.nullish(v.array(v.nullable(v.number()))),
12
- })
13
- ),
14
- }),
15
- v.strictObject({
16
- component: v.literal('refcode'),
17
- // TODO: Make pdf component-params also inherit default component-params
18
- 'component-params': v.nullish(
19
- v.strictObject({
20
- 'later-pages': v.nullish(v.boolean()),
21
- label: v.nullish(v.string()),
22
- coordinates: v.nullish(v.array(v.nullable(v.number()))),
23
- fontName: v.nullish(v.literal('Font-Mono')),
24
14
  })
25
15
  ),
26
16
  })
27
17
  );
28
18
 
29
- const RefcodeSchema = v.strictObject({
19
+ const RefcodeSchema = createFieldSchema({
30
20
  display: RefcodeDisplaySchema,
31
- sources: v.nullish(v.string()),
32
- 'value-constructor': v.nullish(v.string()),
33
21
  'user-input-mode': v.literal('noinput'),
34
- 'is-display-field': v.nullish(v.boolean()),
35
22
  value: v.nullish(v.string()),
36
- datatype: v.nullish(v.literal('string')),
37
23
  });
38
24
 
39
25
  export type RefcodeType = v.InferOutput<typeof RefcodeSchema>;
@@ -1,12 +1,15 @@
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 StringFieldDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.nullish(v.literal('string')),
7
11
  'component-params': v.nullish(
8
- v.strictObject({
9
- position: v.nullish(v.picklist(['center', 'justify', 'left', 'right'])),
12
+ createComponentParams({
10
13
  enforceUppercase: v.nullish(v.boolean()),
11
14
  multiplicity: v.nullish(v.number()),
12
15
  multiplicityLabels: v.nullish(
@@ -18,57 +21,19 @@ const StringFieldDisplaySchema = createFieldDisplay(
18
21
  emptyValueDisplay: v.nullish(v.string()),
19
22
  })
20
23
  ),
21
- format: v.nullish(v.literal('plaintext')),
22
- textColor: v.nullish(v.string()),
23
24
  'format-title': v.nullish(v.boolean()),
24
- emph: v.nullish(v.boolean()),
25
- bold: v.nullish(v.boolean()),
26
- cell_valign: v.nullish(v.picklist(['BOTTOM', 'MIDDLE', 'TOP'])),
27
- coordinates: v.nullish(v.array(v.nullable(v.number()))),
28
- fontSize: v.nullish(v.number()),
29
- leading: v.nullish(v.number()),
30
- fontName: v.nullish(v.string()),
31
- ignore_emph: v.nullish(v.boolean()),
32
- 'later-pages': v.nullish(v.boolean()),
33
- attachment_retrieval: v.nullish(v.literal('no-content')),
34
- backColor: v.nullish(v.string()),
35
25
  })
36
26
  ),
37
- }),
38
- v.strictObject({
39
- component: v.nullish(v.literal('string')),
40
- emph: v.nullish(v.boolean()),
41
- bold: v.nullish(v.boolean()),
42
- fontSize: v.nullish(v.number()),
43
- position: v.nullish(v.picklist(['center', 'justify', 'left', 'right'])),
44
27
  })
45
28
  );
46
29
 
47
- const StringDatatypeSchema = v.nullish(
48
- v.picklist([
49
- 'amka',
50
- 'attachment',
51
- 'blood_group',
52
- 'document_id',
53
- 'idnumber',
54
- 'string',
55
- 'date',
56
- ])
57
- );
58
-
59
- const StringSchema = v.strictObject({
30
+ const StringSchema = createFieldSchema({
60
31
  display: v.nullish(StringFieldDisplaySchema),
61
32
  'user-input-mode': v.nullish(
62
33
  v.picklist(['display', 'noinput', 'optional', 'required'])
63
34
  ),
64
- attribute: v.nullish(v.string()),
65
35
  value: v.nullish(v.string()),
66
36
  'default-value': v.nullish(v.string()),
67
- sources: v.nullish(v.string()),
68
- 'value-constructor': v.nullish(v.string()),
69
- 'is-display-field': v.nullish(v.boolean()),
70
- datatype: StringDatatypeSchema,
71
- 'default-on-empty': v.nullish(v.string()),
72
37
  safe: v.nullish(v.boolean()),
73
38
  });
74
39
 
@@ -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 TextDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('text'),
7
11
  'component-params': v.nullish(
8
- v.strictObject({
9
- format: v.nullish(v.literal('plaintext')),
10
- fontSize: v.nullish(v.number()),
11
- leading: v.nullish(v.number()),
12
- bold: v.nullish(v.boolean()),
13
- textColor: v.nullish(v.string()),
14
- position: v.nullish(v.picklist(['center', 'justify', 'left', 'right'])),
15
- cell_valign: v.nullish(v.picklist(['BOTTOM', 'MIDDLE', 'TOP'])),
12
+ createComponentParams({
16
13
  enforceUppercase: v.nullish(v.boolean()),
17
14
  })
18
15
  ),
19
16
  })
20
17
  );
21
18
 
22
- const TextSchema = v.strictObject({
23
- 'user-input-mode': v.picklist(['display', 'noinput', 'optional', 'required']),
19
+ const TextSchema = createFieldSchema({
20
+ 'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
24
21
  display: TextDisplaySchema,
25
22
  value: v.nullish(v.string()),
26
23
  'default-value': v.nullish(v.string()),
27
- attribute: v.nullish(v.string()),
28
- datatype: v.nullish(v.picklist(['text', 'string'])),
29
- sources: v.nullish(v.string()),
30
- 'value-constructor': v.nullish(v.string()),
31
- safe: v.nullish(v.boolean()),
32
24
  });
33
25
 
34
26
  export type TextType = v.InferOutput<typeof TextSchema>;
@@ -1,11 +1,15 @@
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 ThreeBlockDateDisplaySchema = createFieldDisplay(
5
9
  v.strictObject({
6
10
  component: v.literal('three-block-date'),
7
11
  'component-params': v.nullish(
8
- v.strictObject({
12
+ createComponentParams({
9
13
  max: v.literal('now'),
10
14
  min: v.nullish(v.string()),
11
15
  })
@@ -13,13 +17,10 @@ const ThreeBlockDateDisplaySchema = createFieldDisplay(
13
17
  })
14
18
  );
15
19
 
16
- const ThreeBlockDateSchema = v.strictObject({
20
+ const ThreeBlockDateSchema = createFieldSchema({
17
21
  'user-input-mode': v.picklist(['noinput', 'optional', 'required']),
18
- attribute: v.nullish(v.string()),
19
22
  display: ThreeBlockDateDisplaySchema,
20
- 'default-on-empty': v.nullish(v.string()),
21
23
  'default-value': v.nullish(v.string()),
22
- datatype: v.nullish(v.picklist(['date', 'string'])),
23
24
  });
24
25
 
25
26
  export type ThreeBlockDateType = v.InferOutput<typeof ThreeBlockDateSchema>;
@@ -0,0 +1,24 @@
1
+ import * as v from 'valibot';
2
+ import {
3
+ createComponentParams,
4
+ createFieldDisplay,
5
+ createFieldSchema,
6
+ } from '@uides/stepwise/schemas/field/common';
7
+
8
+ const UrlDisplaySchema = createFieldDisplay(
9
+ v.strictObject({
10
+ component: v.literal('url'),
11
+ 'component-params': v.nullish(createComponentParams({})),
12
+ })
13
+ );
14
+
15
+ const UrlSchema = createFieldSchema({
16
+ 'user-input-mode': v.picklist(['optional', 'noinput']),
17
+ display: UrlDisplaySchema,
18
+ 'default-value': v.nullish(v.string()),
19
+ });
20
+
21
+ export type UrlType = v.InferOutput<typeof UrlSchema>;
22
+ export type UrlSchemaType = v.GenericSchema<UrlType>;
23
+
24
+ export default UrlSchema as UrlSchemaType;
@@ -3,35 +3,27 @@ import * as v from 'valibot';
3
3
  export const MultiplicityLabelsSchema = v.strictObject({
4
4
  /** add dialog title */
5
5
  addTitle: v.nullish(v.string()),
6
+ /** add dialog hint */
7
+ addHint: v.nullish(v.string()),
6
8
  /** edit dialog title */
7
9
  editTitle: v.nullish(v.string()),
8
10
  /** add action */
9
11
  addItem: v.nullish(v.string()),
10
- /** remove item action */
11
- removeItem: v.nullish(v.string()),
12
12
  /** edit item action */
13
13
  editItem: v.nullish(v.string()),
14
- /** submit form action (add case) */
15
- submitAdd: v.nullish(v.string()),
16
- /** submit form action (edit case) */
17
- submitEdit: v.nullish(v.string()),
18
- /** cancel action */
19
- cancel: v.nullish(v.string()),
20
14
  /** empty selection message (form field) */
21
15
  empty: v.nullish(v.string()),
22
- /** empty selection message (field display) */
23
- emptyValueDisplay: v.nullish(v.string()),
24
16
  });
25
17
  export type MultiplicityLabels = v.InferOutput<typeof MultiplicityLabelsSchema>;
26
18
 
27
19
  export const OtherComponentParamsSchema = v.strictObject({
28
- page_break: v.nullish(v.boolean()),
29
20
  sticky_title: v.nullish(v.boolean()),
30
21
  multiplicity: v.nullish(v.number()),
31
22
  multiplicityLabels: v.nullish(MultiplicityLabelsSchema),
32
23
  required: v.nullish(v.boolean()),
33
24
  fixed: v.nullish(v.boolean()),
34
25
  layout: v.nullish(v.picklist(['entry', 'card'])),
26
+ page_break: v.nullish(v.boolean()),
35
27
  });
36
28
  export type OtherComponentParams = v.InferOutput<
37
29
  typeof OtherComponentParamsSchema
@@ -41,21 +33,13 @@ export const TableComponentParamsSchema = v.strictObject({
41
33
  lines: v.optional(
42
34
  v.nullable(v.picklist(['no', 'grid', 'outer', 'grid-round', 'outer-round']))
43
35
  ),
44
- table_halign: v.optional(v.nullable(v.picklist(['LEFT', 'CENTER', 'RIGHT']))),
45
- table_width_ratio: v.nullish(v.number()),
46
- cell_halign: v.optional(v.nullable(v.picklist(['left', 'center', 'right']))),
47
- cell_valign: v.optional(v.nullable(v.picklist(['BOTTOM', 'MIDDLE', 'TOP']))),
36
+ fontSize: v.nullish(v.number()),
48
37
  cell_height: v.nullish(v.number()),
49
38
  auto_columns: v.nullish(v.boolean()),
50
- fontSize: v.nullish(v.number()),
51
- no_split: v.nullish(v.boolean()),
52
39
  spaceBefore: v.nullish(v.number()),
53
40
  spaceAfter: v.nullish(v.number()),
54
41
  omit_empty_values: v.nullish(v.boolean()),
55
- background: v.nullish(v.string()),
56
42
  coordinates: v.nullish(v.array(v.number())),
57
- mirrored: v.nullish(v.boolean()),
58
- handler: v.nullish(v.string()),
59
43
  ...OtherComponentParamsSchema.entries,
60
44
  });
61
45
  export type TableComponentParams = v.InferOutput<
@@ -3,51 +3,20 @@ import {
3
3
  ComponentLayoutSchema,
4
4
  DisplayLangSchema,
5
5
  } from '@uides/stepwise/schemas/common';
6
- import {
7
- OtherComponentParamsSchema,
8
- TableComponentParamsSchema,
9
- } from '@uides/stepwise/schemas/fieldset/component-params';
10
- import {
11
- PdfOtherComponentSchema,
12
- PdfTableBasedComponentSchema,
13
- WebComponentSchema,
14
- } from '@uides/stepwise/schemas/fieldset/enums';
6
+ import { TableComponentParamsSchema } from '@uides/stepwise/schemas/fieldset/component-params';
7
+ import { WebComponentSchema } from '@uides/stepwise/schemas/fieldset/enums';
15
8
 
16
9
  export const FieldsetWebDisplaySchema = v.strictObject({
17
10
  /** The explanatory title of the fieldset */
18
11
  title: v.nullish(v.string()),
12
+ /** The explanatory hint of the fieldset */
13
+ hint: v.nullish(v.string()),
19
14
  component: WebComponentSchema,
20
15
  'component-params': v.nullish(TableComponentParamsSchema),
21
16
  layout: v.nullish(ComponentLayoutSchema),
22
17
  });
23
18
  export type FieldsetWebDisplay = v.InferOutput<typeof FieldsetWebDisplaySchema>;
24
19
 
25
- export const FieldsetPdfDisplayTableSchema = v.strictObject({
26
- /** The explanatory title of the fieldset */
27
- title: v.nullish(v.string()),
28
- component: PdfTableBasedComponentSchema,
29
- 'component-params': v.nullish(TableComponentParamsSchema),
30
- });
31
- export type FieldsetPdfDisplayTable = v.InferOutput<
32
- typeof FieldsetPdfDisplayTableSchema
33
- >;
34
-
35
- export const FieldsetPdfDisplayOtherSchema = v.strictObject({
36
- /** The explanatory title of the fieldset */
37
- title: v.nullish(v.string()),
38
- component: PdfOtherComponentSchema,
39
- 'component-params': v.nullish(OtherComponentParamsSchema),
40
- });
41
- export type FieldsetPdfDisplayOther = v.InferOutput<
42
- typeof FieldsetPdfDisplayOtherSchema
43
- >;
44
-
45
- export const FieldsetPdfDisplaySchema = v.variant('component', [
46
- FieldsetPdfDisplayTableSchema,
47
- FieldsetPdfDisplayOtherSchema,
48
- ]);
49
- export type FieldsetPdfDisplay = v.InferOutput<typeof FieldsetPdfDisplaySchema>;
50
-
51
20
  export const FieldsetDisplaySchema = v.union([
52
21
  v.looseObject({
53
22
  default: v.record(DisplayLangSchema, FieldsetWebDisplaySchema),
@@ -56,7 +25,7 @@ export const FieldsetDisplaySchema = v.union([
56
25
  web: v.record(DisplayLangSchema, FieldsetWebDisplaySchema),
57
26
  }),
58
27
  v.looseObject({
59
- pdf: v.record(DisplayLangSchema, FieldsetPdfDisplaySchema),
28
+ pdf: v.record(DisplayLangSchema, v.any()),
60
29
  }),
61
30
  ]);
62
31
 
@@ -9,41 +9,3 @@ import * as v from 'valibot';
9
9
  */
10
10
  export const WebComponentSchema = v.picklist(['values-list', 'hidden', 'form']);
11
11
  export type WebComponent = v.InferOutput<typeof WebComponentSchema>;
12
-
13
- /**
14
- * Pdf table-based component type.
15
- *
16
- * @value 'values-list' Used for displaying values.
17
- * @value 'table' Table. Ideal for displaying multiple fields, by showing both the field title and value. By using the field attributes 'title_md' and 'value_md', it is possible to align the fields in a custom way.
18
- * @value 'one-liner-table' One-liner table. Ideal for displaying a single row per value.
19
- * @value 'signature' Signature.
20
- * @value 'footnotes' Footnotes.
21
- * @value 'hidden' Hidden.
22
- * @value 'custom' Custom.
23
- */
24
- export const PdfTableBasedComponentSchema = v.picklist([
25
- 'values-list',
26
- 'table',
27
- 'one-liner-table',
28
- 'signature',
29
- 'footnotes',
30
- 'hidden',
31
- 'custom',
32
- ]);
33
- export type PdfTableBasedComponent = v.InferOutput<
34
- typeof PdfTableBasedComponentSchema
35
- >;
36
-
37
- /**
38
- * Pdf component type.
39
- *
40
- * @value 'header' Header.
41
- * @value 'common' Common.
42
- * @value 'plain-text' Plain text. Ideal for displaying fields with values that are large texts. It helps in displaying the text across multiple pages.
43
- */
44
- export const PdfOtherComponentSchema = v.picklist([
45
- 'header',
46
- 'common',
47
- 'plain-text',
48
- ]);
49
- export type PdfOtherComponent = v.InferOutput<typeof PdfOtherComponentSchema>;
@@ -116,6 +116,7 @@ export const StepSchema = v.pipe(
116
116
  'has-display-fields': v.nullish(v.boolean()),
117
117
  targets: v.nullish(v.array(v.record(v.string(), v.any()))),
118
118
  'post-step-claims': v.nullish(v.array(v.string())),
119
+ 'pre-step-claims': v.nullish(v.array(v.string())),
119
120
  }),
120
121
 
121
122
  validateField('fieldsets', (fieldsets, step) => {
@@ -5,12 +5,12 @@ import {
5
5
  } from '@uides/stepwise/schemas/step';
6
6
 
7
7
  /**
8
- * Describes a template
8
+ * Describes a template.
9
9
  *
10
10
  * A template is a set of steps that the user must complete in order to complete a process
11
11
  * in the system, whether that is the issuance of a document or the entry of a request.
12
12
  */
13
- export const TemplateBaseSchema = v.strictObject({
13
+ export const TemplateSchema = v.strictObject({
14
14
  /**
15
15
  * Template's creation date
16
16
  */
@@ -39,7 +39,7 @@ export const TemplateBaseSchema = v.strictObject({
39
39
  * An entity's gate can be the owner of a template. If not specified, the template is considered
40
40
  * to be owned by the "System".
41
41
  */
42
- owner: v.string(),
42
+ owner: v.nullish(v.string()),
43
43
  /** The template's unique identifier */
44
44
  refname: v.string(),
45
45
  /**
@@ -52,8 +52,32 @@ export const TemplateBaseSchema = v.strictObject({
52
52
  * Specification of the steps of the template.
53
53
  */
54
54
  steps_spec: v.nullish(StepsSpecSchema as unknown as StepsSpecSchemaType),
55
+ /**
56
+ * Whether the template is enabled or not.
57
+ */
58
+ enabled: v.nullish(v.boolean()),
59
+ template_type: v.strictObject({
60
+ /** @default 'application' */
61
+ refname: v.string(),
62
+ /** @default [] */
63
+ fields: v.array(v.any()),
64
+ }),
65
+ consent_method: v.literal('login'),
66
+ /**
67
+ * Recipient's business title
68
+ * @deprecated
69
+ */
70
+ recipient_hint: v.nullish(v.string()),
71
+ /**
72
+ * Claims that the application checks for in the user's session.
73
+ *
74
+ * @default ['mobile_certified_login','is_citizen_user','govgr_login']
75
+ */
76
+ required_claims: v.array(v.string()),
77
+ login_endpoint: v.nullish(v.string()),
78
+ fields: v.nullish(v.array(v.any())),
79
+ 'ui:legacy_renderer': v.nullish(v.boolean()),
55
80
  });
81
+ export type Template = v.InferOutput<typeof TemplateSchema>;
56
82
 
57
- export type TemplateBase = v.InferOutput<typeof TemplateBaseSchema>;
58
-
59
- export default TemplateBase;
83
+ export default Template;
@@ -27,7 +27,7 @@ export function collectIssues(
27
27
  if (!issue?.issues) {
28
28
  formattedIssues[path] = {
29
29
  ...formattedIssues[path],
30
- [nestedPath]: issue.message.replace(/invalid type: /i, ''),
30
+ [nestedPath]: formatMessage(issue),
31
31
  };
32
32
  } else {
33
33
  const nestedIssues: Record<string, string> = {};
@@ -60,10 +60,77 @@ function getNestedIssueMessage(
60
60
  });
61
61
  return nestedIssues;
62
62
  } else {
63
- return { [path]: issue.message.replace(/invalid type: /i, '') };
63
+ return { [path]: formatMessage(issue) };
64
64
  }
65
65
  }
66
66
 
67
+ /**
68
+ * Format a valibot issue into a clearer, actionable message.
69
+ *
70
+ * Handles common-but-noisy cases:
71
+ * - `strict_object` with `expected: 'never'` → unknown key
72
+ * - `variant` with no sub-issues → no matching schema, with component hint
73
+ * - `picklist` / `literal` mismatch → expected vs received with values
74
+ * - same `expected`/`received` labels (e.g. `Object` vs `Object`) → drop the
75
+ * useless "Expected X but received X" wording
76
+ */
77
+ function formatMessage(issue: BaseIssue<unknown>): string {
78
+ const { type, expected, received, message, input } = issue;
79
+
80
+ if (type === 'strict_object' && expected === 'never') {
81
+ return `Unknown key ${received} not allowed`;
82
+ }
83
+
84
+ if (type === 'variant') {
85
+ const components = extractDisplayComponents(input);
86
+ if (components.length > 0) {
87
+ const list = components.map((c) => `"${c}"`).join(', ');
88
+ return `No schema variant matches display component ${list}`;
89
+ }
90
+ return `No matching schema variant`;
91
+ }
92
+
93
+ if (
94
+ (type === 'picklist' || type === 'literal') &&
95
+ expected != null &&
96
+ received != null
97
+ ) {
98
+ return `Expected one of ${expected} but received ${received}`;
99
+ }
100
+
101
+ // valibot's literal/picklist can surface inside a `raw_check` when the
102
+ // schema author misuses the message-override arg; expected/received are
103
+ // still correct, so prefer those over the bare message.
104
+ if (
105
+ type === 'raw_check' &&
106
+ expected != null &&
107
+ received != null &&
108
+ message !== `Expected ${expected} but received ${received}`
109
+ ) {
110
+ return `Expected ${expected} but received ${received}`;
111
+ }
112
+
113
+ if (expected != null && received != null && expected === received) {
114
+ return `Value does not match expected ${expected} shape`;
115
+ }
116
+
117
+ return message.replace(/^Invalid type: /i, '');
118
+ }
119
+
120
+ function extractDisplayComponents(input: unknown): string[] {
121
+ if (!input || typeof input !== 'object' || Array.isArray(input)) return [];
122
+ const components = new Set<string>();
123
+ for (const modeVal of Object.values(input as Record<string, unknown>)) {
124
+ if (!modeVal || typeof modeVal !== 'object') continue;
125
+ for (const langVal of Object.values(modeVal as Record<string, unknown>)) {
126
+ if (!langVal || typeof langVal !== 'object') continue;
127
+ const c = (langVal as Record<string, unknown>)['component'];
128
+ if (typeof c === 'string') components.add(c);
129
+ }
130
+ }
131
+ return Array.from(components);
132
+ }
133
+
67
134
  /**
68
135
  * Type guard to check if previous pipeline step resulted in a failure dataset.
69
136
  */