@narrative.io/jsonforms-provider-protocols 2.11.0 → 2.12.0

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 (147) hide show
  1. package/README.md +193 -33
  2. package/dist/core/initFormData.d.ts +17 -0
  3. package/dist/core/initFormData.d.ts.map +1 -0
  4. package/dist/core/initFormData.js +99 -0
  5. package/dist/core/initFormData.js.map +1 -0
  6. package/dist/core/projection.d.ts +36 -0
  7. package/dist/core/projection.d.ts.map +1 -0
  8. package/dist/core/projection.js +77 -0
  9. package/dist/core/projection.js.map +1 -0
  10. package/dist/core/refs.d.ts +58 -0
  11. package/dist/core/refs.d.ts.map +1 -0
  12. package/dist/core/refs.js +70 -0
  13. package/dist/core/refs.js.map +1 -0
  14. package/dist/core/resolveScope.d.ts +17 -0
  15. package/dist/core/resolveScope.d.ts.map +1 -0
  16. package/dist/core/resolveScope.js +28 -0
  17. package/dist/core/resolveScope.js.map +1 -0
  18. package/dist/core/seedProjectionTargets.d.ts +60 -0
  19. package/dist/core/seedProjectionTargets.d.ts.map +1 -0
  20. package/dist/core/seedProjectionTargets.js +52 -0
  21. package/dist/core/seedProjectionTargets.js.map +1 -0
  22. package/dist/core/transforms.d.ts +8 -10
  23. package/dist/core/transforms.d.ts.map +1 -1
  24. package/dist/core/transforms.js +58 -13
  25. package/dist/core/transforms.js.map +1 -1
  26. package/dist/core/types.d.ts +8 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/index.d.ts +9 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +21 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/jsonforms-provider-protocols.css +6 -2
  33. package/dist/no-eval-ajv.d.ts +70 -0
  34. package/dist/no-eval-ajv.d.ts.map +1 -0
  35. package/dist/no-eval-ajv.js +247 -0
  36. package/dist/no-eval-ajv.js.map +1 -0
  37. package/dist/vue/components/ProviderAutocomplete.vue.d.ts.map +1 -1
  38. package/dist/vue/components/ProviderAutocomplete.vue.js +12 -6
  39. package/dist/vue/components/ProviderAutocomplete.vue.js.map +1 -1
  40. package/dist/vue/components/ProviderMultiSelect.vue.d.ts.map +1 -1
  41. package/dist/vue/components/ProviderMultiSelect.vue.js +1 -1
  42. package/dist/vue/components/ProviderMultiSelect.vue2.js +21 -11
  43. package/dist/vue/components/ProviderMultiSelect.vue2.js.map +1 -1
  44. package/dist/vue/components/ProviderObjectMultiSelect.vue.d.ts +9 -0
  45. package/dist/vue/components/ProviderObjectMultiSelect.vue.d.ts.map +1 -0
  46. package/dist/vue/components/ProviderObjectMultiSelect.vue.js +8 -0
  47. package/dist/vue/components/ProviderObjectMultiSelect.vue.js.map +1 -0
  48. package/dist/vue/components/ProviderObjectMultiSelect.vue2.js +142 -0
  49. package/dist/vue/components/ProviderObjectMultiSelect.vue2.js.map +1 -0
  50. package/dist/vue/components/ProviderSelect.vue.d.ts.map +1 -1
  51. package/dist/vue/components/ProviderSelect.vue.js +1 -1
  52. package/dist/vue/components/ProviderSelect.vue2.js +22 -10
  53. package/dist/vue/components/ProviderSelect.vue2.js.map +1 -1
  54. package/dist/vue/composables/useDataLayer.d.ts +10 -0
  55. package/dist/vue/composables/useDataLayer.d.ts.map +1 -0
  56. package/dist/vue/composables/useDataLayer.js +26 -0
  57. package/dist/vue/composables/useDataLayer.js.map +1 -0
  58. package/dist/vue/composables/useDerive.d.ts +5 -2
  59. package/dist/vue/composables/useDerive.d.ts.map +1 -1
  60. package/dist/vue/composables/useDerive.js +29 -12
  61. package/dist/vue/composables/useDerive.js.map +1 -1
  62. package/dist/vue/composables/useDeriveInitialValue.d.ts +36 -0
  63. package/dist/vue/composables/useDeriveInitialValue.d.ts.map +1 -0
  64. package/dist/vue/composables/useDeriveInitialValue.js +125 -0
  65. package/dist/vue/composables/useDeriveInitialValue.js.map +1 -0
  66. package/dist/vue/composables/useDirtyValidation.d.ts +9 -0
  67. package/dist/vue/composables/useDirtyValidation.d.ts.map +1 -0
  68. package/dist/vue/composables/useDirtyValidation.js +15 -0
  69. package/dist/vue/composables/useDirtyValidation.js.map +1 -0
  70. package/dist/vue/composables/useProjection.d.ts +42 -0
  71. package/dist/vue/composables/useProjection.d.ts.map +1 -0
  72. package/dist/vue/composables/useProjection.js +116 -0
  73. package/dist/vue/composables/useProjection.js.map +1 -0
  74. package/dist/vue/composables/useProvider.d.ts +2 -2
  75. package/dist/vue/composables/useProvider.d.ts.map +1 -1
  76. package/dist/vue/composables/useProvider.js +14 -10
  77. package/dist/vue/composables/useProvider.js.map +1 -1
  78. package/dist/vue/index.d.ts +9 -1
  79. package/dist/vue/index.d.ts.map +1 -1
  80. package/dist/vue/index.js +72 -34
  81. package/dist/vue/index.js.map +1 -1
  82. package/dist/vue/primevue/JfBoolean.vue.d.ts +9 -0
  83. package/dist/vue/primevue/JfBoolean.vue.d.ts.map +1 -1
  84. package/dist/vue/primevue/JfBoolean.vue.js +44 -17
  85. package/dist/vue/primevue/JfBoolean.vue.js.map +1 -1
  86. package/dist/vue/primevue/JfEnum.vue.d.ts +9 -0
  87. package/dist/vue/primevue/JfEnum.vue.d.ts.map +1 -1
  88. package/dist/vue/primevue/JfEnum.vue.js +38 -24
  89. package/dist/vue/primevue/JfEnum.vue.js.map +1 -1
  90. package/dist/vue/primevue/JfEnumArray.vue.d.ts +9 -0
  91. package/dist/vue/primevue/JfEnumArray.vue.d.ts.map +1 -1
  92. package/dist/vue/primevue/JfEnumArray.vue.js +40 -20
  93. package/dist/vue/primevue/JfEnumArray.vue.js.map +1 -1
  94. package/dist/vue/primevue/JfNumber.vue.d.ts +9 -0
  95. package/dist/vue/primevue/JfNumber.vue.d.ts.map +1 -1
  96. package/dist/vue/primevue/JfNumber.vue.js +33 -23
  97. package/dist/vue/primevue/JfNumber.vue.js.map +1 -1
  98. package/dist/vue/primevue/JfText.vue.d.ts +9 -0
  99. package/dist/vue/primevue/JfText.vue.d.ts.map +1 -1
  100. package/dist/vue/primevue/JfText.vue.js +51 -35
  101. package/dist/vue/primevue/JfText.vue.js.map +1 -1
  102. package/dist/vue/primevue/JfTextArea.vue.d.ts +9 -0
  103. package/dist/vue/primevue/JfTextArea.vue.d.ts.map +1 -1
  104. package/dist/vue/primevue/JfTextArea.vue.js +34 -19
  105. package/dist/vue/primevue/JfTextArea.vue.js.map +1 -1
  106. package/dist/vue/primevue/index.d.ts.map +1 -1
  107. package/dist/vue/primevue/index.js +100 -8
  108. package/dist/vue/primevue/index.js.map +1 -1
  109. package/dist/vue/utils/objectMultiSelect.d.ts +68 -0
  110. package/dist/vue/utils/objectMultiSelect.d.ts.map +1 -0
  111. package/dist/vue/utils/objectMultiSelect.js +72 -0
  112. package/dist/vue/utils/objectMultiSelect.js.map +1 -0
  113. package/dist/vue/utils/placeholder.d.ts +17 -0
  114. package/dist/vue/utils/placeholder.d.ts.map +1 -0
  115. package/dist/vue/utils/placeholder.js +17 -0
  116. package/dist/vue/utils/placeholder.js.map +1 -0
  117. package/package.json +10 -2
  118. package/src/core/initFormData.ts +208 -0
  119. package/src/core/projection.ts +147 -0
  120. package/src/core/refs.ts +166 -0
  121. package/src/core/resolveScope.ts +54 -0
  122. package/src/core/seedProjectionTargets.ts +144 -0
  123. package/src/core/transforms.ts +118 -26
  124. package/src/core/types.ts +9 -0
  125. package/src/index.ts +22 -2
  126. package/src/no-eval-ajv.ts +381 -0
  127. package/src/vue/components/ProviderAutocomplete.vue +11 -7
  128. package/src/vue/components/ProviderMultiSelect.vue +22 -15
  129. package/src/vue/components/ProviderObjectMultiSelect.vue +169 -0
  130. package/src/vue/components/ProviderSelect.vue +23 -14
  131. package/src/vue/composables/useDataLayer.ts +43 -0
  132. package/src/vue/composables/useDerive.ts +62 -16
  133. package/src/vue/composables/useDeriveInitialValue.ts +195 -0
  134. package/src/vue/composables/useDirtyValidation.ts +20 -0
  135. package/src/vue/composables/useProjection.ts +245 -0
  136. package/src/vue/composables/useProvider.ts +28 -11
  137. package/src/vue/index.ts +83 -47
  138. package/src/vue/primevue/JfBoolean.vue +35 -12
  139. package/src/vue/primevue/JfEnum.vue +35 -26
  140. package/src/vue/primevue/JfEnumArray.vue +37 -20
  141. package/src/vue/primevue/JfNumber.vue +32 -24
  142. package/src/vue/primevue/JfText.vue +48 -33
  143. package/src/vue/primevue/JfTextArea.vue +32 -21
  144. package/src/vue/primevue/index.ts +114 -8
  145. package/src/vue/styles.css +26 -1
  146. package/src/vue/utils/objectMultiSelect.ts +171 -0
  147. package/src/vue/utils/placeholder.ts +42 -0
@@ -1 +1 @@
1
- {"version":3,"file":"JfTextArea.vue.js","sources":["../../../src/vue/primevue/JfTextArea.vue"],"sourcesContent":["<script lang=\"ts\">\nexport default {\n name: \"JfTextArea\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n },\n cells: {\n type: Array,\n required: false,\n },\n config: {\n type: Object,\n required: false,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, ref, getCurrentInstance } from \"vue\";\nimport Textarea from \"primevue/textarea\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange } = useJsonFormsControl(props);\n\nconst placeholder = computed<string | undefined>(\n () =>\n (control.value.uischema as { options?: { placeholder?: string } })?.options\n ?.placeholder ?? control.value.description,\n);\n\n// Track user interaction\nconst hasInteracted = ref(false);\n\nconst showErrors = computed(() => hasInteracted.value && control.value.errors);\n\nfunction onInput(val: string | undefined) {\n // Convert empty strings to undefined for proper required field validation\n const newValue = val && val.trim() !== \"\" ? val : undefined;\n if (control.value.data !== newValue) {\n handleChange(control.value.path, newValue);\n }\n}\n\nfunction onBlur() {\n hasInteracted.value = true;\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-2\">\n <label v-if=\"control.label\" class=\"text-color text-left\">{{\n control.label\n }}</label>\n <div v-if=\"control.description\" class=\"text-color-secondary text-left\">\n {{ control.description }}\n </div>\n <Textarea\n class=\"w-full!\"\n :model-value=\"control.data ?? ''\"\n :disabled=\"!control.enabled\"\n :aria-invalid=\"!!showErrors || undefined\"\n :placeholder=\"placeholder\"\n :rows=\"4\"\n :auto-resize=\"true\"\n @update:model-value=\"onInput\"\n @blur=\"onBlur\"\n />\n <small v-if=\"showErrors\" class=\"p-error\">{{ control.errors }}</small>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":";;;;;;;;;;;;;;;;AACA,MAAA,cAAe;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,IAEX,WAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ;;;;AAUA,UAAM,WAAW,mBAAA;AACjB,UAAM,QAAQ,SAAS;AACvB,UAAM,EAAE,SAAS,iBAAiB,oBAAoB,KAAK;AAE3D,UAAM,cAAc;AAAA,MAClB,MACG,QAAQ,MAAM,UAAqD,SAChE,eAAe,QAAQ,MAAM;AAAA,IAAA;AAIrC,UAAM,gBAAgB,IAAI,KAAK;AAE/B,UAAM,aAAa,SAAS,MAAM,cAAc,SAAS,QAAQ,MAAM,MAAM;AAE7E,aAAS,QAAQ,KAAyB;AAExC,YAAM,WAAW,OAAO,IAAI,KAAA,MAAW,KAAK,MAAM;AAClD,UAAI,QAAQ,MAAM,SAAS,UAAU;AACnC,qBAAa,QAAQ,MAAM,MAAM,QAAQ;AAAA,MAC3C;AAAA,IACF;AAEA,aAAS,SAAS;AAChB,oBAAc,QAAQ;AAAA,IACxB;;AAIE,aAAAA,UAAA,GAAAC,mBAmBM,OAnBN,YAmBM;AAAA,QAlBSC,MAAA,OAAA,EAAQ,SAArBF,UAAA,GAAAC,mBAEU,SAFV,YAEUE,gBADRD,MAAA,OAAA,EAAQ,KAAK,GAAA,CAAA;QAEJA,MAAA,OAAA,EAAQ,eAAnBF,UAAA,GAAAC,mBAEM,OAFN,YAEME,gBADDD,MAAA,OAAA,EAAQ,WAAW,GAAA,CAAA;QAExBE,YAUEF,MAAA,QAAA,GAAA;AAAA,UATA,OAAM;AAAA,UACL,eAAaA,MAAA,OAAA,EAAQ,QAAI;AAAA,UACzB,UAAQ,CAAGA,MAAA,OAAA,EAAQ;AAAA,UACnB,gBAAY,CAAA,CAAI,WAAA,SAAc;AAAA,UAC9B,aAAa,YAAA;AAAA,UACb,MAAM;AAAA,UACN,eAAa;AAAA,UACb,uBAAoB;AAAA,UACpB;AAAA,QAAA;QAEU,WAAA,SAAbF,UAAA,GAAAC,mBAAqE,SAArE,YAAqEE,gBAAzBD,MAAA,OAAA,EAAQ,MAAM,GAAA,CAAA;;;;;"}
1
+ {"version":3,"file":"JfTextArea.vue.js","sources":["../../../src/vue/primevue/JfTextArea.vue"],"sourcesContent":["<script lang=\"ts\">\nexport default {\n name: \"JfTextArea\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n default: undefined,\n },\n cells: {\n type: Array,\n required: false,\n default: undefined,\n },\n config: {\n type: Object,\n required: false,\n default: undefined,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, getCurrentInstance } from \"vue\";\nimport { useProjection } from \"../composables/useProjection\";\nimport { useDirtyValidation } from \"../composables/useDirtyValidation\";\nimport { resolvePlaceholder } from \"../utils/placeholder\";\nimport Textarea from \"primevue/textarea\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange: rawHandleChange } = useJsonFormsControl(props);\nconst {\n projectedData,\n handleProjectedChange: handleChange,\n projectedErrors,\n projectedLabel,\n} = useProjection(control, rawHandleChange);\n\nconst placeholder = computed<string | undefined>(() =>\n resolvePlaceholder(control.value.uischema, projectedLabel.value, \"input\"),\n);\n\n// Track user interaction errors only show after blur\nconst { showErrors, markDirty } = useDirtyValidation(control, projectedErrors);\n\nfunction onInput(val: string | undefined) {\n // Convert empty strings to undefined for proper required field validation\n const newValue = val && val.trim() !== \"\" ? val : undefined;\n if (projectedData.value !== newValue) {\n handleChange(control.value.path, newValue);\n }\n}\n\nfunction onBlur() {\n markDirty();\n // Normalize empty strings to undefined so required validation fires\n const val = projectedData.value;\n if (typeof val === \"string\" && val.trim() === \"\") {\n handleChange(control.value.path, undefined);\n }\n}\n</script>\n\n<template>\n <div class=\"jf-control\">\n <label v-if=\"projectedLabel\" class=\"jf-label\">{{ projectedLabel }}</label>\n <div v-if=\"control.description\" class=\"jf-description\">\n {{ control.description }}\n </div>\n <Textarea\n :class=\"['w-full!', { 'p-invalid': showErrors }]\"\n :model-value=\"(projectedData as string) ?? ''\"\n :disabled=\"!control.enabled\"\n :aria-invalid=\"showErrors || undefined\"\n :placeholder=\"placeholder\"\n :rows=\"4\"\n :auto-resize=\"true\"\n @update:model-value=\"onInput\"\n @blur=\"onBlur\"\n />\n <small v-if=\"showErrors\" class=\"p-error\">{{ projectedErrors }}</small>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":";;;;;;;;;;;;;;;;;;;AACA,MAAA,cAAe;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,IAEX,WAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,IAEX,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,IAEX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ;;;;AAaA,UAAM,WAAW,mBAAA;AACjB,UAAM,QAAQ,SAAS;AACvB,UAAM,EAAE,SAAS,cAAc,gBAAA,IAAoB,oBAAoB,KAAK;AAC5E,UAAM;AAAA,MACJ;AAAA,MACA,uBAAuB;AAAA,MACvB;AAAA,MACA;AAAA,IAAA,IACE,cAAc,SAAS,eAAe;AAE1C,UAAM,cAAc;AAAA,MAA6B,MAC/C,mBAAmB,QAAQ,MAAM,UAAU,eAAe,OAAO,OAAO;AAAA,IAAA;AAI1E,UAAM,EAAE,YAAY,UAAA,IAAc,mBAAmB,SAAS,eAAe;AAE7E,aAAS,QAAQ,KAAyB;AAExC,YAAM,WAAW,OAAO,IAAI,KAAA,MAAW,KAAK,MAAM;AAClD,UAAI,cAAc,UAAU,UAAU;AACpC,qBAAa,QAAQ,MAAM,MAAM,QAAQ;AAAA,MAC3C;AAAA,IACF;AAEA,aAAS,SAAS;AAChB,gBAAA;AAEA,YAAM,MAAM,cAAc;AAC1B,UAAI,OAAO,QAAQ,YAAY,IAAI,KAAA,MAAW,IAAI;AAChD,qBAAa,QAAQ,MAAM,MAAM,MAAS;AAAA,MAC5C;AAAA,IACF;;AAIE,aAAAA,UAAA,GAAAC,mBAiBM,OAjBN,YAiBM;AAAA,QAhBSC,MAAA,cAAA,kBAAbD,mBAA0E,SAA1E,YAA0EE,gBAAzBD,MAAA,cAAA,CAAc,GAAA,CAAA;QACpDA,MAAA,OAAA,EAAQ,eAAnBF,UAAA,GAAAC,mBAEM,OAFN,YAEME,gBADDD,MAAA,OAAA,EAAQ,WAAW,GAAA,CAAA;QAExBE,YAUEF,MAAA,QAAA,GAAA;AAAA,UATC,iDAAkCA,MAAA,UAAA,EAAA,CAAU,CAAA;AAAA,UAC5C,eAAcA,MAAA,aAAA,KAAa;AAAA,UAC3B,UAAQ,CAAGA,MAAA,OAAA,EAAQ;AAAA,UACnB,gBAAcA,MAAA,UAAA,KAAc;AAAA,UAC5B,aAAa,YAAA;AAAA,UACb,MAAM;AAAA,UACN,eAAa;AAAA,UACb,uBAAoB;AAAA,UACpB;AAAA,QAAA;QAEUA,MAAA,UAAA,kBAAbD,mBAAsE,SAAtE,YAAsEE,gBAA1BD,MAAA,eAAA,CAAe,GAAA,CAAA;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAkCxC,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAAO,CAAC;AAK/C,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,EAAE,CAqFvE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AA6DxC,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAAO,CAAC;AAK/C,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,EAAE,CAoKvE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
@@ -4,6 +4,8 @@ import _sfc_main$2 from "./JfNumber.vue.js";
4
4
  import _sfc_main$3 from "./JfEnum.vue.js";
5
5
  import _sfc_main$4 from "./JfEnumArray.vue.js";
6
6
  import _sfc_main$5 from "./JfBoolean.vue.js";
7
+ import { getProjectedSchema } from "../../core/projection.js";
8
+ import { resolveScopeSchema } from "../../core/resolveScope.js";
7
9
  const injectLayoutStyles = () => {
8
10
  if (typeof window !== "undefined" && typeof document !== "undefined") {
9
11
  if (!document.getElementById("jsonforms-primevue-styles")) {
@@ -15,13 +17,38 @@ const injectLayoutStyles = () => {
15
17
  display: flex;
16
18
  flex-direction: column;
17
19
  align-items: flex-start;
18
- gap: 1rem;
20
+ gap: 24px;
19
21
  width: 100%;
20
22
  }
21
23
 
22
24
  .vertical-layout-item {
23
25
  width: 100%;
24
26
  }
27
+
28
+ /* Form control wrapper */
29
+ .jf-control {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: 12px;
33
+ }
34
+
35
+ /* Form control label typography */
36
+ .jf-label {
37
+ font-weight: 600;
38
+ font-size: 14px;
39
+ line-height: 14px;
40
+ color: #031553;
41
+ text-align: left;
42
+ }
43
+
44
+ /* Form control description typography */
45
+ .jf-description {
46
+ font-weight: 400;
47
+ font-size: 14px;
48
+ line-height: 14px;
49
+ color: #415290;
50
+ text-align: left;
51
+ }
25
52
  `;
26
53
  document.head.appendChild(style);
27
54
  }
@@ -40,6 +67,7 @@ function registerPrimevueRenderers(jsonformsCore) {
40
67
  isNumberControl,
41
68
  isIntegerControl,
42
69
  and,
70
+ or,
43
71
  isControl,
44
72
  schemaMatches,
45
73
  isBooleanControl
@@ -61,27 +89,91 @@ function registerPrimevueRenderers(jsonformsCore) {
61
89
  {}
62
90
  );
63
91
  };
92
+ const projectedSchemaMatches = (
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ ((check) => (uischema, schema) => {
95
+ const ui = uischema;
96
+ const projection = ui?.options?.projection;
97
+ if (!projection || ui?.type !== "Control" || !ui?.scope) return false;
98
+ const propertySchema = resolveScopeSchema(
99
+ ui.scope,
100
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ schema
102
+ );
103
+ if (!propertySchema) return false;
104
+ return check(getProjectedSchema(propertySchema, projection));
105
+ })
106
+ );
107
+ const isMultilineProjection = (uischema, schema) => {
108
+ const ui = uischema;
109
+ return ui?.options?.multi === true && projectedSchemaMatches((s) => s?.type === "string")(uischema, schema);
110
+ };
64
111
  const renderers = [
65
112
  // Multiline text has higher priority than regular text
66
- { tester: rankWith(PRIME + 4, isMultilineString), renderer: _sfc_main },
67
- { tester: rankWith(PRIME + 3, isStringControl), renderer: _sfc_main$1 },
68
113
  {
69
- tester: rankWith(PRIME + 6, isIntegerControl),
114
+ tester: rankWith(PRIME + 4, or(isMultilineString, isMultilineProjection)),
115
+ renderer: _sfc_main
116
+ },
117
+ {
118
+ tester: rankWith(
119
+ PRIME + 3,
120
+ or(
121
+ isStringControl,
122
+ projectedSchemaMatches((s) => s?.type === "string")
123
+ )
124
+ ),
125
+ renderer: _sfc_main$1
126
+ },
127
+ {
128
+ tester: rankWith(
129
+ PRIME + 6,
130
+ or(
131
+ isIntegerControl,
132
+ projectedSchemaMatches((s) => s?.type === "integer")
133
+ )
134
+ ),
70
135
  renderer: _sfc_main$2
71
136
  },
72
137
  {
73
- tester: rankWith(PRIME + 4, isNumberControl),
138
+ tester: rankWith(
139
+ PRIME + 4,
140
+ or(
141
+ isNumberControl,
142
+ projectedSchemaMatches((s) => s?.type === "number")
143
+ )
144
+ ),
74
145
  renderer: _sfc_main$2
75
146
  },
76
147
  {
77
- tester: rankWith(PRIME + 7, and(isControl, schemaMatches(isScalarEnum))),
148
+ tester: rankWith(
149
+ PRIME + 7,
150
+ or(
151
+ and(isControl, schemaMatches(isScalarEnum)),
152
+ and(isControl, projectedSchemaMatches(isScalarEnum))
153
+ )
154
+ ),
78
155
  renderer: _sfc_main$3
79
156
  },
80
157
  {
81
- tester: rankWith(PRIME + 8, and(isControl, schemaMatches(isEnumArray))),
158
+ tester: rankWith(
159
+ PRIME + 8,
160
+ or(
161
+ and(isControl, schemaMatches(isEnumArray)),
162
+ and(isControl, projectedSchemaMatches(isEnumArray))
163
+ )
164
+ ),
82
165
  renderer: _sfc_main$4
83
166
  },
84
- { tester: rankWith(PRIME + 3, isBooleanControl), renderer: _sfc_main$5 }
167
+ {
168
+ tester: rankWith(
169
+ PRIME + 3,
170
+ or(
171
+ isBooleanControl,
172
+ projectedSchemaMatches((s) => s?.type === "boolean")
173
+ )
174
+ ),
175
+ renderer: _sfc_main$5
176
+ }
85
177
  ];
86
178
  primevueRenderers.splice(0, primevueRenderers.length, ...renderers);
87
179
  renderersInitialized = true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/vue/primevue/index.ts"],"sourcesContent":["import JfText from \"./JfText.vue\";\nimport JfTextArea from \"./JfTextArea.vue\";\nimport JfNumber from \"./JfNumber.vue\";\nimport JfEnum from \"./JfEnum.vue\";\nimport JfEnumArray from \"./JfEnumArray.vue\";\nimport JfBoolean from \"./JfBoolean.vue\";\n\n// Auto-inject layout styles\nconst injectLayoutStyles = () => {\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!document.getElementById(\"jsonforms-primevue-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"jsonforms-primevue-styles\";\n style.textContent = `\n/* JSONForms PrimeVue Provider Protocols Layout Styles */\n.vertical-layout {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 1rem;\n width: 100%;\n}\n\n.vertical-layout-item {\n width: 100%;\n}\n `;\n document.head.appendChild(style);\n }\n }\n};\n\n// Inject styles when this module is imported\ninjectLayoutStyles();\n\n// Track whether renderers have been registered to avoid duplicate registrations\nlet renderersInitialized = false;\n\n// Return empty renderers array initially\nexport const primevueRenderers: unknown[] = [];\n\n// Export a function that can be called by the consumer to register renderers\n// This should only be called once during application initialization\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function registerPrimevueRenderers(jsonformsCore: any): unknown[] {\n // Prevent duplicate registration which causes AJV schema recompilation\n if (renderersInitialized) {\n return primevueRenderers as unknown[];\n }\n\n const {\n rankWith,\n isStringControl,\n isNumberControl,\n isIntegerControl,\n and,\n isControl,\n schemaMatches,\n isBooleanControl,\n } = jsonformsCore;\n\n // Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)\n const PRIME = 100;\n\n // helpers for enum detection - using simple schema checks instead of JSONForms internal functions\n const isScalarEnum = (s?: object) => {\n const schema = s as {\n type?: string;\n enum?: unknown[];\n oneOf?: unknown[];\n };\n return (\n schema &&\n schema.type !== \"array\" &&\n (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))\n );\n };\n\n const isEnumArray = (s?: object) => {\n const schema = s as {\n type?: string;\n items?: { enum?: unknown[]; oneOf?: unknown[] };\n };\n return (\n schema?.type === \"array\" &&\n (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))\n );\n };\n\n // helper for multiline detection\n const isMultilineString = (uischema: unknown, schema: unknown) => {\n const controlUischema = uischema as { options?: { multi?: boolean } };\n return and(isStringControl, () => controlUischema?.options?.multi === true)(\n uischema as Parameters<typeof isStringControl>[0],\n schema as Parameters<typeof isStringControl>[1],\n {} as Parameters<typeof isStringControl>[2],\n );\n };\n\n const renderers = [\n // Multiline text has higher priority than regular text\n { tester: rankWith(PRIME + 4, isMultilineString), renderer: JfTextArea },\n { tester: rankWith(PRIME + 3, isStringControl), renderer: JfText },\n {\n tester: rankWith(PRIME + 6, isIntegerControl),\n renderer: JfNumber,\n },\n {\n tester: rankWith(PRIME + 4, isNumberControl),\n renderer: JfNumber,\n },\n {\n tester: rankWith(PRIME + 7, and(isControl, schemaMatches(isScalarEnum))),\n renderer: JfEnum,\n },\n {\n tester: rankWith(PRIME + 8, and(isControl, schemaMatches(isEnumArray))),\n renderer: JfEnumArray,\n },\n { tester: rankWith(PRIME + 3, isBooleanControl), renderer: JfBoolean },\n ];\n\n // Update the exported array\n primevueRenderers.splice(0, primevueRenderers.length, ...renderers);\n\n // Mark as initialized to prevent duplicate registrations\n renderersInitialized = true;\n\n return renderers;\n}\n\nexport { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };\n"],"names":["JfTextArea","JfText","JfNumber","JfEnum","JfEnumArray","JfBoolean"],"mappings":";;;;;;AAQA,MAAM,qBAAqB,MAAM;AAC/B,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,QAAI,CAAC,SAAS,eAAe,2BAA2B,GAAG;AACzD,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,KAAK;AACX,YAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcpB,eAAS,KAAK,YAAY,KAAK;AAAA,IACjC;AAAA,EACF;AACF;AAGA,mBAAA;AAGA,IAAI,uBAAuB;AAGpB,MAAM,oBAA+B,CAAA;AAKrC,SAAS,0BAA0B,eAA+B;AAEvE,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGJ,QAAM,QAAQ;AAGd,QAAM,eAAe,CAAC,MAAe;AACnC,UAAM,SAAS;AAKf,WACE,UACA,OAAO,SAAS,YACf,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,KAAK;AAAA,EAE7D;AAEA,QAAM,cAAc,CAAC,MAAe;AAClC,UAAM,SAAS;AAIf,WACE,QAAQ,SAAS,YAChB,MAAM,QAAQ,OAAO,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA,EAE3E;AAGA,QAAM,oBAAoB,CAAC,UAAmB,WAAoB;AAChE,UAAM,kBAAkB;AACxB,WAAO,IAAI,iBAAiB,MAAM,iBAAiB,SAAS,UAAU,IAAI;AAAA,MACxE;AAAA,MACA;AAAA,MACA,CAAA;AAAA,IAAC;AAAA,EAEL;AAEA,QAAM,YAAY;AAAA;AAAA,IAEhB,EAAE,QAAQ,SAAS,QAAQ,GAAG,iBAAiB,GAAG,UAAUA,UAAA;AAAA,IAC5D,EAAE,QAAQ,SAAS,QAAQ,GAAG,eAAe,GAAG,UAAUC,YAAA;AAAA,IAC1D;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,gBAAgB;AAAA,MAC5C,UAAUC;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,eAAe;AAAA,MAC3C,UAAUA;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,YAAY,CAAC,CAAC;AAAA,MACvE,UAAUC;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,WAAW,CAAC,CAAC;AAAA,MACtE,UAAUC;AAAAA,IAAA;AAAA,IAEZ,EAAE,QAAQ,SAAS,QAAQ,GAAG,gBAAgB,GAAG,UAAUC,YAAA;AAAA,EAAU;AAIvE,oBAAkB,OAAO,GAAG,kBAAkB,QAAQ,GAAG,SAAS;AAGlE,yBAAuB;AAEvB,SAAO;AACT;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/vue/primevue/index.ts"],"sourcesContent":["import JfText from \"./JfText.vue\";\nimport JfTextArea from \"./JfTextArea.vue\";\nimport JfNumber from \"./JfNumber.vue\";\nimport JfEnum from \"./JfEnum.vue\";\nimport JfEnumArray from \"./JfEnumArray.vue\";\nimport JfBoolean from \"./JfBoolean.vue\";\nimport { getProjectedSchema } from \"../../core/projection\";\nimport { resolveScopeSchema } from \"../../core/resolveScope\";\n\n// Auto-inject layout styles\nconst injectLayoutStyles = () => {\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!document.getElementById(\"jsonforms-primevue-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"jsonforms-primevue-styles\";\n style.textContent = `\n/* JSONForms PrimeVue Provider Protocols Layout Styles */\n.vertical-layout {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 24px;\n width: 100%;\n}\n\n.vertical-layout-item {\n width: 100%;\n}\n\n/* Form control wrapper */\n.jf-control {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Form control label typography */\n.jf-label {\n font-weight: 600;\n font-size: 14px;\n line-height: 14px;\n color: #031553;\n text-align: left;\n}\n\n/* Form control description typography */\n.jf-description {\n font-weight: 400;\n font-size: 14px;\n line-height: 14px;\n color: #415290;\n text-align: left;\n}\n `;\n document.head.appendChild(style);\n }\n }\n};\n\n// Inject styles when this module is imported\ninjectLayoutStyles();\n\n// Track whether renderers have been registered to avoid duplicate registrations\nlet renderersInitialized = false;\n\n// Return empty renderers array initially\nexport const primevueRenderers: unknown[] = [];\n\n// Export a function that can be called by the consumer to register renderers\n// This should only be called once during application initialization\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function registerPrimevueRenderers(jsonformsCore: any): unknown[] {\n // Prevent duplicate registration which causes AJV schema recompilation\n if (renderersInitialized) {\n return primevueRenderers as unknown[];\n }\n\n const {\n rankWith,\n isStringControl,\n isNumberControl,\n isIntegerControl,\n and,\n or,\n isControl,\n schemaMatches,\n isBooleanControl,\n } = jsonformsCore;\n\n // Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)\n const PRIME = 100;\n\n // helpers for enum detection - using simple schema checks instead of JSONForms internal functions\n const isScalarEnum = (s?: object) => {\n const schema = s as {\n type?: string;\n enum?: unknown[];\n oneOf?: unknown[];\n };\n return (\n schema &&\n schema.type !== \"array\" &&\n (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))\n );\n };\n\n const isEnumArray = (s?: object) => {\n const schema = s as {\n type?: string;\n items?: { enum?: unknown[]; oneOf?: unknown[] };\n };\n return (\n schema?.type === \"array\" &&\n (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))\n );\n };\n\n // helper for multiline detection\n const isMultilineString = (uischema: unknown, schema: unknown) => {\n const controlUischema = uischema as { options?: { multi?: boolean } };\n return and(isStringControl, () => controlUischema?.options?.multi === true)(\n uischema as Parameters<typeof isStringControl>[0],\n schema as Parameters<typeof isStringControl>[1],\n {} as Parameters<typeof isStringControl>[2],\n );\n };\n\n // Projection-aware schema check: when options.projection is set,\n // resolve the projected schema and test against it instead of the original\n\n const projectedSchemaMatches =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (check: (schema: any) => boolean) =>\n (uischema: unknown, schema: unknown): boolean => {\n const ui = uischema as {\n type?: string;\n scope?: string;\n options?: { projection?: string };\n };\n const projection = ui?.options?.projection;\n if (!projection || ui?.type !== \"Control\" || !ui?.scope) return false;\n\n const propertySchema = resolveScopeSchema(\n ui.scope,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema as Record<string, any>,\n );\n if (!propertySchema) return false;\n\n return check(getProjectedSchema(propertySchema, projection));\n };\n\n const isMultilineProjection = (uischema: unknown, schema: unknown) => {\n const ui = uischema as { options?: { multi?: boolean } };\n return (\n ui?.options?.multi === true &&\n projectedSchemaMatches((s) => s?.type === \"string\")(uischema, schema)\n );\n };\n\n const renderers = [\n // Multiline text has higher priority than regular text\n {\n tester: rankWith(PRIME + 4, or(isMultilineString, isMultilineProjection)),\n renderer: JfTextArea,\n },\n {\n tester: rankWith(\n PRIME + 3,\n or(\n isStringControl,\n projectedSchemaMatches((s) => s?.type === \"string\"),\n ),\n ),\n renderer: JfText,\n },\n {\n tester: rankWith(\n PRIME + 6,\n or(\n isIntegerControl,\n projectedSchemaMatches((s) => s?.type === \"integer\"),\n ),\n ),\n renderer: JfNumber,\n },\n {\n tester: rankWith(\n PRIME + 4,\n or(\n isNumberControl,\n projectedSchemaMatches((s) => s?.type === \"number\"),\n ),\n ),\n renderer: JfNumber,\n },\n {\n tester: rankWith(\n PRIME + 7,\n or(\n and(isControl, schemaMatches(isScalarEnum)),\n and(isControl, projectedSchemaMatches(isScalarEnum)),\n ),\n ),\n renderer: JfEnum,\n },\n {\n tester: rankWith(\n PRIME + 8,\n or(\n and(isControl, schemaMatches(isEnumArray)),\n and(isControl, projectedSchemaMatches(isEnumArray)),\n ),\n ),\n renderer: JfEnumArray,\n },\n {\n tester: rankWith(\n PRIME + 3,\n or(\n isBooleanControl,\n projectedSchemaMatches((s) => s?.type === \"boolean\"),\n ),\n ),\n renderer: JfBoolean,\n },\n ];\n\n // Update the exported array\n primevueRenderers.splice(0, primevueRenderers.length, ...renderers);\n\n // Mark as initialized to prevent duplicate registrations\n renderersInitialized = true;\n\n return renderers;\n}\n\nexport { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };\n"],"names":["JfTextArea","JfText","JfNumber","JfEnum","JfEnumArray","JfBoolean"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Helpers for `ProviderObjectMultiSelect`: bidirectional translation between
3
+ * the form-data shape (paired objects with consumer-named keys) and the
4
+ * MultiSelect model shape (`{ value, label }` matching the provider's `map`
5
+ * config), plus `objectKeys` inference when the consumer doesn't specify
6
+ * them on the uischema.
7
+ *
8
+ * Pure functions — no Vue, no rendering — so the renderer can compose them
9
+ * and tests can exercise the logic in isolation.
10
+ */
11
+ export interface ObjectKeys {
12
+ /** Property name on the form-data object that holds the identifier. */
13
+ value: string;
14
+ /** Property name on the form-data object that holds the display string. */
15
+ label: string;
16
+ }
17
+ export interface MultiSelectOption {
18
+ value: unknown;
19
+ label: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Translate form-data items (`[{ [valueKey]: v, [labelKey]: l }]`) into the
24
+ * shape PrimeVue's `<MultiSelect>` expects (`[{ value, label }]`). Items
25
+ * already in `{ value, label }` shape pass through; missing keys yield
26
+ * `undefined` / `""` so the renderer doesn't blow up on partial data.
27
+ */
28
+ export declare function toMultiSelectShape(formData: unknown, keys: ObjectKeys): MultiSelectOption[];
29
+ /**
30
+ * Inverse of `toMultiSelectShape`. Translates `<MultiSelect>` model items
31
+ * back into form-data shape using the consumer-specified property names.
32
+ */
33
+ export declare function fromMultiSelectShape(modelData: unknown, keys: ObjectKeys): Record<string, unknown>[];
34
+ /**
35
+ * Order-insensitive equality of two object-shape selections by the
36
+ * identifier property. Used to short-circuit redundant `handleChange`
37
+ * calls when the model emits the same selection under reference inequality.
38
+ */
39
+ export declare function sameObjectSet(a: unknown, b: unknown, identifierKey: string): boolean;
40
+ /**
41
+ * Resolve the items schema of an array control, dereferencing `items.$ref`
42
+ * against the root if present. Returns `undefined` if no items schema exists.
43
+ */
44
+ export declare function resolveItemsSchema(arraySchema: Record<string, any> | undefined, rootSchema: Record<string, any>): Record<string, any> | undefined;
45
+ /**
46
+ * Infer `objectKeys` from a resolved items schema when the consumer hasn't
47
+ * specified them on the uischema.
48
+ *
49
+ * Strategy: look at `items.required`. If it has exactly two entries, the
50
+ * one whose property has `format: 'uuid'` becomes `value`; the other
51
+ * becomes `label`. If neither has a uuid format, the first entry is
52
+ * `value`, the second is `label`. Returns `undefined` (and the renderer
53
+ * throws at mount) for any other shape — explicit `objectKeys` is required.
54
+ */
55
+ export declare function inferObjectKeys(itemsSchema: Record<string, any> | undefined): ObjectKeys | undefined;
56
+ /**
57
+ * Resolve the active `objectKeys` for a control: prefer the explicit
58
+ * `uischema.options.objectKeys`, fall back to schema-driven inference.
59
+ * Returns `undefined` when neither is available; the renderer surfaces a
60
+ * runtime error in that case so the consumer knows to be explicit.
61
+ */
62
+ export declare function resolveObjectKeys(uischemaOptions: {
63
+ objectKeys?: {
64
+ value?: unknown;
65
+ label?: unknown;
66
+ };
67
+ } | undefined, itemsSchema: Record<string, any> | undefined): ObjectKeys | undefined;
68
+ //# sourceMappingURL=objectMultiSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectMultiSelect.d.ts","sourceRoot":"","sources":["../../../src/vue/utils/objectMultiSelect.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,UAAU,GACf,iBAAiB,EAAE,CAqBrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE,UAAU,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAW3B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,OAAO,EACV,aAAa,EAAE,MAAM,GACpB,OAAO,CAaT;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAEhC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAE5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAE9B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAOjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAE7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAC3C,UAAU,GAAG,SAAS,CAcxB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE;IAAE,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,EAElF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAC3C,UAAU,GAAG,SAAS,CAUxB"}
@@ -0,0 +1,72 @@
1
+ import { deref } from "../../core/refs.js";
2
+ function toMultiSelectShape(formData, keys) {
3
+ if (!Array.isArray(formData)) return [];
4
+ return formData.filter((item) => item !== null && typeof item === "object").map((item) => {
5
+ const obj = item;
6
+ if (!(keys.value in obj) && !(keys.label in obj) && "value" in obj && "label" in obj) {
7
+ return obj;
8
+ }
9
+ return {
10
+ value: obj[keys.value],
11
+ label: typeof obj[keys.label] === "string" ? obj[keys.label] : ""
12
+ };
13
+ });
14
+ }
15
+ function fromMultiSelectShape(modelData, keys) {
16
+ if (!Array.isArray(modelData)) return [];
17
+ return modelData.filter((item) => item !== null && typeof item === "object").map((item) => {
18
+ const obj = item;
19
+ return {
20
+ [keys.value]: obj.value,
21
+ [keys.label]: obj.label
22
+ };
23
+ });
24
+ }
25
+ function sameObjectSet(a, b, identifierKey) {
26
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
27
+ return false;
28
+ }
29
+ const ids = new Set(
30
+ b.filter((x) => x !== null && typeof x === "object").map((x) => x[identifierKey])
31
+ );
32
+ return a.every((x) => {
33
+ if (x === null || typeof x !== "object") return false;
34
+ return ids.has(x[identifierKey]);
35
+ });
36
+ }
37
+ function resolveItemsSchema(arraySchema, rootSchema) {
38
+ if (!arraySchema || typeof arraySchema !== "object") return void 0;
39
+ const items = arraySchema.items;
40
+ if (!items || typeof items !== "object" || Array.isArray(items)) {
41
+ return void 0;
42
+ }
43
+ return deref(items, rootSchema);
44
+ }
45
+ function inferObjectKeys(itemsSchema) {
46
+ if (!itemsSchema || itemsSchema.type !== "object") return void 0;
47
+ const required = itemsSchema.required;
48
+ if (!Array.isArray(required) || required.length !== 2) return void 0;
49
+ const [a, b] = required;
50
+ const props = itemsSchema.properties ?? {};
51
+ const aIsUuid = props[a]?.format === "uuid";
52
+ const bIsUuid = props[b]?.format === "uuid";
53
+ if (aIsUuid && !bIsUuid) return { value: a, label: b };
54
+ if (bIsUuid && !aIsUuid) return { value: b, label: a };
55
+ return { value: a, label: b };
56
+ }
57
+ function resolveObjectKeys(uischemaOptions, itemsSchema) {
58
+ const explicit = uischemaOptions?.objectKeys;
59
+ if (explicit && typeof explicit.value === "string" && typeof explicit.label === "string") {
60
+ return { value: explicit.value, label: explicit.label };
61
+ }
62
+ return inferObjectKeys(itemsSchema);
63
+ }
64
+ export {
65
+ fromMultiSelectShape,
66
+ inferObjectKeys,
67
+ resolveItemsSchema,
68
+ resolveObjectKeys,
69
+ sameObjectSet,
70
+ toMultiSelectShape
71
+ };
72
+ //# sourceMappingURL=objectMultiSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectMultiSelect.js","sources":["../../../src/vue/utils/objectMultiSelect.ts"],"sourcesContent":["import { deref } from \"../../core/refs\";\n\n/**\n * Helpers for `ProviderObjectMultiSelect`: bidirectional translation between\n * the form-data shape (paired objects with consumer-named keys) and the\n * MultiSelect model shape (`{ value, label }` matching the provider's `map`\n * config), plus `objectKeys` inference when the consumer doesn't specify\n * them on the uischema.\n *\n * Pure functions — no Vue, no rendering — so the renderer can compose them\n * and tests can exercise the logic in isolation.\n */\n\nexport interface ObjectKeys {\n /** Property name on the form-data object that holds the identifier. */\n value: string;\n /** Property name on the form-data object that holds the display string. */\n label: string;\n}\n\nexport interface MultiSelectOption {\n value: unknown;\n label: string;\n [key: string]: unknown;\n}\n\n/**\n * Translate form-data items (`[{ [valueKey]: v, [labelKey]: l }]`) into the\n * shape PrimeVue's `<MultiSelect>` expects (`[{ value, label }]`). Items\n * already in `{ value, label }` shape pass through; missing keys yield\n * `undefined` / `\"\"` so the renderer doesn't blow up on partial data.\n */\nexport function toMultiSelectShape(\n formData: unknown,\n keys: ObjectKeys,\n): MultiSelectOption[] {\n if (!Array.isArray(formData)) return [];\n return formData\n .filter((item) => item !== null && typeof item === \"object\")\n .map((item) => {\n const obj = item as Record<string, unknown>;\n // Tolerate already-translated items: if both `value` and `label` are\n // present and the form-data keys aren't, assume MultiSelect shape.\n if (\n !(keys.value in obj) &&\n !(keys.label in obj) &&\n \"value\" in obj &&\n \"label\" in obj\n ) {\n return obj as MultiSelectOption;\n }\n return {\n value: obj[keys.value],\n label: typeof obj[keys.label] === \"string\" ? (obj[keys.label] as string) : \"\",\n };\n });\n}\n\n/**\n * Inverse of `toMultiSelectShape`. Translates `<MultiSelect>` model items\n * back into form-data shape using the consumer-specified property names.\n */\nexport function fromMultiSelectShape(\n modelData: unknown,\n keys: ObjectKeys,\n): Record<string, unknown>[] {\n if (!Array.isArray(modelData)) return [];\n return modelData\n .filter((item) => item !== null && typeof item === \"object\")\n .map((item) => {\n const obj = item as Record<string, unknown>;\n return {\n [keys.value]: obj.value,\n [keys.label]: obj.label,\n };\n });\n}\n\n/**\n * Order-insensitive equality of two object-shape selections by the\n * identifier property. Used to short-circuit redundant `handleChange`\n * calls when the model emits the same selection under reference inequality.\n */\nexport function sameObjectSet(\n a: unknown,\n b: unknown,\n identifierKey: string,\n): boolean {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n const ids = new Set(\n b\n .filter((x) => x !== null && typeof x === \"object\")\n .map((x) => (x as Record<string, unknown>)[identifierKey]),\n );\n return a.every((x) => {\n if (x === null || typeof x !== \"object\") return false;\n return ids.has((x as Record<string, unknown>)[identifierKey]);\n });\n}\n\n/**\n * Resolve the items schema of an array control, dereferencing `items.$ref`\n * against the root if present. Returns `undefined` if no items schema exists.\n */\nexport function resolveItemsSchema(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arraySchema: Record<string, any> | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rootSchema: Record<string, any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> | undefined {\n if (!arraySchema || typeof arraySchema !== \"object\") return undefined;\n const items = arraySchema.items;\n if (!items || typeof items !== \"object\" || Array.isArray(items)) {\n return undefined;\n }\n return deref(items, rootSchema);\n}\n\n/**\n * Infer `objectKeys` from a resolved items schema when the consumer hasn't\n * specified them on the uischema.\n *\n * Strategy: look at `items.required`. If it has exactly two entries, the\n * one whose property has `format: 'uuid'` becomes `value`; the other\n * becomes `label`. If neither has a uuid format, the first entry is\n * `value`, the second is `label`. Returns `undefined` (and the renderer\n * throws at mount) for any other shape — explicit `objectKeys` is required.\n */\nexport function inferObjectKeys(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n itemsSchema: Record<string, any> | undefined,\n): ObjectKeys | undefined {\n if (!itemsSchema || itemsSchema.type !== \"object\") return undefined;\n const required = itemsSchema.required;\n if (!Array.isArray(required) || required.length !== 2) return undefined;\n const [a, b] = required as [string, string];\n const props = (itemsSchema.properties ?? {}) as Record<\n string,\n { format?: string }\n >;\n const aIsUuid = props[a]?.format === \"uuid\";\n const bIsUuid = props[b]?.format === \"uuid\";\n if (aIsUuid && !bIsUuid) return { value: a, label: b };\n if (bIsUuid && !aIsUuid) return { value: b, label: a };\n return { value: a, label: b };\n}\n\n/**\n * Resolve the active `objectKeys` for a control: prefer the explicit\n * `uischema.options.objectKeys`, fall back to schema-driven inference.\n * Returns `undefined` when neither is available; the renderer surfaces a\n * runtime error in that case so the consumer knows to be explicit.\n */\nexport function resolveObjectKeys(\n uischemaOptions: { objectKeys?: { value?: unknown; label?: unknown } } | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n itemsSchema: Record<string, any> | undefined,\n): ObjectKeys | undefined {\n const explicit = uischemaOptions?.objectKeys;\n if (\n explicit &&\n typeof explicit.value === \"string\" &&\n typeof explicit.label === \"string\"\n ) {\n return { value: explicit.value, label: explicit.label };\n }\n return inferObjectKeys(itemsSchema);\n}\n"],"names":[],"mappings":";AAgCO,SAAS,mBACd,UACA,MACqB;AACrB,MAAI,CAAC,MAAM,QAAQ,QAAQ,UAAU,CAAA;AACrC,SAAO,SACJ,OAAO,CAAC,SAAS,SAAS,QAAQ,OAAO,SAAS,QAAQ,EAC1D,IAAI,CAAC,SAAS;AACb,UAAM,MAAM;AAGZ,QACE,EAAE,KAAK,SAAS,QAChB,EAAE,KAAK,SAAS,QAChB,WAAW,OACX,WAAW,KACX;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,OAAO,IAAI,KAAK,KAAK;AAAA,MACrB,OAAO,OAAO,IAAI,KAAK,KAAK,MAAM,WAAY,IAAI,KAAK,KAAK,IAAe;AAAA,IAAA;AAAA,EAE/E,CAAC;AACL;AAMO,SAAS,qBACd,WACA,MAC2B;AAC3B,MAAI,CAAC,MAAM,QAAQ,SAAS,UAAU,CAAA;AACtC,SAAO,UACJ,OAAO,CAAC,SAAS,SAAS,QAAQ,OAAO,SAAS,QAAQ,EAC1D,IAAI,CAAC,SAAS;AACb,UAAM,MAAM;AACZ,WAAO;AAAA,MACL,CAAC,KAAK,KAAK,GAAG,IAAI;AAAA,MAClB,CAAC,KAAK,KAAK,GAAG,IAAI;AAAA,IAAA;AAAA,EAEtB,CAAC;AACL;AAOO,SAAS,cACd,GACA,GACA,eACS;AACT,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ;AACnE,WAAO;AAAA,EACT;AACA,QAAM,MAAM,IAAI;AAAA,IACd,EACG,OAAO,CAAC,MAAM,MAAM,QAAQ,OAAO,MAAM,QAAQ,EACjD,IAAI,CAAC,MAAO,EAA8B,aAAa,CAAC;AAAA,EAAA;AAE7D,SAAO,EAAE,MAAM,CAAC,MAAM;AACpB,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAU,QAAO;AAChD,WAAO,IAAI,IAAK,EAA8B,aAAa,CAAC;AAAA,EAC9D,CAAC;AACH;AAMO,SAAS,mBAEd,aAEA,YAEiC;AACjC,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAC5D,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,MAAM,OAAO,UAAU;AAChC;AAYO,SAAS,gBAEd,aACwB;AACxB,MAAI,CAAC,eAAe,YAAY,SAAS,SAAU,QAAO;AAC1D,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,EAAG,QAAO;AAC9D,QAAM,CAAC,GAAG,CAAC,IAAI;AACf,QAAM,QAAS,YAAY,cAAc,CAAA;AAIzC,QAAM,UAAU,MAAM,CAAC,GAAG,WAAW;AACrC,QAAM,UAAU,MAAM,CAAC,GAAG,WAAW;AACrC,MAAI,WAAW,CAAC,QAAS,QAAO,EAAE,OAAO,GAAG,OAAO,EAAA;AACnD,MAAI,WAAW,CAAC,QAAS,QAAO,EAAE,OAAO,GAAG,OAAO,EAAA;AACnD,SAAO,EAAE,OAAO,GAAG,OAAO,EAAA;AAC5B;AAQO,SAAS,kBACd,iBAEA,aACwB;AACxB,QAAM,WAAW,iBAAiB;AAClC,MACE,YACA,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU,UAC1B;AACA,WAAO,EAAE,OAAO,SAAS,OAAO,OAAO,SAAS,MAAA;AAAA,EAClD;AACA,SAAO,gBAAgB,WAAW;AACpC;"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Placeholder resolution for form controls.
3
+ *
4
+ * Precedence:
5
+ * 1. `uischema.options.placeholder` (explicit author intent — always wins)
6
+ * 2. `Select ${label}` or `Enter ${label}` when a label is resolvable
7
+ * 3. Kind-appropriate bare fallback
8
+ *
9
+ * Never falls back to `schema.description` — descriptions are rendered as
10
+ * prose above the field by our renderers, so re-using them as placeholder
11
+ * produces a duplicated, truncated string inside the input.
12
+ */
13
+ export type PlaceholderKind = "select" | "input";
14
+ export declare function resolvePlaceholder(uischema: {
15
+ options?: unknown;
16
+ } | undefined, resolvedLabel: string | undefined, kind: PlaceholderKind): string | undefined;
17
+ //# sourceMappingURL=placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder.d.ts","sourceRoot":"","sources":["../../../src/vue/utils/placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAUjD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAC3C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,IAAI,EAAE,eAAe,GACpB,MAAM,GAAG,SAAS,CAcpB"}
@@ -0,0 +1,17 @@
1
+ function stripRequiredMarker(label) {
2
+ return label.replace(/\s*\*\s*$/, "").trim();
3
+ }
4
+ function resolvePlaceholder(uischema, resolvedLabel, kind) {
5
+ const options = uischema?.options;
6
+ const explicit = options && typeof options === "object" ? options.placeholder : void 0;
7
+ if (typeof explicit === "string" && explicit.length > 0) return explicit;
8
+ const label = resolvedLabel ? stripRequiredMarker(resolvedLabel) : "";
9
+ if (label) {
10
+ return kind === "select" ? `Select ${label}` : `Enter ${label}`;
11
+ }
12
+ return kind === "select" ? "Select…" : void 0;
13
+ }
14
+ export {
15
+ resolvePlaceholder
16
+ };
17
+ //# sourceMappingURL=placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder.js","sources":["../../../src/vue/utils/placeholder.ts"],"sourcesContent":["/**\n * Placeholder resolution for form controls.\n *\n * Precedence:\n * 1. `uischema.options.placeholder` (explicit author intent — always wins)\n * 2. `Select ${label}` or `Enter ${label}` when a label is resolvable\n * 3. Kind-appropriate bare fallback\n *\n * Never falls back to `schema.description` — descriptions are rendered as\n * prose above the field by our renderers, so re-using them as placeholder\n * produces a duplicated, truncated string inside the input.\n */\n\nexport type PlaceholderKind = \"select\" | \"input\";\n\n/**\n * Strip a trailing required-indicator asterisk (\" *\" or \"*\") that `resolveLabel`\n * appends for required fields, so composed placeholders read naturally.\n */\nfunction stripRequiredMarker(label: string): string {\n return label.replace(/\\s*\\*\\s*$/, \"\").trim();\n}\n\nexport function resolvePlaceholder(\n uischema: { options?: unknown } | undefined,\n resolvedLabel: string | undefined,\n kind: PlaceholderKind,\n): string | undefined {\n const options = uischema?.options;\n const explicit =\n options && typeof options === \"object\"\n ? (options as Record<string, unknown>).placeholder\n : undefined;\n if (typeof explicit === \"string\" && explicit.length > 0) return explicit;\n\n const label = resolvedLabel ? stripRequiredMarker(resolvedLabel) : \"\";\n if (label) {\n return kind === \"select\" ? `Select ${label}` : `Enter ${label}`;\n }\n\n return kind === \"select\" ? \"Select…\" : undefined;\n}\n"],"names":[],"mappings":"AAmBA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,aAAa,EAAE,EAAE,KAAA;AACxC;AAEO,SAAS,mBACd,UACA,eACA,MACoB;AACpB,QAAM,UAAU,UAAU;AAC1B,QAAM,WACJ,WAAW,OAAO,YAAY,WACzB,QAAoC,cACrC;AACN,MAAI,OAAO,aAAa,YAAY,SAAS,SAAS,EAAG,QAAO;AAEhE,QAAM,QAAQ,gBAAgB,oBAAoB,aAAa,IAAI;AACnE,MAAI,OAAO;AACT,WAAO,SAAS,WAAW,UAAU,KAAK,KAAK,SAAS,KAAK;AAAA,EAC/D;AAEA,SAAO,SAAS,WAAW,YAAY;AACzC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narrative.io/jsonforms-provider-protocols",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "Dynamic data provider capabilities for JSONForms with Vue 3 integration",
5
5
  "type": "module",
6
6
  "author": "Narrative I/O",
@@ -47,6 +47,10 @@
47
47
  "import": "./dist/protocols/rest_api.js",
48
48
  "types": "./dist/protocols/rest_api.d.ts"
49
49
  },
50
+ "./no-eval-ajv": {
51
+ "import": "./dist/no-eval-ajv.js",
52
+ "types": "./dist/no-eval-ajv.d.ts"
53
+ },
50
54
  "./style.css": "./dist/jsonforms-provider-protocols.css"
51
55
  },
52
56
  "files": [
@@ -84,12 +88,14 @@
84
88
  "@vitejs/plugin-vue": "^6.0.1",
85
89
  "@vue/eslint-config-typescript": "^14.6.0",
86
90
  "@vue/runtime-core": "^3.5.20",
91
+ "@vue/test-utils": "^2.4.6",
87
92
  "bun-git-hooks": "^0.2.19",
88
93
  "commitlint": "^20.0.0",
89
94
  "eslint": "^9.34.0",
90
95
  "eslint-config-prettier": "^10.1.8",
91
96
  "eslint-plugin-vue": "^10.4.0",
92
97
  "globals": "^16.3.0",
98
+ "happy-dom": "^20.6.3",
93
99
  "prettier": "^3.6.2",
94
100
  "primevue": "^4.3.8",
95
101
  "typescript": "^5.9.2",
@@ -105,5 +111,7 @@
105
111
  "@jsonforms/vue": "^3.6.0",
106
112
  "@jsonforms/vue-vanilla": "^3.6.0"
107
113
  },
108
- "dependencies": {}
114
+ "dependencies": {
115
+ "@cfworker/json-schema": "4.1.1"
116
+ }
109
117
  }