@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeriveInitialValue.js","sources":["../../../src/vue/composables/useDeriveInitialValue.ts"],"sourcesContent":["import { computed, inject, ref, watch, type Ref, type ComputedRef } from \"vue\";\nimport { type ControlElement } from \"@jsonforms/core\";\nimport { renderTpl, renderObj } from \"../../core/templating\";\nimport { jp } from \"../../core/jsonpath\";\nimport {\n applyTransformPipeline,\n type TransformPipeline,\n} from \"../../core/transforms\";\nimport type { AuthConfig } from \"../../core/types\";\n\nexport interface DeriveInitialValueCfg {\n protocol: string;\n config: {\n url: string;\n method?: \"GET\" | \"POST\";\n headers?: Record<string, string>;\n query?: Record<string, unknown>;\n body?: unknown;\n auth?: AuthConfig;\n items: string;\n map: { value: string };\n transforms?: TransformPipeline;\n showError?: boolean;\n };\n}\n\ninterface DeriveInitialValueOptions {\n control: Ref<{\n uischema: ControlElement;\n path: string;\n data: unknown;\n }>;\n handleChange: (path: string, value: unknown) => void;\n data?: Ref<unknown> | ComputedRef<unknown>;\n}\n\nfunction buildAuthHeaders(\n auth?: AuthConfig,\n globalAuth?: Record<string, unknown>,\n): Record<string, string> {\n const headers: Record<string, string> = {};\n if (!auth) return headers;\n\n if (auth.use && globalAuth?.[auth.use]) {\n const globalValue = globalAuth[auth.use];\n const value =\n typeof globalValue === \"function\" ? globalValue() : globalValue;\n if (auth.use === \"apiKey\") headers[\"X-API-Key\"] = String(value);\n else if (auth.use === \"bearer\")\n headers[\"Authorization\"] = `Bearer ${value}`;\n else if (auth.use === \"token\") headers[\"Authorization\"] = `Token ${value}`;\n return headers;\n }\n\n if (auth.bearer) {\n const v = typeof auth.bearer === \"function\" ? auth.bearer() : auth.bearer;\n headers[\"Authorization\"] = `Bearer ${v}`;\n }\n if (auth.apiKey) {\n const v = typeof auth.apiKey === \"function\" ? auth.apiKey() : auth.apiKey;\n headers[\"X-API-Key\"] = String(v);\n }\n if (auth.token) {\n const v = typeof auth.token === \"function\" ? auth.token() : auth.token;\n headers[\"Authorization\"] = `Token ${v}`;\n }\n\n return headers;\n}\n\n/**\n * Returns true when the template URL contains `{{…}}` placeholders but\n * one or more of those placeholders resolved to an empty string, which\n * means a required data dependency hasn't been set yet.\n */\nfunction hasUnresolvedTemplates(\n templateUrl: string,\n renderedUrl: string,\n): boolean {\n if (!templateUrl.includes(\"{{\")) return false;\n // After protocol, empty segments indicate unresolved vars\n const pathPart = renderedUrl.replace(/^https?:\\/\\/[^/]+/, \"\");\n if (pathPart.includes(\"//\")) return true;\n // Trailing slash when the template didn't have one\n if (renderedUrl.endsWith(\"/\") && !templateUrl.endsWith(\"/\")) return true;\n return false;\n}\n\nexport function useDeriveInitialValue({\n control,\n handleChange,\n}: DeriveInitialValueOptions) {\n const injectedFormData = inject<{ value: unknown }>(\"formData\", {\n value: {},\n });\n const rootData = computed(() => injectedFormData.value || {});\n const auth = inject(\"providerAuth\", {}) as Record<string, unknown>;\n\n const cfg = computed<DeriveInitialValueCfg | undefined>(() => {\n return control.value.uischema?.options?.deriveInitialValue as\n | DeriveInitialValueCfg\n | undefined;\n });\n\n // Compute the resolved URL reactively\n const resolvedUrl = computed<string | null>(() => {\n const c = cfg.value;\n if (!c?.config?.url) return null;\n const rendered = renderTpl(c.config.url, { data: rootData.value });\n if (hasUnresolvedTemplates(c.config.url, rendered)) return null;\n return rendered;\n });\n\n const lastFetchedUrl = ref<string | null>(null);\n const loading = ref(false);\n const error = ref<string | undefined>(undefined);\n\n watch(\n resolvedUrl,\n async (url) => {\n if (!url || !cfg.value) return;\n // Only fetch when the URL changes (new context).\n // Same URL = same context; don't override user selection.\n if (url === lastFetchedUrl.value) return;\n lastFetchedUrl.value = url;\n\n loading.value = true;\n error.value = undefined;\n\n try {\n const c = cfg.value.config;\n const fullUrl = new URL(url);\n\n // Query params\n const q = renderObj(c.query ?? {}, {\n data: rootData.value,\n }) as Record<string, unknown>;\n for (const [k, v] of Object.entries(q)) {\n if (v !== undefined && v !== \"\")\n fullUrl.searchParams.set(k, String(v));\n }\n\n // Headers\n const baseHeaders = renderObj(c.headers ?? {}, {\n data: rootData.value,\n }) as Record<string, string>;\n const authHeaders = buildAuthHeaders(c.auth, auth);\n const headers = { ...baseHeaders, ...authHeaders };\n\n const method = c.method ?? \"GET\";\n const requestInit: RequestInit = { method, headers };\n if (method !== \"GET\" && c.body) {\n requestInit.body = JSON.stringify(\n renderObj(c.body, { data: rootData.value }),\n );\n }\n\n const res = await fetch(fullUrl.toString(), requestInit);\n if (!res.ok) {\n if (c.showError !== false) {\n throw new Error(`REST ${res.status}`);\n }\n return;\n }\n\n const json = await res.json();\n let items = jp(json, c.items);\n\n // Apply transforms if provided\n if (c.transforms && c.transforms.length > 0) {\n items = applyTransformPipeline(items, c.transforms);\n }\n\n if (items.length === 0) return; // No items → leave field empty\n\n // Extract value from first item\n const derivedValue = jp(items[0], c.map.value)[0];\n if (derivedValue !== undefined) {\n handleChange(control.value.path, derivedValue);\n }\n } catch (e) {\n error.value = (e as Error)?.message ?? String(e);\n console.warn(\n `deriveInitialValue fetch failed for ${control.value.path}:`,\n e,\n );\n } finally {\n loading.value = false;\n }\n },\n { immediate: true },\n );\n\n return { loading, error };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Ref, type ComputedRef } from "vue";
2
+ export declare function useDirtyValidation(control: Ref<{
3
+ errors: string;
4
+ }>, errorsOverride?: Ref<string> | ComputedRef<string>): {
5
+ hasInteracted: Ref<boolean, boolean>;
6
+ showErrors: ComputedRef<boolean>;
7
+ markDirty: () => void;
8
+ };
9
+ //# sourceMappingURL=useDirtyValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDirtyValidation.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useDirtyValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAEhE,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,GAAG,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAChC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;;;;EAenD"}
@@ -0,0 +1,15 @@
1
+ import { ref, computed } from "vue";
2
+ function useDirtyValidation(control, errorsOverride) {
3
+ const hasInteracted = ref(false);
4
+ const showErrors = computed(
5
+ () => hasInteracted.value && !!(errorsOverride ? errorsOverride.value : control.value.errors)
6
+ );
7
+ const markDirty = () => {
8
+ hasInteracted.value = true;
9
+ };
10
+ return { hasInteracted, showErrors, markDirty };
11
+ }
12
+ export {
13
+ useDirtyValidation
14
+ };
15
+ //# sourceMappingURL=useDirtyValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDirtyValidation.js","sources":["../../../src/vue/composables/useDirtyValidation.ts"],"sourcesContent":["import { ref, computed, type Ref, type ComputedRef } from \"vue\";\n\nexport function useDirtyValidation(\n control: Ref<{ errors: string }>,\n errorsOverride?: Ref<string> | ComputedRef<string>,\n) {\n const hasInteracted = ref(false);\n\n const showErrors = computed(\n () =>\n hasInteracted.value &&\n !!(errorsOverride ? errorsOverride.value : control.value.errors),\n );\n\n const markDirty = () => {\n hasInteracted.value = true;\n };\n\n return { hasInteracted, showErrors, markDirty };\n}\n"],"names":[],"mappings":";AAEO,SAAS,mBACd,SACA,gBACA;AACA,QAAM,gBAAgB,IAAI,KAAK;AAE/B,QAAM,aAAa;AAAA,IACjB,MACE,cAAc,SACd,CAAC,EAAE,iBAAiB,eAAe,QAAQ,QAAQ,MAAM;AAAA,EAAA;AAG7D,QAAM,YAAY,MAAM;AACtB,kBAAc,QAAQ;AAAA,EACxB;AAEA,SAAO,EAAE,eAAe,YAAY,UAAA;AACtC;"}
@@ -0,0 +1,42 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ interface ProjectionControl {
3
+ data: unknown;
4
+ path: string;
5
+ errors: string;
6
+ label?: string;
7
+ required?: boolean;
8
+ schema: Record<string, any>;
9
+ uischema: {
10
+ options?: {
11
+ projection?: string;
12
+ [key: string]: unknown;
13
+ };
14
+ };
15
+ }
16
+ export interface ProjectionResult {
17
+ /** The value at the projected path (for rendering) */
18
+ projectedData: ComputedRef<unknown>;
19
+ /** The schema at the projected path (for renderer selection) */
20
+ projectedSchema: ComputedRef<Record<string, any>>;
21
+ /** Wrapped handleChange that writes through the projection */
22
+ handleProjectedChange: (path: string, value: unknown) => void;
23
+ /** Whether projection is active */
24
+ hasProjection: boolean;
25
+ /** Resolved display label (options.label → projected schema title → control.label) */
26
+ projectedLabel: ComputedRef<string>;
27
+ /** Error string combining base-path and projected sub-path errors */
28
+ projectedErrors: ComputedRef<string>;
29
+ }
30
+ /**
31
+ * Composable that wraps a JSON Forms control with projection support.
32
+ *
33
+ * When `options.projection` is set on the uischema, this composable:
34
+ * - Reads the projected sub-value from the control data
35
+ * - Resolves the projected sub-schema for renderer type resolution
36
+ * - Wraps handleChange to write back through the projection path (preserving siblings)
37
+ *
38
+ * When no projection is set, it passes through control data/schema/handleChange unchanged.
39
+ */
40
+ export declare function useProjection(control: Ref<ProjectionControl>, handleChange: (path: string, value: unknown) => void): ProjectionResult;
41
+ export {};
42
+ //# sourceMappingURL=useProjection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjection.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useProjection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AASnE,UAAU,iBAAiB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,UAAU,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CACzE;AAqGD,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,gEAAgE;IAEhE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,8DAA8D;IAC9D,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,mCAAmC;IACnC,aAAa,EAAE,OAAO,CAAC;IACvB,sFAAsF;IACtF,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,qEAAqE;IACrE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GACnD,gBAAgB,CAgGlB"}
@@ -0,0 +1,116 @@
1
+ import { computed, inject } from "vue";
2
+ import { getProjectedValue, getProjectedSchema, parseProjectionPath, setProjectedValue } from "../../core/projection.js";
3
+ import { deref } from "../../core/refs.js";
4
+ function resolveLabel(ctrl, schemaTitle, required) {
5
+ const base = ctrl.uischema?.options?.label ?? schemaTitle ?? ctrl.label ?? "";
6
+ if (!base) return base;
7
+ return required ? `${base} *` : base;
8
+ }
9
+ function isProjectedFieldRequired(schema, path, root) {
10
+ const segments = parseProjectionPath(path);
11
+ if (segments.length === 0) return false;
12
+ const rootSchema = root ?? schema;
13
+ let current = deref(schema, rootSchema);
14
+ for (let i = 0; i < segments.length - 1; i++) {
15
+ const seg = segments[i];
16
+ if (typeof seg === "number") {
17
+ current = deref(current?.items, rootSchema);
18
+ } else {
19
+ current = deref(current?.properties?.[seg], rootSchema);
20
+ }
21
+ if (!current) return false;
22
+ }
23
+ const last = segments[segments.length - 1];
24
+ if (typeof last !== "string") return false;
25
+ current = deref(current, rootSchema);
26
+ return Array.isArray(current?.required) && current.required.includes(last);
27
+ }
28
+ function normalizeErrors(errors) {
29
+ if (!errors) return errors;
30
+ return errors.replace(/is a required property/g, "is required").replace(/must have required property '[^']*'/g, "is required");
31
+ }
32
+ function prefixErrors(label, errors) {
33
+ if (!label || !errors) return errors;
34
+ return errors.split("\n").map((line) => `${label} ${line}`).join("\n");
35
+ }
36
+ function getErrorPath(error) {
37
+ let p = (error.instancePath || "").replace(/\//g, ".").replace(/^\./, "");
38
+ if (error.keyword === "required" && error.params?.missingProperty) {
39
+ p = p ? p + "." + error.params.missingProperty : error.params.missingProperty;
40
+ }
41
+ return p;
42
+ }
43
+ function useProjection(control, handleChange) {
44
+ const projection = control.value.uischema?.options?.projection;
45
+ if (!projection) {
46
+ const label2 = computed(
47
+ () => resolveLabel(control.value, void 0, control.value.required)
48
+ );
49
+ return {
50
+ projectedData: computed(() => control.value.data),
51
+ projectedSchema: computed(() => control.value.schema),
52
+ handleProjectedChange: handleChange,
53
+ hasProjection: false,
54
+ projectedLabel: label2,
55
+ projectedErrors: computed(
56
+ () => prefixErrors(
57
+ label2.value.replace(/\*$/, "").trim(),
58
+ normalizeErrors(control.value.errors)
59
+ )
60
+ )
61
+ };
62
+ }
63
+ const jsonforms = inject("jsonforms", null);
64
+ const fullProjectedPath = control.value.path + "." + projection;
65
+ const projectedData = computed(
66
+ () => getProjectedValue(control.value.data, projection)
67
+ );
68
+ const projectedSchema = computed(
69
+ () => getProjectedSchema(control.value.schema, projection)
70
+ );
71
+ const projectedRequired = computed(
72
+ () => isProjectedFieldRequired(
73
+ control.value.schema,
74
+ projection,
75
+ jsonforms?.core?.schema ?? control.value.schema
76
+ )
77
+ );
78
+ const label = computed(
79
+ () => resolveLabel(
80
+ control.value,
81
+ projectedSchema.value?.title,
82
+ projectedRequired.value
83
+ )
84
+ );
85
+ const projectedErrors = computed(() => {
86
+ const baseErrors = normalizeErrors(control.value.errors || "");
87
+ const rawErrors = jsonforms?.core?.errors ?? [];
88
+ const matching = rawErrors.filter(
89
+ (err) => getErrorPath(err) === fullProjectedPath
90
+ );
91
+ let errStr;
92
+ if (matching.length === 0) {
93
+ errStr = baseErrors;
94
+ } else {
95
+ const projMsg = matching.map((e) => e.keyword === "required" ? "is required" : e.message).filter(Boolean).join("\n");
96
+ errStr = [baseErrors, projMsg].filter(Boolean).join("\n");
97
+ }
98
+ return prefixErrors(label.value.replace(/\*$/, "").trim(), errStr);
99
+ });
100
+ const handleProjectedChange = (path, value) => {
101
+ const fullValue = setProjectedValue(control.value.data, projection, value);
102
+ handleChange(path, fullValue);
103
+ };
104
+ return {
105
+ projectedData,
106
+ projectedSchema,
107
+ handleProjectedChange,
108
+ hasProjection: true,
109
+ projectedLabel: label,
110
+ projectedErrors
111
+ };
112
+ }
113
+ export {
114
+ useProjection
115
+ };
116
+ //# sourceMappingURL=useProjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjection.js","sources":["../../../src/vue/composables/useProjection.ts"],"sourcesContent":["import { computed, inject, type ComputedRef, type Ref } from \"vue\";\nimport {\n getProjectedValue,\n setProjectedValue,\n getProjectedSchema,\n parseProjectionPath,\n} from \"../../core/projection\";\nimport { deref } from \"../../core/refs\";\n\ninterface ProjectionControl {\n data: unknown;\n path: string;\n errors: string;\n label?: string;\n required?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: Record<string, any>;\n uischema: { options?: { projection?: string; [key: string]: unknown } };\n}\n\n// Minimal AJV ErrorObject shape for filtering\ninterface ErrorLike {\n instancePath?: string;\n keyword?: string;\n message?: string;\n params?: { missingProperty?: string };\n}\n\n/**\n * Resolve the display label for a control.\n * Priority: uischema options.label → schemaTitle (projected sub-schema) → control.label.\n * Appends a trailing asterisk when the control is for a required property.\n */\nfunction resolveLabel(\n ctrl: ProjectionControl,\n schemaTitle?: string,\n required?: boolean,\n): string {\n const base =\n (ctrl.uischema?.options?.label as string) ??\n schemaTitle ??\n ctrl.label ??\n \"\";\n if (!base) return base;\n return required ? `${base} *` : base;\n}\n\n/**\n * Determine whether the leaf of a projection path is listed in its parent\n * schema's `required` array. Numeric leaf segments (array indices) are not\n * considered \"required properties\".\n *\n * Dereferences `$ref` at every step against `root` (defaulting to `schema`)\n * so that schemas like `items: { $ref: '#/$defs/Foo' }` resolve correctly.\n */\nfunction isProjectedFieldRequired(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: Record<string, any>,\n path: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n root?: Record<string, any>,\n): boolean {\n const segments = parseProjectionPath(path);\n if (segments.length === 0) return false;\n const rootSchema = root ?? schema;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: Record<string, any> | undefined = deref(schema, rootSchema);\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!;\n if (typeof seg === \"number\") {\n current = deref(current?.items, rootSchema);\n } else {\n current = deref(current?.properties?.[seg], rootSchema);\n }\n if (!current) return false;\n }\n const last = segments[segments.length - 1];\n if (typeof last !== \"string\") return false;\n current = deref(current, rootSchema);\n return Array.isArray(current?.required) && current.required.includes(last);\n}\n\n/**\n * Normalize AJV error message fragments into user-friendly text.\n * e.g. \"is a required property\" → \"is required\"\n */\nfunction normalizeErrors(errors: string): string {\n if (!errors) return errors;\n return errors\n .replace(/is a required property/g, \"is required\")\n .replace(/must have required property '[^']*'/g, \"is required\");\n}\n\n/**\n * Prefix each error message line with the field label so that AJV fragments\n * like \"is required\" become \"Name is required\".\n */\nfunction prefixErrors(label: string, errors: string): string {\n if (!label || !errors) return errors;\n return errors\n .split(\"\\n\")\n .map((line) => `${label} ${line}`)\n .join(\"\\n\");\n}\n\n/**\n * Convert an AJV ErrorObject's instancePath to a dot-separated control path.\n * Replicates the logic from @jsonforms/core getControlPath.\n */\nfunction getErrorPath(error: ErrorLike): string {\n let p = (error.instancePath || \"\").replace(/\\//g, \".\").replace(/^\\./, \"\");\n if (error.keyword === \"required\" && error.params?.missingProperty) {\n p = p\n ? p + \".\" + error.params.missingProperty\n : error.params.missingProperty;\n }\n return p;\n}\n\nexport interface ProjectionResult {\n /** The value at the projected path (for rendering) */\n projectedData: ComputedRef<unknown>;\n /** The schema at the projected path (for renderer selection) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n projectedSchema: ComputedRef<Record<string, any>>;\n /** Wrapped handleChange that writes through the projection */\n handleProjectedChange: (path: string, value: unknown) => void;\n /** Whether projection is active */\n hasProjection: boolean;\n /** Resolved display label (options.label → projected schema title → control.label) */\n projectedLabel: ComputedRef<string>;\n /** Error string combining base-path and projected sub-path errors */\n projectedErrors: ComputedRef<string>;\n}\n\n/**\n * Composable that wraps a JSON Forms control with projection support.\n *\n * When `options.projection` is set on the uischema, this composable:\n * - Reads the projected sub-value from the control data\n * - Resolves the projected sub-schema for renderer type resolution\n * - Wraps handleChange to write back through the projection path (preserving siblings)\n *\n * When no projection is set, it passes through control data/schema/handleChange unchanged.\n */\nexport function useProjection(\n control: Ref<ProjectionControl>,\n handleChange: (path: string, value: unknown) => void,\n): ProjectionResult {\n const projection = control.value.uischema?.options?.projection as\n | string\n | undefined;\n\n if (!projection) {\n const label = computed(() =>\n resolveLabel(control.value, undefined, control.value.required),\n );\n return {\n projectedData: computed(() => control.value.data),\n projectedSchema: computed(() => control.value.schema),\n handleProjectedChange: handleChange,\n hasProjection: false,\n projectedLabel: label,\n projectedErrors: computed(() =>\n prefixErrors(\n label.value.replace(/\\*$/, \"\").trim(),\n normalizeErrors(control.value.errors),\n ),\n ),\n };\n }\n\n // Inject JSONForms state to access raw AJV errors for projected sub-paths,\n // and the root schema so that `$ref` resolution inside the projected slice\n // can find `$defs` (which live at the root, not on the control's schema).\n const jsonforms = inject<{\n core?: {\n errors?: ErrorLike[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: Record<string, any>;\n };\n } | null>(\"jsonforms\", null);\n\n const fullProjectedPath = control.value.path + \".\" + projection;\n\n const projectedData = computed(() =>\n getProjectedValue(control.value.data, projection),\n );\n\n const projectedSchema = computed(() =>\n getProjectedSchema(control.value.schema, projection),\n );\n\n const projectedRequired = computed(() =>\n isProjectedFieldRequired(\n control.value.schema,\n projection,\n jsonforms?.core?.schema ?? control.value.schema,\n ),\n );\n\n const label = computed(() =>\n resolveLabel(\n control.value,\n projectedSchema.value?.title,\n projectedRequired.value,\n ),\n );\n\n const projectedErrors = computed(() => {\n const baseErrors = normalizeErrors(control.value.errors || \"\");\n\n const rawErrors = jsonforms?.core?.errors ?? ([] as ErrorLike[]);\n const matching = rawErrors.filter(\n (err) => getErrorPath(err) === fullProjectedPath,\n );\n\n let errStr: string;\n if (matching.length === 0) {\n errStr = baseErrors;\n } else {\n const projMsg = matching\n .map((e) => (e.keyword === \"required\" ? \"is required\" : e.message))\n .filter(Boolean)\n .join(\"\\n\");\n errStr = [baseErrors, projMsg].filter(Boolean).join(\"\\n\");\n }\n\n return prefixErrors(label.value.replace(/\\*$/, \"\").trim(), errStr);\n });\n\n const handleProjectedChange = (path: string, value: unknown) => {\n const fullValue = setProjectedValue(control.value.data, projection, value);\n handleChange(path, fullValue);\n };\n\n return {\n projectedData,\n projectedSchema,\n handleProjectedChange,\n hasProjection: true,\n projectedLabel: label,\n projectedErrors,\n };\n}\n"],"names":["label"],"mappings":"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"}
@@ -3,8 +3,8 @@ import type { ProviderBinding, ProviderItem } from "../../core/types";
3
3
  export declare function useProvider(binding: ProviderBinding | Ref<ProviderBinding> | ComputedRef<ProviderBinding>, ctxBits: {
4
4
  data: unknown | Ref<unknown> | ComputedRef<unknown>;
5
5
  path: string;
6
- dependsOnValues?: unknown[];
7
- uiQuery?: string;
6
+ dependsOnValues?: unknown[] | Ref<unknown[]> | ComputedRef<unknown[]>;
7
+ uiQuery?: string | Ref<string | undefined> | ComputedRef<string | undefined>;
8
8
  }): {
9
9
  items: Ref<{
10
10
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useProvider.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAIhB,KAAK,GAAG,EAIT,MAAM,KAAK,CAAC;AAGb,OAAO,KAAK,EAEV,eAAe,EACf,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,WAAW,CACzB,OAAO,EACH,eAAe,GACf,GAAG,CAAC,eAAe,CAAC,GACpB,WAAW,CAAC,eAAe,CAAC,EAChC,OAAO,EAAE;IACP,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;;;;;;;;;EAsEF"}
1
+ {"version":3,"file":"useProvider.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAIhB,KAAK,GAAG,EAIT,MAAM,KAAK,CAAC;AAIb,OAAO,KAAK,EAEV,eAAe,EACf,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,WAAW,CACzB,OAAO,EACH,eAAe,GACf,GAAG,CAAC,eAAe,CAAC,GACpB,WAAW,CAAC,eAAe,CAAC,EAChC,OAAO,EAAE;IACP,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EACJ,MAAM,GACN,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GACvB,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACrC;;;;;;;;;;;;;EAmFF"}
@@ -1,6 +1,7 @@
1
1
  import { inject, ref, computed, unref, onBeforeUnmount, watch } from "vue";
2
2
  import { cache } from "../../core/cache.js";
3
3
  import { registry } from "../../core/registry.js";
4
+ import { renderObj } from "../../core/templating.js";
4
5
  function useProvider(binding, ctxBits) {
5
6
  const registry$1 = inject("providerRegistry", registry);
6
7
  const cache$1 = inject("providerCache", cache);
@@ -9,15 +10,18 @@ function useProvider(binding, ctxBits) {
9
10
  const loading = ref(false);
10
11
  const error = ref(void 0);
11
12
  const ac = new AbortController();
12
- const cacheKey = computed(
13
- () => JSON.stringify({
14
- b: unref(binding),
15
- d: ctxBits.dependsOnValues ?? [],
16
- q: ctxBits.uiQuery ?? "",
17
- data: unref(ctxBits.data)
18
- // Include data in cache key for reactivity
19
- })
20
- );
13
+ const cacheKey = computed(() => {
14
+ const b = unref(binding);
15
+ const renderedBinding = b ? {
16
+ ...b,
17
+ config: renderObj(b.config ?? {}, { data: unref(ctxBits.data) })
18
+ } : b;
19
+ return JSON.stringify({
20
+ b: renderedBinding,
21
+ d: unref(ctxBits.dependsOnValues) ?? [],
22
+ q: unref(ctxBits.uiQuery) ?? ""
23
+ });
24
+ });
21
25
  async function load() {
22
26
  const bindingValue = unref(binding);
23
27
  if (!bindingValue) return;
@@ -39,7 +43,7 @@ function useProvider(binding, ctxBits) {
39
43
  const out = await driver.resolve(bindingValue.config ?? {}, {
40
44
  data: unref(ctxBits.data),
41
45
  path: ctxBits.path,
42
- ui: { query: ctxBits.uiQuery },
46
+ ui: { query: unref(ctxBits.uiQuery) },
43
47
  signal: ac.signal,
44
48
  auth: resolveAuth(bindingValue.auth, auth)
45
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useProvider.js","sources":["../../../src/vue/composables/useProvider.ts"],"sourcesContent":["import {\n type ComputedRef,\n computed,\n inject,\n onBeforeUnmount,\n type Ref,\n ref,\n unref,\n watch,\n} from \"vue\";\nimport { cache as globalCache } from \"../../core/cache\";\nimport { registry as globalRegistry } from \"../../core/registry\";\nimport type {\n AuthConfig,\n ProviderBinding,\n ProviderItem,\n ProviderOutput,\n} from \"../../core/types\";\n\nexport function useProvider(\n binding:\n | ProviderBinding\n | Ref<ProviderBinding>\n | ComputedRef<ProviderBinding>,\n ctxBits: {\n data: unknown | Ref<unknown> | ComputedRef<unknown>;\n path: string;\n dependsOnValues?: unknown[];\n uiQuery?: string;\n },\n) {\n const registry = inject(\"providerRegistry\", globalRegistry);\n const cache = inject(\"providerCache\", globalCache);\n const auth = inject(\"providerAuth\", {}) as Record<\n string,\n (() => string) | string\n >;\n\n const items = ref<ProviderItem[]>([]);\n const loading = ref(false);\n const error = ref<string | undefined>(undefined);\n const ac = new AbortController();\n\n const cacheKey = computed(() =>\n JSON.stringify({\n b: unref(binding),\n d: ctxBits.dependsOnValues ?? [],\n q: ctxBits.uiQuery ?? \"\",\n data: unref(ctxBits.data), // Include data in cache key for reactivity\n }),\n );\n\n async function load() {\n const bindingValue = unref(binding);\n if (!bindingValue) return;\n loading.value = true;\n error.value = undefined;\n const hit = cache.get(cacheKey.value) as ProviderOutput | undefined;\n if (hit) {\n items.value = hit.items;\n loading.value = false;\n return;\n }\n try {\n const driver = registry.get(bindingValue.protocol);\n if (!driver) {\n throw new Error(\n `No provider registered for protocol: ${bindingValue.protocol}`,\n );\n }\n const out = await driver.resolve(bindingValue.config ?? {}, {\n data: unref(ctxBits.data),\n path: ctxBits.path,\n ui: { query: ctxBits.uiQuery },\n signal: ac.signal,\n auth: resolveAuth(bindingValue.auth, auth),\n });\n items.value = out.items;\n cache.set(cacheKey.value, out, bindingValue.cacheTTL ?? out.ttl ?? 0);\n } catch (e) {\n error.value = (e as Error)?.message ?? String(e);\n items.value = [];\n } finally {\n loading.value = false;\n }\n }\n\n onBeforeUnmount(() => ac.abort());\n watch(\n [cacheKey],\n () => {\n const bindingValue = unref(binding);\n if (bindingValue?.load === \"mount\" || bindingValue?.load === \"query\")\n load();\n },\n { immediate: unref(binding)?.load === \"mount\" },\n );\n\n return { items, loading, error, reload: load };\n}\n\nfunction resolveAuth(\n spec: AuthConfig | undefined,\n authBag: Record<string, (() => string) | string>,\n): AuthConfig {\n if (!spec) return {};\n if (spec.use && typeof authBag[spec.use] === \"function\") {\n const authFunc = authBag[spec.use] as () => string;\n return { [spec.use]: authFunc() };\n }\n return spec;\n}\n"],"names":["registry","globalRegistry","cache","globalCache"],"mappings":";;;AAmBO,SAAS,YACd,SAIA,SAMA;AACA,QAAMA,aAAW,OAAO,oBAAoBC,QAAc;AAC1D,QAAMC,UAAQ,OAAO,iBAAiBC,KAAW;AACjD,QAAM,OAAO,OAAO,gBAAgB,EAAE;AAKtC,QAAM,QAAQ,IAAoB,EAAE;AACpC,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,QAAQ,IAAwB,MAAS;AAC/C,QAAM,KAAK,IAAI,gBAAA;AAEf,QAAM,WAAW;AAAA,IAAS,MACxB,KAAK,UAAU;AAAA,MACb,GAAG,MAAM,OAAO;AAAA,MAChB,GAAG,QAAQ,mBAAmB,CAAA;AAAA,MAC9B,GAAG,QAAQ,WAAW;AAAA,MACtB,MAAM,MAAM,QAAQ,IAAI;AAAA;AAAA,IAAA,CACzB;AAAA,EAAA;AAGH,iBAAe,OAAO;AACpB,UAAM,eAAe,MAAM,OAAO;AAClC,QAAI,CAAC,aAAc;AACnB,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,UAAM,MAAMD,QAAM,IAAI,SAAS,KAAK;AACpC,QAAI,KAAK;AACP,YAAM,QAAQ,IAAI;AAClB,cAAQ,QAAQ;AAChB;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAASF,WAAS,IAAI,aAAa,QAAQ;AACjD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR,wCAAwC,aAAa,QAAQ;AAAA,QAAA;AAAA,MAEjE;AACA,YAAM,MAAM,MAAM,OAAO,QAAQ,aAAa,UAAU,IAAI;AAAA,QAC1D,MAAM,MAAM,QAAQ,IAAI;AAAA,QACxB,MAAM,QAAQ;AAAA,QACd,IAAI,EAAE,OAAO,QAAQ,QAAA;AAAA,QACrB,QAAQ,GAAG;AAAA,QACX,MAAM,YAAY,aAAa,MAAM,IAAI;AAAA,MAAA,CAC1C;AACD,YAAM,QAAQ,IAAI;AAClBE,cAAM,IAAI,SAAS,OAAO,KAAK,aAAa,YAAY,IAAI,OAAO,CAAC;AAAA,IACtE,SAAS,GAAG;AACV,YAAM,QAAS,GAAa,WAAW,OAAO,CAAC;AAC/C,YAAM,QAAQ,CAAA;AAAA,IAChB,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,kBAAgB,MAAM,GAAG,OAAO;AAChC;AAAA,IACE,CAAC,QAAQ;AAAA,IACT,MAAM;AACJ,YAAM,eAAe,MAAM,OAAO;AAClC,UAAI,cAAc,SAAS,WAAW,cAAc,SAAS;AAC3D,aAAA;AAAA,IACJ;AAAA,IACA,EAAE,WAAW,MAAM,OAAO,GAAG,SAAS,QAAA;AAAA,EAAQ;AAGhD,SAAO,EAAE,OAAO,SAAS,OAAO,QAAQ,KAAA;AAC1C;AAEA,SAAS,YACP,MACA,SACY;AACZ,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,MAAI,KAAK,OAAO,OAAO,QAAQ,KAAK,GAAG,MAAM,YAAY;AACvD,UAAM,WAAW,QAAQ,KAAK,GAAG;AACjC,WAAO,EAAE,CAAC,KAAK,GAAG,GAAG,WAAS;AAAA,EAChC;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"useProvider.js","sources":["../../../src/vue/composables/useProvider.ts"],"sourcesContent":["import {\n type ComputedRef,\n computed,\n inject,\n onBeforeUnmount,\n type Ref,\n ref,\n unref,\n watch,\n} from \"vue\";\nimport { cache as globalCache } from \"../../core/cache\";\nimport { registry as globalRegistry } from \"../../core/registry\";\nimport { renderObj } from \"../../core/templating\";\nimport type {\n AuthConfig,\n ProviderBinding,\n ProviderItem,\n ProviderOutput,\n} from \"../../core/types\";\n\nexport function useProvider(\n binding:\n | ProviderBinding\n | Ref<ProviderBinding>\n | ComputedRef<ProviderBinding>,\n ctxBits: {\n data: unknown | Ref<unknown> | ComputedRef<unknown>;\n path: string;\n dependsOnValues?: unknown[] | Ref<unknown[]> | ComputedRef<unknown[]>;\n uiQuery?:\n | string\n | Ref<string | undefined>\n | ComputedRef<string | undefined>;\n },\n) {\n const registry = inject(\"providerRegistry\", globalRegistry);\n const cache = inject(\"providerCache\", globalCache);\n const auth = inject(\"providerAuth\", {}) as Record<\n string,\n (() => string) | string\n >;\n\n const items = ref<ProviderItem[]>([]);\n const loading = ref(false);\n const error = ref<string | undefined>(undefined);\n const ac = new AbortController();\n\n // Cache key keys on the *rendered* binding config (with template variables\n // substituted) plus dependsOnValues + uiQuery. This means:\n // - `{{data.country}}` in the URL → cache key changes when country changes,\n // auto-refetching without callers having to declare dependsOn.\n // - Unrelated form fields → rendered URL is unchanged → no refetch.\n // The protocol's resolve() still receives the raw config and current data,\n // so per-fetch URL rendering works as before.\n const cacheKey = computed(() => {\n const b = unref(binding);\n const renderedBinding = b\n ? {\n ...b,\n config: renderObj(b.config ?? {}, { data: unref(ctxBits.data) }),\n }\n : b;\n return JSON.stringify({\n b: renderedBinding,\n d: unref(ctxBits.dependsOnValues) ?? [],\n q: unref(ctxBits.uiQuery) ?? \"\",\n });\n });\n\n async function load() {\n const bindingValue = unref(binding);\n if (!bindingValue) return;\n loading.value = true;\n error.value = undefined;\n const hit = cache.get(cacheKey.value) as ProviderOutput | undefined;\n if (hit) {\n items.value = hit.items;\n loading.value = false;\n return;\n }\n try {\n const driver = registry.get(bindingValue.protocol);\n if (!driver) {\n throw new Error(\n `No provider registered for protocol: ${bindingValue.protocol}`,\n );\n }\n const out = await driver.resolve(bindingValue.config ?? {}, {\n data: unref(ctxBits.data),\n path: ctxBits.path,\n ui: { query: unref(ctxBits.uiQuery) },\n signal: ac.signal,\n auth: resolveAuth(bindingValue.auth, auth),\n });\n items.value = out.items;\n cache.set(cacheKey.value, out, bindingValue.cacheTTL ?? out.ttl ?? 0);\n } catch (e) {\n error.value = (e as Error)?.message ?? String(e);\n items.value = [];\n } finally {\n loading.value = false;\n }\n }\n\n onBeforeUnmount(() => ac.abort());\n watch(\n [cacheKey],\n () => {\n const bindingValue = unref(binding);\n if (bindingValue?.load === \"mount\" || bindingValue?.load === \"query\")\n load();\n },\n { immediate: unref(binding)?.load === \"mount\" },\n );\n\n return { items, loading, error, reload: load };\n}\n\nfunction resolveAuth(\n spec: AuthConfig | undefined,\n authBag: Record<string, (() => string) | string>,\n): AuthConfig {\n if (!spec) return {};\n if (spec.use && typeof authBag[spec.use] === \"function\") {\n const authFunc = authBag[spec.use] as () => string;\n return { [spec.use]: authFunc() };\n }\n return spec;\n}\n"],"names":["registry","globalRegistry","cache","globalCache"],"mappings":";;;;AAoBO,SAAS,YACd,SAIA,SASA;AACA,QAAMA,aAAW,OAAO,oBAAoBC,QAAc;AAC1D,QAAMC,UAAQ,OAAO,iBAAiBC,KAAW;AACjD,QAAM,OAAO,OAAO,gBAAgB,EAAE;AAKtC,QAAM,QAAQ,IAAoB,EAAE;AACpC,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,QAAQ,IAAwB,MAAS;AAC/C,QAAM,KAAK,IAAI,gBAAA;AASf,QAAM,WAAW,SAAS,MAAM;AAC9B,UAAM,IAAI,MAAM,OAAO;AACvB,UAAM,kBAAkB,IACpB;AAAA,MACE,GAAG;AAAA,MACH,QAAQ,UAAU,EAAE,UAAU,CAAA,GAAI,EAAE,MAAM,MAAM,QAAQ,IAAI,EAAA,CAAG;AAAA,IAAA,IAEjE;AACJ,WAAO,KAAK,UAAU;AAAA,MACpB,GAAG;AAAA,MACH,GAAG,MAAM,QAAQ,eAAe,KAAK,CAAA;AAAA,MACrC,GAAG,MAAM,QAAQ,OAAO,KAAK;AAAA,IAAA,CAC9B;AAAA,EACH,CAAC;AAED,iBAAe,OAAO;AACpB,UAAM,eAAe,MAAM,OAAO;AAClC,QAAI,CAAC,aAAc;AACnB,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AACd,UAAM,MAAMD,QAAM,IAAI,SAAS,KAAK;AACpC,QAAI,KAAK;AACP,YAAM,QAAQ,IAAI;AAClB,cAAQ,QAAQ;AAChB;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAASF,WAAS,IAAI,aAAa,QAAQ;AACjD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR,wCAAwC,aAAa,QAAQ;AAAA,QAAA;AAAA,MAEjE;AACA,YAAM,MAAM,MAAM,OAAO,QAAQ,aAAa,UAAU,IAAI;AAAA,QAC1D,MAAM,MAAM,QAAQ,IAAI;AAAA,QACxB,MAAM,QAAQ;AAAA,QACd,IAAI,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAA;AAAA,QAClC,QAAQ,GAAG;AAAA,QACX,MAAM,YAAY,aAAa,MAAM,IAAI;AAAA,MAAA,CAC1C;AACD,YAAM,QAAQ,IAAI;AAClBE,cAAM,IAAI,SAAS,OAAO,KAAK,aAAa,YAAY,IAAI,OAAO,CAAC;AAAA,IACtE,SAAS,GAAG;AACV,YAAM,QAAS,GAAa,WAAW,OAAO,CAAC;AAC/C,YAAM,QAAQ,CAAA;AAAA,IAChB,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,kBAAgB,MAAM,GAAG,OAAO;AAChC;AAAA,IACE,CAAC,QAAQ;AAAA,IACT,MAAM;AACJ,YAAM,eAAe,MAAM,OAAO;AAClC,UAAI,cAAc,SAAS,WAAW,cAAc,SAAS;AAC3D,aAAA;AAAA,IACJ;AAAA,IACA,EAAE,WAAW,MAAM,OAAO,GAAG,SAAS,QAAA;AAAA,EAAQ;AAGhD,SAAO,EAAE,OAAO,SAAS,OAAO,QAAQ,KAAA;AAC1C;AAEA,SAAS,YACP,MACA,SACY;AACZ,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,MAAI,KAAK,OAAO,OAAO,QAAQ,KAAK,GAAG,MAAM,YAAY;AACvD,UAAM,WAAW,QAAQ,KAAK,GAAG;AACjC,WAAO,EAAE,CAAC,KAAK,GAAG,GAAG,WAAS;AAAA,EAChC;AACA,SAAO;AACT;"}
@@ -2,6 +2,7 @@ import type { UISchemaElement } from "@jsonforms/core";
2
2
  import ProviderAutocomplete from "./components/ProviderAutocomplete.vue";
3
3
  import ProviderSelect from "./components/ProviderSelect.vue";
4
4
  import ProviderMultiSelect from "./components/ProviderMultiSelect.vue";
5
+ import ProviderObjectMultiSelect from "./components/ProviderObjectMultiSelect.vue";
5
6
  export declare const providerRenderers: {
6
7
  tester: (uischema: UISchemaElement, schema: import("@jsonforms/core").JsonSchema, context: import("@jsonforms/core").TesterContext) => number;
7
8
  renderer: import("vue").DefineComponent<{
@@ -15,8 +16,15 @@ export declare const providerRenderers: {
15
16
  }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
17
  }[];
17
18
  export { primevueRenderers, registerPrimevueRenderers } from "./primevue";
18
- export { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };
19
+ export { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect, ProviderObjectMultiSelect, };
19
20
  export { useProvider } from "./composables/useProvider";
21
+ export { useProjection } from "./composables/useProjection";
22
+ export type { ProjectionResult } from "./composables/useProjection";
23
+ export { createDataLayer, useDataLayer } from "./composables/useDataLayer";
24
+ export type { DataLayer } from "./composables/useDataLayer";
25
+ export { useDeriveInitialValue } from "./composables/useDeriveInitialValue";
26
+ export type { DeriveInitialValueCfg } from "./composables/useDeriveInitialValue";
27
+ export { useDirtyValidation } from "./composables/useDirtyValidation";
20
28
  export * from "./testers";
21
29
  export { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean, } from "./primevue";
22
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AAoFvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;GAI7B,CAAC;AAGF,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAYvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,yBAAyB,MAAM,4CAA4C,CAAC;AAoGnF,eAAO,MAAM,iBAAiB;;;;;;;;;;;GAQ7B,CAAC;AAGF,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,yBAAyB,GAC1B,CAAC;AACF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
package/dist/vue/index.js CHANGED
@@ -1,9 +1,16 @@
1
- import { rankWith, and, or, isStringControl, isNumberControl, isControl } from "@jsonforms/core";
1
+ import { rankWith, and, or, isStringControl, isNumberControl, isIntegerControl, isControl } from "@jsonforms/core";
2
+ import { resolveScopeSchema } from "../core/resolveScope.js";
3
+ import { resolveItemsSchema } from "./utils/objectMultiSelect.js";
2
4
  import _sfc_main from "./components/ProviderAutocomplete.vue.js";
3
5
  import ProviderSelect from "./components/ProviderSelect.vue.js";
4
6
  import ProviderMultiSelect from "./components/ProviderMultiSelect.vue.js";
7
+ import ProviderObjectMultiSelect from "./components/ProviderObjectMultiSelect.vue.js";
5
8
  import { primevueRenderers, registerPrimevueRenderers } from "./primevue/index.js";
6
9
  import { useProvider } from "./composables/useProvider.js";
10
+ import { useProjection } from "./composables/useProjection.js";
11
+ import { createDataLayer, useDataLayer } from "./composables/useDataLayer.js";
12
+ import { useDeriveInitialValue } from "./composables/useDeriveInitialValue.js";
13
+ import { useDirtyValidation } from "./composables/useDirtyValidation.js";
7
14
  import { providerTester } from "./testers.js";
8
15
  import { default as default2 } from "./primevue/JfText.vue.js";
9
16
  import { default as default3 } from "./primevue/JfTextArea.vue.js";
@@ -14,64 +21,89 @@ import { default as default7 } from "./primevue/JfBoolean.vue.js";
14
21
  const hasProvider = (uischema) => {
15
22
  return uischema?.options?.provider !== void 0;
16
23
  };
24
+ const isIntegerScope = (uischema, schema) => {
25
+ const ui = uischema;
26
+ if (ui?.type !== "Control" || !ui?.scope) return false;
27
+ const propertySchema = resolveScopeSchema(
28
+ ui.scope,
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ schema
31
+ );
32
+ return propertySchema?.type === "integer";
33
+ };
17
34
  const providerSelectTester = rankWith(
18
- 106,
19
- // Higher than PrimeVue base (100) to ensure providers take precedence
35
+ 107,
36
+ // Higher than PrimeVue JfNumber integer renderer (106) so provider wins
20
37
  and(
21
38
  or(
22
39
  isStringControl,
23
40
  isNumberControl,
24
- and(isControl, (uischema, schema) => {
25
- const ui = uischema;
26
- const rootSchema = schema;
27
- if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
28
- return false;
29
- const propertyName = ui.scope.replace("#/properties/", "");
30
- const propertySchema = rootSchema.properties[propertyName];
31
- return propertySchema?.type === "integer";
32
- })
41
+ isIntegerControl,
42
+ and(isControl, isIntegerScope)
33
43
  ),
34
44
  hasProvider,
35
45
  (uischema) => !uischema?.options?.autocomplete
36
46
  )
37
47
  );
38
48
  const providerAutocompleteTester = rankWith(
39
- 107,
40
- // Higher than PrimeVue base (100) to ensure providers take precedence
49
+ 108,
50
+ // Higher than providerSelectTester so autocomplete variant wins when flagged
41
51
  and(
42
52
  or(
43
53
  isStringControl,
44
54
  isNumberControl,
45
- and(isControl, (uischema, schema) => {
46
- const ui = uischema;
47
- const rootSchema = schema;
48
- if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
49
- return false;
50
- const propertyName = ui.scope.replace("#/properties/", "");
51
- const propertySchema = rootSchema.properties[propertyName];
52
- return propertySchema?.type === "integer";
53
- })
55
+ isIntegerControl,
56
+ and(isControl, isIntegerScope)
54
57
  ),
55
58
  hasProvider,
56
59
  (uischema) => uischema?.options?.autocomplete === true
57
60
  )
58
61
  );
59
- const isArrayControl = (uischema, schema) => {
62
+ const getArraySchema = (uischema, schema) => {
60
63
  const controlSchema = uischema;
61
- if (controlSchema.type !== "Control" || !controlSchema.scope) {
62
- return false;
63
- }
64
- const rootSchema = schema;
65
- const propertyPath = controlSchema.scope.replace("#/properties/", "");
66
- const propertySchema = rootSchema?.properties?.[propertyPath];
67
- return propertySchema?.type === "array";
64
+ if (controlSchema.type !== "Control" || !controlSchema.scope) return void 0;
65
+ const propertySchema = resolveScopeSchema(
66
+ controlSchema.scope,
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ schema
69
+ );
70
+ if (propertySchema?.type !== "array") return void 0;
71
+ return propertySchema;
68
72
  };
73
+ const isObjectArrayControl = (uischema, schema) => {
74
+ const arr = getArraySchema(uischema, schema);
75
+ if (!arr) return false;
76
+ const items = resolveItemsSchema(
77
+ arr,
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ schema
80
+ );
81
+ return items?.type === "object";
82
+ };
83
+ const isScalarArrayControl = (uischema, schema) => {
84
+ const arr = getArraySchema(uischema, schema);
85
+ if (!arr) return false;
86
+ const items = resolveItemsSchema(
87
+ arr,
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ schema
90
+ );
91
+ return items?.type !== "object";
92
+ };
93
+ const providerObjectMultiSelectTester = rankWith(
94
+ 110,
95
+ // One higher than scalar multi-select so object-item arrays match first.
96
+ and(isObjectArrayControl, hasProvider)
97
+ );
69
98
  const providerMultiSelectTester = rankWith(
70
- 108,
71
- // Highest priority for array controls with providers
72
- and(isArrayControl, hasProvider)
99
+ 109,
100
+ and(isScalarArrayControl, hasProvider)
73
101
  );
74
102
  const providerRenderers = [
103
+ {
104
+ tester: providerObjectMultiSelectTester,
105
+ renderer: ProviderObjectMultiSelect
106
+ },
75
107
  { tester: providerMultiSelectTester, renderer: ProviderMultiSelect },
76
108
  { tester: providerAutocompleteTester, renderer: _sfc_main },
77
109
  { tester: providerSelectTester, renderer: ProviderSelect }
@@ -85,11 +117,17 @@ export {
85
117
  default3 as JfTextArea,
86
118
  _sfc_main as ProviderAutocomplete,
87
119
  ProviderMultiSelect,
120
+ ProviderObjectMultiSelect,
88
121
  ProviderSelect,
122
+ createDataLayer,
89
123
  primevueRenderers,
90
124
  providerRenderers,
91
125
  providerTester,
92
126
  registerPrimevueRenderers,
127
+ useDataLayer,
128
+ useDeriveInitialValue,
129
+ useDirtyValidation,
130
+ useProjection,
93
131
  useProvider
94
132
  };
95
133
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/vue/index.ts"],"sourcesContent":["import type { UISchemaElement } from \"@jsonforms/core\";\nimport {\n and,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n isControl,\n} from \"@jsonforms/core\";\nimport ProviderAutocomplete from \"./components/ProviderAutocomplete.vue\";\nimport ProviderSelect from \"./components/ProviderSelect.vue\";\nimport ProviderMultiSelect from \"./components/ProviderMultiSelect.vue\";\n\n// Custom tester that checks if provider option exists (as object or boolean)\nconst hasProvider = (uischema: UISchemaElement) => {\n return uischema?.options?.provider !== undefined;\n};\n\n// Create specific testers for each component type\nconst providerSelectTester = rankWith(\n 106, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(\n isStringControl,\n isNumberControl,\n and(isControl, (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n const rootSchema = schema as {\n properties?: Record<string, { type?: string }>;\n };\n\n if (ui?.type !== \"Control\" || !ui?.scope || !rootSchema?.properties)\n return false;\n\n // Extract property name from scope (e.g., \"#/properties/age\" -> \"age\")\n const propertyName = ui.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema.properties[propertyName];\n\n return propertySchema?.type === \"integer\";\n }),\n ),\n hasProvider,\n (uischema) => !uischema?.options?.autocomplete,\n ),\n);\n\nconst providerAutocompleteTester = rankWith(\n 107, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(\n isStringControl,\n isNumberControl,\n and(isControl, (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n const rootSchema = schema as {\n properties?: Record<string, { type?: string }>;\n };\n\n if (ui?.type !== \"Control\" || !ui?.scope || !rootSchema?.properties)\n return false;\n\n // Extract property name from scope (e.g., \"#/properties/age\" -> \"age\")\n const propertyName = ui.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema.properties[propertyName];\n\n return propertySchema?.type === \"integer\";\n }),\n ),\n hasProvider,\n (uischema) => uischema?.options?.autocomplete === true,\n ),\n);\n\n// Custom array tester - check both uischema control type and schema type\nconst isArrayControl = (uischema: UISchemaElement, schema: unknown) => {\n const controlSchema = uischema as { type: string; scope?: string };\n if (controlSchema.type !== \"Control\" || !controlSchema.scope) {\n return false;\n }\n\n // Extract the property schema from the root schema\n const rootSchema = schema as { properties?: Record<string, unknown> };\n const propertyPath = controlSchema.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema?.properties?.[propertyPath] as {\n type?: string;\n };\n\n return propertySchema?.type === \"array\";\n};\n\nconst providerMultiSelectTester = rankWith(\n 108, // Highest priority for array controls with providers\n and(isArrayControl, hasProvider),\n);\n\nexport const providerRenderers = [\n { tester: providerMultiSelectTester, renderer: ProviderMultiSelect },\n { tester: providerAutocompleteTester, renderer: ProviderAutocomplete },\n { tester: providerSelectTester, renderer: ProviderSelect },\n];\n\n// Export PrimeVue renderers (styles are auto-injected)\nexport { primevueRenderers, registerPrimevueRenderers } from \"./primevue\";\n\n// Export individual components\nexport { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };\nexport { useProvider } from \"./composables/useProvider\";\nexport * from \"./testers\";\n\n// Export individual PrimeVue components using lazy evaluation to avoid circular deps\nexport {\n JfText,\n JfTextArea,\n JfNumber,\n JfEnum,\n JfEnumArray,\n JfBoolean,\n} from \"./primevue\";\n"],"names":["ProviderAutocomplete"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,cAAc,CAAC,aAA8B;AACjD,SAAO,UAAU,SAAS,aAAa;AACzC;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI,WAAW,CAAC,UAAmB,WAAoB;AACrD,cAAM,KAAK;AACX,cAAM,aAAa;AAInB,YAAI,IAAI,SAAS,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY;AACvD,iBAAO;AAGT,cAAM,eAAe,GAAG,MAAM,QAAQ,iBAAiB,EAAE;AACzD,cAAM,iBAAiB,WAAW,WAAW,YAAY;AAEzD,eAAO,gBAAgB,SAAS;AAAA,MAClC,CAAC;AAAA,IAAA;AAAA,IAEH;AAAA,IACA,CAAC,aAAa,CAAC,UAAU,SAAS;AAAA,EAAA;AAEtC;AAEA,MAAM,6BAA6B;AAAA,EACjC;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI,WAAW,CAAC,UAAmB,WAAoB;AACrD,cAAM,KAAK;AACX,cAAM,aAAa;AAInB,YAAI,IAAI,SAAS,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY;AACvD,iBAAO;AAGT,cAAM,eAAe,GAAG,MAAM,QAAQ,iBAAiB,EAAE;AACzD,cAAM,iBAAiB,WAAW,WAAW,YAAY;AAEzD,eAAO,gBAAgB,SAAS;AAAA,MAClC,CAAC;AAAA,IAAA;AAAA,IAEH;AAAA,IACA,CAAC,aAAa,UAAU,SAAS,iBAAiB;AAAA,EAAA;AAEtD;AAGA,MAAM,iBAAiB,CAAC,UAA2B,WAAoB;AACrE,QAAM,gBAAgB;AACtB,MAAI,cAAc,SAAS,aAAa,CAAC,cAAc,OAAO;AAC5D,WAAO;AAAA,EACT;AAGA,QAAM,aAAa;AACnB,QAAM,eAAe,cAAc,MAAM,QAAQ,iBAAiB,EAAE;AACpE,QAAM,iBAAiB,YAAY,aAAa,YAAY;AAI5D,SAAO,gBAAgB,SAAS;AAClC;AAEA,MAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA,IAAI,gBAAgB,WAAW;AACjC;AAEO,MAAM,oBAAoB;AAAA,EAC/B,EAAE,QAAQ,2BAA2B,UAAU,oBAAA;AAAA,EAC/C,EAAE,QAAQ,4BAA4B,UAAUA,UAAA;AAAA,EAChD,EAAE,QAAQ,sBAAsB,UAAU,eAAA;AAC5C;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/vue/index.ts"],"sourcesContent":["import type { UISchemaElement } from \"@jsonforms/core\";\nimport {\n and,\n isIntegerControl,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n isControl,\n} from \"@jsonforms/core\";\nimport { resolveScopeSchema } from \"../core/resolveScope\";\nimport { resolveItemsSchema } from \"./utils/objectMultiSelect\";\nimport ProviderAutocomplete from \"./components/ProviderAutocomplete.vue\";\nimport ProviderSelect from \"./components/ProviderSelect.vue\";\nimport ProviderMultiSelect from \"./components/ProviderMultiSelect.vue\";\nimport ProviderObjectMultiSelect from \"./components/ProviderObjectMultiSelect.vue\";\n\n// Custom tester that checks if provider option exists (as object or boolean)\nconst hasProvider = (uischema: UISchemaElement) => {\n return uischema?.options?.provider !== undefined;\n};\n\n// Integer fallback tester handles nested scopes like #/properties/parent/properties/child\nconst isIntegerScope = (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n if (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 return propertySchema?.type === \"integer\";\n};\n\n// Create specific testers for each component type\nconst providerSelectTester = rankWith(\n 107, // Higher than PrimeVue JfNumber integer renderer (106) so provider wins\n and(\n or(\n isStringControl,\n isNumberControl,\n isIntegerControl,\n and(isControl, isIntegerScope),\n ),\n hasProvider,\n (uischema) => !uischema?.options?.autocomplete,\n ),\n);\n\nconst providerAutocompleteTester = rankWith(\n 108, // Higher than providerSelectTester so autocomplete variant wins when flagged\n and(\n or(\n isStringControl,\n isNumberControl,\n isIntegerControl,\n and(isControl, isIntegerScope),\n ),\n hasProvider,\n (uischema) => uischema?.options?.autocomplete === true,\n ),\n);\n\n// Resolve the array schema at a control's scope, or undefined if the\n// control isn't an array. Shared by both array testers below.\nconst getArraySchema = (uischema: UISchemaElement, schema: unknown) => {\n const controlSchema = uischema as { type: string; scope?: string };\n if (controlSchema.type !== \"Control\" || !controlSchema.scope) return undefined;\n const propertySchema = resolveScopeSchema(\n controlSchema.scope,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema as Record<string, any>,\n );\n if (propertySchema?.type !== \"array\") return undefined;\n return propertySchema;\n};\n\n// Object-item arrays render with paired-object MultiSelect.\nconst isObjectArrayControl = (uischema: UISchemaElement, schema: unknown) => {\n const arr = getArraySchema(uischema, schema);\n if (!arr) return false;\n const items = resolveItemsSchema(\n arr,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema as Record<string, any>,\n );\n return items?.type === \"object\";\n};\n\n// Scalar-item arrays the original tester. Excludes object-item arrays so\n// the new ObjectMultiSelect renderer can claim them at a higher rank.\nconst isScalarArrayControl = (uischema: UISchemaElement, schema: unknown) => {\n const arr = getArraySchema(uischema, schema);\n if (!arr) return false;\n const items = resolveItemsSchema(\n arr,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema as Record<string, any>,\n );\n // Treat unknown / no-items shapes as scalar (matches prior behavior where\n // any array control was eligible for ProviderMultiSelect).\n return items?.type !== \"object\";\n};\n\nconst providerObjectMultiSelectTester = rankWith(\n 110, // One higher than scalar multi-select so object-item arrays match first.\n and(isObjectArrayControl, hasProvider),\n);\n\nconst providerMultiSelectTester = rankWith(\n 109,\n and(isScalarArrayControl, hasProvider),\n);\n\nexport const providerRenderers = [\n {\n tester: providerObjectMultiSelectTester,\n renderer: ProviderObjectMultiSelect,\n },\n { tester: providerMultiSelectTester, renderer: ProviderMultiSelect },\n { tester: providerAutocompleteTester, renderer: ProviderAutocomplete },\n { tester: providerSelectTester, renderer: ProviderSelect },\n];\n\n// Export PrimeVue renderers (styles are auto-injected)\nexport { primevueRenderers, registerPrimevueRenderers } from \"./primevue\";\n\n// Export individual components\nexport {\n ProviderAutocomplete,\n ProviderSelect,\n ProviderMultiSelect,\n ProviderObjectMultiSelect,\n};\nexport { useProvider } from \"./composables/useProvider\";\nexport { useProjection } from \"./composables/useProjection\";\nexport type { ProjectionResult } from \"./composables/useProjection\";\nexport { createDataLayer, useDataLayer } from \"./composables/useDataLayer\";\nexport type { DataLayer } from \"./composables/useDataLayer\";\nexport { useDeriveInitialValue } from \"./composables/useDeriveInitialValue\";\nexport type { DeriveInitialValueCfg } from \"./composables/useDeriveInitialValue\";\nexport { useDirtyValidation } from \"./composables/useDirtyValidation\";\nexport * from \"./testers\";\n\n// Export individual PrimeVue components using lazy evaluation to avoid circular deps\nexport {\n JfText,\n JfTextArea,\n JfNumber,\n JfEnum,\n JfEnumArray,\n JfBoolean,\n} from \"./primevue\";\n"],"names":["ProviderAutocomplete"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,cAAc,CAAC,aAA8B;AACjD,SAAO,UAAU,SAAS,aAAa;AACzC;AAGA,MAAM,iBAAiB,CAAC,UAAmB,WAAoB;AAC7D,QAAM,KAAK;AACX,MAAI,IAAI,SAAS,aAAa,CAAC,IAAI,MAAO,QAAO;AAEjD,QAAM,iBAAiB;AAAA,IACrB,GAAG;AAAA;AAAA,IAEH;AAAA,EAAA;AAEF,SAAO,gBAAgB,SAAS;AAClC;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,WAAW,cAAc;AAAA,IAAA;AAAA,IAE/B;AAAA,IACA,CAAC,aAAa,CAAC,UAAU,SAAS;AAAA,EAAA;AAEtC;AAEA,MAAM,6BAA6B;AAAA,EACjC;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,WAAW,cAAc;AAAA,IAAA;AAAA,IAE/B;AAAA,IACA,CAAC,aAAa,UAAU,SAAS,iBAAiB;AAAA,EAAA;AAEtD;AAIA,MAAM,iBAAiB,CAAC,UAA2B,WAAoB;AACrE,QAAM,gBAAgB;AACtB,MAAI,cAAc,SAAS,aAAa,CAAC,cAAc,MAAO,QAAO;AACrE,QAAM,iBAAiB;AAAA,IACrB,cAAc;AAAA;AAAA,IAEd;AAAA,EAAA;AAEF,MAAI,gBAAgB,SAAS,QAAS,QAAO;AAC7C,SAAO;AACT;AAGA,MAAM,uBAAuB,CAAC,UAA2B,WAAoB;AAC3E,QAAM,MAAM,eAAe,UAAU,MAAM;AAC3C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ;AAAA,IACZ;AAAA;AAAA,IAEA;AAAA,EAAA;AAEF,SAAO,OAAO,SAAS;AACzB;AAIA,MAAM,uBAAuB,CAAC,UAA2B,WAAoB;AAC3E,QAAM,MAAM,eAAe,UAAU,MAAM;AAC3C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ;AAAA,IACZ;AAAA;AAAA,IAEA;AAAA,EAAA;AAIF,SAAO,OAAO,SAAS;AACzB;AAEA,MAAM,kCAAkC;AAAA,EACtC;AAAA;AAAA,EACA,IAAI,sBAAsB,WAAW;AACvC;AAEA,MAAM,4BAA4B;AAAA,EAChC;AAAA,EACA,IAAI,sBAAsB,WAAW;AACvC;AAEO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,IACE,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA;AAAA,EAEZ,EAAE,QAAQ,2BAA2B,UAAU,oBAAA;AAAA,EAC/C,EAAE,QAAQ,4BAA4B,UAAUA,UAAA;AAAA,EAChD,EAAE,QAAQ,sBAAsB,UAAU,eAAA;AAC5C;"}
@@ -18,14 +18,17 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
18
18
  renderers: {
19
19
  type: ArrayConstructor;
20
20
  required: false;
21
+ default: undefined;
21
22
  };
22
23
  cells: {
23
24
  type: ArrayConstructor;
24
25
  required: false;
26
+ default: undefined;
25
27
  };
26
28
  config: {
27
29
  type: ObjectConstructor;
28
30
  required: false;
31
+ default: undefined;
29
32
  };
30
33
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
31
34
  uischema: {
@@ -47,17 +50,23 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
47
50
  renderers: {
48
51
  type: ArrayConstructor;
49
52
  required: false;
53
+ default: undefined;
50
54
  };
51
55
  cells: {
52
56
  type: ArrayConstructor;
53
57
  required: false;
58
+ default: undefined;
54
59
  };
55
60
  config: {
56
61
  type: ObjectConstructor;
57
62
  required: false;
63
+ default: undefined;
58
64
  };
59
65
  }>> & Readonly<{}>, {
66
+ config: Record<string, any>;
60
67
  enabled: boolean;
68
+ renderers: unknown[];
69
+ cells: unknown[];
61
70
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
62
71
  export default _default;
63
72
  //# sourceMappingURL=JfBoolean.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JfBoolean.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfBoolean.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEA,wBA0JK"}
1
+ {"version":3,"file":"JfBoolean.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfBoolean.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGA,wBAiMK"}