@fusedio/widget-sdk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bridge.d.ts CHANGED
@@ -87,6 +87,15 @@ export interface RoutingBridge {
87
87
  export interface SqlQueryOptions {
88
88
  defaultLimit?: number;
89
89
  signal?: AbortSignal;
90
+ /**
91
+ * Optional binding identity (chunk-2 MCP-host seam). When the host resolves
92
+ * data server-side (the MCP Apps renderer), it stamps a `_queryId` into each
93
+ * data-bound node's props and the SDK threads it here so the static bridge can
94
+ * look up the pre-resolved rows by id. The workbench bridge ignores this field
95
+ * (it runs the query against DuckDB regardless), so it is fully
96
+ * backward-compatible.
97
+ */
98
+ queryId?: string;
90
99
  }
91
100
  export interface SqlQueryResult {
92
101
  rows: ReadonlyArray<Record<string, unknown>>;
package/dist/bundle.js CHANGED
@@ -1,2 +1,2 @@
1
- var Sn="parameter-updates",ce=(o=>(o.PARAM="param",o.RANGE="range",o.VIEWPORT="viewport",o.CLEAR="clear",o))(ce||{});function yn(e){if(typeof e!="object"||e===null)return!1;let r=e;return typeof r.type=="string"&&Object.values(ce).includes(r.type)&&typeof r.parameter=="string"&&"values"in r}import{createContext as we,useContext as Ue}from"react";var ke=we(null);ke.displayName="FusedWidgetBridgeContext";function v(){let e=Ue(ke);if(!e)throw new Error("useFusedWidgetBridge: no FusedWidgetBridgeContext provider in the tree. Wrap your components with the workbench's <JsonUiProvider> or the test harness's <FusedWidgetBridgeContext.Provider value={createTestBridge()}>.");return e}var Ce=we(null);Ce.displayName="JsonUiNodeOverrideContext";function W(){let e=v(),r=Ue(Ce);return r?{udfUniqueId:r.udfUniqueId??e.node.udfUniqueId,udfName:r.udfName??e.node.udfName,configHash:r.configHash??e.node.configHash}:{udfUniqueId:e.node.udfUniqueId,udfName:e.node.udfName,configHash:e.node.configHash}}import{createContext as ar,useCallback as Pe,useContext as lr,useRef as Ae,useSyncExternalStore as cr}from"react";function hn(){let e=new Map,r=new Set,n=t=>{r.forEach(o=>{o.names.has(t)&&o.cb()})};return{get(t){return e.get(t)},getSnapshot(t){let o={};for(let i of t)e.has(i)&&(o[i]=e.get(i));return o},getAll(){let t={};return e.forEach((o,i)=>{t[i]=o}),t},setField(t,o){e.has(t)&&Object.is(e.get(t),o)||(e.set(t,o),n(t))},removeField(t){e.has(t)&&(e.delete(t),n(t))},subscribe(t,o){let i={names:new Set(t),cb:o};return r.add(i),()=>{r.delete(i)}}}}var Oe=ar({store:null,isInForm:!1});Oe.displayName="JsonUiFormContext";function de(){return lr(Oe)}var Ee=Object.freeze({});function J(e){let{store:r,isInForm:n}=de(),t=fr(e),o=Pe(c=>r?r.subscribe(t,c):()=>{},[r,t]),i=Ae(Ee),u=Pe(()=>{if(!r)return Ee;let c=r.getSnapshot(t),a=i.current;return dr(a,c)?a:(i.current=c,c)},[r,t]),s=cr(o,u,u);return{inForm:n,values:s}}function dr(e,r){if(e===r)return!0;let n=Object.keys(e),t=Object.keys(r);if(n.length!==t.length)return!1;for(let o of n)if(!Object.is(e[o],r[o]))return!1;return!0}function fr(e){let r=Ae(e),n=r.current;return n!==e&&(n.length!==e.length||n.some((t,o)=>t!==e[o]))&&(r.current=e),r.current}function gr(e){return e}function pr(e){return e}import{useCallback as ee,useEffect as z,useMemo as re,useRef as V,useState as mr}from"react";function fe({param:e,debounceMs:r=300,readOnly:n=!1,defaultValue:t,broadcastDefaultValue:o=!0,validate:i,preprocess:u}){let s=v(),{configHash:c}=W(),a=!!e,x=(f,C)=>{if(!e)return;if(f==="Cleared"){s.log.log(`Cleared param "${e}"`,"info",c);return}let l=JSON.stringify(C),y=l&&l.length>100?l.slice(0,100)+"\u2026":l;s.log.log(`${f} param "${e}" = ${y}`,"info",c)},m=re(()=>u??yr(t),[u]),w=re(()=>i??Sr(t),[i]),d=re(()=>e?[e]:[],[e]),{inForm:b,values:S}=J(d),q=e?S[e]:void 0,M=re(()=>{if(!(!a||!e))return s.params.getSnapshot(e)},[s,a,e]),h=()=>{let f=b&&q!==void 0?q:M;if(f==null)return t;let C=m(f);return w(C)?C:t},[L,U]=mr(h),k=V(L);k.current=L;let g=V(null),O=V(!1),N=V(!1),Q=V({enabled:a,param:e});Q.current={enabled:a,param:e};let T=V(s);T.current=s;let F=V(e);z(()=>{let f=F.current;F.current=e,f&&f!==e&&s.params.clear(f)},[s,e]),z(()=>{if(!a||!e||O.current)return;let f=b&&q!==void 0?q:s.params.getSnapshot(e);if(f==null)return;let C=m(f);C!==k.current&&w(C)&&(U(C),x("Received",f))},[s,e,a,b,q,m,w]),z(()=>!a||!e?void 0:s.params.subscribe(e,()=>{if(O.current)return;let C=s.params.getSnapshot(e);if(C==null)return;let l=m(C);l!==k.current&&w(l)&&(U(l),x("Received",C))}),[s,e,a,m,w]);let A=ee(f=>{!a||!e||(s.params.set(e,f,"param"),s.edges.stopLoading(),x("Broadcast",f))},[s,a,e]),j=ee(()=>{!a||n||(g.current&&(clearTimeout(g.current),g.current=null),s.edges.startLoading(),A(k.current),O.current=!1)},[s,A,a,n]),E=ee(f=>{g.current&&(clearTimeout(g.current),g.current=null),U(f),k.current=f,O.current=!1,!(!a||!e||n)&&(s.params.clear(e),s.edges.stopLoading(),x("Cleared",null))},[s,a,e,n]);z(()=>{N.current=!1},[e,a]),z(()=>{if(!a||!e||n||!o||N.current)return;let f=s.params.getSnapshot(e);if(f!=null){N.current=!0;return}if(k.current===""){N.current=!0;return}A(k.current),N.current=!0},[s,a,e,n,o,A]);let B=ee(f=>{U(f),!(!a||n)&&(O.current=!0,s.edges.startLoading(),g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{A(f),O.current=!1},r))},[s,A,r,a,n]);return z(()=>()=>{g.current&&clearTimeout(g.current);let{enabled:f,param:C}=Q.current;!f||!C||T.current.params.clear(C)},[]),{value:L,setValue:B,broadcastNow:j,clearValue:E}}function Sr(e){return typeof e=="string"?(r=>typeof r=="string"):typeof e=="number"?(r=>typeof r=="number"):typeof e=="boolean"?(r=>typeof r=="boolean"):Array.isArray(e)?(r=>Array.isArray(r)):e!==null&&typeof e=="object"?(r=>r!==null&&typeof r=="object"&&!Array.isArray(r)):(r=>!0)}function yr(e){return typeof e=="string"?r=>typeof r=="string"?r:Array.isArray(r)?r.join(","):r!==null&&typeof r=="object"?JSON.stringify(r):String(r):r=>r}import{useEffect as Le}from"react";function Rr(e){let r=de(),n=e.param,t=!!(r.isInForm&&n),{value:o,setValue:i,broadcastNow:u,clearValue:s}=fe({...e,param:t?void 0:e.param}),c=r.store;return Le(()=>{!t||!n||!c||c.setField(n,o)},[o,t,n,c]),Le(()=>{if(!(!t||!n||!c))return()=>{c.removeField(n)}},[t,n,c]),{value:o,setValue:i,broadcastNow:u,clearValue:s,isInForm:r.isInForm}}import{useCallback as Fe,useRef as De,useSyncExternalStore as vr}from"react";var Te=Object.freeze({});function Y(e){let r=v(),n=xr(e),t=Fe(u=>n.length===0?()=>{}:r.params.subscribeMany(n,u),[r,n]),o=De(Te),i=Fe(()=>{if(n.length===0)return Te;let u=r.params.getSnapshotMany(n),s=o.current;return br(s,u)?s:(o.current=u,u)},[r,n]);return vr(t,i,i)}function br(e,r){if(e===r)return!0;let n=Object.keys(e),t=Object.keys(r);if(n.length!==t.length)return!1;for(let o of n)if(!Object.is(e[o],r[o]))return!1;return!0}function xr(e){let r=De(e),n=r.current;return n!==e&&(n.length!==e.length||n.some((t,o)=>t!==e[o]))&&(r.current=e),r.current}import{useCallback as ge,useRef as hr,useSyncExternalStore as wr}from"react";function Ur(){let e=v(),r=ge(u=>e.routing.subscribeAllowedSources(u),[e]),n=hr(null),t=ge(()=>{let u=e.routing.getAllowedSources(),s=n.current;return kr(s,u)?s:(n.current=u,u)},[e]),o=wr(r,t,t),i=ge((u,s)=>!o||o.length===0||!u&&!s?!0:o.some(c=>c.udfUniqueId&&c.udfUniqueId===u||c.udfName&&c.udfName===s),[o]);return{allowedSources:o,isAllowedSource:i}}function kr(e,r){return e===r?!0:e===null||r===null||e.length!==r.length?!1:e.every((n,t)=>n.udfUniqueId===r[t].udfUniqueId&&n.udfName===r[t].udfName)}import{useCallback as Ne,useRef as Cr,useSyncExternalStore as Pr}from"react";function Er(){let e=v(),r=Ne(o=>e.routing.subscribeAllowedSources(o),[e]),n=Cr(null),t=Ne(()=>{let o=e.routing.getAllowedUdfNames(),i=n.current;return Ar(i,o)?i:(n.current=o,o)},[e]);return Pr(r,t,t)}function Ar(e,r){if(e===r)return!0;if(e===null||r===null||e.size!==r.size)return!1;for(let n of e)if(!r.has(n))return!1;return!0}import{useEffect as Or,useMemo as $,useRef as Lr,useState as qe,useSyncExternalStore as Fr,useCallback as Me}from"react";var Ie=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,Tr=/\{\{[\s\S]*?\}\}/,Be=/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\b/g;function pe(e,r={}){let n=e??"",t=r.preserveMissingParams??!1,o=v(),i=$(()=>Dr(n),[n]),u=Y(i),{inForm:s,values:c}=J(i),a=$(()=>s?{...u,...c}:u,[u,c,s]),x=$(()=>Tr.test(n),[n]),m=$(()=>x?"":Nr(n,a,t),[n,a,t,x]),w=$(()=>{if(!x)return[];let U=new Set,k=[];Be.lastIndex=0;let g;for(;(g=Be.exec(n))!==null;)U.has(g[1])||(U.add(g[1]),k.push(g[1]));return k},[n,x]),d=Mr(o,w),[b,S]=qe(()=>({key:"",value:""})),[q,M]=qe(!1),h=$(()=>JSON.stringify({template:n,paramValues:a,preserveMissingParams:t,tick:d}),[n,a,t,d]);return Or(()=>{if(!x){M(!1);return}let U=!1,k=new AbortController;return M(!0),o.template.render(n,a,{preserveMissingParams:t,signal:k.signal}).then(g=>{U||(S(O=>O.key===h&&O.value===g.value?O:{key:h,value:g.value}),M(g.loading))},g=>{U||g?.name!=="AbortError"&&M(!1)}),()=>{U=!0,k.abort()}},[o,x,n,a,t,h]),{value:$(()=>{if(!x)return m;if(b.key===h)return b.value;try{return o.template.renderLoading(n,a,{preserveMissingParams:t})}catch{return n}},[o,x,m,b,h,n,a,t]),loading:x?q:!1}}function Dr(e){let r=[],n=new Set;for(let t of e.matchAll(Ie)){let o=t[1];n.has(o)||(n.add(o),r.push(o))}return r}function Nr(e,r,n){return e.replace(Ie,(t,o)=>{let i=r[o];return i==null?n?t:"":qr(i)})}function qr(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e)??""}function Mr(e,r){let n=Lr(0),t=r.slice().sort().join("|"),o=Me(u=>{let s=()=>{n.current+=1,u()},c=[e.template.subscribe(s)];for(let a of r)c.push(e.udfs.subscribeOutput(a,s));return()=>c.forEach(a=>a())},[e,t]),i=Me(()=>n.current,[]);return Fr(o,i,i)}import{useCallback as ne,useEffect as Br,useMemo as te,useRef as Ir,useState as _e,useSyncExternalStore as _r}from"react";function Qe(e){let r=v(),n=ne(i=>e?r.udfs.subscribeOutput(e,i):()=>{},[r,e]),t=Ir(void 0),o=ne(()=>{if(!e)return;let i=r.udfs.getOutputSnapshot(e),u=t.current;return Qr(u,i)?u:(t.current=i,i)},[r,e]);return _r(n,o,o)}function Ve(){let e=v();return ne(r=>e.udfs.requestReexecute(r),[e])}function Qr(e,r){return e===r?!0:!e||!r?!1:e.data===r.data&&e.isExecutionInProgress===r.isExecutionInProgress&&e.error===r.error&&e.vfsFilename===r.vfsFilename}var $e=/^\{\{(\w+)\.(\w+)(?:\[(\d+)\])?\}\}$/;function oe(e){return!e||typeof e!="string"?!1:$e.test(e)}function me(e){if(!oe(e))return null;let r=e.match($e);if(!r)return null;let[,n,t,o]=r,i=o!==void 0?parseInt(o,10):void 0;return{udfName:n,columnName:t,index:i}}function Vr(e){return!!e&&typeof e=="object"&&typeof e.getRows=="function"}function Se({udfName:e,sampleSize:r=200}){let n=Qe(e),t=Ve(),[o,i]=_e([]),[u,s]=_e([]);Br(()=>{let a=!1,x=n?.data;if(!x||!Vr(x)){i([]),s([]);return}return(async()=>{try{let m=await x.getRows(0,Math.max(0,r));if(a)return;let w=m.map(b=>{let S=b;return S&&typeof S=="object"&&S.properties&&typeof S.properties=="object"?S.properties:b});i(w);let d=Array.from(new Set(w.flatMap(b=>Object.keys(b??{}))));s(d)}catch{if(a)return;i([]),s([])}})(),()=>{a=!0}},[n?.data,r]);let c=ne(()=>{e&&t(e)},[t,e]);return{loading:n?.isExecutionInProgress??!1,errorMessage:n?.error??null,isError:!!n?.error,columns:u,rows:o,requestReexecute:c}}function $r(e,r=200){let n=oe(e),t=te(()=>n?me(e):null,[n,e]),{rows:o,loading:i}=Se({udfName:t?.udfName,sampleSize:r});return{values:te(()=>!t||!t.columnName?[]:o.map(s=>s?.[t.columnName]).filter(s=>s!=null),[o,t]),loading:n?i:!1}}function jr(e,r=200){let n=oe(e),t=te(()=>n?me(e):null,[n,e]),{rows:o,loading:i}=Se({udfName:t?.udfName,sampleSize:r});return{value:te(()=>{if(!t||!t.columnName||t.index===void 0)return null;let s=o[t.index];if(!s)return null;let c=s[t.columnName];return c!==void 0?c:null},[o,t]),loading:n?i:!1}}import{useCallback as nr,useEffect as K,useMemo as D,useRef as nn,useState as I}from"react";import{useCallback as se,useMemo as Wr,useRef as ye,useSyncExternalStore as Jr}from"react";var je=Object.freeze([]);function ie(){let e=v(),{configHash:r}=W(),n=ye(e);n.current=e;let t=ye(r);t.current=r;let o=se((i,u="info")=>{n.current.log.log(i,u,t.current)},[]);return Wr(()=>({log:o}),[o])}function zr(e){let r=v(),n=se(i=>e?r.log.subscribeLogs(e,i):()=>{},[r,e]),t=ye(je),o=se(()=>{if(!e)return je;let i=r.log.getLogsSnapshot(e);return i===t.current?t.current:(t.current=i,i)},[r,e]);return Jr(n,o,o)}function Hr(e){let r=v();return se(()=>{e&&r.log.clearLogs(e)},[r,e])}function ue(){let e=v();return{startLoading:e.edges.startLoading,stopLoading:e.edges.stopLoading}}import{createContext as Kr,useContext as Zr}from"react";var Gr=Object.freeze({}),Re=Kr(Gr);Re.displayName="SqlSourceOverrideContext";function ve(){return Zr(Re)}var be=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,We=/\{\{(\w+)(?:\?([^}]*))?\}\}/g,xe=/'((?:s3|gs|fd):\/\/[^'\n]+)'/g;function Yr(e){return e==null?"''":typeof e=="number"&&!Number.isNaN(e)?String(e):typeof e=="boolean"?e?"TRUE":"FALSE":`'${String(e).replace(/'/g,"''")}'`}function Xr(e,r){let n=!1;for(let t=0;t<r;t++)if(e[t]==="'"){if(n&&e[t+1]==="'"){t++;continue}n=!n}return n}function Je(e,r){return e.replace(be,(n,t,o)=>{let i=r[t],u=i==null?"":String(i);return Xr(e,o)?u.replace(/'/g,"''"):Yr(i)})}function ze(e){let r=new Set,n=[];be.lastIndex=0;for(let t of e.matchAll(be)){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function en(e){if(!e)return null;let r={},n=!1;for(let t of e.split(/[&,]/)){if(!t)continue;let o=t.indexOf("=");if(o===-1)continue;let i=t.slice(0,o),u=t.slice(o+1),s,c;try{s=decodeURIComponent(i),c=decodeURIComponent(u)}catch{s=i,c=u}s&&(r[s]=c,n=!0)}return n?r:null}function He(e){let r=[],n;for(We.lastIndex=0;(n=We.exec(e))!==null;){let[t,o,i]=n;r.push({match:t,name:o,overrides:en(i),start:n.index,end:n.index+t.length})}return r}function Ke(e){if(!e)return[];let r=new Set,n=[];xe.lastIndex=0;let t;for(;(t=xe.exec(e))!==null;){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function Ze(e,r){return e&&e.replace(xe,(n,t)=>{let o=r[t];return o?`'${o}'`:n})}var Ge=/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/;function Ye(e){let r=e.trim(),n=Ge.exec(r);return n?n[1]:null}function Xe(e,r){let n=Ge.exec(e);if(!n)return{value:e,unresolved:!1};let t=n[1];if(!(t in r))return{value:e,unresolved:!0};let o=r[t];return o==null?{value:"",unresolved:!1}:{value:String(o),unresolved:!1}}function rn(e){return Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}function er(e,r){return r?`${e}#${rn(r)}`:e}var tr=500,H=Object.freeze([]),X=Object.freeze([]);function rr(e,r){if(/\bLIMIT\b/i.test(e))return e;let n=e.trimEnd();return`${n.endsWith(";")?n.slice(0,-1):n} LIMIT ${r}`}function tn(e){return`"${e.replace(/"/g,'""')}"`}function on(e,r,n,t,o,i){let u=e.match(/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/);if(u){let c=o[u[1]];return c==null?"":rr(String(c),i)}let s=e;for(let c=r.length-1;c>=0;c--){let{raw:a,key:x,resolvedOverrides:m}=r[c],d=m===null&&t?t[a.name]:void 0,b;d?b=tn(d.relationName):b=`'${n.get(x)??`${a.name}.parquet`}'`,s=s.slice(0,a.start)+b+s.slice(a.end)}return s=rr(s,i),Je(s,o)}function or({sql:e,enabled:r=!0,maxRows:n=tr,sourceOverrides:t}){let o=v(),i=ve(),u=D(()=>{let l=Object.keys(i).length>0;return t?l?{...i,...t}:t:l?i:void 0},[i,t]),{startLoading:s,stopLoading:c}=ue(),{log:a}=ie(),[x,m]=I(""),[w,d]=I(!1),[b,S]=I(null),[q,M]=I(0),h=D(()=>e?He(e):[],[e]),L=D(()=>u?h.filter(l=>l.overrides!==null||!u[l.name]):h,[h,u]),U=D(()=>{let l=new Set;for(let y of L)if(y.overrides)for(let R of Object.values(y.overrides)){let _=Ye(R);_&&l.add(_)}return Array.from(l)},[L]),k=D(()=>e?ze(e):[],[e]),g=D(()=>{let l=new Set,y=[];for(let R of k)l.has(R)||(l.add(R),y.push(R));for(let R of U)l.has(R)||(l.add(R),y.push(R));return y},[k,U]),O=Y(g),{inForm:N,values:Q}=J(g),T=D(()=>N?{...O,...Q}:O,[N,O,Q]),F=D(()=>L.map(l=>{if(!l.overrides)return{raw:l,key:l.name,resolvedOverrides:null,unresolved:!1};let y={},R=!1;for(let[_,Z]of Object.entries(l.overrides)){let p=Xe(Z,T);p.unresolved&&(R=!0),y[_]=p.value}return{raw:l,key:er(l.name,y),resolvedOverrides:y,unresolved:R}}),[L,T]),A=D(()=>{let l=new Set,y=[];for(let R of F)R.unresolved||l.has(R.key)||(l.add(R.key),y.push({name:R.raw.name,key:R.key,overrides:R.resolvedOverrides??void 0}));return y},[F]),j=D(()=>A.map(l=>`${l.key}|${l.name}|${l.overrides?Object.entries(l.overrides).sort(([y],[R])=>y.localeCompare(R)).map(([y,R])=>`${y}=${R}`).join(","):""}`).join(`
2
- `),[A]),E=nr(()=>{M(l=>l+1)},[]);K(()=>{if(!r||A.length===0)return;let l=A.map(y=>o.udfs.subscribeOutput(y.name,()=>{M(R=>R+1)}));return()=>{l.forEach(y=>y())}},[o,r,A]),K(()=>{w?s():c()},[w,s,c]);let B=D(()=>{if(!u)return null;for(let l of h){if(l.overrides!==null)continue;let y=u[l.name];if(y?.error)return y.error}return null},[h,u]),f=D(()=>u?h.some(l=>l.overrides===null&&u[l.name]?.loading):!1,[h,u]),C=F.some(l=>l.unresolved);return K(()=>{if(!r||!e){m(""),d(!1),S(null);return}if(B){m(""),S(B),d(!1),a(`SQL preprocessing: ${B}`,"error");return}if(f||C){m(""),S(null),d(!0);return}let l=!1;return d(!0),S(null),(async()=>{let y=new Map,R;if(A.length>0)try{let p=await o.sql.resolveVfsFilenames(A);if(l)return;if(p instanceof Map)for(let P of F){if(P.resolvedOverrides)continue;let G=p.get(P.raw.name);G&&y.set(P.key,G)}else y=p.filenames,R=p.errors}catch(p){if(l)return;let P=p instanceof Error?p.message:typeof p=="string"?p:"VFS registration failed";m(""),S(P),d(!1),a(`SQL preprocessing: ${P}`,"error");return}if(R)for(let p of F){let P=R.get(p.key);if(P){if(l)return;m(""),S(P),d(!1),a(`SQL preprocessing: ${P}`,"error");return}}for(let p of F)if(!(p.unresolved||p.resolvedOverrides===null&&u?.[p.raw.name]!==void 0)&&!y.has(p.key)){if(l)return;m(""),S(null),d(!0);return}let _;try{_=on(e,F,y,u,T,n)}catch(p){if(l)return;let P=p instanceof Error?p.message:typeof p=="string"?p:"SQL preprocessing failed";m(""),S(P),d(!1),a(`SQL preprocessing failed: ${P}`,"error");return}let Z=Ke(_);if(Z.length===0){if(l)return;m(_),S(null),d(!1),a("SQL preprocessing completed");return}try{let p={},P=await Promise.all(Z.map(le=>o.signUrl(le)));if(l)return;Z.forEach((le,ur)=>{p[le]=P[ur].signed});let G=Ze(_,p);m(G),S(null),d(!1),a("SQL preprocessing completed")}catch(p){if(l)return;let P=p instanceof Error?p.message:typeof p=="string"?p:"URL signing failed";m(""),S(P),d(!1),a(`SQL preprocessing failed: ${P}`,"error")}})(),()=>{l=!0}},[o,r,e,j,F,T,u,B,f,C,n,q,a,A]),{processedSql:x,loading:w,error:b,refetch:E}}function sn({sql:e,enabled:r=!0,maxRows:n=tr,sourceOverrides:t}){let o=v(),{startLoading:i,stopLoading:u}=ue(),{log:s}=ie(),[c,a]=I(H),[x,m]=I(X),[w,d]=I(!1),[b,S]=I(null),[q,M]=I(0),{processedSql:h,loading:L,error:U,refetch:k}=or({sql:e,enabled:r,maxRows:n,sourceOverrides:t}),g=nn(""),O=r&&!!e&&!!h&&!L&&!U&&h!==g.current,N=L||w||O;K(()=>{N?i():u()},[N,i,u]);let Q=nr(()=>{g.current="",k(),M(T=>T+1)},[k]);return K(()=>{if(!r||!e){g.current="",a(H),m(X),d(!1),S(null);return}if(U){g.current="",S(U),a(H),m(X),d(!1);return}if(L||!h){g.current="",d(!1);return}let T=!1,F=new AbortController;g.current=h,d(!0),S(null);let A=h.length>120?h.slice(0,120)+"\u2026":h;s(`SQL query started: ${A}`);let j=performance.now();return o.sql.query(h,{signal:F.signal}).then(E=>{if(T)return;let B=Math.round(performance.now()-j);if(E.error){a(H),m(X),S(E.error),d(!1),s(`SQL failed (${B}ms): ${E.error}`,"error");return}a(E.rows.length===0?H:E.rows),m(E.columns),S(null),d(!1),s(`SQL completed: ${E.rows.length} row${E.rows.length!==1?"s":""} in ${B}ms`)},E=>{if(T||E?.name==="AbortError")return;let B=Math.round(performance.now()-j),f=E instanceof Error?E.message:typeof E=="string"?E:"SQL query failed";S(f),a(H),m(X),d(!1),s(`SQL failed (${B}ms): ${f}`,"error")}),()=>{T=!0,F.abort()}},[o,r,e,h,L,U,q,s]),{rows:c,columns:x,loading:N,error:b,refetch:Q}}function un(e,r=!0){let n=v(),[t,o]=I({filenames:new Map,loading:!1}),i=D(()=>e.slice().sort().join("|"),[e]);return K(()=>{if(!r||e.length===0){o({filenames:new Map,loading:!1});return}let u=!1;return o(s=>({...s,loading:!0,error:void 0})),n.sql.resolveVfsFilenames(e).then(s=>{if(u)return;let c=s instanceof Map?s:s.filenames;o({filenames:c,loading:!1})},s=>{u||o({filenames:new Map,loading:!1,error:s instanceof Error?s.message:String(s)})}),()=>{u=!0}},[n,i,r]),t}import{useCallback as sr,useEffect as an,useState as ae}from"react";var ir=["s3://","gs://","fd://"];function he(e){return ir.some(r=>e.startsWith(r))}function ln(){let e=v();return{signUrl:sr(n=>e.signUrl(n),[e])}}function cn(e){let r=v(),{value:n,loading:t}=pe(e),[o,i]=ae(null),[u,s]=ae(null),[c,a]=ae(!1),[x,m]=ae(0);an(()=>{if(t)return;if(!n){i(null),s(null),a(!1);return}if(!he(n)){i(n),s(null),a(!1);return}let d=!1;return a(!0),s(null),r.signUrl(n).then(({signed:b})=>{d||i(b??n)}).catch(b=>{d||(s(b instanceof Error?b.message:"Failed to load media"),i(null))}).finally(()=>{d||a(!1)}),()=>{d=!0}},[r,t,n,x]);let w=sr(async()=>{if(!n||!he(n))return n??null;let{signed:d}=await r.signUrl(n),b=d??n;return i(b),s(null),m(S=>S+1),b},[r,n]);return{src:o,loading:t||c,error:u,refreshSignedUrl:w,resolvedSrc:n,needsSigning:!!(n&&he(n))}}import{useEffect as dn,useState as fn}from"react";function gn(e,r){let n=v(),[t,o]=fn({status:"idle"});return dn(()=>{if(!r||!e?.trim()){o({status:"idle"});return}let i=!1;return o({status:"checking"}),n.uploads.checkAccess(e).then(u=>{i||(u.ok?o({status:"allowed"}):o({status:"denied",message:u.message??"Upload access denied."}))}),()=>{i=!0}},[n,e,r]),t}function pn(){return W()}function mn(e){if(!e)return{};let r={};for(let n of e.split(";")){let t=n.indexOf(":");if(t===-1)continue;let o=n.slice(0,t).trim(),i=n.slice(t+1).trim();if(!o||!i)continue;let u=o.replace(/-([a-z])/g,(s,c)=>c.toUpperCase());r[u]=i}return r}export{Oe as FormContext,ke as FusedWidgetBridgeContext,Ce as JsonUiNodeOverrideContext,Sn as PARAMETER_BROADCAST_CHANNEL,ce as ParameterMessageType,xe as SIGNABLE_URL_LITERAL_REGEX,ir as SIGNED_URL_SCHEMES,be as SQL_PARAM_REGEX,We as SQL_SOURCE_PLACEHOLDER_REGEX,Re as SqlSourceOverrideContext,rn as canonicalOverrideKey,er as computePlaceholderKey,hn as createFormParamsStore,pr as defineCatalog,gr as defineComponent,Yr as escapeSqlValue,Ke as extractSignableUrls,ze as extractSqlParams,Ye as getDollarRefName,yn as isStandardMessage,oe as isUdfQuery,en as parseOverridesString,He as parseSqlUdfPlaceholders,mn as parseStyle,me as parseUdfColumnQuery,Xe as resolveOverrideValue,Ze as rewriteSignedUrls,Je as substituteSqlParams,Ur as useAllowedSources,Er as useAllowedUdfNames,Y as useCanvasParams,sn as useDuckDbSqlQuery,or as useDuckDbSqlQueryPreprocessing,de as useFormContext,J as useFormParams,fe as useFusedParam,Rr as useFusedParamWithForm,v as useFusedWidgetBridge,ue as useJsonUiEdgeAnimation,ie as useJsonUiLog,Hr as useJsonUiLogClear,zr as useJsonUiLogs,W as useJsonUiNode,pn as useJsonUiUdfInfo,cn as useMediaSrc,pe as useParamSubstitution,Ve as useRequestUdfReexecute,ve as useSqlSourceOverrides,jr as useUdfColumnValue,$r as useUdfColumnValues,Se as useUdfDataFrameSample,Qe as useUdfOutputByName,gn as useUploadAccessCheck,ln as useUrlSigning,un as useVfsRegistration};
1
+ var xr="parameter-updates",ce=(o=>(o.PARAM="param",o.RANGE="range",o.VIEWPORT="viewport",o.CLEAR="clear",o))(ce||{});function br(e){if(typeof e!="object"||e===null)return!1;let n=e;return typeof n.type=="string"&&Object.values(ce).includes(n.type)&&typeof n.parameter=="string"&&"values"in n}import{createContext as ke,useContext as Ce}from"react";var Pe=ke(null);Pe.displayName="FusedWidgetBridgeContext";function v(){let e=Ce(Pe);if(!e)throw new Error("useFusedWidgetBridge: no FusedWidgetBridgeContext provider in the tree. Wrap your components with the workbench's <JsonUiProvider> or the test harness's <FusedWidgetBridgeContext.Provider value={createTestBridge()}>.");return e}var Ee=ke(null);Ee.displayName="JsonUiNodeOverrideContext";function j(){let e=v(),n=Ce(Ee);return n?{udfUniqueId:n.udfUniqueId??e.node.udfUniqueId,udfName:n.udfName??e.node.udfName,configHash:n.configHash??e.node.configHash}:{udfUniqueId:e.node.udfUniqueId,udfName:e.node.udfName,configHash:e.node.configHash}}import{createContext as dn,useCallback as Ae,useContext as fn,useRef as Le,useSyncExternalStore as gn}from"react";function Cr(){let e=new Map,n=new Set,r=t=>{n.forEach(o=>{o.names.has(t)&&o.cb()})};return{get(t){return e.get(t)},getSnapshot(t){let o={};for(let s of t)e.has(s)&&(o[s]=e.get(s));return o},getAll(){let t={};return e.forEach((o,s)=>{t[s]=o}),t},setField(t,o){e.has(t)&&Object.is(e.get(t),o)||(e.set(t,o),r(t))},removeField(t){e.has(t)&&(e.delete(t),r(t))},subscribe(t,o){let s={names:new Set(t),cb:o};return n.add(s),()=>{n.delete(s)}}}}var Fe=dn({store:null,isInForm:!1});Fe.displayName="JsonUiFormContext";function de(){return fn(Fe)}var Oe=Object.freeze({});function W(e){let{store:n,isInForm:r}=de(),t=mn(e),o=Ae(c=>n?n.subscribe(t,c):()=>{},[n,t]),s=Le(Oe),u=Ae(()=>{if(!n)return Oe;let c=n.getSnapshot(t),l=s.current;return pn(l,c)?l:(s.current=c,c)},[n,t]),i=gn(o,u,u);return{inForm:r,values:i}}function pn(e,n){if(e===n)return!0;let r=Object.keys(e),t=Object.keys(n);if(r.length!==t.length)return!1;for(let o of r)if(!Object.is(e[o],n[o]))return!1;return!0}function mn(e){let n=Le(e),r=n.current;return r!==e&&(r.length!==e.length||r.some((t,o)=>t!==e[o]))&&(n.current=e),n.current}function Sn(e){return e}function yn(e){return e}import{useCallback as ee,useEffect as z,useMemo as ne,useRef as J,useState as Rn}from"react";function fe({param:e,debounceMs:n=300,readOnly:r=!1,defaultValue:t,broadcastDefaultValue:o=!0,validate:s,preprocess:u}){let i=v(),{configHash:c}=j(),l=!!e,x=(d,f)=>{if(!e)return;if(d==="Cleared"){i.log.log(`Cleared param "${e}"`,"info",c);return}let a=JSON.stringify(f),g=a&&a.length>100?a.slice(0,100)+"\u2026":a;i.log.log(`${d} param "${e}" = ${g}`,"info",c)},b=ne(()=>u??xn(t),[u]),w=ne(()=>s??vn(t),[s]),S=ne(()=>e?[e]:[],[e]),{inForm:p,values:h}=W(S),E=e?h[e]:void 0,q=ne(()=>{if(!(!l||!e))return i.params.getSnapshot(e)},[i,l,e]),k=()=>{let d=p&&E!==void 0?E:q;if(d==null)return t;let f=b(d);return w(f)?f:t},[N,O]=Rn(k),U=J(N);U.current=N;let y=J(null),C=J(!1),D=J(!1),T=J({enabled:l,param:e});T.current={enabled:l,param:e};let M=J(i);M.current=i;let L=J(e);z(()=>{let d=L.current;L.current=e,d&&d!==e&&i.params.clear(d)},[i,e]),z(()=>{if(!l||!e||C.current)return;let d=p&&E!==void 0?E:i.params.getSnapshot(e);if(d==null)return;let f=b(d);f!==U.current&&w(f)&&(O(f),x("Received",d))},[i,e,l,p,E,b,w]),z(()=>!l||!e?void 0:i.params.subscribe(e,()=>{if(C.current)return;let f=i.params.getSnapshot(e);if(f==null)return;let a=b(f);a!==U.current&&w(a)&&(O(a),x("Received",f))}),[i,e,l,b,w]);let A=ee(d=>{!l||!e||(i.params.set(e,d,"param"),i.edges.stopLoading(),x("Broadcast",d))},[i,l,e]),I=ee(()=>{!l||r||(y.current&&(clearTimeout(y.current),y.current=null),i.edges.startLoading(),A(U.current),C.current=!1)},[i,A,l,r]),$=ee(d=>{y.current&&(clearTimeout(y.current),y.current=null),O(d),U.current=d,C.current=!1,!(!l||!e||r)&&(i.params.clear(e),i.edges.stopLoading(),x("Cleared",null))},[i,l,e,r]);z(()=>{D.current=!1},[e,l]),z(()=>{if(!l||!e||r||!o||D.current)return;let d=i.params.getSnapshot(e);if(d!=null){D.current=!0;return}if(U.current===""){D.current=!0;return}A(U.current),D.current=!0},[i,l,e,r,o,A]);let Q=ee(d=>{O(d),!(!l||r)&&(C.current=!0,i.edges.startLoading(),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{A(d),C.current=!1},n))},[i,A,n,l,r]);return z(()=>()=>{y.current&&clearTimeout(y.current);let{enabled:d,param:f}=T.current;!d||!f||M.current.params.clear(f)},[]),{value:N,setValue:Q,broadcastNow:I,clearValue:$}}function vn(e){return typeof e=="string"?(n=>typeof n=="string"):typeof e=="number"?(n=>typeof n=="number"):typeof e=="boolean"?(n=>typeof n=="boolean"):Array.isArray(e)?(n=>Array.isArray(n)):e!==null&&typeof e=="object"?(n=>n!==null&&typeof n=="object"&&!Array.isArray(n)):(n=>!0)}function xn(e){return typeof e=="string"?n=>typeof n=="string"?n:Array.isArray(n)?n.join(","):n!==null&&typeof n=="object"?JSON.stringify(n):String(n):n=>n}import{useEffect as Te}from"react";function bn(e){let n=de(),r=e.param,t=!!(n.isInForm&&r),{value:o,setValue:s,broadcastNow:u,clearValue:i}=fe({...e,param:t?void 0:e.param}),c=n.store;return Te(()=>{!t||!r||!c||c.setField(r,o)},[o,t,r,c]),Te(()=>{if(!(!t||!r||!c))return()=>{c.removeField(r)}},[t,r,c]),{value:o,setValue:s,broadcastNow:u,clearValue:i,isInForm:n.isInForm}}import{useCallback as qe,useRef as De,useSyncExternalStore as hn}from"react";var Ne=Object.freeze({});function Y(e){let n=v(),r=wn(e),t=qe(u=>r.length===0?()=>{}:n.params.subscribeMany(r,u),[n,r]),o=De(Ne),s=qe(()=>{if(r.length===0)return Ne;let u=n.params.getSnapshotMany(r),i=o.current;return Un(i,u)?i:(o.current=u,u)},[n,r]);return hn(t,s,s)}function Un(e,n){if(e===n)return!0;let r=Object.keys(e),t=Object.keys(n);if(r.length!==t.length)return!1;for(let o of r)if(!Object.is(e[o],n[o]))return!1;return!0}function wn(e){let n=De(e),r=n.current;return r!==e&&(r.length!==e.length||r.some((t,o)=>t!==e[o]))&&(n.current=e),n.current}import{useCallback as ge,useRef as kn,useSyncExternalStore as Cn}from"react";function Pn(){let e=v(),n=ge(u=>e.routing.subscribeAllowedSources(u),[e]),r=kn(null),t=ge(()=>{let u=e.routing.getAllowedSources(),i=r.current;return En(i,u)?i:(r.current=u,u)},[e]),o=Cn(n,t,t),s=ge((u,i)=>!o||o.length===0||!u&&!i?!0:o.some(c=>c.udfUniqueId&&c.udfUniqueId===u||c.udfName&&c.udfName===i),[o]);return{allowedSources:o,isAllowedSource:s}}function En(e,n){return e===n?!0:e===null||n===null||e.length!==n.length?!1:e.every((r,t)=>r.udfUniqueId===n[t].udfUniqueId&&r.udfName===n[t].udfName)}import{useCallback as Be,useRef as An,useSyncExternalStore as On}from"react";function Ln(){let e=v(),n=Be(o=>e.routing.subscribeAllowedSources(o),[e]),r=An(null),t=Be(()=>{let o=e.routing.getAllowedUdfNames(),s=r.current;return Fn(s,o)?s:(r.current=o,o)},[e]);return On(n,t,t)}function Fn(e,n){if(e===n)return!0;if(e===null||n===null||e.size!==n.size)return!1;for(let r of e)if(!n.has(r))return!1;return!0}import{useEffect as Tn,useMemo as V,useRef as qn,useState as Me,useSyncExternalStore as Nn,useCallback as Ie}from"react";var Qe=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,Dn=/\{\{[\s\S]*?\}\}/,_e=/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\b/g;function pe(e,n={}){let r=e??"",t=n.preserveMissingParams??!1,o=v(),s=V(()=>Bn(r),[r]),u=Y(s),{inForm:i,values:c}=W(s),l=V(()=>i?{...u,...c}:u,[u,c,i]),x=V(()=>Dn.test(r),[r]),b=V(()=>x?"":Mn(r,l,t),[r,l,t,x]),w=V(()=>{if(!x)return[];let O=new Set,U=[];_e.lastIndex=0;let y;for(;(y=_e.exec(r))!==null;)O.has(y[1])||(O.add(y[1]),U.push(y[1]));return U},[r,x]),S=_n(o,w),[p,h]=Me(()=>({key:"",value:""})),[E,q]=Me(!1),k=V(()=>JSON.stringify({template:r,paramValues:l,preserveMissingParams:t,tick:S}),[r,l,t,S]);return Tn(()=>{if(!x){q(!1);return}let O=!1,U=new AbortController;return q(!0),o.template.render(r,l,{preserveMissingParams:t,signal:U.signal}).then(y=>{O||(h(C=>C.key===k&&C.value===y.value?C:{key:k,value:y.value}),q(y.loading))},y=>{O||y?.name!=="AbortError"&&q(!1)}),()=>{O=!0,U.abort()}},[o,x,r,l,t,k]),{value:V(()=>{if(!x)return b;if(p.key===k)return p.value;try{return o.template.renderLoading(r,l,{preserveMissingParams:t})}catch{return r}},[o,x,b,p,k,r,l,t]),loading:x?E:!1}}function Bn(e){let n=[],r=new Set;for(let t of e.matchAll(Qe)){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function Mn(e,n,r){return e.replace(Qe,(t,o)=>{let s=n[o];return s==null?r?t:"":In(s)})}function In(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e)??""}function _n(e,n){let r=qn(0),t=n.slice().sort().join("|"),o=Ie(u=>{let i=()=>{r.current+=1,u()},c=[e.template.subscribe(i)];for(let l of n)c.push(e.udfs.subscribeOutput(l,i));return()=>c.forEach(l=>l())},[e,t]),s=Ie(()=>r.current,[]);return Nn(o,s,s)}import{useCallback as re,useEffect as Qn,useMemo as te,useRef as Jn,useState as Je,useSyncExternalStore as Vn}from"react";function Ve(e){let n=v(),r=re(s=>e?n.udfs.subscribeOutput(e,s):()=>{},[n,e]),t=Jn(void 0),o=re(()=>{if(!e)return;let s=n.udfs.getOutputSnapshot(e),u=t.current;return $n(u,s)?u:(t.current=s,s)},[n,e]);return Vn(r,o,o)}function $e(){let e=v();return re(n=>e.udfs.requestReexecute(n),[e])}function $n(e,n){return e===n?!0:!e||!n?!1:e.data===n.data&&e.isExecutionInProgress===n.isExecutionInProgress&&e.error===n.error&&e.vfsFilename===n.vfsFilename}var je=/^\{\{(\w+)\.(\w+)(?:\[(\d+)\])?\}\}$/;function oe(e){return!e||typeof e!="string"?!1:je.test(e)}function me(e){if(!oe(e))return null;let n=e.match(je);if(!n)return null;let[,r,t,o]=n,s=o!==void 0?parseInt(o,10):void 0;return{udfName:r,columnName:t,index:s}}function jn(e){return!!e&&typeof e=="object"&&typeof e.getRows=="function"}function Se({udfName:e,sampleSize:n=200}){let r=Ve(e),t=$e(),[o,s]=Je([]),[u,i]=Je([]);Qn(()=>{let l=!1,x=r?.data;if(!x||!jn(x)){s([]),i([]);return}return(async()=>{try{let b=await x.getRows(0,Math.max(0,n));if(l)return;let w=b.map(p=>{let h=p;return h&&typeof h=="object"&&h.properties&&typeof h.properties=="object"?h.properties:p});s(w);let S=Array.from(new Set(w.flatMap(p=>Object.keys(p??{}))));i(S)}catch{if(l)return;s([]),i([])}})(),()=>{l=!0}},[r?.data,n]);let c=re(()=>{e&&t(e)},[t,e]);return{loading:r?.isExecutionInProgress??!1,errorMessage:r?.error??null,isError:!!r?.error,columns:u,rows:o,requestReexecute:c}}function Wn(e,n=200){let r=oe(e),t=te(()=>r?me(e):null,[r,e]),{rows:o,loading:s}=Se({udfName:t?.udfName,sampleSize:n});return{values:te(()=>!t||!t.columnName?[]:o.map(i=>i?.[t.columnName]).filter(i=>i!=null),[o,t]),loading:r?s:!1}}function zn(e,n=200){let r=oe(e),t=te(()=>r?me(e):null,[r,e]),{rows:o,loading:s}=Se({udfName:t?.udfName,sampleSize:n});return{value:te(()=>{if(!t||!t.columnName||t.index===void 0)return null;let i=o[t.index];if(!i)return null;let c=i[t.columnName];return c!==void 0?c:null},[o,t]),loading:r?s:!1}}import{useCallback as on,useEffect as K,useMemo as F,useRef as ur,useState as B}from"react";import{createContext as Hn,useContext as Kn}from"react";var ye=Hn({});ye.displayName="JsonUiBindingContext";function Re(){return Kn(ye)}import{useCallback as se,useMemo as Zn,useRef as ve,useSyncExternalStore as Gn}from"react";var We=Object.freeze([]);function ie(){let e=v(),{configHash:n}=j(),r=ve(e);r.current=e;let t=ve(n);t.current=n;let o=se((s,u="info")=>{r.current.log.log(s,u,t.current)},[]);return Zn(()=>({log:o}),[o])}function Yn(e){let n=v(),r=se(s=>e?n.log.subscribeLogs(e,s):()=>{},[n,e]),t=ve(We),o=se(()=>{if(!e)return We;let s=n.log.getLogsSnapshot(e);return s===t.current?t.current:(t.current=s,s)},[n,e]);return Gn(r,o,o)}function Xn(e){let n=v();return se(()=>{e&&n.log.clearLogs(e)},[n,e])}function ue(){let e=v();return{startLoading:e.edges.startLoading,stopLoading:e.edges.stopLoading}}import{createContext as er,useContext as nr}from"react";var rr=Object.freeze({}),xe=er(rr);xe.displayName="SqlSourceOverrideContext";function be(){return nr(xe)}var he=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,ze=/\{\{(\w+)(?:\?([^}]*))?\}\}/g,Ue=/'((?:s3|gs|fd):\/\/[^'\n]+)'/g;function tr(e){return e==null?"''":typeof e=="number"&&!Number.isNaN(e)?String(e):typeof e=="boolean"?e?"TRUE":"FALSE":`'${String(e).replace(/'/g,"''")}'`}function or(e,n){let r=!1;for(let t=0;t<n;t++)if(e[t]==="'"){if(r&&e[t+1]==="'"){t++;continue}r=!r}return r}function He(e,n){return e.replace(he,(r,t,o)=>{let s=n[t],u=s==null?"":String(s);return or(e,o)?u.replace(/'/g,"''"):tr(s)})}function Ke(e){let n=new Set,r=[];he.lastIndex=0;for(let t of e.matchAll(he)){let o=t[1];n.has(o)||(n.add(o),r.push(o))}return r}function sr(e){if(!e)return null;let n={},r=!1;for(let t of e.split(/[&,]/)){if(!t)continue;let o=t.indexOf("=");if(o===-1)continue;let s=t.slice(0,o),u=t.slice(o+1),i,c;try{i=decodeURIComponent(s),c=decodeURIComponent(u)}catch{i=s,c=u}i&&(n[i]=c,r=!0)}return r?n:null}function Ze(e){let n=[],r;for(ze.lastIndex=0;(r=ze.exec(e))!==null;){let[t,o,s]=r;n.push({match:t,name:o,overrides:sr(s),start:r.index,end:r.index+t.length})}return n}function Ge(e){if(!e)return[];let n=new Set,r=[];Ue.lastIndex=0;let t;for(;(t=Ue.exec(e))!==null;){let o=t[1];n.has(o)||(n.add(o),r.push(o))}return r}function Ye(e,n){return e&&e.replace(Ue,(r,t)=>{let o=n[t];return o?`'${o}'`:r})}var Xe=/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/;function en(e){let n=e.trim(),r=Xe.exec(n);return r?r[1]:null}function nn(e,n){let r=Xe.exec(e);if(!r)return{value:e,unresolved:!1};let t=r[1];if(!(t in n))return{value:e,unresolved:!0};let o=n[t];return o==null?{value:"",unresolved:!1}:{value:String(o),unresolved:!1}}function ir(e){return Object.keys(e).sort().map(n=>`${n}=${e[n]}`).join("&")}function rn(e,n){return n?`${e}#${ir(n)}`:e}var sn=500,H=Object.freeze([]),X=Object.freeze([]);function tn(e,n){if(/\bLIMIT\b/i.test(e))return e;let r=e.trimEnd();return`${r.endsWith(";")?r.slice(0,-1):r} LIMIT ${n}`}function ar(e){return`"${e.replace(/"/g,'""')}"`}function lr(e,n,r,t,o,s){let u=e.match(/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/);if(u){let c=o[u[1]];return c==null?"":tn(String(c),s)}let i=e;for(let c=n.length-1;c>=0;c--){let{raw:l,key:x,resolvedOverrides:b}=n[c],S=b===null&&t?t[l.name]:void 0,p;S?p=ar(S.relationName):p=`'${r.get(x)??`${l.name}.parquet`}'`,i=i.slice(0,l.start)+p+i.slice(l.end)}return i=tn(i,s),He(i,o)}function un({sql:e,enabled:n=!0,maxRows:r=sn,sourceOverrides:t}){let o=v(),s=be(),u=F(()=>{let a=Object.keys(s).length>0;return t?a?{...s,...t}:t:a?s:void 0},[s,t]),{startLoading:i,stopLoading:c}=ue(),{log:l}=ie(),[x,b]=B(""),[w,S]=B(!1),[p,h]=B(null),[E,q]=B(0),k=F(()=>e?Ze(e):[],[e]),N=F(()=>u?k.filter(a=>a.overrides!==null||!u[a.name]):k,[k,u]),O=F(()=>{let a=new Set;for(let g of N)if(g.overrides)for(let R of Object.values(g.overrides)){let _=en(R);_&&a.add(_)}return Array.from(a)},[N]),U=F(()=>e?Ke(e):[],[e]),y=F(()=>{let a=new Set,g=[];for(let R of U)a.has(R)||(a.add(R),g.push(R));for(let R of O)a.has(R)||(a.add(R),g.push(R));return g},[U,O]),C=Y(y),{inForm:D,values:T}=W(y),M=F(()=>D?{...C,...T}:C,[D,C,T]),L=F(()=>N.map(a=>{if(!a.overrides)return{raw:a,key:a.name,resolvedOverrides:null,unresolved:!1};let g={},R=!1;for(let[_,Z]of Object.entries(a.overrides)){let m=nn(Z,M);m.unresolved&&(R=!0),g[_]=m.value}return{raw:a,key:rn(a.name,g),resolvedOverrides:g,unresolved:R}}),[N,M]),A=F(()=>{let a=new Set,g=[];for(let R of L)R.unresolved||a.has(R.key)||(a.add(R.key),g.push({name:R.raw.name,key:R.key,overrides:R.resolvedOverrides??void 0}));return g},[L]),I=F(()=>A.map(a=>`${a.key}|${a.name}|${a.overrides?Object.entries(a.overrides).sort(([g],[R])=>g.localeCompare(R)).map(([g,R])=>`${g}=${R}`).join(","):""}`).join(`
2
+ `),[A]),$=on(()=>{q(a=>a+1)},[]);K(()=>{if(!n||A.length===0)return;let a=A.map(g=>o.udfs.subscribeOutput(g.name,()=>{q(R=>R+1)}));return()=>{a.forEach(g=>g())}},[o,n,A]),K(()=>{w?i():c()},[w,i,c]);let Q=F(()=>{if(!u)return null;for(let a of k){if(a.overrides!==null)continue;let g=u[a.name];if(g?.error)return g.error}return null},[k,u]),d=F(()=>u?k.some(a=>a.overrides===null&&u[a.name]?.loading):!1,[k,u]),f=L.some(a=>a.unresolved);return K(()=>{if(!n||!e){b(""),S(!1),h(null);return}if(Q){b(""),h(Q),S(!1),l(`SQL preprocessing: ${Q}`,"error");return}if(d||f){b(""),h(null),S(!0);return}let a=!1;return S(!0),h(null),(async()=>{let g=new Map,R;if(A.length>0)try{let m=await o.sql.resolveVfsFilenames(A);if(a)return;if(m instanceof Map)for(let P of L){if(P.resolvedOverrides)continue;let G=m.get(P.raw.name);G&&g.set(P.key,G)}else g=m.filenames,R=m.errors}catch(m){if(a)return;let P=m instanceof Error?m.message:typeof m=="string"?m:"VFS registration failed";b(""),h(P),S(!1),l(`SQL preprocessing: ${P}`,"error");return}if(R)for(let m of L){let P=R.get(m.key);if(P){if(a)return;b(""),h(P),S(!1),l(`SQL preprocessing: ${P}`,"error");return}}for(let m of L)if(!(m.unresolved||m.resolvedOverrides===null&&u?.[m.raw.name]!==void 0)&&!g.has(m.key)){if(a)return;b(""),h(null),S(!0);return}let _;try{_=lr(e,L,g,u,M,r)}catch(m){if(a)return;let P=m instanceof Error?m.message:typeof m=="string"?m:"SQL preprocessing failed";b(""),h(P),S(!1),l(`SQL preprocessing failed: ${P}`,"error");return}let Z=Ge(_);if(Z.length===0){if(a)return;b(_),h(null),S(!1),l("SQL preprocessing completed");return}try{let m={},P=await Promise.all(Z.map(le=>o.signUrl(le)));if(a)return;Z.forEach((le,cn)=>{m[le]=P[cn].signed});let G=Ye(_,m);b(G),h(null),S(!1),l("SQL preprocessing completed")}catch(m){if(a)return;let P=m instanceof Error?m.message:typeof m=="string"?m:"URL signing failed";b(""),h(P),S(!1),l(`SQL preprocessing failed: ${P}`,"error")}})(),()=>{a=!0}},[o,n,e,I,L,M,u,Q,d,f,r,E,l,A]),{processedSql:x,loading:w,error:p,refetch:$}}function cr({sql:e,enabled:n=!0,maxRows:r=sn,sourceOverrides:t,queryId:o}){let s=v(),{startLoading:u,stopLoading:i}=ue(),{log:c}=ie(),{queryId:l}=Re(),x=o??l,[b,w]=B(H),[S,p]=B(X),[h,E]=B(!1),[q,k]=B(null),[N,O]=B(0),{processedSql:U,loading:y,error:C,refetch:D}=un({sql:e,enabled:n,maxRows:r,sourceOverrides:t}),T=ur(""),M=n&&!!e&&!!U&&!y&&!C&&U!==T.current,L=y||h||M;K(()=>{L?u():i()},[L,u,i]);let A=on(()=>{T.current="",D(),O(I=>I+1)},[D]);return K(()=>{if(!n||!e){T.current="",w(H),p(X),E(!1),k(null);return}if(C){T.current="",k(C),w(H),p(X),E(!1);return}if(y||!U){T.current="",E(!1);return}let I=!1,$=new AbortController;T.current=U,E(!0),k(null);let Q=U.length>120?U.slice(0,120)+"\u2026":U;c(`SQL query started: ${Q}`);let d=performance.now();return s.sql.query(U,{signal:$.signal,queryId:x}).then(f=>{if(I)return;let a=Math.round(performance.now()-d);if(f.error){w(H),p(X),k(f.error),E(!1),c(`SQL failed (${a}ms): ${f.error}`,"error");return}w(f.rows.length===0?H:f.rows),p(f.columns),k(null),E(!1),c(`SQL completed: ${f.rows.length} row${f.rows.length!==1?"s":""} in ${a}ms`)},f=>{if(I||f?.name==="AbortError")return;let a=Math.round(performance.now()-d),g=f instanceof Error?f.message:typeof f=="string"?f:"SQL query failed";k(g),w(H),p(X),E(!1),c(`SQL failed (${a}ms): ${g}`,"error")}),()=>{I=!0,$.abort()}},[s,n,e,U,y,C,N,c,x]),{rows:b,columns:S,loading:L,error:q,refetch:A}}function dr(e,n=!0){let r=v(),[t,o]=B({filenames:new Map,loading:!1}),s=F(()=>e.slice().sort().join("|"),[e]);return K(()=>{if(!n||e.length===0){o({filenames:new Map,loading:!1});return}let u=!1;return o(i=>({...i,loading:!0,error:void 0})),r.sql.resolveVfsFilenames(e).then(i=>{if(u)return;let c=i instanceof Map?i:i.filenames;o({filenames:c,loading:!1})},i=>{u||o({filenames:new Map,loading:!1,error:i instanceof Error?i.message:String(i)})}),()=>{u=!0}},[r,s,n]),t}import{useCallback as an,useEffect as fr,useState as ae}from"react";var ln=["s3://","gs://","fd://"];function we(e){return ln.some(n=>e.startsWith(n))}function gr(){let e=v();return{signUrl:an(r=>e.signUrl(r),[e])}}function pr(e){let n=v(),{value:r,loading:t}=pe(e),[o,s]=ae(null),[u,i]=ae(null),[c,l]=ae(!1),[x,b]=ae(0);fr(()=>{if(t)return;if(!r){s(null),i(null),l(!1);return}if(!we(r)){s(r),i(null),l(!1);return}let S=!1;return l(!0),i(null),n.signUrl(r).then(({signed:p})=>{S||s(p??r)}).catch(p=>{S||(i(p instanceof Error?p.message:"Failed to load media"),s(null))}).finally(()=>{S||l(!1)}),()=>{S=!0}},[n,t,r,x]);let w=an(async()=>{if(!r||!we(r))return r??null;let{signed:S}=await n.signUrl(r),p=S??r;return s(p),i(null),b(h=>h+1),p},[n,r]);return{src:o,loading:t||c,error:u,refreshSignedUrl:w,resolvedSrc:r,needsSigning:!!(r&&we(r))}}import{useEffect as mr,useState as Sr}from"react";function yr(e,n){let r=v(),[t,o]=Sr({status:"idle"});return mr(()=>{if(!n||!e?.trim()){o({status:"idle"});return}let s=!1;return o({status:"checking"}),r.uploads.checkAccess(e).then(u=>{s||(u.ok?o({status:"allowed"}):o({status:"denied",message:u.message??"Upload access denied."}))}),()=>{s=!0}},[r,e,n]),t}function Rr(){return j()}function vr(e){if(!e)return{};let n={};for(let r of e.split(";")){let t=r.indexOf(":");if(t===-1)continue;let o=r.slice(0,t).trim(),s=r.slice(t+1).trim();if(!o||!s)continue;let u=o.replace(/-([a-z])/g,(i,c)=>c.toUpperCase());n[u]=s}return n}export{Fe as FormContext,Pe as FusedWidgetBridgeContext,ye as JsonUiBindingContext,Ee as JsonUiNodeOverrideContext,xr as PARAMETER_BROADCAST_CHANNEL,ce as ParameterMessageType,Ue as SIGNABLE_URL_LITERAL_REGEX,ln as SIGNED_URL_SCHEMES,he as SQL_PARAM_REGEX,ze as SQL_SOURCE_PLACEHOLDER_REGEX,xe as SqlSourceOverrideContext,ir as canonicalOverrideKey,rn as computePlaceholderKey,Cr as createFormParamsStore,yn as defineCatalog,Sn as defineComponent,tr as escapeSqlValue,Ge as extractSignableUrls,Ke as extractSqlParams,en as getDollarRefName,br as isStandardMessage,oe as isUdfQuery,sr as parseOverridesString,Ze as parseSqlUdfPlaceholders,vr as parseStyle,me as parseUdfColumnQuery,nn as resolveOverrideValue,Ye as rewriteSignedUrls,He as substituteSqlParams,Pn as useAllowedSources,Ln as useAllowedUdfNames,Y as useCanvasParams,cr as useDuckDbSqlQuery,un as useDuckDbSqlQueryPreprocessing,de as useFormContext,W as useFormParams,fe as useFusedParam,bn as useFusedParamWithForm,v as useFusedWidgetBridge,Re as useJsonUiBinding,ue as useJsonUiEdgeAnimation,ie as useJsonUiLog,Xn as useJsonUiLogClear,Yn as useJsonUiLogs,j as useJsonUiNode,Rr as useJsonUiUdfInfo,pr as useMediaSrc,pe as useParamSubstitution,$e as useRequestUdfReexecute,be as useSqlSourceOverrides,zn as useUdfColumnValue,Wn as useUdfColumnValues,Se as useUdfDataFrameSample,Ve as useUdfOutputByName,yr as useUploadAccessCheck,gr as useUrlSigning,dr as useVfsRegistration};
@@ -0,0 +1,7 @@
1
+ export interface JsonUiBinding {
2
+ /** Resolver-stamped query id for this node (e.g. `"q0"`); undefined elsewhere. */
3
+ queryId?: string;
4
+ }
5
+ export declare const JsonUiBindingContext: import("react").Context<JsonUiBinding>;
6
+ /** Read the current node's data-binding identity. `{}` when no provider is present. */
7
+ export declare function useJsonUiBinding(): JsonUiBinding;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonUiBindingContext = void 0;
4
+ exports.useJsonUiBinding = useJsonUiBinding;
5
+ /**
6
+ * JsonUiBindingContext — per-node data-binding identity (chunk-2 MCP-host seam).
7
+ *
8
+ * When a host resolves a widget's data server-side (the MCP Apps renderer), it
9
+ * stamps a deterministic `_queryId` into each data-bound node's props and wraps
10
+ * that node's renderer in a `<JsonUiBindingContext.Provider value={{queryId}}>`.
11
+ * SDK data hooks (currently `useDuckDbSqlQuery`) read the id via
12
+ * `useJsonUiBinding()` and thread it into `bridge.sql.query(sql, { queryId })`,
13
+ * letting the static MCP bridge look up the pre-resolved rows by id instead of
14
+ * running DuckDB in the sandbox.
15
+ *
16
+ * The default value is `{}` (no binding). In every other host (workbench, test
17
+ * harness, mobile) the provider is absent, `queryId` is `undefined`, and the
18
+ * hooks behave exactly as before — so this seam is fully backward-compatible and
19
+ * data-bound components never need editing.
20
+ */
21
+ const react_1 = require("react");
22
+ exports.JsonUiBindingContext = (0, react_1.createContext)({});
23
+ exports.JsonUiBindingContext.displayName = "JsonUiBindingContext";
24
+ /** Read the current node's data-binding identity. `{}` when no provider is present. */
25
+ function useJsonUiBinding() {
26
+ return (0, react_1.useContext)(exports.JsonUiBindingContext);
27
+ }
@@ -24,6 +24,12 @@ export interface UseDuckDbSqlQueryOptions {
24
24
  }>;
25
25
  /** @deprecated Use `maxRows` — kept temporarily for the SDK's existing surface. */
26
26
  defaultLimit?: number;
27
+ /**
28
+ * Binding identity for server-resolved data (MCP-host seam). When omitted,
29
+ * the hook falls back to `useJsonUiBinding()`. Threaded into
30
+ * `bridge.sql.query(sql, { queryId })`; the workbench bridge ignores it.
31
+ */
32
+ queryId?: string;
27
33
  }
28
34
  export interface UseDuckDbSqlQueryResult {
29
35
  rows: ReadonlyArray<Record<string, unknown>>;
@@ -49,7 +55,7 @@ export declare function useDuckDbSqlQueryPreprocessing({ sql, enabled, maxRows,
49
55
  * `useDuckDbSqlQueryPreprocessing` to prepare the SQL string, then runs
50
56
  * it via the bridge.
51
57
  */
52
- export declare function useDuckDbSqlQuery({ sql, enabled, maxRows, sourceOverrides, }: UseDuckDbSqlQueryOptions): UseDuckDbSqlQueryResult;
58
+ export declare function useDuckDbSqlQuery({ sql, enabled, maxRows, sourceOverrides, queryId: queryIdOption, }: UseDuckDbSqlQueryOptions): UseDuckDbSqlQueryResult;
53
59
  /**
54
60
  * Resolve UDF names to VFS filenames, registering them in DuckDB if needed.
55
61
  * Exposed for advanced use cases (e.g. building your own query string).
@@ -21,6 +21,7 @@ exports.useVfsRegistration = useVfsRegistration;
21
21
  const react_1 = require("react");
22
22
  const bridge_1 = require("../bridge");
23
23
  const form_1 = require("../form");
24
+ const json_ui_binding_1 = require("./json-ui-binding");
24
25
  const use_json_ui_log_1 = require("./use-json-ui-log");
25
26
  const use_json_ui_edge_animation_1 = require("./use-json-ui-edge-animation");
26
27
  const use_canvas_params_1 = require("./use-canvas-params");
@@ -422,10 +423,15 @@ function useDuckDbSqlQueryPreprocessing({ sql, enabled = true, maxRows = DEFAULT
422
423
  * `useDuckDbSqlQueryPreprocessing` to prepare the SQL string, then runs
423
424
  * it via the bridge.
424
425
  */
425
- function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, sourceOverrides, }) {
426
+ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, sourceOverrides, queryId: queryIdOption, }) {
426
427
  const bridge = (0, bridge_1.useFusedWidgetBridge)();
427
428
  const { startLoading: startEdgeLoading, stopLoading: stopEdgeLoading } = (0, use_json_ui_edge_animation_1.useJsonUiEdgeAnimation)();
428
429
  const { log } = (0, use_json_ui_log_1.useJsonUiLog)();
430
+ // Server-resolved data seam: explicit option wins, else fall back to the
431
+ // per-node binding context. `undefined` in every non-MCP host (no behavior
432
+ // change for the workbench).
433
+ const { queryId: queryIdBinding } = (0, json_ui_binding_1.useJsonUiBinding)();
434
+ const queryId = queryIdOption ?? queryIdBinding;
429
435
  const [rows, setRows] = (0, react_1.useState)(EMPTY_ROWS);
430
436
  const [columns, setColumns] = (0, react_1.useState)(EMPTY_COLUMNS);
431
437
  const [queryLoading, setQueryLoading] = (0, react_1.useState)(false);
@@ -490,7 +496,7 @@ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, so
490
496
  : processedSql;
491
497
  log(`SQL query started: ${truncatedSql}`);
492
498
  const t0 = performance.now();
493
- bridge.sql.query(processedSql, { signal: controller.signal }).then((result) => {
499
+ bridge.sql.query(processedSql, { signal: controller.signal, queryId }).then((result) => {
494
500
  if (cancelled)
495
501
  return;
496
502
  const elapsed = Math.round(performance.now() - t0);
@@ -537,6 +543,7 @@ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, so
537
543
  preprocessingError,
538
544
  fetchKey,
539
545
  log,
546
+ queryId,
540
547
  ]);
541
548
  return { rows, columns, loading, error, refetch };
542
549
  }
package/dist/index.d.ts CHANGED
@@ -34,5 +34,6 @@ export { useUploadAccessCheck, type UploadAccessState, } from "./hooks/use-uploa
34
34
  export { useJsonUiLog, useJsonUiLogs, useJsonUiLogClear, } from "./hooks/use-json-ui-log";
35
35
  export { useJsonUiUdfInfo } from "./hooks/use-json-ui-udf-info";
36
36
  export { useJsonUiEdgeAnimation } from "./hooks/use-json-ui-edge-animation";
37
+ export { JsonUiBindingContext, useJsonUiBinding, type JsonUiBinding, } from "./hooks/json-ui-binding";
37
38
  export * from "./utils/sql-placeholders";
38
39
  export { parseStyle } from "./utils/parse-style";
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
30
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
31
31
  };
32
32
  Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.parseStyle = exports.useJsonUiEdgeAnimation = exports.useJsonUiUdfInfo = exports.useJsonUiLogClear = exports.useJsonUiLogs = exports.useJsonUiLog = exports.useUploadAccessCheck = exports.SIGNED_URL_SCHEMES = exports.useMediaSrc = exports.useUrlSigning = exports.useSqlSourceOverrides = exports.SqlSourceOverrideContext = exports.useVfsRegistration = exports.useDuckDbSqlQueryPreprocessing = exports.useDuckDbSqlQuery = exports.parseUdfColumnQuery = exports.isUdfQuery = exports.useUdfColumnValues = exports.useUdfColumnValue = exports.useUdfDataFrameSample = exports.useRequestUdfReexecute = exports.useUdfOutputByName = exports.useParamSubstitution = exports.useAllowedUdfNames = exports.useAllowedSources = exports.useCanvasParams = exports.useFusedParamWithForm = exports.useFusedParam = exports.defineCatalog = exports.defineComponent = void 0;
33
+ exports.parseStyle = exports.useJsonUiBinding = exports.JsonUiBindingContext = exports.useJsonUiEdgeAnimation = exports.useJsonUiUdfInfo = exports.useJsonUiLogClear = exports.useJsonUiLogs = exports.useJsonUiLog = exports.useUploadAccessCheck = exports.SIGNED_URL_SCHEMES = exports.useMediaSrc = exports.useUrlSigning = exports.useSqlSourceOverrides = exports.SqlSourceOverrideContext = exports.useVfsRegistration = exports.useDuckDbSqlQueryPreprocessing = exports.useDuckDbSqlQuery = exports.parseUdfColumnQuery = exports.isUdfQuery = exports.useUdfColumnValues = exports.useUdfColumnValue = exports.useUdfDataFrameSample = exports.useRequestUdfReexecute = exports.useUdfOutputByName = exports.useParamSubstitution = exports.useAllowedUdfNames = exports.useAllowedSources = exports.useCanvasParams = exports.useFusedParamWithForm = exports.useFusedParam = exports.defineCatalog = exports.defineComponent = void 0;
34
34
  // ── Part 1: Provider contract ────────────────────────────────────────────────
35
35
  __exportStar(require("./protocol"), exports);
36
36
  __exportStar(require("./bridge"), exports);
@@ -84,6 +84,9 @@ var use_json_ui_udf_info_1 = require("./hooks/use-json-ui-udf-info");
84
84
  Object.defineProperty(exports, "useJsonUiUdfInfo", { enumerable: true, get: function () { return use_json_ui_udf_info_1.useJsonUiUdfInfo; } });
85
85
  var use_json_ui_edge_animation_1 = require("./hooks/use-json-ui-edge-animation");
86
86
  Object.defineProperty(exports, "useJsonUiEdgeAnimation", { enumerable: true, get: function () { return use_json_ui_edge_animation_1.useJsonUiEdgeAnimation; } });
87
+ var json_ui_binding_1 = require("./hooks/json-ui-binding");
88
+ Object.defineProperty(exports, "JsonUiBindingContext", { enumerable: true, get: function () { return json_ui_binding_1.JsonUiBindingContext; } });
89
+ Object.defineProperty(exports, "useJsonUiBinding", { enumerable: true, get: function () { return json_ui_binding_1.useJsonUiBinding; } });
87
90
  // ── Pure utilities (re-exported for advanced workbench paths) ────────────────
88
91
  __exportStar(require("./utils/sql-placeholders"), exports);
89
92
  var parse_style_1 = require("./utils/parse-style");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusedio/widget-sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "SDK for building custom json-ui components for the Fused workbench",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.js",