@goodo/platform-plugin 0.1.6 → 0.1.8

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.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./communicator-DQZOTxOF.cjs");let f=null;function u(t){return f||(f=l.pong(t).catch(e=>{throw f=null,e})),f}function z(t){u().then(e=>e.sendRequest("widget_ready")).then(e=>{t(e)}).catch(e=>{console.error("Failed to initialize widget:",e)})}function C(t,e){const n=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():Math.random().toString(36).substring(2,9);let i=!1,a=null,c=null;return u().then(o=>{c=o,!i&&(a=o.registerHandler("widget_data_source_update",s=>{(s==null?void 0:s.identity)===n&&e(s.data||[])}),o.sendRequest("add_widget_data_source_listener",{identity:n,config:t}).catch(s=>{console.error("Failed to add data source listener:",s)}))}).catch(o=>{console.error("Failed to initialize communicator for data source listener:",o)}),()=>{i=!0,a&&a(),c&&c.sendRequest("remove_widget_data_source_listener",{identity:n}).catch(o=>{console.error("Failed to remove data source listener:",o)})}}async function D(t,e){return await(await u()).sendRequest("emit_widget_event",{type:t,args:e})}async function I(t){return await(await u()).sendRequest("set_widget_personalization",t)}function N(t){let e=!1,n=null;return u().then(i=>{e||(n=i.registerHandler("widget_filter_change",a=>{t(a)}))}).catch(i=>{console.error("Failed to initialize communicator for filter change listener:",i)}),()=>{e=!0,n&&n()}}async function _(t){return await(await u()).sendRequest("fetch_node_data",t)}function R(t){async function e(r){return await _({...t,...r})}const n=new Set;let i=null,a=!1,c=null,o=null;async function s(){if(a||c)return;a=!0;const r=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():Math.random().toString(36).substring(2,9);i=r;try{const d=await u();if(o=d,n.size===0||i!==r)return;c=d.registerHandler("widget_data_source_update",m=>{(m==null?void 0:m.identity)===r&&n.forEach(w=>{try{w()}catch(y){console.error("Error in widget data source onChange callback:",y)}})}),await d.sendRequest("add_widget_data_source_listener",{identity:r,config:t})}catch(d){console.error("Failed to initialize communicator for data source listener:",d)}finally{a=!1,n.size===0&&i===r&&g()}}function g(){const r=i;i=null,a=!1,c&&(c(),c=null),o&&r&&o.sendRequest("remove_widget_data_source_listener",{identity:r}).catch(d=>{console.error("Failed to remove data source listener:",d)})}function h(r){return n.add(r),n.size===1&&s(),()=>{n.delete(r),n.size===0&&g()}}return{fetch:e,onChange:h}}exports.Communicator=l.Communicator;exports.PING_TOKEN=l.PING_TOKEN;exports.PONG_TOKEN=l.PONG_TOKEN;exports.pong=l.pong;exports.addDataSourceListener=C;exports.createDataSource=R;exports.emitWidgetEvent=D;exports.fetchNodeData=_;exports.onWidgetFilterChange=N;exports.onWidgetReady=z;exports.setWidgetPersonalization=I;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./communicator-DQZOTxOF.cjs");let d=null;function c(t){return d||(d=u.pong(t).catch(e=>{throw d=null,e})),d}function z(t){c().then(e=>e.sendRequest("widget_ready")).then(e=>{t(e)}).catch(e=>{console.error("Failed to initialize widget:",e)})}async function N(t,e){return await(await c()).sendRequest("emit_widget_event",{type:t,args:e})}async function C(t){return await(await c()).sendRequest("set_widget_personalization",t)}function E(t){let e=!1,i=null;return c().then(r=>{e||(i=r.registerHandler("widget_filter_change",a=>{t(a)}))}).catch(r=>{console.error("Failed to initialize communicator for filter change listener:",r)}),()=>{e=!0,i&&i()}}async function g(t){return await(await c()).sendRequest("fetch_node_data",t)}function P(t){async function e(n){return await g({...t,...n})}const i=new Set;let r=null,a=!1,s=null,l=null;async function _(){if(a||s)return;a=!0;const n=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():Math.random().toString(36).substring(2,9);r=n;try{const o=await c();if(l=o,i.size===0||r!==n)return;s=o.registerHandler("widget_data_source_update",m=>{(m==null?void 0:m.identity)===n&&i.forEach(w=>{try{w()}catch(y){console.error("Error in widget data source onChange callback:",y)}})}),await o.sendRequest("add_widget_data_source_listener",{identity:n,config:t})}catch(o){console.error("Failed to initialize communicator for data source listener:",o)}finally{a=!1,i.size===0&&r===n&&f()}}function f(){const n=r;r=null,a=!1,s&&(s(),s=null),l&&n&&l.sendRequest("remove_widget_data_source_listener",{identity:n}).catch(o=>{console.error("Failed to remove data source listener:",o)})}function h(n){return i.add(n),i.size===1&&_(),()=>{i.delete(n),i.size===0&&f()}}return{fetch:e,onChange:h}}exports.Communicator=u.Communicator;exports.PING_TOKEN=u.PING_TOKEN;exports.PONG_TOKEN=u.PONG_TOKEN;exports.pong=u.pong;exports.createDataSource=P;exports.emitWidgetEvent=N;exports.fetchNodeData=g;exports.onWidgetFilterChange=E;exports.onWidgetReady=z;exports.setWidgetPersonalization=C;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Add a reactive data source listener on the host platform.\n * Returns an unsubscribe function.\n */\nexport function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void {\n const identity =\n typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n let commInstance: Communicator | null = null;\n\n getCommunicator()\n .then((comm) => {\n commInstance = comm;\n\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity === identity) {\n onChange(payload.data || []);\n }\n });\n\n comm.sendRequest('add_widget_data_source_listener', { identity, config }).catch((err) => {\n console.error('Failed to add data source listener:', err);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for data source listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n\n if (commInstance) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n };\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: string) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","addDataSourceListener","onChange","identity","isCancelled","unregisterHandler","commInstance","payload","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","condition","fetchNodeData","createDataSource","fetch","callbacks","isConnecting","connect","currentIdentity","cb","disconnect","activeIdentity"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","isCancelled","unregisterHandler","condition","fetchNodeData","payload","createDataSource","fetch","callbacks","identity","isConnecting","commInstance","connect","currentIdentity","cb","disconnect","activeIdentity","onChange"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,98 +1,81 @@
1
1
  import { b as w } from "./communicator-BF77R7Qs.js";
2
- import { C as p, P as H, a as E } from "./communicator-BF77R7Qs.js";
3
- let l = null;
4
- function u(t) {
5
- return l || (l = w(t).catch((e) => {
6
- throw l = null, e;
7
- })), l;
2
+ import { C as F, P as N, a as P } from "./communicator-BF77R7Qs.js";
3
+ let u = null;
4
+ function c(t) {
5
+ return u || (u = w(t).catch((e) => {
6
+ throw u = null, e;
7
+ })), u;
8
8
  }
9
9
  function C(t) {
10
- u().then((e) => e.sendRequest("widget_ready")).then((e) => {
10
+ c().then((e) => e.sendRequest("widget_ready")).then((e) => {
11
11
  t(e);
12
12
  }).catch((e) => {
13
13
  console.error("Failed to initialize widget:", e);
14
14
  });
15
15
  }
16
- function I(t, e) {
17
- const n = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);
18
- let i = !1, a = null, c = null;
19
- return u().then((o) => {
20
- c = o, !i && (a = o.registerHandler("widget_data_source_update", (s) => {
21
- (s == null ? void 0 : s.identity) === n && e(s.data || []);
22
- }), o.sendRequest("add_widget_data_source_listener", { identity: n, config: t }).catch((s) => {
23
- console.error("Failed to add data source listener:", s);
24
- }));
25
- }).catch((o) => {
26
- console.error("Failed to initialize communicator for data source listener:", o);
27
- }), () => {
28
- i = !0, a && a(), c && c.sendRequest("remove_widget_data_source_listener", { identity: n }).catch((o) => {
29
- console.error("Failed to remove data source listener:", o);
30
- });
31
- };
32
- }
33
16
  async function R(t, e) {
34
- return await (await u()).sendRequest("emit_widget_event", { type: t, args: e });
17
+ return await (await c()).sendRequest("emit_widget_event", { type: t, args: e });
35
18
  }
36
- async function q(t) {
37
- return await (await u()).sendRequest("set_widget_personalization", t);
19
+ async function p(t) {
20
+ return await (await c()).sendRequest("set_widget_personalization", t);
38
21
  }
39
- function F(t) {
40
- let e = !1, n = null;
41
- return u().then((i) => {
42
- e || (n = i.registerHandler("widget_filter_change", (a) => {
22
+ function q(t) {
23
+ let e = !1, i = null;
24
+ return c().then((r) => {
25
+ e || (i = r.registerHandler("widget_filter_change", (a) => {
43
26
  t(a);
44
27
  }));
45
- }).catch((i) => {
46
- console.error("Failed to initialize communicator for filter change listener:", i);
28
+ }).catch((r) => {
29
+ console.error("Failed to initialize communicator for filter change listener:", r);
47
30
  }), () => {
48
- e = !0, n && n();
31
+ e = !0, i && i();
49
32
  };
50
33
  }
51
34
  async function y(t) {
52
- return await (await u()).sendRequest("fetch_node_data", t);
35
+ return await (await c()).sendRequest("fetch_node_data", t);
53
36
  }
54
- function U(t) {
55
- async function e(r) {
37
+ function I(t) {
38
+ async function e(n) {
56
39
  return await y({
57
40
  ...t,
58
- ...r
41
+ ...n
59
42
  });
60
43
  }
61
- const n = /* @__PURE__ */ new Set();
62
- let i = null, a = !1, c = null, o = null;
63
- async function s() {
64
- if (a || c) return;
44
+ const i = /* @__PURE__ */ new Set();
45
+ let r = null, a = !1, s = null, l = null;
46
+ async function m() {
47
+ if (a || s) return;
65
48
  a = !0;
66
- const r = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);
67
- i = r;
49
+ const n = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);
50
+ r = n;
68
51
  try {
69
- const d = await u();
70
- if (o = d, n.size === 0 || i !== r)
52
+ const o = await c();
53
+ if (l = o, i.size === 0 || r !== n)
71
54
  return;
72
- c = d.registerHandler("widget_data_source_update", (f) => {
73
- (f == null ? void 0 : f.identity) === r && n.forEach((_) => {
55
+ s = o.registerHandler("widget_data_source_update", (d) => {
56
+ (d == null ? void 0 : d.identity) === n && i.forEach((_) => {
74
57
  try {
75
58
  _();
76
59
  } catch (h) {
77
60
  console.error("Error in widget data source onChange callback:", h);
78
61
  }
79
62
  });
80
- }), await d.sendRequest("add_widget_data_source_listener", { identity: r, config: t });
81
- } catch (d) {
82
- console.error("Failed to initialize communicator for data source listener:", d);
63
+ }), await o.sendRequest("add_widget_data_source_listener", { identity: n, config: t });
64
+ } catch (o) {
65
+ console.error("Failed to initialize communicator for data source listener:", o);
83
66
  } finally {
84
- a = !1, n.size === 0 && i === r && m();
67
+ a = !1, i.size === 0 && r === n && f();
85
68
  }
86
69
  }
87
- function m() {
88
- const r = i;
89
- i = null, a = !1, c && (c(), c = null), o && r && o.sendRequest("remove_widget_data_source_listener", { identity: r }).catch((d) => {
90
- console.error("Failed to remove data source listener:", d);
70
+ function f() {
71
+ const n = r;
72
+ r = null, a = !1, s && (s(), s = null), l && n && l.sendRequest("remove_widget_data_source_listener", { identity: n }).catch((o) => {
73
+ console.error("Failed to remove data source listener:", o);
91
74
  });
92
75
  }
93
- function g(r) {
94
- return n.add(r), n.size === 1 && s(), () => {
95
- n.delete(r), n.size === 0 && m();
76
+ function g(n) {
77
+ return i.add(n), i.size === 1 && m(), () => {
78
+ i.delete(n), i.size === 0 && f();
96
79
  };
97
80
  }
98
81
  return {
@@ -101,16 +84,15 @@ function U(t) {
101
84
  };
102
85
  }
103
86
  export {
104
- p as Communicator,
105
- H as PING_TOKEN,
106
- E as PONG_TOKEN,
107
- I as addDataSourceListener,
108
- U as createDataSource,
87
+ F as Communicator,
88
+ N as PING_TOKEN,
89
+ P as PONG_TOKEN,
90
+ I as createDataSource,
109
91
  R as emitWidgetEvent,
110
92
  y as fetchNodeData,
111
- F as onWidgetFilterChange,
93
+ q as onWidgetFilterChange,
112
94
  C as onWidgetReady,
113
95
  w as pong,
114
- q as setWidgetPersonalization
96
+ p as setWidgetPersonalization
115
97
  };
116
98
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Add a reactive data source listener on the host platform.\n * Returns an unsubscribe function.\n */\nexport function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void {\n const identity =\n typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n let commInstance: Communicator | null = null;\n\n getCommunicator()\n .then((comm) => {\n commInstance = comm;\n\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity === identity) {\n onChange(payload.data || []);\n }\n });\n\n comm.sendRequest('add_widget_data_source_listener', { identity, config }).catch((err) => {\n console.error('Failed to add data source listener:', err);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for data source listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n\n if (commInstance) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n };\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: string) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","addDataSourceListener","onChange","identity","isCancelled","unregisterHandler","commInstance","payload","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","condition","fetchNodeData","createDataSource","fetch","callbacks","isConnecting","connect","currentIdentity","cb","disconnect","activeIdentity"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/widget-sdk.ts"],"sourcesContent":["import { Communicator, pong, OnPingOptions } from './communicator';\nimport { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';\n\nlet communicatorPromise: Promise<Communicator> | null = null;\n\n/**\n * Get or initialize the Communicator instance for the widget.\n * Caches the connection promise so that multiple calls reuse the same handshake.\n */\nfunction getCommunicator(options?: OnPingOptions): Promise<Communicator> {\n if (!communicatorPromise) {\n communicatorPromise = pong(options).catch((err) => {\n communicatorPromise = null;\n throw err;\n });\n }\n\n return communicatorPromise;\n}\n\n/**\n * Called when the widget is ready to receive configuration from the host.\n */\nexport function onWidgetReady(callback: (config: WidgetConfig) => void) {\n getCommunicator()\n .then((comm) => comm.sendRequest('widget_ready'))\n .then((config) => {\n callback(config);\n })\n .catch((err) => {\n console.error('Failed to initialize widget:', err);\n });\n}\n\n/**\n * Emit a custom widget event to the host platform.\n */\nexport async function emitWidgetEvent(type: string, args?: Record<string, any>) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('emit_widget_event', { type, args });\n}\n\n/**\n * Update widget personalization state on the host platform.\n */\nexport async function setWidgetPersonalization(data: any) {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('set_widget_personalization', data);\n}\n\n/**\n * Register a listener for widget filter changes from the host platform.\n * Returns an unsubscribe function.\n */\nexport function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void {\n let isCancelled = false;\n\n let unregisterHandler: (() => void) | null = null;\n\n getCommunicator()\n .then((comm) => {\n if (isCancelled) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_filter_change', (condition) => {\n callback(condition);\n });\n })\n .catch((err) => {\n console.error('Failed to initialize communicator for filter change listener:', err);\n });\n\n return () => {\n isCancelled = true;\n\n if (unregisterHandler) {\n unregisterHandler();\n }\n };\n}\n\nexport async function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData> {\n const comm = await getCommunicator();\n\n return await comm.sendRequest('fetch_node_data', payload);\n}\n\nexport function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n async function fetch(payload?: Omit<NodeDataRequestPayload, 'node' | 'filterExpression'>) {\n return await fetchNodeData({\n ...config,\n ...payload,\n });\n }\n\n const callbacks = new Set<() => void>();\n let identity: string | null = null;\n let isConnecting = false;\n let unregisterHandler: (() => void) | null = null;\n let commInstance: Communicator | null = null;\n\n async function connect() {\n if (isConnecting || unregisterHandler) return;\n isConnecting = true;\n\n const currentIdentity =\n typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 9);\n identity = currentIdentity;\n\n try {\n const comm = await getCommunicator();\n commInstance = comm;\n\n // If all subscribers unsubscribed while connecting, abort\n if (callbacks.size === 0 || identity !== currentIdentity) {\n return;\n }\n\n unregisterHandler = comm.registerHandler('widget_data_source_update', (payload) => {\n if (payload?.identity !== currentIdentity) return;\n\n callbacks.forEach((cb) => {\n try {\n cb();\n } catch (err) {\n console.error('Error in widget data source onChange callback:', err);\n }\n });\n });\n\n await comm.sendRequest('add_widget_data_source_listener', { identity: currentIdentity, config });\n } catch (err) {\n console.error('Failed to initialize communicator for data source listener:', err);\n } finally {\n isConnecting = false;\n // In case subscribers dropped to 0 while add_widget_data_source_listener was in-flight\n if (callbacks.size === 0 && identity === currentIdentity) {\n disconnect();\n }\n }\n }\n\n function disconnect() {\n const activeIdentity = identity;\n identity = null;\n isConnecting = false;\n\n if (unregisterHandler) {\n unregisterHandler();\n unregisterHandler = null;\n }\n\n if (commInstance && activeIdentity) {\n commInstance.sendRequest('remove_widget_data_source_listener', { identity: activeIdentity }).catch((err) => {\n console.error('Failed to remove data source listener:', err);\n });\n }\n }\n\n function onChange(callback: () => void): () => void {\n callbacks.add(callback);\n\n if (callbacks.size === 1) {\n connect();\n }\n\n return () => {\n callbacks.delete(callback);\n\n if (callbacks.size === 0) {\n disconnect();\n }\n };\n }\n\n return {\n fetch,\n onChange,\n };\n}\n\n"],"names":["communicatorPromise","getCommunicator","options","pong","err","onWidgetReady","callback","comm","config","emitWidgetEvent","type","args","setWidgetPersonalization","data","onWidgetFilterChange","isCancelled","unregisterHandler","condition","fetchNodeData","payload","createDataSource","fetch","callbacks","identity","isConnecting","commInstance","connect","currentIdentity","cb","disconnect","activeIdentity","onChange"],"mappings":"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"}
package/dist/manifest.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("zod"),o=e.z.enum(["input","checkbox","color-picker","date","data-time-range","datetime","input-number","monaco-editor","radio","select","tree-select","time","textarea","switch","slider","select-cascader","data-node","data-node-fields","context-menu"]),r=e.z.object({type:o,group:e.z.string().optional(),label:e.z.string().min(1,"Property config label is required")}),c=e.z.object({name:e.z.string().min(1,"Property name is required"),defaultValue:e.z.any().optional().default(null),config:r.optional()}),s=e.z.enum(["SelectedObject","MultipleSelectedObject","CurrentMenu"]),i=e.z.lazy(()=>e.z.object({bindProp:e.z.string().optional(),name:e.z.string().optional(),generic:e.z.array(e.z.lazy(()=>i)).optional()})),d=e.z.object({name:s,type:i}),m=e.z.object({options:e.z.object({bindProp:e.z.string().min(1,"options.bindProp is required")})}),g=e.z.object({name:e.z.string().min(1,"Event name is required"),label:e.z.string().min(1,"Event label is required"),arguments:e.z.array(d).optional().default([]),contextmenu:m.optional()}),u=e.z.object({id:e.z.string().min(1,"'id' is required and cannot be empty"),name:e.z.string().min(1,"'name' is required and cannot be empty"),icon:e.z.string().optional(),entry:e.z.string().optional().default("dist"),props:e.z.array(c).optional().default([]),events:e.z.array(g).optional().default([])});function l(t){return t}function p(t){const n=u.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,errors:n.error.issues.map(a=>({path:a.path.join(".")||"root",message:a.message}))}}exports.defineWidget=l;exports.validateWidgetManifest=p;exports.widgetArgumentTypeSchema=i;exports.widgetConfigTypeSchema=o;exports.widgetEventArgumentNameSchema=s;exports.widgetEventArgumentSchema=d;exports.widgetEventContextMenuSchema=m;exports.widgetEventSchema=g;exports.widgetManifestSchema=u;exports.widgetPropConfigSchema=r;exports.widgetPropSchema=c;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("zod"),o=e.z.enum(["input","checkbox","color-picker","date","data-time-range","datetime","input-number","monaco-editor","radio","select","tree-select","time","textarea","switch","slider","select-cascader","data-node","data-node-fields","context-menu"]),r=e.z.enum(["base","custom","display","filters","value"]),c=e.z.object({type:o,group:r.optional(),label:e.z.string().min(1,"Property config label is required")}),s=e.z.object({name:e.z.string().min(1,"Property name is required"),defaultValue:e.z.any().optional().default(null),config:c.optional()}),d=e.z.enum(["SelectedObject","MultipleSelectedObject","CurrentMenu"]),i=e.z.lazy(()=>e.z.object({bindProp:e.z.string().optional(),name:e.z.string().optional(),generic:e.z.array(e.z.lazy(()=>i)).optional()})),m=e.z.object({name:d,type:i}),g=e.z.object({options:e.z.object({bindProp:e.z.string().min(1,"options.bindProp is required")})}),u=e.z.object({name:e.z.string().min(1,"Event name is required"),label:e.z.string().min(1,"Event label is required"),arguments:e.z.array(m).optional().default([]),contextmenu:g.optional()}),l=e.z.object({id:e.z.string().min(1,"'id' is required and cannot be empty"),name:e.z.string().min(1,"'name' is required and cannot be empty"),icon:e.z.string().optional(),entry:e.z.string().optional().default("dist"),props:e.z.array(s).optional().default([]),events:e.z.array(u).optional().default([])});function p(t){return t}function z(t){const n=l.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,errors:n.error.issues.map(a=>({path:a.path.join(".")||"root",message:a.message}))}}exports.defineWidget=p;exports.validateWidgetManifest=z;exports.widgetArgumentTypeSchema=i;exports.widgetConfigGroupSchema=r;exports.widgetConfigTypeSchema=o;exports.widgetEventArgumentNameSchema=d;exports.widgetEventArgumentSchema=m;exports.widgetEventContextMenuSchema=g;exports.widgetEventSchema=u;exports.widgetManifestSchema=l;exports.widgetPropConfigSchema=c;exports.widgetPropSchema=s;
2
2
  //# sourceMappingURL=manifest.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.cjs","sources":["../src/manifest.ts"],"sourcesContent":["import { z } from 'zod';\n\n// ==========================================\n// 1. Props Configuration Schemas\n// ==========================================\n\nexport const widgetConfigTypeSchema = z.enum([\n 'input',\n 'checkbox',\n 'color-picker',\n 'date',\n 'data-time-range',\n 'datetime',\n 'input-number',\n 'monaco-editor',\n 'radio',\n 'select',\n 'tree-select',\n 'time',\n 'textarea',\n 'switch',\n 'slider',\n 'select-cascader',\n 'data-node',\n 'data-node-fields',\n 'context-menu',\n]);\n\nexport const widgetPropConfigSchema = z.object({\n type: widgetConfigTypeSchema,\n group: z.string().optional(),\n label: z.string().min(1, 'Property config label is required'),\n});\n\nexport const widgetPropSchema = z.object({\n name: z.string().min(1, 'Property name is required'),\n defaultValue: z.any().optional().default(null),\n config: widgetPropConfigSchema.optional(),\n});\n\n// ==========================================\n// 2. Events & Arguments Configuration Schemas\n// ==========================================\n\n/**\n * Supported standard event argument names (3.3)\n */\nexport const widgetEventArgumentNameSchema = z.enum([\n 'SelectedObject',\n 'MultipleSelectedObject',\n 'CurrentMenu',\n]);\n\n/**\n * Recursive schema for event argument types (3.2):\n * 1. Entity type bound to property: { bindProp: 'dataSourceNode' }\n * 2. Generic collection type: { name: 'List', generic: [{ bindProp: 'dataSourceNode' }] }\n * 3. Fixed internal platform type: { name: 'CurrentMenu' }\n */\nexport type WidgetArgumentType = {\n bindProp?: string;\n name?: string;\n generic?: WidgetArgumentType[];\n};\n\nexport const widgetArgumentTypeSchema: z.ZodType<WidgetArgumentType> = z.lazy(() =>\n z.object({\n bindProp: z.string().optional(),\n name: z.string().optional(),\n generic: z.array(z.lazy(() => widgetArgumentTypeSchema)).optional(),\n })\n);\n\n/**\n * Event Argument configuration item (3.2)\n */\nexport const widgetEventArgumentSchema = z.object({\n name: widgetEventArgumentNameSchema,\n type: widgetArgumentTypeSchema,\n});\n\n/**\n * Context menu binding configuration for event (3.4)\n */\nexport const widgetEventContextMenuSchema = z.object({\n options: z.object({\n bindProp: z.string().min(1, 'options.bindProp is required'),\n }),\n});\n\n/**\n * Event configuration item (3.1)\n */\nexport const widgetEventSchema = z.object({\n name: z.string().min(1, 'Event name is required'),\n label: z.string().min(1, 'Event label is required'),\n arguments: z.array(widgetEventArgumentSchema).optional().default([]),\n contextmenu: widgetEventContextMenuSchema.optional(),\n});\n\n// ==========================================\n// 3. Widget Manifest Root Schema\n// ==========================================\n\nexport const widgetManifestSchema = z.object({\n id: z.string().min(1, \"'id' is required and cannot be empty\"),\n name: z.string().min(1, \"'name' is required and cannot be empty\"),\n icon: z.string().optional(),\n entry: z.string().optional().default('dist'),\n props: z.array(widgetPropSchema).optional().default([]),\n events: z.array(widgetEventSchema).optional().default([]),\n});\n\n// ==========================================\n// 4. Inferred TypeScript Types\n// ==========================================\n\nexport type WidgetConfigType = z.infer<typeof widgetConfigTypeSchema>;\nexport type WidgetPropConfig = z.infer<typeof widgetPropConfigSchema>;\nexport type WidgetProp = z.infer<typeof widgetPropSchema>;\n\nexport type WidgetEventArgumentName = z.infer<typeof widgetEventArgumentNameSchema>;\nexport type WidgetEventArgument = z.infer<typeof widgetEventArgumentSchema>;\nexport type WidgetEventContextMenu = z.infer<typeof widgetEventContextMenuSchema>;\nexport type WidgetEvent = z.infer<typeof widgetEventSchema>;\n\nexport type WidgetManifest = z.input<typeof widgetManifestSchema>;\nexport type ResolvedWidgetManifest = z.output<typeof widgetManifestSchema>;\n\n// ==========================================\n// 5. Helper & Validation Functions\n// ==========================================\n\n/**\n * Type-helper for defining widget manifest in `.goodo/manifest.ts`.\n * Provides full IDE autocomplete and compile-time type validation.\n */\nexport function defineWidget(config: WidgetManifest): WidgetManifest {\n return config;\n}\n\nexport interface ManifestValidationResult {\n success: boolean;\n data?: ResolvedWidgetManifest;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * Validates raw manifest data using Zod schema for Node.js environments (e.g. CLI, backend).\n */\nexport function validateWidgetManifest(raw: unknown): ManifestValidationResult {\n const result = widgetManifestSchema.safeParse(raw);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join('.') || 'root',\n message: issue.message,\n })),\n };\n}"],"names":["widgetConfigTypeSchema","z","widgetPropConfigSchema","widgetPropSchema","widgetEventArgumentNameSchema","widgetArgumentTypeSchema","widgetEventArgumentSchema","widgetEventContextMenuSchema","widgetEventSchema","widgetManifestSchema","defineWidget","config","validateWidgetManifest","raw","result","issue"],"mappings":"uGAMaA,EAAyBC,EAAAA,EAAE,KAAK,CAC3C,QACA,WACA,eACA,OACA,kBACA,WACA,eACA,gBACA,QACA,SACA,cACA,OACA,WACA,SACA,SACA,kBACA,YACA,mBACA,cACF,CAAC,EAEYC,EAAyBD,EAAAA,EAAE,OAAO,CAC7C,KAAMD,EACN,MAAOC,EAAAA,EAAE,OAAA,EAAS,SAAA,EAClB,MAAOA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,mCAAmC,CAC9D,CAAC,EAEYE,EAAmBF,EAAAA,EAAE,OAAO,CACvC,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,2BAA2B,EACnD,aAAcA,EAAAA,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAI,EAC7C,OAAQC,EAAuB,SAAA,CACjC,CAAC,EASYE,EAAgCH,EAAAA,EAAE,KAAK,CAClD,iBACA,yBACA,aACF,CAAC,EAcYI,EAA0DJ,EAAAA,EAAE,KAAK,IAC5EA,EAAAA,EAAE,OAAO,CACP,SAAUA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACrB,KAAMA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACjB,QAASA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,KAAK,IAAMI,CAAwB,CAAC,EAAE,SAAA,CAAS,CACnE,CACH,EAKaC,EAA4BL,EAAAA,EAAE,OAAO,CAChD,KAAMG,EACN,KAAMC,CACR,CAAC,EAKYE,EAA+BN,EAAAA,EAAE,OAAO,CACnD,QAASA,EAAAA,EAAE,OAAO,CAChB,SAAUA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,8BAA8B,CAAA,CAC3D,CACH,CAAC,EAKYO,EAAoBP,EAAAA,EAAE,OAAO,CACxC,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,wBAAwB,EAChD,MAAOA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,yBAAyB,EAClD,UAAWA,EAAAA,EAAE,MAAMK,CAAyB,EAAE,SAAA,EAAW,QAAQ,EAAE,EACnE,YAAaC,EAA6B,SAAA,CAC5C,CAAC,EAMYE,EAAuBR,EAAAA,EAAE,OAAO,CAC3C,GAAIA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,sCAAsC,EAC5D,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,wCAAwC,EAChE,KAAMA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACjB,MAAOA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAM,EAC3C,MAAOA,EAAAA,EAAE,MAAME,CAAgB,EAAE,SAAA,EAAW,QAAQ,EAAE,EACtD,OAAQF,EAAAA,EAAE,MAAMO,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA,CAAE,CAC1D,CAAC,EA0BM,SAASE,EAAaC,EAAwC,CACnE,OAAOA,CACT,CAWO,SAASC,EAAuBC,EAAwC,CAC7E,MAAMC,EAASL,EAAqB,UAAUI,CAAG,EACjD,OAAIC,EAAO,QACF,CACL,QAAS,GACT,KAAMA,EAAO,IAAA,EAIV,CACL,QAAS,GACT,OAAQA,EAAO,MAAM,OAAO,IAAKC,IAAW,CAC1C,KAAMA,EAAM,KAAK,KAAK,GAAG,GAAK,OAC9B,QAASA,EAAM,OAAA,EACf,CAAA,CAEN"}
1
+ {"version":3,"file":"manifest.cjs","sources":["../src/manifest.ts"],"sourcesContent":["import { z } from 'zod';\n\n// ==========================================\n// 1. Props Configuration Schemas\n// ==========================================\n\nexport const widgetConfigTypeSchema = z.enum([\n 'input',\n 'checkbox',\n 'color-picker',\n 'date',\n 'data-time-range',\n 'datetime',\n 'input-number',\n 'monaco-editor',\n 'radio',\n 'select',\n 'tree-select',\n 'time',\n 'textarea',\n 'switch',\n 'slider',\n 'select-cascader',\n 'data-node',\n 'data-node-fields',\n 'context-menu',\n]);\n\nexport const widgetConfigGroupSchema = z.enum([\n 'base',\n 'custom',\n 'display',\n 'filters',\n 'value',\n]);\n\nexport const widgetPropConfigSchema = z.object({\n type: widgetConfigTypeSchema,\n group: widgetConfigGroupSchema.optional(),\n label: z.string().min(1, 'Property config label is required'),\n});\n\nexport const widgetPropSchema = z.object({\n name: z.string().min(1, 'Property name is required'),\n defaultValue: z.any().optional().default(null),\n config: widgetPropConfigSchema.optional(),\n});\n\n// ==========================================\n// 2. Events & Arguments Configuration Schemas\n// ==========================================\n\n/**\n * Supported standard event argument names (3.3)\n */\nexport const widgetEventArgumentNameSchema = z.enum([\n 'SelectedObject',\n 'MultipleSelectedObject',\n 'CurrentMenu',\n]);\n\n/**\n * Recursive schema for event argument types (3.2):\n * 1. Entity type bound to property: { bindProp: 'dataSourceNode' }\n * 2. Generic collection type: { name: 'List', generic: [{ bindProp: 'dataSourceNode' }] }\n * 3. Fixed internal platform type: { name: 'CurrentMenu' }\n */\nexport type WidgetArgumentType = {\n bindProp?: string;\n name?: string;\n generic?: WidgetArgumentType[];\n};\n\nexport const widgetArgumentTypeSchema: z.ZodType<WidgetArgumentType> = z.lazy(() =>\n z.object({\n bindProp: z.string().optional(),\n name: z.string().optional(),\n generic: z.array(z.lazy(() => widgetArgumentTypeSchema)).optional(),\n })\n);\n\n/**\n * Event Argument configuration item (3.2)\n */\nexport const widgetEventArgumentSchema = z.object({\n name: widgetEventArgumentNameSchema,\n type: widgetArgumentTypeSchema,\n});\n\n/**\n * Context menu binding configuration for event (3.4)\n */\nexport const widgetEventContextMenuSchema = z.object({\n options: z.object({\n bindProp: z.string().min(1, 'options.bindProp is required'),\n }),\n});\n\n/**\n * Event configuration item (3.1)\n */\nexport const widgetEventSchema = z.object({\n name: z.string().min(1, 'Event name is required'),\n label: z.string().min(1, 'Event label is required'),\n arguments: z.array(widgetEventArgumentSchema).optional().default([]),\n contextmenu: widgetEventContextMenuSchema.optional(),\n});\n\n// ==========================================\n// 3. Widget Manifest Root Schema\n// ==========================================\n\nexport const widgetManifestSchema = z.object({\n id: z.string().min(1, \"'id' is required and cannot be empty\"),\n name: z.string().min(1, \"'name' is required and cannot be empty\"),\n icon: z.string().optional(),\n entry: z.string().optional().default('dist'),\n props: z.array(widgetPropSchema).optional().default([]),\n events: z.array(widgetEventSchema).optional().default([]),\n});\n\n// ==========================================\n// 4. Inferred TypeScript Types\n// ==========================================\n\nexport type WidgetConfigType = z.infer<typeof widgetConfigTypeSchema>;\nexport type WidgetConfigGroup = z.infer<typeof widgetConfigGroupSchema>;\nexport type WidgetPropConfig = z.infer<typeof widgetPropConfigSchema>;\nexport type WidgetProp = z.infer<typeof widgetPropSchema>;\n\nexport type WidgetEventArgumentName = z.infer<typeof widgetEventArgumentNameSchema>;\nexport type WidgetEventArgument = z.infer<typeof widgetEventArgumentSchema>;\nexport type WidgetEventContextMenu = z.infer<typeof widgetEventContextMenuSchema>;\nexport type WidgetEvent = z.infer<typeof widgetEventSchema>;\n\nexport type WidgetManifest = z.input<typeof widgetManifestSchema>;\nexport type ResolvedWidgetManifest = z.output<typeof widgetManifestSchema>;\n\n// ==========================================\n// 5. Helper & Validation Functions\n// ==========================================\n\n/**\n * Type-helper for defining widget manifest in `.goodo/manifest.ts`.\n * Provides full IDE autocomplete and compile-time type validation.\n */\nexport function defineWidget(config: WidgetManifest): WidgetManifest {\n return config;\n}\n\nexport interface ManifestValidationResult {\n success: boolean;\n data?: ResolvedWidgetManifest;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * Validates raw manifest data using Zod schema for Node.js environments (e.g. CLI, backend).\n */\nexport function validateWidgetManifest(raw: unknown): ManifestValidationResult {\n const result = widgetManifestSchema.safeParse(raw);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join('.') || 'root',\n message: issue.message,\n })),\n };\n}"],"names":["widgetConfigTypeSchema","z","widgetConfigGroupSchema","widgetPropConfigSchema","widgetPropSchema","widgetEventArgumentNameSchema","widgetArgumentTypeSchema","widgetEventArgumentSchema","widgetEventContextMenuSchema","widgetEventSchema","widgetManifestSchema","defineWidget","config","validateWidgetManifest","raw","result","issue"],"mappings":"uGAMaA,EAAyBC,EAAAA,EAAE,KAAK,CAC3C,QACA,WACA,eACA,OACA,kBACA,WACA,eACA,gBACA,QACA,SACA,cACA,OACA,WACA,SACA,SACA,kBACA,YACA,mBACA,cACF,CAAC,EAEYC,EAA0BD,EAAAA,EAAE,KAAK,CAC5C,OACA,SACA,UACA,UACA,OACF,CAAC,EAEYE,EAAyBF,EAAAA,EAAE,OAAO,CAC7C,KAAMD,EACN,MAAOE,EAAwB,SAAA,EAC/B,MAAOD,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,mCAAmC,CAC9D,CAAC,EAEYG,EAAmBH,EAAAA,EAAE,OAAO,CACvC,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,2BAA2B,EACnD,aAAcA,EAAAA,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAI,EAC7C,OAAQE,EAAuB,SAAA,CACjC,CAAC,EASYE,EAAgCJ,EAAAA,EAAE,KAAK,CAClD,iBACA,yBACA,aACF,CAAC,EAcYK,EAA0DL,EAAAA,EAAE,KAAK,IAC5EA,EAAAA,EAAE,OAAO,CACP,SAAUA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACrB,KAAMA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACjB,QAASA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,KAAK,IAAMK,CAAwB,CAAC,EAAE,SAAA,CAAS,CACnE,CACH,EAKaC,EAA4BN,EAAAA,EAAE,OAAO,CAChD,KAAMI,EACN,KAAMC,CACR,CAAC,EAKYE,EAA+BP,EAAAA,EAAE,OAAO,CACnD,QAASA,EAAAA,EAAE,OAAO,CAChB,SAAUA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,8BAA8B,CAAA,CAC3D,CACH,CAAC,EAKYQ,EAAoBR,EAAAA,EAAE,OAAO,CACxC,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,wBAAwB,EAChD,MAAOA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,yBAAyB,EAClD,UAAWA,EAAAA,EAAE,MAAMM,CAAyB,EAAE,SAAA,EAAW,QAAQ,EAAE,EACnE,YAAaC,EAA6B,SAAA,CAC5C,CAAC,EAMYE,EAAuBT,EAAAA,EAAE,OAAO,CAC3C,GAAIA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,sCAAsC,EAC5D,KAAMA,EAAAA,EAAE,OAAA,EAAS,IAAI,EAAG,wCAAwC,EAChE,KAAMA,EAAAA,EAAE,OAAA,EAAS,SAAA,EACjB,MAAOA,EAAAA,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAM,EAC3C,MAAOA,EAAAA,EAAE,MAAMG,CAAgB,EAAE,SAAA,EAAW,QAAQ,EAAE,EACtD,OAAQH,EAAAA,EAAE,MAAMQ,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA,CAAE,CAC1D,CAAC,EA2BM,SAASE,EAAaC,EAAwC,CACnE,OAAOA,CACT,CAWO,SAASC,EAAuBC,EAAwC,CAC7E,MAAMC,EAASL,EAAqB,UAAUI,CAAG,EACjD,OAAIC,EAAO,QACF,CACL,QAAS,GACT,KAAMA,EAAO,IAAA,EAIV,CACL,QAAS,GACT,OAAQA,EAAO,MAAM,OAAO,IAAKC,IAAW,CAC1C,KAAMA,EAAM,KAAK,KAAK,GAAG,GAAK,OAC9B,QAASA,EAAM,OAAA,EACf,CAAA,CAEN"}
@@ -20,6 +20,13 @@ export declare const widgetConfigTypeSchema: z.ZodEnum<{
20
20
  "data-node-fields": "data-node-fields";
21
21
  "context-menu": "context-menu";
22
22
  }>;
23
+ export declare const widgetConfigGroupSchema: z.ZodEnum<{
24
+ base: "base";
25
+ custom: "custom";
26
+ display: "display";
27
+ filters: "filters";
28
+ value: "value";
29
+ }>;
23
30
  export declare const widgetPropConfigSchema: z.ZodObject<{
24
31
  type: z.ZodEnum<{
25
32
  input: "input";
@@ -42,7 +49,13 @@ export declare const widgetPropConfigSchema: z.ZodObject<{
42
49
  "data-node-fields": "data-node-fields";
43
50
  "context-menu": "context-menu";
44
51
  }>;
45
- group: z.ZodOptional<z.ZodString>;
52
+ group: z.ZodOptional<z.ZodEnum<{
53
+ base: "base";
54
+ custom: "custom";
55
+ display: "display";
56
+ filters: "filters";
57
+ value: "value";
58
+ }>>;
46
59
  label: z.ZodString;
47
60
  }, z.core.$strip>;
48
61
  export declare const widgetPropSchema: z.ZodObject<{
@@ -70,7 +83,13 @@ export declare const widgetPropSchema: z.ZodObject<{
70
83
  "data-node-fields": "data-node-fields";
71
84
  "context-menu": "context-menu";
72
85
  }>;
73
- group: z.ZodOptional<z.ZodString>;
86
+ group: z.ZodOptional<z.ZodEnum<{
87
+ base: "base";
88
+ custom: "custom";
89
+ display: "display";
90
+ filters: "filters";
91
+ value: "value";
92
+ }>>;
74
93
  label: z.ZodString;
75
94
  }, z.core.$strip>>;
76
95
  }, z.core.$strip>;
@@ -163,7 +182,13 @@ export declare const widgetManifestSchema: z.ZodObject<{
163
182
  "data-node-fields": "data-node-fields";
164
183
  "context-menu": "context-menu";
165
184
  }>;
166
- group: z.ZodOptional<z.ZodString>;
185
+ group: z.ZodOptional<z.ZodEnum<{
186
+ base: "base";
187
+ custom: "custom";
188
+ display: "display";
189
+ filters: "filters";
190
+ value: "value";
191
+ }>>;
167
192
  label: z.ZodString;
168
193
  }, z.core.$strip>>;
169
194
  }, z.core.$strip>>>>;
@@ -186,6 +211,7 @@ export declare const widgetManifestSchema: z.ZodObject<{
186
211
  }, z.core.$strip>>>>;
187
212
  }, z.core.$strip>;
188
213
  export type WidgetConfigType = z.infer<typeof widgetConfigTypeSchema>;
214
+ export type WidgetConfigGroup = z.infer<typeof widgetConfigGroupSchema>;
189
215
  export type WidgetPropConfig = z.infer<typeof widgetPropConfigSchema>;
190
216
  export type WidgetProp = z.infer<typeof widgetPropSchema>;
191
217
  export type WidgetEventArgumentName = z.infer<typeof widgetEventArgumentNameSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;EAoBjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;iBAIjC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI3B,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;EAIxC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAMlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;iBAGpC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAK5B,CAAC;AAMH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAO/B,CAAC;AAMH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAM3E;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAEnE;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAgB7E"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;EAoBjC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;EAMlC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIjC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI3B,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,6BAA6B;;;;EAIxC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAMlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;iBAGpC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;iBAK5B,CAAC;AAMH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAO/B,CAAC;AAMH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAM3E;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAEnE;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAgB7E"}
package/dist/manifest.js CHANGED
@@ -19,15 +19,21 @@ const o = e.enum([
19
19
  "data-node",
20
20
  "data-node-fields",
21
21
  "context-menu"
22
- ]), r = e.object({
22
+ ]), r = e.enum([
23
+ "base",
24
+ "custom",
25
+ "display",
26
+ "filters",
27
+ "value"
28
+ ]), s = e.object({
23
29
  type: o,
24
- group: e.string().optional(),
30
+ group: r.optional(),
25
31
  label: e.string().min(1, "Property config label is required")
26
- }), s = e.object({
32
+ }), c = e.object({
27
33
  name: e.string().min(1, "Property name is required"),
28
34
  defaultValue: e.any().optional().default(null),
29
- config: r.optional()
30
- }), c = e.enum([
35
+ config: s.optional()
36
+ }), d = e.enum([
31
37
  "SelectedObject",
32
38
  "MultipleSelectedObject",
33
39
  "CurrentMenu"
@@ -37,31 +43,31 @@ const o = e.enum([
37
43
  name: e.string().optional(),
38
44
  generic: e.array(e.lazy(() => a)).optional()
39
45
  })
40
- ), d = e.object({
41
- name: c,
46
+ ), m = e.object({
47
+ name: d,
42
48
  type: a
43
- }), m = e.object({
49
+ }), l = e.object({
44
50
  options: e.object({
45
51
  bindProp: e.string().min(1, "options.bindProp is required")
46
52
  })
47
- }), l = e.object({
53
+ }), u = e.object({
48
54
  name: e.string().min(1, "Event name is required"),
49
55
  label: e.string().min(1, "Event label is required"),
50
- arguments: e.array(d).optional().default([]),
51
- contextmenu: m.optional()
52
- }), u = e.object({
56
+ arguments: e.array(m).optional().default([]),
57
+ contextmenu: l.optional()
58
+ }), p = e.object({
53
59
  id: e.string().min(1, "'id' is required and cannot be empty"),
54
60
  name: e.string().min(1, "'name' is required and cannot be empty"),
55
61
  icon: e.string().optional(),
56
62
  entry: e.string().optional().default("dist"),
57
- props: e.array(s).optional().default([]),
58
- events: e.array(l).optional().default([])
63
+ props: e.array(c).optional().default([]),
64
+ events: e.array(u).optional().default([])
59
65
  });
60
- function g(t) {
66
+ function b(t) {
61
67
  return t;
62
68
  }
63
- function b(t) {
64
- const n = u.safeParse(t);
69
+ function f(t) {
70
+ const n = p.safeParse(t);
65
71
  return n.success ? {
66
72
  success: !0,
67
73
  data: n.data
@@ -74,16 +80,17 @@ function b(t) {
74
80
  };
75
81
  }
76
82
  export {
77
- g as defineWidget,
78
- b as validateWidgetManifest,
83
+ b as defineWidget,
84
+ f as validateWidgetManifest,
79
85
  a as widgetArgumentTypeSchema,
86
+ r as widgetConfigGroupSchema,
80
87
  o as widgetConfigTypeSchema,
81
- c as widgetEventArgumentNameSchema,
82
- d as widgetEventArgumentSchema,
83
- m as widgetEventContextMenuSchema,
84
- l as widgetEventSchema,
85
- u as widgetManifestSchema,
86
- r as widgetPropConfigSchema,
87
- s as widgetPropSchema
88
+ d as widgetEventArgumentNameSchema,
89
+ m as widgetEventArgumentSchema,
90
+ l as widgetEventContextMenuSchema,
91
+ u as widgetEventSchema,
92
+ p as widgetManifestSchema,
93
+ s as widgetPropConfigSchema,
94
+ c as widgetPropSchema
88
95
  };
89
96
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sources":["../src/manifest.ts"],"sourcesContent":["import { z } from 'zod';\n\n// ==========================================\n// 1. Props Configuration Schemas\n// ==========================================\n\nexport const widgetConfigTypeSchema = z.enum([\n 'input',\n 'checkbox',\n 'color-picker',\n 'date',\n 'data-time-range',\n 'datetime',\n 'input-number',\n 'monaco-editor',\n 'radio',\n 'select',\n 'tree-select',\n 'time',\n 'textarea',\n 'switch',\n 'slider',\n 'select-cascader',\n 'data-node',\n 'data-node-fields',\n 'context-menu',\n]);\n\nexport const widgetPropConfigSchema = z.object({\n type: widgetConfigTypeSchema,\n group: z.string().optional(),\n label: z.string().min(1, 'Property config label is required'),\n});\n\nexport const widgetPropSchema = z.object({\n name: z.string().min(1, 'Property name is required'),\n defaultValue: z.any().optional().default(null),\n config: widgetPropConfigSchema.optional(),\n});\n\n// ==========================================\n// 2. Events & Arguments Configuration Schemas\n// ==========================================\n\n/**\n * Supported standard event argument names (3.3)\n */\nexport const widgetEventArgumentNameSchema = z.enum([\n 'SelectedObject',\n 'MultipleSelectedObject',\n 'CurrentMenu',\n]);\n\n/**\n * Recursive schema for event argument types (3.2):\n * 1. Entity type bound to property: { bindProp: 'dataSourceNode' }\n * 2. Generic collection type: { name: 'List', generic: [{ bindProp: 'dataSourceNode' }] }\n * 3. Fixed internal platform type: { name: 'CurrentMenu' }\n */\nexport type WidgetArgumentType = {\n bindProp?: string;\n name?: string;\n generic?: WidgetArgumentType[];\n};\n\nexport const widgetArgumentTypeSchema: z.ZodType<WidgetArgumentType> = z.lazy(() =>\n z.object({\n bindProp: z.string().optional(),\n name: z.string().optional(),\n generic: z.array(z.lazy(() => widgetArgumentTypeSchema)).optional(),\n })\n);\n\n/**\n * Event Argument configuration item (3.2)\n */\nexport const widgetEventArgumentSchema = z.object({\n name: widgetEventArgumentNameSchema,\n type: widgetArgumentTypeSchema,\n});\n\n/**\n * Context menu binding configuration for event (3.4)\n */\nexport const widgetEventContextMenuSchema = z.object({\n options: z.object({\n bindProp: z.string().min(1, 'options.bindProp is required'),\n }),\n});\n\n/**\n * Event configuration item (3.1)\n */\nexport const widgetEventSchema = z.object({\n name: z.string().min(1, 'Event name is required'),\n label: z.string().min(1, 'Event label is required'),\n arguments: z.array(widgetEventArgumentSchema).optional().default([]),\n contextmenu: widgetEventContextMenuSchema.optional(),\n});\n\n// ==========================================\n// 3. Widget Manifest Root Schema\n// ==========================================\n\nexport const widgetManifestSchema = z.object({\n id: z.string().min(1, \"'id' is required and cannot be empty\"),\n name: z.string().min(1, \"'name' is required and cannot be empty\"),\n icon: z.string().optional(),\n entry: z.string().optional().default('dist'),\n props: z.array(widgetPropSchema).optional().default([]),\n events: z.array(widgetEventSchema).optional().default([]),\n});\n\n// ==========================================\n// 4. Inferred TypeScript Types\n// ==========================================\n\nexport type WidgetConfigType = z.infer<typeof widgetConfigTypeSchema>;\nexport type WidgetPropConfig = z.infer<typeof widgetPropConfigSchema>;\nexport type WidgetProp = z.infer<typeof widgetPropSchema>;\n\nexport type WidgetEventArgumentName = z.infer<typeof widgetEventArgumentNameSchema>;\nexport type WidgetEventArgument = z.infer<typeof widgetEventArgumentSchema>;\nexport type WidgetEventContextMenu = z.infer<typeof widgetEventContextMenuSchema>;\nexport type WidgetEvent = z.infer<typeof widgetEventSchema>;\n\nexport type WidgetManifest = z.input<typeof widgetManifestSchema>;\nexport type ResolvedWidgetManifest = z.output<typeof widgetManifestSchema>;\n\n// ==========================================\n// 5. Helper & Validation Functions\n// ==========================================\n\n/**\n * Type-helper for defining widget manifest in `.goodo/manifest.ts`.\n * Provides full IDE autocomplete and compile-time type validation.\n */\nexport function defineWidget(config: WidgetManifest): WidgetManifest {\n return config;\n}\n\nexport interface ManifestValidationResult {\n success: boolean;\n data?: ResolvedWidgetManifest;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * Validates raw manifest data using Zod schema for Node.js environments (e.g. CLI, backend).\n */\nexport function validateWidgetManifest(raw: unknown): ManifestValidationResult {\n const result = widgetManifestSchema.safeParse(raw);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join('.') || 'root',\n message: issue.message,\n })),\n };\n}"],"names":["widgetConfigTypeSchema","z","widgetPropConfigSchema","widgetPropSchema","widgetEventArgumentNameSchema","widgetArgumentTypeSchema","widgetEventArgumentSchema","widgetEventContextMenuSchema","widgetEventSchema","widgetManifestSchema","defineWidget","config","validateWidgetManifest","raw","result","issue"],"mappings":";AAMO,MAAMA,IAAyBC,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYC,IAAyBD,EAAE,OAAO;AAAA,EAC7C,MAAMD;AAAA,EACN,OAAOC,EAAE,OAAA,EAAS,SAAA;AAAA,EAClB,OAAOA,EAAE,OAAA,EAAS,IAAI,GAAG,mCAAmC;AAC9D,CAAC,GAEYE,IAAmBF,EAAE,OAAO;AAAA,EACvC,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,2BAA2B;AAAA,EACnD,cAAcA,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAI;AAAA,EAC7C,QAAQC,EAAuB,SAAA;AACjC,CAAC,GASYE,IAAgCH,EAAE,KAAK;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAcYI,IAA0DJ,EAAE;AAAA,EAAK,MAC5EA,EAAE,OAAO;AAAA,IACP,UAAUA,EAAE,OAAA,EAAS,SAAA;AAAA,IACrB,MAAMA,EAAE,OAAA,EAAS,SAAA;AAAA,IACjB,SAASA,EAAE,MAAMA,EAAE,KAAK,MAAMI,CAAwB,CAAC,EAAE,SAAA;AAAA,EAAS,CACnE;AACH,GAKaC,IAA4BL,EAAE,OAAO;AAAA,EAChD,MAAMG;AAAA,EACN,MAAMC;AACR,CAAC,GAKYE,IAA+BN,EAAE,OAAO;AAAA,EACnD,SAASA,EAAE,OAAO;AAAA,IAChB,UAAUA,EAAE,OAAA,EAAS,IAAI,GAAG,8BAA8B;AAAA,EAAA,CAC3D;AACH,CAAC,GAKYO,IAAoBP,EAAE,OAAO;AAAA,EACxC,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,wBAAwB;AAAA,EAChD,OAAOA,EAAE,OAAA,EAAS,IAAI,GAAG,yBAAyB;AAAA,EAClD,WAAWA,EAAE,MAAMK,CAAyB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,EACnE,aAAaC,EAA6B,SAAA;AAC5C,CAAC,GAMYE,IAAuBR,EAAE,OAAO;AAAA,EAC3C,IAAIA,EAAE,OAAA,EAAS,IAAI,GAAG,sCAAsC;AAAA,EAC5D,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,wCAAwC;AAAA,EAChE,MAAMA,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,OAAOA,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAM;AAAA,EAC3C,OAAOA,EAAE,MAAME,CAAgB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,EACtD,QAAQF,EAAE,MAAMO,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA,CAAE;AAC1D,CAAC;AA0BM,SAASE,EAAaC,GAAwC;AACnE,SAAOA;AACT;AAWO,SAASC,EAAuBC,GAAwC;AAC7E,QAAMC,IAASL,EAAqB,UAAUI,CAAG;AACjD,SAAIC,EAAO,UACF;AAAA,IACL,SAAS;AAAA,IACT,MAAMA,EAAO;AAAA,EAAA,IAIV;AAAA,IACL,SAAS;AAAA,IACT,QAAQA,EAAO,MAAM,OAAO,IAAI,CAACC,OAAW;AAAA,MAC1C,MAAMA,EAAM,KAAK,KAAK,GAAG,KAAK;AAAA,MAC9B,SAASA,EAAM;AAAA,IAAA,EACf;AAAA,EAAA;AAEN;"}
1
+ {"version":3,"file":"manifest.js","sources":["../src/manifest.ts"],"sourcesContent":["import { z } from 'zod';\n\n// ==========================================\n// 1. Props Configuration Schemas\n// ==========================================\n\nexport const widgetConfigTypeSchema = z.enum([\n 'input',\n 'checkbox',\n 'color-picker',\n 'date',\n 'data-time-range',\n 'datetime',\n 'input-number',\n 'monaco-editor',\n 'radio',\n 'select',\n 'tree-select',\n 'time',\n 'textarea',\n 'switch',\n 'slider',\n 'select-cascader',\n 'data-node',\n 'data-node-fields',\n 'context-menu',\n]);\n\nexport const widgetConfigGroupSchema = z.enum([\n 'base',\n 'custom',\n 'display',\n 'filters',\n 'value',\n]);\n\nexport const widgetPropConfigSchema = z.object({\n type: widgetConfigTypeSchema,\n group: widgetConfigGroupSchema.optional(),\n label: z.string().min(1, 'Property config label is required'),\n});\n\nexport const widgetPropSchema = z.object({\n name: z.string().min(1, 'Property name is required'),\n defaultValue: z.any().optional().default(null),\n config: widgetPropConfigSchema.optional(),\n});\n\n// ==========================================\n// 2. Events & Arguments Configuration Schemas\n// ==========================================\n\n/**\n * Supported standard event argument names (3.3)\n */\nexport const widgetEventArgumentNameSchema = z.enum([\n 'SelectedObject',\n 'MultipleSelectedObject',\n 'CurrentMenu',\n]);\n\n/**\n * Recursive schema for event argument types (3.2):\n * 1. Entity type bound to property: { bindProp: 'dataSourceNode' }\n * 2. Generic collection type: { name: 'List', generic: [{ bindProp: 'dataSourceNode' }] }\n * 3. Fixed internal platform type: { name: 'CurrentMenu' }\n */\nexport type WidgetArgumentType = {\n bindProp?: string;\n name?: string;\n generic?: WidgetArgumentType[];\n};\n\nexport const widgetArgumentTypeSchema: z.ZodType<WidgetArgumentType> = z.lazy(() =>\n z.object({\n bindProp: z.string().optional(),\n name: z.string().optional(),\n generic: z.array(z.lazy(() => widgetArgumentTypeSchema)).optional(),\n })\n);\n\n/**\n * Event Argument configuration item (3.2)\n */\nexport const widgetEventArgumentSchema = z.object({\n name: widgetEventArgumentNameSchema,\n type: widgetArgumentTypeSchema,\n});\n\n/**\n * Context menu binding configuration for event (3.4)\n */\nexport const widgetEventContextMenuSchema = z.object({\n options: z.object({\n bindProp: z.string().min(1, 'options.bindProp is required'),\n }),\n});\n\n/**\n * Event configuration item (3.1)\n */\nexport const widgetEventSchema = z.object({\n name: z.string().min(1, 'Event name is required'),\n label: z.string().min(1, 'Event label is required'),\n arguments: z.array(widgetEventArgumentSchema).optional().default([]),\n contextmenu: widgetEventContextMenuSchema.optional(),\n});\n\n// ==========================================\n// 3. Widget Manifest Root Schema\n// ==========================================\n\nexport const widgetManifestSchema = z.object({\n id: z.string().min(1, \"'id' is required and cannot be empty\"),\n name: z.string().min(1, \"'name' is required and cannot be empty\"),\n icon: z.string().optional(),\n entry: z.string().optional().default('dist'),\n props: z.array(widgetPropSchema).optional().default([]),\n events: z.array(widgetEventSchema).optional().default([]),\n});\n\n// ==========================================\n// 4. Inferred TypeScript Types\n// ==========================================\n\nexport type WidgetConfigType = z.infer<typeof widgetConfigTypeSchema>;\nexport type WidgetConfigGroup = z.infer<typeof widgetConfigGroupSchema>;\nexport type WidgetPropConfig = z.infer<typeof widgetPropConfigSchema>;\nexport type WidgetProp = z.infer<typeof widgetPropSchema>;\n\nexport type WidgetEventArgumentName = z.infer<typeof widgetEventArgumentNameSchema>;\nexport type WidgetEventArgument = z.infer<typeof widgetEventArgumentSchema>;\nexport type WidgetEventContextMenu = z.infer<typeof widgetEventContextMenuSchema>;\nexport type WidgetEvent = z.infer<typeof widgetEventSchema>;\n\nexport type WidgetManifest = z.input<typeof widgetManifestSchema>;\nexport type ResolvedWidgetManifest = z.output<typeof widgetManifestSchema>;\n\n// ==========================================\n// 5. Helper & Validation Functions\n// ==========================================\n\n/**\n * Type-helper for defining widget manifest in `.goodo/manifest.ts`.\n * Provides full IDE autocomplete and compile-time type validation.\n */\nexport function defineWidget(config: WidgetManifest): WidgetManifest {\n return config;\n}\n\nexport interface ManifestValidationResult {\n success: boolean;\n data?: ResolvedWidgetManifest;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * Validates raw manifest data using Zod schema for Node.js environments (e.g. CLI, backend).\n */\nexport function validateWidgetManifest(raw: unknown): ManifestValidationResult {\n const result = widgetManifestSchema.safeParse(raw);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join('.') || 'root',\n message: issue.message,\n })),\n };\n}"],"names":["widgetConfigTypeSchema","z","widgetConfigGroupSchema","widgetPropConfigSchema","widgetPropSchema","widgetEventArgumentNameSchema","widgetArgumentTypeSchema","widgetEventArgumentSchema","widgetEventContextMenuSchema","widgetEventSchema","widgetManifestSchema","defineWidget","config","validateWidgetManifest","raw","result","issue"],"mappings":";AAMO,MAAMA,IAAyBC,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYC,IAA0BD,EAAE,KAAK;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYE,IAAyBF,EAAE,OAAO;AAAA,EAC7C,MAAMD;AAAA,EACN,OAAOE,EAAwB,SAAA;AAAA,EAC/B,OAAOD,EAAE,OAAA,EAAS,IAAI,GAAG,mCAAmC;AAC9D,CAAC,GAEYG,IAAmBH,EAAE,OAAO;AAAA,EACvC,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,2BAA2B;AAAA,EACnD,cAAcA,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,IAAI;AAAA,EAC7C,QAAQE,EAAuB,SAAA;AACjC,CAAC,GASYE,IAAgCJ,EAAE,KAAK;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAcYK,IAA0DL,EAAE;AAAA,EAAK,MAC5EA,EAAE,OAAO;AAAA,IACP,UAAUA,EAAE,OAAA,EAAS,SAAA;AAAA,IACrB,MAAMA,EAAE,OAAA,EAAS,SAAA;AAAA,IACjB,SAASA,EAAE,MAAMA,EAAE,KAAK,MAAMK,CAAwB,CAAC,EAAE,SAAA;AAAA,EAAS,CACnE;AACH,GAKaC,IAA4BN,EAAE,OAAO;AAAA,EAChD,MAAMI;AAAA,EACN,MAAMC;AACR,CAAC,GAKYE,IAA+BP,EAAE,OAAO;AAAA,EACnD,SAASA,EAAE,OAAO;AAAA,IAChB,UAAUA,EAAE,OAAA,EAAS,IAAI,GAAG,8BAA8B;AAAA,EAAA,CAC3D;AACH,CAAC,GAKYQ,IAAoBR,EAAE,OAAO;AAAA,EACxC,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,wBAAwB;AAAA,EAChD,OAAOA,EAAE,OAAA,EAAS,IAAI,GAAG,yBAAyB;AAAA,EAClD,WAAWA,EAAE,MAAMM,CAAyB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,EACnE,aAAaC,EAA6B,SAAA;AAC5C,CAAC,GAMYE,IAAuBT,EAAE,OAAO;AAAA,EAC3C,IAAIA,EAAE,OAAA,EAAS,IAAI,GAAG,sCAAsC;AAAA,EAC5D,MAAMA,EAAE,OAAA,EAAS,IAAI,GAAG,wCAAwC;AAAA,EAChE,MAAMA,EAAE,OAAA,EAAS,SAAA;AAAA,EACjB,OAAOA,EAAE,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAM;AAAA,EAC3C,OAAOA,EAAE,MAAMG,CAAgB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,EACtD,QAAQH,EAAE,MAAMQ,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA,CAAE;AAC1D,CAAC;AA2BM,SAASE,EAAaC,GAAwC;AACnE,SAAOA;AACT;AAWO,SAASC,EAAuBC,GAAwC;AAC7E,QAAMC,IAASL,EAAqB,UAAUI,CAAG;AACjD,SAAIC,EAAO,UACF;AAAA,IACL,SAAS;AAAA,IACT,MAAMA,EAAO;AAAA,EAAA,IAIV;AAAA,IACL,SAAS;AAAA,IACT,QAAQA,EAAO,MAAM,OAAO,IAAI,CAACC,OAAW;AAAA,MAC1C,MAAMA,EAAM,KAAK,KAAK,GAAG,KAAK;AAAA,MAC9B,SAASA,EAAM;AAAA,IAAA,EACf;AAAA,EAAA;AAEN;"}
package/dist/types.d.ts CHANGED
@@ -53,7 +53,8 @@ export interface ActionMap {
53
53
  }>;
54
54
  }) => void;
55
55
  set_widget_personalization: (payload: any) => void;
56
- widget_filter_change: (payload: string) => void;
56
+ widget_filter_change: (payload: WidgetFilter) => void;
57
57
  fetch_node_data: (payload: NodeDataRequestPayload) => NodeData;
58
58
  }
59
+ export type WidgetFilter = Record<string, string>;
59
60
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,YAAY,CAAC;IACjC,yBAAyB,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACjF,+BAA+B,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5I,kCAAkC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CACX,MAAM,EACN;YACE,IAAI,EAAE,GAAG,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC;SAClB,CACF,CAAC;KACH,KAAK,IAAI,CAAC;IACX,0BAA0B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,QAAQ,CAAC;CAChE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,YAAY,CAAC;IACjC,yBAAyB,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACjF,+BAA+B,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5I,kCAAkC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CACX,MAAM,EACN;YACE,IAAI,EAAE,GAAG,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC;SAClB,CACF,CAAC;KACH,KAAK,IAAI,CAAC;IACX,0BAA0B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,QAAQ,CAAC;CAChE;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA"}
@@ -1,13 +1,8 @@
1
- import { DataSourceConfig, NodeData, NodeDataRequestPayload, WidgetConfig } from './types';
1
+ import { NodeData, NodeDataRequestPayload, WidgetConfig, WidgetFilter } from './types';
2
2
  /**
3
3
  * Called when the widget is ready to receive configuration from the host.
4
4
  */
5
5
  export declare function onWidgetReady(callback: (config: WidgetConfig) => void): void;
6
- /**
7
- * Add a reactive data source listener on the host platform.
8
- * Returns an unsubscribe function.
9
- */
10
- export declare function addDataSourceListener(config: DataSourceConfig, onChange: (value: any[]) => void): () => void;
11
6
  /**
12
7
  * Emit a custom widget event to the host platform.
13
8
  */
@@ -20,7 +15,7 @@ export declare function setWidgetPersonalization(data: any): Promise<void>;
20
15
  * Register a listener for widget filter changes from the host platform.
21
16
  * Returns an unsubscribe function.
22
17
  */
23
- export declare function onWidgetFilterChange(callback: (condition: string) => void): () => void;
18
+ export declare function onWidgetFilterChange(callback: (condition: WidgetFilter) => void): () => void;
24
19
  export declare function fetchNodeData(payload: NodeDataRequestPayload): Promise<NodeData>;
25
20
  export declare function createDataSource(config: Pick<NodeDataRequestPayload, 'node' | 'filterExpression'>): {
26
21
  fetch: (payload?: Omit<NodeDataRequestPayload, "node" | "filterExpression">) => Promise<NodeData>;
@@ -1 +1 @@
1
- {"version":3,"file":"widget-sdk.d.ts","sourceRoot":"","sources":["../src/widget-sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmB3F;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,QASrE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CA6C5G;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAI7E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAIvD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CA0BtF;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAItF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;sBACjE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;yBAyE5D,MAAM,IAAI,KAAG,MAAM,IAAI;EAoBpD"}
1
+ {"version":3,"file":"widget-sdk.d.ts","sourceRoot":"","sources":["../src/widget-sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmBzG;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,QASrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAI7E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAIvD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CA0B5F;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAItF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;sBACjE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,kBAAkB,CAAC;yBAyE5D,MAAM,IAAI,KAAG,MAAM,IAAI;EAoBpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodo/platform-plugin",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "goodo platform plugin sdk",
5
5
  "type": "module",
6
6
  "publishConfig": {