@narrative.io/jsonforms-provider-protocols 1.1.0-beta.4 → 1.1.0-beta.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"useDerive.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useDerive.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,UAAU,aAAa;IACrB,OAAO,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,cAAc,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;KACf,CAAC,CAAC;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,aAAa,QAwCjE"}
1
+ {"version":3,"file":"useDerive.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useDerive.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,UAAU,aAAa;IACrB,OAAO,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,cAAc,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;KACf,CAAC,CAAC;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,aAAa,QAkDjE"}
@@ -5,6 +5,10 @@ function useDerive({ control, handleChange }) {
5
5
  value: {}
6
6
  });
7
7
  const rootData = computed(() => injectedFormData.value || {});
8
+ const injectedExternalData = inject("externalData", {
9
+ value: {}
10
+ });
11
+ const externalData = computed(() => injectedExternalData.value || {});
8
12
  const deriveConfig = computed(() => {
9
13
  const options = control.value.uischema?.options;
10
14
  return {
@@ -14,13 +18,17 @@ function useDerive({ control, handleChange }) {
14
18
  };
15
19
  });
16
20
  watch(
17
- [rootData, deriveConfig],
18
- ([data, config]) => {
21
+ [rootData, externalData, deriveConfig],
22
+ ([data, extData, config]) => {
19
23
  if (!config.expression || config.mode !== "follow") {
20
24
  return;
21
25
  }
22
26
  try {
23
- const derivedValue = resolveDeriveExpression(config.expression, data);
27
+ const derivedValue = resolveDeriveExpression(
28
+ config.expression,
29
+ data,
30
+ extData
31
+ );
24
32
  if (derivedValue !== control.value.data) {
25
33
  handleChange(control.value.path, derivedValue);
26
34
  }
@@ -34,7 +42,11 @@ function useDerive({ control, handleChange }) {
34
42
  { deep: true, immediate: true }
35
43
  );
36
44
  }
37
- function resolveDeriveExpression(expression, data) {
45
+ function resolveDeriveExpression(expression, data, externalData) {
46
+ if (expression.startsWith("externalData(") && expression.endsWith(")")) {
47
+ const propertyPath = expression.slice(13, -1);
48
+ return resolvePropertyPath(propertyPath, externalData);
49
+ }
38
50
  if (!expression.includes("(") && !expression.includes("+") && !expression.includes("?")) {
39
51
  return resolvePropertyPath(expression, data);
40
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useDerive.js","sources":["../../../src/vue/composables/useDerive.ts"],"sourcesContent":["import { computed, watch, inject, type Ref } from \"vue\";\nimport { type ControlElement } from \"@jsonforms/core\";\n\ninterface DeriveOptions {\n control: Ref<{\n uischema: ControlElement;\n path: string;\n data: unknown;\n }>;\n handleChange: (path: string, value: unknown) => void;\n}\n\nexport function useDerive({ control, handleChange }: DeriveOptions) {\n // Get the root form data from JSONForms context\n const injectedFormData = inject<{ value: unknown }>(\"formData\", {\n value: {},\n });\n const rootData = computed(() => injectedFormData.value || {});\n\n // Extract derive configuration from uischema options\n const deriveConfig = computed(() => {\n const options = control.value.uischema?.options as\n | { derive?: string; mode?: string }\n | undefined;\n return {\n expression: options?.derive,\n mode: options?.mode || \"follow\", // 'follow' = auto-update, 'manual' = user controlled\n };\n });\n\n // Watch for changes in form data and update derived field\n watch(\n [rootData, deriveConfig],\n ([data, config]) => {\n if (!config.expression || config.mode !== \"follow\") {\n return;\n }\n\n try {\n const derivedValue = resolveDeriveExpression(config.expression, data);\n if (derivedValue !== control.value.data) {\n handleChange(control.value.path, derivedValue);\n }\n } catch (error) {\n console.warn(\n `Failed to derive value for ${control.value.path}:`,\n error,\n );\n }\n },\n { deep: true, immediate: true },\n );\n}\n\nfunction resolveDeriveExpression(expression: string, data: unknown): unknown {\n // Handle simple property paths like \"country.name\"\n if (\n !expression.includes(\"(\") &&\n !expression.includes(\"+\") &&\n !expression.includes(\"?\")\n ) {\n return resolvePropertyPath(expression, data);\n }\n\n // For now, we'll only support simple property paths\n // Complex expressions would require a safe expression evaluator\n return resolvePropertyPath(expression, data);\n}\n\nfunction resolvePropertyPath(path: string, data: unknown): unknown {\n if (!path || !data) return \"\";\n\n const keys = path.split(\".\");\n let value: unknown = data;\n\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return null;\n }\n }\n\n return value;\n}\n"],"names":[],"mappings":";;AAYO,SAAS,UAAU,EAAE,SAAS,gBAA+B;AAElE,QAAM,mBAAmB,OAA2B,YAAY;AAAA,IAC9D,OAAO,CAAA;AAAA,EAAC,CACT;AACD,QAAM,WAAW,SAAS,MAAM,iBAAiB,SAAS,CAAA,CAAE;AAG5D,QAAM,eAAe,SAAS,MAAM;AAClC,UAAM,UAAU,QAAQ,MAAM,UAAU;AAGxC,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,MAAM,SAAS,QAAQ;AAAA;AAAA,IAAA;AAAA,EAE3B,CAAC;AAGD;AAAA,IACE,CAAC,UAAU,YAAY;AAAA,IACvB,CAAC,CAAC,MAAM,MAAM,MAAM;AAClB,UAAI,CAAC,OAAO,cAAc,OAAO,SAAS,UAAU;AAClD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,eAAe,wBAAwB,OAAO,YAAY,IAAI;AACpE,YAAI,iBAAiB,QAAQ,MAAM,MAAM;AACvC,uBAAa,QAAQ,MAAM,MAAM,YAAY;AAAA,QAC/C;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,8BAA8B,QAAQ,MAAM,IAAI;AAAA,UAChD;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,EAAE,MAAM,MAAM,WAAW,KAAA;AAAA,EAAK;AAElC;AAEA,SAAS,wBAAwB,YAAoB,MAAwB;AAE3E,MACE,CAAC,WAAW,SAAS,GAAG,KACxB,CAAC,WAAW,SAAS,GAAG,KACxB,CAAC,WAAW,SAAS,GAAG,GACxB;AACA,WAAO,oBAAoB,YAAY,IAAI;AAAA,EAC7C;AAIA,SAAO,oBAAoB,YAAY,IAAI;AAC7C;AAEA,SAAS,oBAAoB,MAAc,MAAwB;AACjE,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,QAAiB;AAErB,aAAW,OAAO,MAAM;AACtB,QAAI,SAAS,OAAO,UAAU,YAAY,OAAO,OAAO;AACtD,cAAS,MAAkC,GAAG;AAAA,IAChD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"useDerive.js","sources":["../../../src/vue/composables/useDerive.ts"],"sourcesContent":["import { computed, watch, inject, type Ref } from \"vue\";\nimport { type ControlElement } from \"@jsonforms/core\";\n\ninterface DeriveOptions {\n control: Ref<{\n uischema: ControlElement;\n path: string;\n data: unknown;\n }>;\n handleChange: (path: string, value: unknown) => void;\n}\n\nexport function useDerive({ control, handleChange }: DeriveOptions) {\n // Get the root form data from JSONForms context\n const injectedFormData = inject<{ value: unknown }>(\"formData\", {\n value: {},\n });\n const rootData = computed(() => injectedFormData.value || {});\n\n // Get external data from context if available\n const injectedExternalData = inject<{ value: unknown }>(\"externalData\", {\n value: {},\n });\n const externalData = computed(() => injectedExternalData.value || {});\n\n // Extract derive configuration from uischema options\n const deriveConfig = computed(() => {\n const options = control.value.uischema?.options as\n | { derive?: string; mode?: string }\n | undefined;\n return {\n expression: options?.derive,\n mode: options?.mode || \"follow\", // 'follow' = auto-update, 'manual' = user controlled\n };\n });\n\n // Watch for changes in form data and external data and update derived field\n watch(\n [rootData, externalData, deriveConfig],\n ([data, extData, config]) => {\n if (!config.expression || config.mode !== \"follow\") {\n return;\n }\n\n try {\n const derivedValue = resolveDeriveExpression(\n config.expression,\n data,\n extData,\n );\n if (derivedValue !== control.value.data) {\n handleChange(control.value.path, derivedValue);\n }\n } catch (error) {\n console.warn(\n `Failed to derive value for ${control.value.path}:`,\n error,\n );\n }\n },\n { deep: true, immediate: true },\n );\n}\n\nfunction resolveDeriveExpression(\n expression: string,\n data: unknown,\n externalData?: unknown,\n): unknown {\n // Handle externalData() syntax\n if (expression.startsWith(\"externalData(\") && expression.endsWith(\")\")) {\n const propertyPath = expression.slice(13, -1); // Remove \"externalData(\" and \")\"\n return resolvePropertyPath(propertyPath, externalData);\n }\n\n // Handle simple property paths like \"country.name\"\n if (\n !expression.includes(\"(\") &&\n !expression.includes(\"+\") &&\n !expression.includes(\"?\")\n ) {\n return resolvePropertyPath(expression, data);\n }\n\n // For now, we'll only support simple property paths and externalData() calls\n // Complex expressions would require a safe expression evaluator\n return resolvePropertyPath(expression, data);\n}\n\nfunction resolvePropertyPath(path: string, data: unknown): unknown {\n if (!path || !data) return \"\";\n\n const keys = path.split(\".\");\n let value: unknown = data;\n\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return null;\n }\n }\n\n return value;\n}\n"],"names":[],"mappings":";;AAYO,SAAS,UAAU,EAAE,SAAS,gBAA+B;AAElE,QAAM,mBAAmB,OAA2B,YAAY;AAAA,IAC9D,OAAO,CAAA;AAAA,EAAC,CACT;AACD,QAAM,WAAW,SAAS,MAAM,iBAAiB,SAAS,CAAA,CAAE;AAG5D,QAAM,uBAAuB,OAA2B,gBAAgB;AAAA,IACtE,OAAO,CAAA;AAAA,EAAC,CACT;AACD,QAAM,eAAe,SAAS,MAAM,qBAAqB,SAAS,CAAA,CAAE;AAGpE,QAAM,eAAe,SAAS,MAAM;AAClC,UAAM,UAAU,QAAQ,MAAM,UAAU;AAGxC,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,MAAM,SAAS,QAAQ;AAAA;AAAA,IAAA;AAAA,EAE3B,CAAC;AAGD;AAAA,IACE,CAAC,UAAU,cAAc,YAAY;AAAA,IACrC,CAAC,CAAC,MAAM,SAAS,MAAM,MAAM;AAC3B,UAAI,CAAC,OAAO,cAAc,OAAO,SAAS,UAAU;AAClD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,eAAe;AAAA,UACnB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,iBAAiB,QAAQ,MAAM,MAAM;AACvC,uBAAa,QAAQ,MAAM,MAAM,YAAY;AAAA,QAC/C;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,8BAA8B,QAAQ,MAAM,IAAI;AAAA,UAChD;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,EAAE,MAAM,MAAM,WAAW,KAAA;AAAA,EAAK;AAElC;AAEA,SAAS,wBACP,YACA,MACA,cACS;AAET,MAAI,WAAW,WAAW,eAAe,KAAK,WAAW,SAAS,GAAG,GAAG;AACtE,UAAM,eAAe,WAAW,MAAM,IAAI,EAAE;AAC5C,WAAO,oBAAoB,cAAc,YAAY;AAAA,EACvD;AAGA,MACE,CAAC,WAAW,SAAS,GAAG,KACxB,CAAC,WAAW,SAAS,GAAG,KACxB,CAAC,WAAW,SAAS,GAAG,GACxB;AACA,WAAO,oBAAoB,YAAY,IAAI;AAAA,EAC7C;AAIA,SAAO,oBAAoB,YAAY,IAAI;AAC7C;AAEA,SAAS,oBAAoB,MAAc,MAAwB;AACjE,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,QAAiB;AAErB,aAAW,OAAO,MAAM;AACtB,QAAI,SAAS,OAAO,UAAU,YAAY,OAAO,OAAO;AACtD,cAAS,MAAkC,GAAG;AAAA,IAChD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narrative.io/jsonforms-provider-protocols",
3
- "version": "1.1.0-beta.4",
3
+ "version": "1.1.0-beta.5",
4
4
  "description": "Dynamic data provider capabilities for JSONForms with Vue 3 integration",
5
5
  "type": "module",
6
6
  "author": "Narrative I/O",
@@ -17,6 +17,12 @@ export function useDerive({ control, handleChange }: DeriveOptions) {
17
17
  });
18
18
  const rootData = computed(() => injectedFormData.value || {});
19
19
 
20
+ // Get external data from context if available
21
+ const injectedExternalData = inject<{ value: unknown }>("externalData", {
22
+ value: {},
23
+ });
24
+ const externalData = computed(() => injectedExternalData.value || {});
25
+
20
26
  // Extract derive configuration from uischema options
21
27
  const deriveConfig = computed(() => {
22
28
  const options = control.value.uischema?.options as
@@ -28,16 +34,20 @@ export function useDerive({ control, handleChange }: DeriveOptions) {
28
34
  };
29
35
  });
30
36
 
31
- // Watch for changes in form data and update derived field
37
+ // Watch for changes in form data and external data and update derived field
32
38
  watch(
33
- [rootData, deriveConfig],
34
- ([data, config]) => {
39
+ [rootData, externalData, deriveConfig],
40
+ ([data, extData, config]) => {
35
41
  if (!config.expression || config.mode !== "follow") {
36
42
  return;
37
43
  }
38
44
 
39
45
  try {
40
- const derivedValue = resolveDeriveExpression(config.expression, data);
46
+ const derivedValue = resolveDeriveExpression(
47
+ config.expression,
48
+ data,
49
+ extData,
50
+ );
41
51
  if (derivedValue !== control.value.data) {
42
52
  handleChange(control.value.path, derivedValue);
43
53
  }
@@ -52,7 +62,17 @@ export function useDerive({ control, handleChange }: DeriveOptions) {
52
62
  );
53
63
  }
54
64
 
55
- function resolveDeriveExpression(expression: string, data: unknown): unknown {
65
+ function resolveDeriveExpression(
66
+ expression: string,
67
+ data: unknown,
68
+ externalData?: unknown,
69
+ ): unknown {
70
+ // Handle externalData() syntax
71
+ if (expression.startsWith("externalData(") && expression.endsWith(")")) {
72
+ const propertyPath = expression.slice(13, -1); // Remove "externalData(" and ")"
73
+ return resolvePropertyPath(propertyPath, externalData);
74
+ }
75
+
56
76
  // Handle simple property paths like "country.name"
57
77
  if (
58
78
  !expression.includes("(") &&
@@ -62,7 +82,7 @@ function resolveDeriveExpression(expression: string, data: unknown): unknown {
62
82
  return resolvePropertyPath(expression, data);
63
83
  }
64
84
 
65
- // For now, we'll only support simple property paths
85
+ // For now, we'll only support simple property paths and externalData() calls
66
86
  // Complex expressions would require a safe expression evaluator
67
87
  return resolvePropertyPath(expression, data);
68
88
  }