@fusedio/widget-sdk 0.3.1 → 0.4.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/README.md CHANGED
@@ -61,7 +61,7 @@ any connected UDF re-runs with the updated parameter.
61
61
  | `useUdfExecutor` | Run a UDF on an event (`udf?param=1`); resolves `$param` at fire time. |
62
62
  | `useUdfColumnValue` / `Values` | Pull values out of `{{udf.col}}` / `{{udf.col[idx]}}` queries. |
63
63
  | `useUdfDataFrameSample` | Sample rows from a UDF's DataFrame output. |
64
- | `useDuckDbSqlQuery` | Run a DuckDB-WASM query against UDF parquet outputs in the browser. |
64
+ | `useDuckDbSqlQuery` | Run a DuckDB-WASM query against UDF parquet outputs in the browser; optional `refreshInterval` (ms) declares host-driven auto-refresh. |
65
65
  | `useUrlSigning` / `useMediaSrc` | Sign `s3://`, `gs://`, `fd://` URLs and resolve media sources. |
66
66
  | `useUploadAccessCheck` | Pre-flight an upload destination for write access. |
67
67
  | `useAllowedSources` | Which UDFs are allowed to broadcast to this node? |
package/dist/bridge.d.ts CHANGED
@@ -128,6 +128,15 @@ export interface SqlQueryOptions {
128
128
  * backward-compatible.
129
129
  */
130
130
  queryId?: string;
131
+ /**
132
+ * Author-declared refresh cadence for this query, in **milliseconds**. When
133
+ * set, a server-resolved host (dev-serve / `widget open` / parley / deployed)
134
+ * re-runs this query on its own timer to drive a live dashboard. The
135
+ * workbench / static bridge **ignores** this field (no timer), so it is fully
136
+ * backward-compatible. The SDK only carries the value — the timer, visibility
137
+ * pausing, and backoff live in the host runtime.
138
+ */
139
+ refreshInterval?: number;
131
140
  }
132
141
  export interface SqlQueryResult {
133
142
  rows: ReadonlyArray<Record<string, unknown>>;
package/dist/bundle.js CHANGED
@@ -1,2 +1,2 @@
1
- var Cn="parameter-updates",fe=(o=>(o.PARAM="param",o.RANGE="range",o.VIEWPORT="viewport",o.CLEAR="clear",o))(fe||{});function Pn(e){if(typeof e!="object"||e===null)return!1;let r=e;return typeof r.type=="string"&&Object.values(fe).includes(r.type)&&typeof r.parameter=="string"&&"values"in r}import{createContext as Te,useContext as Ne}from"react";var De=Te(null);De.displayName="FusedWidgetBridgeContext";function R(){let e=Ne(De);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 qe=Te(null);qe.displayName="JsonUiNodeOverrideContext";function z(){let e=R(),r=Ne(qe);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 yr,useCallback as Be,useContext as xr,useRef as Ie,useSyncExternalStore as Rr}from"react";function Tn(){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 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),n(t))},removeField(t){e.has(t)&&(e.delete(t),n(t))},subscribe(t,o){let s={names:new Set(t),cb:o};return r.add(s),()=>{r.delete(s)}}}}var _e=yr({store:null,isInForm:!1});_e.displayName="JsonUiFormContext";function ge(){return xr(_e)}var Me=Object.freeze({});function J(e){let{store:r,isInForm:n}=ge(),t=br(e),o=Be(c=>r?r.subscribe(t,c):()=>{},[r,t]),s=Ie(Me),u=Be(()=>{if(!r)return Me;let c=r.getSnapshot(t),l=s.current;return vr(l,c)?l:(s.current=c,c)},[r,t]),i=Rr(o,u,u);return{inForm:n,values:i}}function vr(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 br(e){let r=Ie(e),n=r.current;return n!==e&&(n.length!==e.length||n.some((t,o)=>t!==e[o]))&&(r.current=e),r.current}function Ur(e){return e}function hr(e){return e}import{useCallback as ee,useEffect as H,useMemo as re,useRef as $,useState as wr}from"react";function pe({param:e,debounceMs:r=300,readOnly:n=!1,defaultValue:t,broadcastDefaultValue:o=!0,validate:s,preprocess:u}){let i=R(),{configHash:c}=z(),l=!!e,v=(g,m)=>{if(!e)return;if(g==="Cleared"){i.log.log(`Cleared param "${e}"`,"info",c);return}let a=JSON.stringify(m),S=a&&a.length>100?a.slice(0,100)+"\u2026":a;i.log.log(`${g} param "${e}" = ${S}`,"info",c)},b=re(()=>u??Er(t),[u]),k=re(()=>s??kr(t),[s]),f=re(()=>e?[e]:[],[e]),{inForm:p,values:y}=J(f),O=e?y[e]:void 0,T=re(()=>{if(!(!l||!e))return i.params.getSnapshot(e)},[i,l,e]),E=()=>{let g=p&&O!==void 0?O:T;if(g==null)return t;let m=b(g);return k(m)?m:t},[q,C]=wr(E),w=$(q);w.current=q;let d=$(null),h=$(!1),D=$(!1),P=$({enabled:l,param:e});P.current={enabled:l,param:e};let _=$(i);_.current=i;let A=$(e);H(()=>{let g=A.current;A.current=e,g&&g!==e&&i.params.clear(g)},[i,e]),H(()=>{if(!l||!e||h.current)return;let g=p&&O!==void 0?O:i.params.getSnapshot(e);if(g==null)return;let m=b(g);m!==w.current&&k(m)&&(C(m),v("Received",g))},[i,e,l,p,O,b,k]),H(()=>!l||!e?void 0:i.params.subscribe(e,()=>{if(h.current)return;let m=i.params.getSnapshot(e);if(m==null)return;let a=b(m);a!==w.current&&k(a)&&(C(a),v("Received",m))}),[i,e,l,b,k]);let L=ee(g=>{!l||!e||(i.params.set(e,g,"param"),i.edges.stopLoading(),v("Broadcast",g))},[i,l,e]),I=ee(()=>{!l||n||(d.current&&(clearTimeout(d.current),d.current=null),i.edges.startLoading(),L(w.current),h.current=!1)},[i,L,l,n]),N=ee(g=>{d.current&&(clearTimeout(d.current),d.current=null),C(g),w.current=g,h.current=!1,!(!l||!e||n)&&(i.params.clear(e),i.edges.stopLoading(),v("Cleared",null))},[i,l,e,n]);H(()=>{D.current=!1},[e,l]),H(()=>{if(!l||!e||n||!o||D.current)return;let g=i.params.getSnapshot(e);if(g!=null){D.current=!0;return}if(w.current===""){D.current=!0;return}L(w.current),D.current=!0},[i,l,e,n,o,L]);let B=ee(g=>{C(g),!(!l||n)&&(h.current=!0,i.edges.startLoading(),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{L(g),h.current=!1},r))},[i,L,r,l,n]);return H(()=>()=>{d.current&&clearTimeout(d.current);let{enabled:g,param:m}=P.current;!g||!m||_.current.params.clear(m)},[]),{value:q,setValue:B,broadcastNow:I,clearValue:N}}function kr(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 Er(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 Ve}from"react";function Cr(e){let r=ge(),n=e.param,t=!!(r.isInForm&&n),{value:o,setValue:s,broadcastNow:u,clearValue:i}=pe({...e,param:t?void 0:e.param}),c=r.store;return Ve(()=>{!t||!n||!c||c.setField(n,o)},[o,t,n,c]),Ve(()=>{if(!(!t||!n||!c))return()=>{c.removeField(n)}},[t,n,c]),{value:o,setValue:s,broadcastNow:u,clearValue:i,isInForm:r.isInForm}}import{useCallback as Qe,useRef as $e,useSyncExternalStore as Pr}from"react";var Je=Object.freeze({});function j(e){let r=R(),n=Ar(e),t=Qe(u=>n.length===0?()=>{}:r.params.subscribeMany(n,u),[r,n]),o=$e(Je),s=Qe(()=>{if(n.length===0)return Je;let u=r.params.getSnapshotMany(n),i=o.current;return Or(i,u)?i:(o.current=u,u)},[r,n]);return Pr(t,s,s)}function Or(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 Ar(e){let r=$e(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 me,useRef as Lr,useSyncExternalStore as Fr}from"react";function Tr(){let e=R(),r=me(u=>e.routing.subscribeAllowedSources(u),[e]),n=Lr(null),t=me(()=>{let u=e.routing.getAllowedSources(),i=n.current;return Nr(i,u)?i:(n.current=u,u)},[e]),o=Fr(r,t,t),s=me((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 Nr(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 je,useRef as Dr,useSyncExternalStore as qr}from"react";function Se(){let e=R(),r=je(o=>e.routing.subscribeAllowedSources(o),[e]),n=Dr(null),t=je(()=>{let o=e.routing.getAllowedUdfNames(),s=n.current;return Br(s,o)?s:(n.current=o,o)},[e]);return qr(r,t,t)}function Br(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 Mr,useMemo as W,useRef as Ir,useState as We,useSyncExternalStore as _r,useCallback as ze}from"react";var Ke=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,Vr=/\{\{[\s\S]*?\}\}/,He=/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\b/g;function ye(e,r={}){let n=e??"",t=r.preserveMissingParams??!1,o=R(),s=W(()=>Qr(n),[n]),u=j(s),{inForm:i,values:c}=J(s),l=W(()=>i?{...u,...c}:u,[u,c,i]),v=W(()=>Vr.test(n),[n]),b=W(()=>v?"":Jr(n,l,t),[n,l,t,v]),k=W(()=>{if(!v)return[];let C=new Set,w=[];He.lastIndex=0;let d;for(;(d=He.exec(n))!==null;)C.has(d[1])||(C.add(d[1]),w.push(d[1]));return w},[n,v]),f=jr(o,k),[p,y]=We(()=>({key:"",value:""})),[O,T]=We(!1),E=W(()=>JSON.stringify({template:n,paramValues:l,preserveMissingParams:t,tick:f}),[n,l,t,f]);return Mr(()=>{if(!v){T(!1);return}let C=!1,w=new AbortController;return T(!0),o.template.render(n,l,{preserveMissingParams:t,signal:w.signal}).then(d=>{C||(y(h=>h.key===E&&h.value===d.value?h:{key:E,value:d.value}),T(d.loading))},d=>{C||d?.name!=="AbortError"&&T(!1)}),()=>{C=!0,w.abort()}},[o,v,n,l,t,E]),{value:W(()=>{if(!v)return b;if(p.key===E)return p.value;try{return o.template.renderLoading(n,l,{preserveMissingParams:t})}catch{return n}},[o,v,b,p,E,n,l,t]),loading:v?O:!1}}function Qr(e){let r=[],n=new Set;for(let t of e.matchAll(Ke)){let o=t[1];n.has(o)||(n.add(o),r.push(o))}return r}function Jr(e,r,n){return e.replace(Ke,(t,o)=>{let s=r[o];return s==null?n?t:"":$r(s)})}function $r(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e)??""}function jr(e,r){let n=Ir(0),t=r.slice().sort().join("|"),o=ze(u=>{let i=()=>{n.current+=1,u()},c=[e.template.subscribe(i)];for(let l of r)c.push(e.udfs.subscribeOutput(l,i));return()=>c.forEach(l=>l())},[e,t]),s=ze(()=>n.current,[]);return _r(o,s,s)}import{useCallback as ne,useEffect as Wr,useMemo as te,useRef as zr,useState as Ze,useSyncExternalStore as Hr}from"react";function Ge(e){let r=R(),n=ne(s=>e?r.udfs.subscribeOutput(e,s):()=>{},[r,e]),t=zr(void 0),o=ne(()=>{if(!e)return;let s=r.udfs.getOutputSnapshot(e),u=t.current;return Kr(u,s)?u:(t.current=s,s)},[r,e]);return Hr(n,o,o)}function Xe(){let e=R();return ne(r=>e.udfs.requestReexecute(r),[e])}function Kr(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 Ye=/^\{\{(\w+)\.(\w+)(?:\[(\d+)\])?\}\}$/;function oe(e){return!e||typeof e!="string"?!1:Ye.test(e)}function xe(e){if(!oe(e))return null;let r=e.match(Ye);if(!r)return null;let[,n,t,o]=r,s=o!==void 0?parseInt(o,10):void 0;return{udfName:n,columnName:t,index:s}}function Zr(e){return!!e&&typeof e=="object"&&typeof e.getRows=="function"}function Re({udfName:e,sampleSize:r=200}){let n=Ge(e),t=Xe(),[o,s]=Ze([]),[u,i]=Ze([]);Wr(()=>{let l=!1,v=n?.data;if(!v||!Zr(v)){s([]),i([]);return}return(async()=>{try{let b=await v.getRows(0,Math.max(0,r));if(l)return;let k=b.map(p=>{let y=p;return y&&typeof y=="object"&&y.properties&&typeof y.properties=="object"?y.properties:p});s(k);let f=Array.from(new Set(k.flatMap(p=>Object.keys(p??{}))));i(f)}catch{if(l)return;s([]),i([])}})(),()=>{l=!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 Gr(e,r=200){let n=oe(e),t=te(()=>n?xe(e):null,[n,e]),{rows:o,loading:s}=Re({udfName:t?.udfName,sampleSize:r});return{values:te(()=>!t||!t.columnName?[]:o.map(i=>i?.[t.columnName]).filter(i=>i!=null),[o,t]),loading:n?s:!1}}function Xr(e,r=200){let n=oe(e),t=te(()=>n?xe(e):null,[n,e]),{rows:o,loading:s}=Re({udfName:t?.udfName,sampleSize:r});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:n?s:!1}}import{useCallback as cr,useEffect as Z,useMemo as M,useRef as fn,useState as V}from"react";import{createContext as Yr,useContext as en}from"react";var ve=Yr({});ve.displayName="JsonUiBindingContext";function be(){return en(ve)}import{useCallback as se,useMemo as rn,useRef as Ue,useSyncExternalStore as nn}from"react";var er=Object.freeze([]);function ie(){let e=R(),{configHash:r}=z(),n=Ue(e);n.current=e;let t=Ue(r);t.current=r;let o=se((s,u="info")=>{n.current.log.log(s,u,t.current)},[]);return rn(()=>({log:o}),[o])}function tn(e){let r=R(),n=se(s=>e?r.log.subscribeLogs(e,s):()=>{},[r,e]),t=Ue(er),o=se(()=>{if(!e)return er;let s=r.log.getLogsSnapshot(e);return s===t.current?t.current:(t.current=s,s)},[r,e]);return nn(n,o,o)}function on(e){let r=R();return se(()=>{e&&r.log.clearLogs(e)},[r,e])}function ue(){let e=R();return{startLoading:e.edges.startLoading,stopLoading:e.edges.stopLoading}}import{createContext as sn,useContext as un}from"react";var an=Object.freeze({}),he=sn(an);he.displayName="SqlSourceOverrideContext";function we(){return un(he)}var ke=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,rr=/\{\{(\w+)(?:\?([^}]*))?\}\}/g,Ee=/'((?:s3|gs|fd):\/\/[^'\n]+)'/g;function ln(e){return e==null?"''":typeof e=="number"&&!Number.isNaN(e)?String(e):typeof e=="boolean"?e?"TRUE":"FALSE":`'${String(e).replace(/'/g,"''")}'`}function cn(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 nr(e,r){return e.replace(ke,(n,t,o)=>{let s=r[t],u=s==null?"":String(s);return cn(e,o)?u.replace(/'/g,"''"):ln(s)})}function tr(e){let r=new Set,n=[];ke.lastIndex=0;for(let t of e.matchAll(ke)){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function Ce(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 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&&(r[i]=c,n=!0)}return n?r:null}function or(e){let r=[],n;for(rr.lastIndex=0;(n=rr.exec(e))!==null;){let[t,o,s]=n;r.push({match:t,name:o,overrides:Ce(s),start:n.index,end:n.index+t.length})}return r}function sr(e){if(!e)return[];let r=new Set,n=[];Ee.lastIndex=0;let t;for(;(t=Ee.exec(e))!==null;){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function ir(e,r){return e&&e.replace(Ee,(n,t)=>{let o=r[t];return o?`'${o}'`:n})}var ur=/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/;function ae(e){let r=e.trim(),n=ur.exec(r);return n?n[1]:null}function le(e,r){let n=ur.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 dn(e){return Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}function ar(e,r){return r?`${e}#${dn(r)}`:e}var dr=500,K=Object.freeze([]),Y=Object.freeze([]);function lr(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 gn(e){return`"${e.replace(/"/g,'""')}"`}function pn(e,r,n,t,o,s){let u=e.match(/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/);if(u){let c=o[u[1]];return c==null?"":lr(String(c),s)}let i=e;for(let c=r.length-1;c>=0;c--){let{raw:l,key:v,resolvedOverrides:b}=r[c],f=b===null&&t?t[l.name]:void 0,p;f?p=gn(f.relationName):p=`'${n.get(v)??`${l.name}.parquet`}'`,i=i.slice(0,l.start)+p+i.slice(l.end)}return i=lr(i,s),nr(i,o)}function fr({sql:e,enabled:r=!0,maxRows:n=dr,sourceOverrides:t}){let o=R(),s=we(),u=M(()=>{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(),[v,b]=V(""),[k,f]=V(!1),[p,y]=V(null),[O,T]=V(0),E=M(()=>e?or(e):[],[e]),q=M(()=>u?E.filter(a=>a.overrides!==null||!u[a.name]):E,[E,u]),C=M(()=>{let a=new Set;for(let S of q)if(S.overrides)for(let U of Object.values(S.overrides)){let Q=ae(U);Q&&a.add(Q)}return Array.from(a)},[q]),w=M(()=>e?tr(e):[],[e]),d=M(()=>{let a=new Set,S=[];for(let U of w)a.has(U)||(a.add(U),S.push(U));for(let U of C)a.has(U)||(a.add(U),S.push(U));return S},[w,C]),h=j(d),{inForm:D,values:P}=J(d),_=M(()=>D?{...h,...P}:h,[D,h,P]),A=M(()=>q.map(a=>{if(!a.overrides)return{raw:a,key:a.name,resolvedOverrides:null,unresolved:!1};let S={},U=!1;for(let[Q,G]of Object.entries(a.overrides)){let x=le(G,_);x.unresolved&&(U=!0),S[Q]=x.value}return{raw:a,key:ar(a.name,S),resolvedOverrides:S,unresolved:U}}),[q,_]),L=M(()=>{let a=new Set,S=[];for(let U of A)U.unresolved||a.has(U.key)||(a.add(U.key),S.push({name:U.raw.name,key:U.key,overrides:U.resolvedOverrides??void 0}));return S},[A]),I=M(()=>L.map(a=>`${a.key}|${a.name}|${a.overrides?Object.entries(a.overrides).sort(([S],[U])=>S.localeCompare(U)).map(([S,U])=>`${S}=${U}`).join(","):""}`).join(`
2
- `),[L]),N=cr(()=>{T(a=>a+1)},[]);Z(()=>{if(!r||L.length===0)return;let a=L.map(S=>o.udfs.subscribeOutput(S.name,()=>{T(U=>U+1)}));return()=>{a.forEach(S=>S())}},[o,r,L]),Z(()=>{k?i():c()},[k,i,c]);let B=M(()=>{if(!u)return null;for(let a of E){if(a.overrides!==null)continue;let S=u[a.name];if(S?.error)return S.error}return null},[E,u]),g=M(()=>u?E.some(a=>a.overrides===null&&u[a.name]?.loading):!1,[E,u]),m=A.some(a=>a.unresolved);return Z(()=>{if(!r||!e){b(""),f(!1),y(null);return}if(B){b(""),y(B),f(!1),l(`SQL preprocessing: ${B}`,"error");return}if(g||m){b(""),y(null),f(!0);return}let a=!1;return f(!0),y(null),(async()=>{let S=new Map,U;if(L.length>0)try{let x=await o.sql.resolveVfsFilenames(L);if(a)return;if(x instanceof Map)for(let F of A){if(F.resolvedOverrides)continue;let X=x.get(F.raw.name);X&&S.set(F.key,X)}else S=x.filenames,U=x.errors}catch(x){if(a)return;let F=x instanceof Error?x.message:typeof x=="string"?x:"VFS registration failed";b(""),y(F),f(!1),l(`SQL preprocessing: ${F}`,"error");return}if(U)for(let x of A){let F=U.get(x.key);if(F){if(a)return;b(""),y(F),f(!1),l(`SQL preprocessing: ${F}`,"error");return}}for(let x of A)if(!(x.unresolved||x.resolvedOverrides===null&&u?.[x.raw.name]!==void 0)&&!S.has(x.key)){if(a)return;b(""),y(null),f(!0);return}let Q;try{Q=pn(e,A,S,u,_,n)}catch(x){if(a)return;let F=x instanceof Error?x.message:typeof x=="string"?x:"SQL preprocessing failed";b(""),y(F),f(!1),l(`SQL preprocessing failed: ${F}`,"error");return}let G=sr(Q);if(G.length===0){if(a)return;b(Q),y(null),f(!1),l("SQL preprocessing completed");return}try{let x={},F=await Promise.all(G.map(de=>o.signUrl(de)));if(a)return;G.forEach((de,Sr)=>{x[de]=F[Sr].signed});let X=ir(Q,x);b(X),y(null),f(!1),l("SQL preprocessing completed")}catch(x){if(a)return;let F=x instanceof Error?x.message:typeof x=="string"?x:"URL signing failed";b(""),y(F),f(!1),l(`SQL preprocessing failed: ${F}`,"error")}})(),()=>{a=!0}},[o,r,e,I,A,_,u,B,g,m,n,O,l,L]),{processedSql:v,loading:k,error:p,refetch:N}}function mn({sql:e,enabled:r=!0,maxRows:n=dr,sourceOverrides:t,queryId:o}){let s=R(),{startLoading:u,stopLoading:i}=ue(),{log:c}=ie(),{queryId:l}=be(),v=o??l,[b,k]=V(K),[f,p]=V(Y),[y,O]=V(!1),[T,E]=V(null),[q,C]=V(0),{processedSql:w,loading:d,error:h,refetch:D}=fr({sql:e,enabled:r,maxRows:n,sourceOverrides:t}),P=fn(""),_=r&&!!e&&!!w&&!d&&!h&&w!==P.current,A=d||y||_;Z(()=>{A?u():i()},[A,u,i]);let L=cr(()=>{P.current="",D(),C(I=>I+1)},[D]);return Z(()=>{if(!r||!e){P.current="",k(K),p(Y),O(!1),E(null);return}if(h){P.current="",E(h),k(K),p(Y),O(!1);return}if(d||!w){P.current="",O(!1);return}let I=!1,N=new AbortController;P.current=w,O(!0),E(null);let B=w.length>120?w.slice(0,120)+"\u2026":w;c(`SQL query started: ${B}`);let g=performance.now();return s.sql.query(w,{signal:N.signal,queryId:v}).then(m=>{if(I)return;let a=Math.round(performance.now()-g);if(m.error){k(K),p(Y),E(m.error),O(!1),c(`SQL failed (${a}ms): ${m.error}`,"error");return}k(m.rows.length===0?K:m.rows),p(m.columns),E(null),O(!1),c(`SQL completed: ${m.rows.length} row${m.rows.length!==1?"s":""} in ${a}ms`)},m=>{if(I||m?.name==="AbortError")return;let a=Math.round(performance.now()-g),S=m instanceof Error?m.message:typeof m=="string"?m:"SQL query failed";E(S),k(K),p(Y),O(!1),c(`SQL failed (${a}ms): ${S}`,"error")}),()=>{I=!0,N.abort()}},[s,r,e,w,d,h,q,c,v]),{rows:b,columns:f,loading:A,error:T,refetch:L}}function Sn(e,r=!0){let n=R(),[t,o]=V({filenames:new Map,loading:!1}),s=M(()=>e.slice().sort().join("|"),[e]);return Z(()=>{if(!r||e.length===0){o({filenames:new Map,loading:!1});return}let u=!1;return o(i=>({...i,loading:!0,error:void 0})),n.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}},[n,s,r]),t}import{useCallback as gr,useEffect as yn,useState as ce}from"react";var pr=["s3://","gs://","fd://"];function Pe(e){return pr.some(r=>e.startsWith(r))}function xn(){let e=R();return{signUrl:gr(n=>e.signUrl(n),[e])}}function Rn(e){let r=R(),{value:n,loading:t}=ye(e),[o,s]=ce(null),[u,i]=ce(null),[c,l]=ce(!1),[v,b]=ce(0);yn(()=>{if(t)return;if(!n){s(null),i(null),l(!1);return}if(!Pe(n)){s(n),i(null),l(!1);return}let f=!1;return l(!0),i(null),r.signUrl(n).then(({signed:p})=>{f||s(p??n)}).catch(p=>{f||(i(p instanceof Error?p.message:"Failed to load media"),s(null))}).finally(()=>{f||l(!1)}),()=>{f=!0}},[r,t,n,v]);let k=gr(async()=>{if(!n||!Pe(n))return n??null;let{signed:f}=await r.signUrl(n),p=f??n;return s(p),i(null),b(y=>y+1),p},[r,n]);return{src:o,loading:t||c,error:u,refreshSignedUrl:k,resolvedSrc:n,needsSigning:!!(n&&Pe(n))}}import{useEffect as vn,useState as bn}from"react";function Un(e,r){let n=R(),[t,o]=bn({status:"idle"});return vn(()=>{if(!r||!e?.trim()){o({status:"idle"});return}let s=!1;return o({status:"checking"}),n.uploads.checkAccess(e).then(u=>{s||(u.ok?o({status:"allowed"}):o({status:"denied",message:u.message??"Upload access denied."}))}),()=>{s=!0}},[n,e,r]),t}function hn(){return z()}import{useCallback as Ae,useMemo as Le,useRef as mr,useState as Fe}from"react";var wn=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function Oe(e){if(!e)return null;let r=e.trim();if(!r)return null;let n=r.indexOf("?"),t=(n===-1?r:r.slice(0,n)).trim();if(!wn.test(t))return null;let o=n===-1?void 0:r.slice(n+1);return{name:t,overrides:Ce(o)??{}}}function kn(e,r={}){let n=R(),{format:t}=r,o=Le(()=>Oe(e),[e]),s=Le(()=>{if(!o)return[];let d=new Set,h=[];for(let D of Object.values(o.overrides)){let P=ae(D);P&&!d.has(P)&&(d.add(P),h.push(P))}return h},[o]),u=j(s),{inForm:i,values:c}=J(s),l=Le(()=>i?{...u,...c}:u,[u,c,i]),v=Se(),b=mr({parsed:o,paramValues:l,allowedUdfNames:v,format:t});b.current={parsed:o,paramValues:l,allowedUdfNames:v,format:t};let[k,f]=Fe("idle"),[p,y]=Fe(null),[O,T]=Fe(null),E=mr(0),q=Ae(()=>{E.current+=1,f("idle"),y(null),T(null)},[]),C=Ae(d=>(f("error"),T(d),y(null),{data:null,error:d}),[]);return{fire:Ae(async d=>{let{parsed:h,paramValues:D,allowedUdfNames:P,format:_}=b.current;if(!h)return C("No UDF to run (empty or invalid executor)."),null;if(P&&!P.has(h.name))return C(`UDF "${h.name}" is not reachable from this node \u2014 connect it with an edge.`);let A={};for(let[N,B]of Object.entries(h.overrides))A[N]=le(B,D).value;d&&Object.assign(A,d);let L=++E.current,I=()=>L===E.current;f("running"),T(null),n.edges.startLoading();try{let N=await n.udfs.execute(h.name,A,{format:_});return I()&&(N.error?(f("error"),T(N.error),y(null)):(f("success"),y(N.data),T(null))),N}catch(N){let B=N instanceof Error?N.message:"UDF execution failed.";return I()&&(f("error"),T(B),y(null)),{data:null,error:B}}finally{n.edges.stopLoading()}},[n,C]),status:k,isRunning:k==="running",data:p,error:O,canFire:o!==null,reset:q}}function En(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(),s=n.slice(t+1).trim();if(!o||!s)continue;let u=o.replace(/-([a-z])/g,(i,c)=>c.toUpperCase());r[u]=s}return r}export{_e as FormContext,De as FusedWidgetBridgeContext,ve as JsonUiBindingContext,qe as JsonUiNodeOverrideContext,Cn as PARAMETER_BROADCAST_CHANNEL,fe as ParameterMessageType,Ee as SIGNABLE_URL_LITERAL_REGEX,pr as SIGNED_URL_SCHEMES,ke as SQL_PARAM_REGEX,rr as SQL_SOURCE_PLACEHOLDER_REGEX,he as SqlSourceOverrideContext,dn as canonicalOverrideKey,ar as computePlaceholderKey,Tn as createFormParamsStore,hr as defineCatalog,Ur as defineComponent,ln as escapeSqlValue,sr as extractSignableUrls,tr as extractSqlParams,ae as getDollarRefName,Pn as isStandardMessage,oe as isUdfQuery,Oe as parseExecutor,Ce as parseOverridesString,or as parseSqlUdfPlaceholders,En as parseStyle,xe as parseUdfColumnQuery,le as resolveOverrideValue,ir as rewriteSignedUrls,nr as substituteSqlParams,Tr as useAllowedSources,Se as useAllowedUdfNames,j as useCanvasParams,mn as useDuckDbSqlQuery,fr as useDuckDbSqlQueryPreprocessing,ge as useFormContext,J as useFormParams,pe as useFusedParam,Cr as useFusedParamWithForm,R as useFusedWidgetBridge,be as useJsonUiBinding,ue as useJsonUiEdgeAnimation,ie as useJsonUiLog,on as useJsonUiLogClear,tn as useJsonUiLogs,z as useJsonUiNode,hn as useJsonUiUdfInfo,Rn as useMediaSrc,ye as useParamSubstitution,Xe as useRequestUdfReexecute,we as useSqlSourceOverrides,Xr as useUdfColumnValue,Gr as useUdfColumnValues,Re as useUdfDataFrameSample,kn as useUdfExecutor,Ge as useUdfOutputByName,Un as useUploadAccessCheck,xn as useUrlSigning,Sn as useVfsRegistration};
1
+ var Cn="parameter-updates",fe=(o=>(o.PARAM="param",o.RANGE="range",o.VIEWPORT="viewport",o.CLEAR="clear",o))(fe||{});function Pn(e){if(typeof e!="object"||e===null)return!1;let r=e;return typeof r.type=="string"&&Object.values(fe).includes(r.type)&&typeof r.parameter=="string"&&"values"in r}import{createContext as Te,useContext as Ne}from"react";var De=Te(null);De.displayName="FusedWidgetBridgeContext";function x(){let e=Ne(De);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 qe=Te(null);qe.displayName="JsonUiNodeOverrideContext";function H(){let e=x(),r=Ne(qe);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 yr,useCallback as Be,useContext as xr,useRef as Ie,useSyncExternalStore as Rr}from"react";function Tn(){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 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),n(t))},removeField(t){e.has(t)&&(e.delete(t),n(t))},subscribe(t,o){let s={names:new Set(t),cb:o};return r.add(s),()=>{r.delete(s)}}}}var _e=yr({store:null,isInForm:!1});_e.displayName="JsonUiFormContext";function ge(){return xr(_e)}var Me=Object.freeze({});function $(e){let{store:r,isInForm:n}=ge(),t=br(e),o=Be(c=>r?r.subscribe(t,c):()=>{},[r,t]),s=Ie(Me),u=Be(()=>{if(!r)return Me;let c=r.getSnapshot(t),a=s.current;return vr(a,c)?a:(s.current=c,c)},[r,t]),i=Rr(o,u,u);return{inForm:n,values:i}}function vr(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 br(e){let r=Ie(e),n=r.current;return n!==e&&(n.length!==e.length||n.some((t,o)=>t!==e[o]))&&(r.current=e),r.current}function Ur(e){return e}function hr(e){return e}import{useCallback as ee,useEffect as K,useMemo as re,useRef as j,useState as wr}from"react";function pe({param:e,debounceMs:r=300,readOnly:n=!1,defaultValue:t,broadcastDefaultValue:o=!0,validate:s,preprocess:u}){let i=x(),{configHash:c}=H(),a=!!e,b=(f,P)=>{if(!e)return;if(f==="Cleared"){i.log.log(`Cleared param "${e}"`,"info",c);return}let l=JSON.stringify(P),S=l&&l.length>100?l.slice(0,100)+"\u2026":l;i.log.log(`${f} param "${e}" = ${S}`,"info",c)},R=re(()=>u??Er(t),[u]),k=re(()=>s??kr(t),[s]),g=re(()=>e?[e]:[],[e]),{inForm:v,values:p}=$(g),M=e?p[e]:void 0,E=re(()=>{if(!(!a||!e))return i.params.getSnapshot(e)},[i,a,e]),O=()=>{let f=v&&M!==void 0?M:E;if(f==null)return t;let P=R(f);return k(P)?P:t},[L,A]=wr(O),h=j(L);h.current=L;let m=j(null),U=j(!1),C=j(!1),T=j({enabled:a,param:e});T.current={enabled:a,param:e};let q=j(i);q.current=i;let N=j(e);K(()=>{let f=N.current;N.current=e,f&&f!==e&&i.params.clear(f)},[i,e]),K(()=>{if(!a||!e||U.current)return;let f=v&&M!==void 0?M:i.params.getSnapshot(e);if(f==null)return;let P=R(f);P!==h.current&&k(P)&&(A(P),b("Received",f))},[i,e,a,v,M,R,k]),K(()=>!a||!e?void 0:i.params.subscribe(e,()=>{if(U.current)return;let P=i.params.getSnapshot(e);if(P==null)return;let l=R(P);l!==h.current&&k(l)&&(A(l),b("Received",P))}),[i,e,a,R,k]);let w=ee(f=>{!a||!e||(i.params.set(e,f,"param"),i.edges.stopLoading(),b("Broadcast",f))},[i,a,e]),Q=ee(()=>{!a||n||(m.current&&(clearTimeout(m.current),m.current=null),i.edges.startLoading(),w(h.current),U.current=!1)},[i,w,a,n]),D=ee(f=>{m.current&&(clearTimeout(m.current),m.current=null),A(f),h.current=f,U.current=!1,!(!a||!e||n)&&(i.params.clear(e),i.edges.stopLoading(),b("Cleared",null))},[i,a,e,n]);K(()=>{C.current=!1},[e,a]),K(()=>{if(!a||!e||n||!o||C.current)return;let f=i.params.getSnapshot(e);if(f!=null){C.current=!0;return}if(h.current===""){C.current=!0;return}w(h.current),C.current=!0},[i,a,e,n,o,w]);let I=ee(f=>{A(f),!(!a||n)&&(U.current=!0,i.edges.startLoading(),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{w(f),U.current=!1},r))},[i,w,r,a,n]);return K(()=>()=>{m.current&&clearTimeout(m.current);let{enabled:f,param:P}=T.current;!f||!P||q.current.params.clear(P)},[]),{value:L,setValue:I,broadcastNow:Q,clearValue:D}}function kr(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 Er(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 Ve}from"react";function Cr(e){let r=ge(),n=e.param,t=!!(r.isInForm&&n),{value:o,setValue:s,broadcastNow:u,clearValue:i}=pe({...e,param:t?void 0:e.param}),c=r.store;return Ve(()=>{!t||!n||!c||c.setField(n,o)},[o,t,n,c]),Ve(()=>{if(!(!t||!n||!c))return()=>{c.removeField(n)}},[t,n,c]),{value:o,setValue:s,broadcastNow:u,clearValue:i,isInForm:r.isInForm}}import{useCallback as Qe,useRef as $e,useSyncExternalStore as Pr}from"react";var Je=Object.freeze({});function W(e){let r=x(),n=Ar(e),t=Qe(u=>n.length===0?()=>{}:r.params.subscribeMany(n,u),[r,n]),o=$e(Je),s=Qe(()=>{if(n.length===0)return Je;let u=r.params.getSnapshotMany(n),i=o.current;return Or(i,u)?i:(o.current=u,u)},[r,n]);return Pr(t,s,s)}function Or(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 Ar(e){let r=$e(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 me,useRef as Lr,useSyncExternalStore as Fr}from"react";function Tr(){let e=x(),r=me(u=>e.routing.subscribeAllowedSources(u),[e]),n=Lr(null),t=me(()=>{let u=e.routing.getAllowedSources(),i=n.current;return Nr(i,u)?i:(n.current=u,u)},[e]),o=Fr(r,t,t),s=me((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 Nr(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 je,useRef as Dr,useSyncExternalStore as qr}from"react";function Se(){let e=x(),r=je(o=>e.routing.subscribeAllowedSources(o),[e]),n=Dr(null),t=je(()=>{let o=e.routing.getAllowedUdfNames(),s=n.current;return Br(s,o)?s:(n.current=o,o)},[e]);return qr(r,t,t)}function Br(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 Mr,useMemo as z,useRef as Ir,useState as We,useSyncExternalStore as _r,useCallback as ze}from"react";var Ke=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,Vr=/\{\{[\s\S]*?\}\}/,He=/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\b/g;function ye(e,r={}){let n=e??"",t=r.preserveMissingParams??!1,o=x(),s=z(()=>Qr(n),[n]),u=W(s),{inForm:i,values:c}=$(s),a=z(()=>i?{...u,...c}:u,[u,c,i]),b=z(()=>Vr.test(n),[n]),R=z(()=>b?"":Jr(n,a,t),[n,a,t,b]),k=z(()=>{if(!b)return[];let A=new Set,h=[];He.lastIndex=0;let m;for(;(m=He.exec(n))!==null;)A.has(m[1])||(A.add(m[1]),h.push(m[1]));return h},[n,b]),g=jr(o,k),[v,p]=We(()=>({key:"",value:""})),[M,E]=We(!1),O=z(()=>JSON.stringify({template:n,paramValues:a,preserveMissingParams:t,tick:g}),[n,a,t,g]);return Mr(()=>{if(!b){E(!1);return}let A=!1,h=new AbortController;return E(!0),o.template.render(n,a,{preserveMissingParams:t,signal:h.signal}).then(m=>{A||(p(U=>U.key===O&&U.value===m.value?U:{key:O,value:m.value}),E(m.loading))},m=>{A||m?.name!=="AbortError"&&E(!1)}),()=>{A=!0,h.abort()}},[o,b,n,a,t,O]),{value:z(()=>{if(!b)return R;if(v.key===O)return v.value;try{return o.template.renderLoading(n,a,{preserveMissingParams:t})}catch{return n}},[o,b,R,v,O,n,a,t]),loading:b?M:!1}}function Qr(e){let r=[],n=new Set;for(let t of e.matchAll(Ke)){let o=t[1];n.has(o)||(n.add(o),r.push(o))}return r}function Jr(e,r,n){return e.replace(Ke,(t,o)=>{let s=r[o];return s==null?n?t:"":$r(s)})}function $r(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e)??""}function jr(e,r){let n=Ir(0),t=r.slice().sort().join("|"),o=ze(u=>{let i=()=>{n.current+=1,u()},c=[e.template.subscribe(i)];for(let a of r)c.push(e.udfs.subscribeOutput(a,i));return()=>c.forEach(a=>a())},[e,t]),s=ze(()=>n.current,[]);return _r(o,s,s)}import{useCallback as ne,useEffect as Wr,useMemo as te,useRef as zr,useState as Ze,useSyncExternalStore as Hr}from"react";function Ge(e){let r=x(),n=ne(s=>e?r.udfs.subscribeOutput(e,s):()=>{},[r,e]),t=zr(void 0),o=ne(()=>{if(!e)return;let s=r.udfs.getOutputSnapshot(e),u=t.current;return Kr(u,s)?u:(t.current=s,s)},[r,e]);return Hr(n,o,o)}function Xe(){let e=x();return ne(r=>e.udfs.requestReexecute(r),[e])}function Kr(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 Ye=/^\{\{(\w+)\.(\w+)(?:\[(\d+)\])?\}\}$/;function oe(e){return!e||typeof e!="string"?!1:Ye.test(e)}function xe(e){if(!oe(e))return null;let r=e.match(Ye);if(!r)return null;let[,n,t,o]=r,s=o!==void 0?parseInt(o,10):void 0;return{udfName:n,columnName:t,index:s}}function Zr(e){return!!e&&typeof e=="object"&&typeof e.getRows=="function"}function Re({udfName:e,sampleSize:r=200}){let n=Ge(e),t=Xe(),[o,s]=Ze([]),[u,i]=Ze([]);Wr(()=>{let a=!1,b=n?.data;if(!b||!Zr(b)){s([]),i([]);return}return(async()=>{try{let R=await b.getRows(0,Math.max(0,r));if(a)return;let k=R.map(v=>{let p=v;return p&&typeof p=="object"&&p.properties&&typeof p.properties=="object"?p.properties:v});s(k);let g=Array.from(new Set(k.flatMap(v=>Object.keys(v??{}))));i(g)}catch{if(a)return;s([]),i([])}})(),()=>{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 Gr(e,r=200){let n=oe(e),t=te(()=>n?xe(e):null,[n,e]),{rows:o,loading:s}=Re({udfName:t?.udfName,sampleSize:r});return{values:te(()=>!t||!t.columnName?[]:o.map(i=>i?.[t.columnName]).filter(i=>i!=null),[o,t]),loading:n?s:!1}}function Xr(e,r=200){let n=oe(e),t=te(()=>n?xe(e):null,[n,e]),{rows:o,loading:s}=Re({udfName:t?.udfName,sampleSize:r});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:n?s:!1}}import{useCallback as cr,useEffect as G,useMemo as _,useRef as fn,useState as V}from"react";import{createContext as Yr,useContext as en}from"react";var ve=Yr({});ve.displayName="JsonUiBindingContext";function be(){return en(ve)}import{useCallback as se,useMemo as rn,useRef as Ue,useSyncExternalStore as nn}from"react";var er=Object.freeze([]);function ie(){let e=x(),{configHash:r}=H(),n=Ue(e);n.current=e;let t=Ue(r);t.current=r;let o=se((s,u="info")=>{n.current.log.log(s,u,t.current)},[]);return rn(()=>({log:o}),[o])}function tn(e){let r=x(),n=se(s=>e?r.log.subscribeLogs(e,s):()=>{},[r,e]),t=Ue(er),o=se(()=>{if(!e)return er;let s=r.log.getLogsSnapshot(e);return s===t.current?t.current:(t.current=s,s)},[r,e]);return nn(n,o,o)}function on(e){let r=x();return se(()=>{e&&r.log.clearLogs(e)},[r,e])}function ue(){let e=x();return{startLoading:e.edges.startLoading,stopLoading:e.edges.stopLoading}}import{createContext as sn,useContext as un}from"react";var an=Object.freeze({}),he=sn(an);he.displayName="SqlSourceOverrideContext";function we(){return un(he)}var ke=/\$([a-zA-Z_][a-zA-Z0-9_]*)/g,rr=/\{\{(\w+)(?:\?([^}]*))?\}\}/g,Ee=/'((?:s3|gs|fd):\/\/[^'\n]+)'/g;function ln(e){return e==null?"''":typeof e=="number"&&!Number.isNaN(e)?String(e):typeof e=="boolean"?e?"TRUE":"FALSE":`'${String(e).replace(/'/g,"''")}'`}function cn(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 nr(e,r){return e.replace(ke,(n,t,o)=>{let s=r[t],u=s==null?"":String(s);return cn(e,o)?u.replace(/'/g,"''"):ln(s)})}function tr(e){let r=new Set,n=[];ke.lastIndex=0;for(let t of e.matchAll(ke)){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function Ce(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 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&&(r[i]=c,n=!0)}return n?r:null}function or(e){let r=[],n;for(rr.lastIndex=0;(n=rr.exec(e))!==null;){let[t,o,s]=n;r.push({match:t,name:o,overrides:Ce(s),start:n.index,end:n.index+t.length})}return r}function sr(e){if(!e)return[];let r=new Set,n=[];Ee.lastIndex=0;let t;for(;(t=Ee.exec(e))!==null;){let o=t[1];r.has(o)||(r.add(o),n.push(o))}return n}function ir(e,r){return e&&e.replace(Ee,(n,t)=>{let o=r[t];return o?`'${o}'`:n})}var ur=/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/;function ae(e){let r=e.trim(),n=ur.exec(r);return n?n[1]:null}function le(e,r){let n=ur.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 dn(e){return Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}function ar(e,r){return r?`${e}#${dn(r)}`:e}var dr=500,Z=Object.freeze([]),Y=Object.freeze([]);function lr(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 gn(e){return`"${e.replace(/"/g,'""')}"`}function pn(e,r,n,t,o,s){let u=e.match(/^\$([a-zA-Z_][a-zA-Z0-9_]*)$/);if(u){let c=o[u[1]];return c==null?"":lr(String(c),s)}let i=e;for(let c=r.length-1;c>=0;c--){let{raw:a,key:b,resolvedOverrides:R}=r[c],g=R===null&&t?t[a.name]:void 0,v;g?v=gn(g.relationName):v=`'${n.get(b)??`${a.name}.parquet`}'`,i=i.slice(0,a.start)+v+i.slice(a.end)}return i=lr(i,s),nr(i,o)}function fr({sql:e,enabled:r=!0,maxRows:n=dr,sourceOverrides:t}){let o=x(),s=we(),u=_(()=>{let l=Object.keys(s).length>0;return t?l?{...s,...t}:t:l?s:void 0},[s,t]),{startLoading:i,stopLoading:c}=ue(),{log:a}=ie(),[b,R]=V(""),[k,g]=V(!1),[v,p]=V(null),[M,E]=V(0),O=_(()=>e?or(e):[],[e]),L=_(()=>u?O.filter(l=>l.overrides!==null||!u[l.name]):O,[O,u]),A=_(()=>{let l=new Set;for(let S of L)if(S.overrides)for(let d of Object.values(S.overrides)){let B=ae(d);B&&l.add(B)}return Array.from(l)},[L]),h=_(()=>e?tr(e):[],[e]),m=_(()=>{let l=new Set,S=[];for(let d of h)l.has(d)||(l.add(d),S.push(d));for(let d of A)l.has(d)||(l.add(d),S.push(d));return S},[h,A]),U=W(m),{inForm:C,values:T}=$(m),q=_(()=>C?{...U,...T}:U,[C,U,T]),N=_(()=>L.map(l=>{if(!l.overrides)return{raw:l,key:l.name,resolvedOverrides:null,unresolved:!1};let S={},d=!1;for(let[B,J]of Object.entries(l.overrides)){let y=le(J,q);y.unresolved&&(d=!0),S[B]=y.value}return{raw:l,key:ar(l.name,S),resolvedOverrides:S,unresolved:d}}),[L,q]),w=_(()=>{let l=new Set,S=[];for(let d of N)d.unresolved||l.has(d.key)||(l.add(d.key),S.push({name:d.raw.name,key:d.key,overrides:d.resolvedOverrides??void 0}));return S},[N]),Q=_(()=>w.map(l=>`${l.key}|${l.name}|${l.overrides?Object.entries(l.overrides).sort(([S],[d])=>S.localeCompare(d)).map(([S,d])=>`${S}=${d}`).join(","):""}`).join(`
2
+ `),[w]),D=cr(()=>{E(l=>l+1)},[]);G(()=>{if(!r||w.length===0)return;let l=w.map(S=>o.udfs.subscribeOutput(S.name,()=>{E(d=>d+1)}));return()=>{l.forEach(S=>S())}},[o,r,w]),G(()=>{k?i():c()},[k,i,c]);let I=_(()=>{if(!u)return null;for(let l of O){if(l.overrides!==null)continue;let S=u[l.name];if(S?.error)return S.error}return null},[O,u]),f=_(()=>u?O.some(l=>l.overrides===null&&u[l.name]?.loading):!1,[O,u]),P=N.some(l=>l.unresolved);return G(()=>{if(!r||!e){R(""),g(!1),p(null);return}if(I){R(""),p(I),g(!1),a(`SQL preprocessing: ${I}`,"error");return}if(f||P){R(""),p(null),g(!0);return}let l=!1;return g(!0),p(null),(async()=>{let S=new Map,d;if(w.length>0)try{let y=await o.sql.resolveVfsFilenames(w);if(l)return;if(y instanceof Map)for(let F of N){if(F.resolvedOverrides)continue;let X=y.get(F.raw.name);X&&S.set(F.key,X)}else S=y.filenames,d=y.errors}catch(y){if(l)return;let F=y instanceof Error?y.message:typeof y=="string"?y:"VFS registration failed";R(""),p(F),g(!1),a(`SQL preprocessing: ${F}`,"error");return}if(d)for(let y of N){let F=d.get(y.key);if(F){if(l)return;R(""),p(F),g(!1),a(`SQL preprocessing: ${F}`,"error");return}}for(let y of N)if(!(y.unresolved||y.resolvedOverrides===null&&u?.[y.raw.name]!==void 0)&&!S.has(y.key)){if(l)return;R(""),p(null),g(!0);return}let B;try{B=pn(e,N,S,u,q,n)}catch(y){if(l)return;let F=y instanceof Error?y.message:typeof y=="string"?y:"SQL preprocessing failed";R(""),p(F),g(!1),a(`SQL preprocessing failed: ${F}`,"error");return}let J=sr(B);if(J.length===0){if(l)return;R(B),p(null),g(!1),a("SQL preprocessing completed");return}try{let y={},F=await Promise.all(J.map(de=>o.signUrl(de)));if(l)return;J.forEach((de,Sr)=>{y[de]=F[Sr].signed});let X=ir(B,y);R(X),p(null),g(!1),a("SQL preprocessing completed")}catch(y){if(l)return;let F=y instanceof Error?y.message:typeof y=="string"?y:"URL signing failed";R(""),p(F),g(!1),a(`SQL preprocessing failed: ${F}`,"error")}})(),()=>{l=!0}},[o,r,e,Q,N,q,u,I,f,P,n,M,a,w]),{processedSql:b,loading:k,error:v,refetch:D}}function mn({sql:e,enabled:r=!0,maxRows:n=dr,sourceOverrides:t,queryId:o,refreshInterval:s}){let u=x(),{startLoading:i,stopLoading:c}=ue(),{log:a}=ie(),{queryId:b,refreshInterval:R}=be(),k=o??b,g=s??R,[v,p]=V(Z),[M,E]=V(Y),[O,L]=V(!1),[A,h]=V(null),[m,U]=V(0),{processedSql:C,loading:T,error:q,refetch:N}=fr({sql:e,enabled:r,maxRows:n,sourceOverrides:t}),w=fn(""),Q=r&&!!e&&!!C&&!T&&!q&&C!==w.current,D=T||O||Q;G(()=>{D?i():c()},[D,i,c]);let I=cr(()=>{w.current="",N(),U(f=>f+1)},[N]);return G(()=>{if(!r||!e){w.current="",p(Z),E(Y),L(!1),h(null);return}if(q){w.current="",h(q),p(Z),E(Y),L(!1);return}if(T||!C){w.current="",L(!1);return}let f=!1,P=new AbortController;w.current=C,L(!0),h(null);let l=C.length>120?C.slice(0,120)+"\u2026":C;a(`SQL query started: ${l}`);let S=performance.now();return u.sql.query(C,{signal:P.signal,queryId:k,refreshInterval:g}).then(d=>{if(f)return;let B=Math.round(performance.now()-S);if(d.error){p(Z),E(Y),h(d.error),L(!1),a(`SQL failed (${B}ms): ${d.error}`,"error");return}p(d.rows.length===0?Z:d.rows),E(d.columns),h(null),L(!1),a(`SQL completed: ${d.rows.length} row${d.rows.length!==1?"s":""} in ${B}ms`)},d=>{if(f||d?.name==="AbortError")return;let B=Math.round(performance.now()-S),J=d instanceof Error?d.message:typeof d=="string"?d:"SQL query failed";h(J),p(Z),E(Y),L(!1),a(`SQL failed (${B}ms): ${J}`,"error")}),()=>{f=!0,P.abort()}},[u,r,e,C,T,q,m,a,k,g]),{rows:v,columns:M,loading:D,error:A,refetch:I}}function Sn(e,r=!0){let n=x(),[t,o]=V({filenames:new Map,loading:!1}),s=_(()=>e.slice().sort().join("|"),[e]);return G(()=>{if(!r||e.length===0){o({filenames:new Map,loading:!1});return}let u=!1;return o(i=>({...i,loading:!0,error:void 0})),n.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}},[n,s,r]),t}import{useCallback as gr,useEffect as yn,useState as ce}from"react";var pr=["s3://","gs://","fd://"];function Pe(e){return pr.some(r=>e.startsWith(r))}function xn(){let e=x();return{signUrl:gr(n=>e.signUrl(n),[e])}}function Rn(e){let r=x(),{value:n,loading:t}=ye(e),[o,s]=ce(null),[u,i]=ce(null),[c,a]=ce(!1),[b,R]=ce(0);yn(()=>{if(t)return;if(!n){s(null),i(null),a(!1);return}if(!Pe(n)){s(n),i(null),a(!1);return}let g=!1;return a(!0),i(null),r.signUrl(n).then(({signed:v})=>{g||s(v??n)}).catch(v=>{g||(i(v instanceof Error?v.message:"Failed to load media"),s(null))}).finally(()=>{g||a(!1)}),()=>{g=!0}},[r,t,n,b]);let k=gr(async()=>{if(!n||!Pe(n))return n??null;let{signed:g}=await r.signUrl(n),v=g??n;return s(v),i(null),R(p=>p+1),v},[r,n]);return{src:o,loading:t||c,error:u,refreshSignedUrl:k,resolvedSrc:n,needsSigning:!!(n&&Pe(n))}}import{useEffect as vn,useState as bn}from"react";function Un(e,r){let n=x(),[t,o]=bn({status:"idle"});return vn(()=>{if(!r||!e?.trim()){o({status:"idle"});return}let s=!1;return o({status:"checking"}),n.uploads.checkAccess(e).then(u=>{s||(u.ok?o({status:"allowed"}):o({status:"denied",message:u.message??"Upload access denied."}))}),()=>{s=!0}},[n,e,r]),t}function hn(){return H()}import{useCallback as Ae,useMemo as Le,useRef as mr,useState as Fe}from"react";var wn=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function Oe(e){if(!e)return null;let r=e.trim();if(!r)return null;let n=r.indexOf("?"),t=(n===-1?r:r.slice(0,n)).trim();if(!wn.test(t))return null;let o=n===-1?void 0:r.slice(n+1);return{name:t,overrides:Ce(o)??{}}}function kn(e,r={}){let n=x(),{format:t}=r,o=Le(()=>Oe(e),[e]),s=Le(()=>{if(!o)return[];let m=new Set,U=[];for(let C of Object.values(o.overrides)){let T=ae(C);T&&!m.has(T)&&(m.add(T),U.push(T))}return U},[o]),u=W(s),{inForm:i,values:c}=$(s),a=Le(()=>i?{...u,...c}:u,[u,c,i]),b=Se(),R=mr({parsed:o,paramValues:a,allowedUdfNames:b,format:t});R.current={parsed:o,paramValues:a,allowedUdfNames:b,format:t};let[k,g]=Fe("idle"),[v,p]=Fe(null),[M,E]=Fe(null),O=mr(0),L=Ae(()=>{O.current+=1,g("idle"),p(null),E(null)},[]),A=Ae(m=>(g("error"),E(m),p(null),{data:null,error:m}),[]);return{fire:Ae(async m=>{let{parsed:U,paramValues:C,allowedUdfNames:T,format:q}=R.current;if(!U)return A("No UDF to run (empty or invalid executor)."),null;if(T&&!T.has(U.name))return A(`UDF "${U.name}" is not reachable from this node \u2014 connect it with an edge.`);let N={};for(let[D,I]of Object.entries(U.overrides))N[D]=le(I,C).value;m&&Object.assign(N,m);let w=++O.current,Q=()=>w===O.current;g("running"),E(null),n.edges.startLoading();try{let D=await n.udfs.execute(U.name,N,{format:q});return Q()&&(D.error?(g("error"),E(D.error),p(null)):(g("success"),p(D.data),E(null))),D}catch(D){let I=D instanceof Error?D.message:"UDF execution failed.";return Q()&&(g("error"),E(I),p(null)),{data:null,error:I}}finally{n.edges.stopLoading()}},[n,A]),status:k,isRunning:k==="running",data:v,error:M,canFire:o!==null,reset:L}}function En(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(),s=n.slice(t+1).trim();if(!o||!s)continue;let u=o.replace(/-([a-z])/g,(i,c)=>c.toUpperCase());r[u]=s}return r}export{_e as FormContext,De as FusedWidgetBridgeContext,ve as JsonUiBindingContext,qe as JsonUiNodeOverrideContext,Cn as PARAMETER_BROADCAST_CHANNEL,fe as ParameterMessageType,Ee as SIGNABLE_URL_LITERAL_REGEX,pr as SIGNED_URL_SCHEMES,ke as SQL_PARAM_REGEX,rr as SQL_SOURCE_PLACEHOLDER_REGEX,he as SqlSourceOverrideContext,dn as canonicalOverrideKey,ar as computePlaceholderKey,Tn as createFormParamsStore,hr as defineCatalog,Ur as defineComponent,ln as escapeSqlValue,sr as extractSignableUrls,tr as extractSqlParams,ae as getDollarRefName,Pn as isStandardMessage,oe as isUdfQuery,Oe as parseExecutor,Ce as parseOverridesString,or as parseSqlUdfPlaceholders,En as parseStyle,xe as parseUdfColumnQuery,le as resolveOverrideValue,ir as rewriteSignedUrls,nr as substituteSqlParams,Tr as useAllowedSources,Se as useAllowedUdfNames,W as useCanvasParams,mn as useDuckDbSqlQuery,fr as useDuckDbSqlQueryPreprocessing,ge as useFormContext,$ as useFormParams,pe as useFusedParam,Cr as useFusedParamWithForm,x as useFusedWidgetBridge,be as useJsonUiBinding,ue as useJsonUiEdgeAnimation,ie as useJsonUiLog,on as useJsonUiLogClear,tn as useJsonUiLogs,H as useJsonUiNode,hn as useJsonUiUdfInfo,Rn as useMediaSrc,ye as useParamSubstitution,Xe as useRequestUdfReexecute,we as useSqlSourceOverrides,Xr as useUdfColumnValue,Gr as useUdfColumnValues,Re as useUdfDataFrameSample,kn as useUdfExecutor,Ge as useUdfOutputByName,Un as useUploadAccessCheck,xn as useUrlSigning,Sn as useVfsRegistration};
@@ -1,6 +1,8 @@
1
1
  export interface JsonUiBinding {
2
2
  /** Resolver-stamped query id for this node (e.g. `"q0"`); undefined elsewhere. */
3
3
  queryId?: string;
4
+ /** Resolver-stamped refresh interval (ms) for this node; undefined in non-server-resolved hosts. */
5
+ refreshInterval?: number;
4
6
  }
5
7
  export declare const JsonUiBindingContext: import("react").Context<JsonUiBinding>;
6
8
  /** Read the current node's data-binding identity. `{}` when no provider is present. */
@@ -11,7 +11,9 @@ exports.useJsonUiBinding = useJsonUiBinding;
11
11
  * SDK data hooks (currently `useDuckDbSqlQuery`) read the id via
12
12
  * `useJsonUiBinding()` and thread it into `bridge.sql.query(sql, { queryId })`,
13
13
  * letting the static MCP bridge look up the pre-resolved rows by id instead of
14
- * running DuckDB in the sandbox.
14
+ * running DuckDB in the sandbox. The binding also carries an optional
15
+ * `refreshInterval` (ms) the host stamps alongside `_queryId`, parallel to the
16
+ * query id, so a server-resolved host knows this node's auto-refresh cadence.
15
17
  *
16
18
  * The default value is `{}` (no binding). In every other host (workbench, test
17
19
  * harness, mobile) the provider is absent, `queryId` is `undefined`, and the
@@ -30,6 +30,14 @@ export interface UseDuckDbSqlQueryOptions {
30
30
  * `bridge.sql.query(sql, { queryId })`; the workbench bridge ignores it.
31
31
  */
32
32
  queryId?: string;
33
+ /**
34
+ * Author-declared auto-refresh cadence for this query, in **milliseconds**.
35
+ * The refresh timer is provided by the host runtime, **not** this SDK — in
36
+ * hosts without refresh support (e.g. the workbench) the field is inert and
37
+ * behavior is unchanged. An explicit option wins over the binding-provided
38
+ * value. Threaded into `bridge.sql.query(sql, { refreshInterval })`.
39
+ */
40
+ refreshInterval?: number;
33
41
  }
34
42
  export interface UseDuckDbSqlQueryResult {
35
43
  rows: ReadonlyArray<Record<string, unknown>>;
@@ -55,7 +63,7 @@ export declare function useDuckDbSqlQueryPreprocessing({ sql, enabled, maxRows,
55
63
  * `useDuckDbSqlQueryPreprocessing` to prepare the SQL string, then runs
56
64
  * it via the bridge.
57
65
  */
58
- export declare function useDuckDbSqlQuery({ sql, enabled, maxRows, sourceOverrides, queryId: queryIdOption, }: UseDuckDbSqlQueryOptions): UseDuckDbSqlQueryResult;
66
+ export declare function useDuckDbSqlQuery({ sql, enabled, maxRows, sourceOverrides, queryId: queryIdOption, refreshInterval: refreshIntervalOption, }: UseDuckDbSqlQueryOptions): UseDuckDbSqlQueryResult;
59
67
  /**
60
68
  * Resolve UDF names to VFS filenames, registering them in DuckDB if needed.
61
69
  * Exposed for advanced use cases (e.g. building your own query string).
@@ -423,15 +423,20 @@ function useDuckDbSqlQueryPreprocessing({ sql, enabled = true, maxRows = DEFAULT
423
423
  * `useDuckDbSqlQueryPreprocessing` to prepare the SQL string, then runs
424
424
  * it via the bridge.
425
425
  */
426
- function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, sourceOverrides, queryId: queryIdOption, }) {
426
+ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, sourceOverrides, queryId: queryIdOption, refreshInterval: refreshIntervalOption, }) {
427
427
  const bridge = (0, bridge_1.useFusedWidgetBridge)();
428
428
  const { startLoading: startEdgeLoading, stopLoading: stopEdgeLoading } = (0, use_json_ui_edge_animation_1.useJsonUiEdgeAnimation)();
429
429
  const { log } = (0, use_json_ui_log_1.useJsonUiLog)();
430
430
  // Server-resolved data seam: explicit option wins, else fall back to the
431
431
  // per-node binding context. `undefined` in every non-MCP host (no behavior
432
432
  // change for the workbench).
433
- const { queryId: queryIdBinding } = (0, json_ui_binding_1.useJsonUiBinding)();
433
+ const { queryId: queryIdBinding, refreshInterval: refreshIntervalBinding } = (0, json_ui_binding_1.useJsonUiBinding)();
434
434
  const queryId = queryIdOption ?? queryIdBinding;
435
+ // Passthrough metadata for the host's refresh timer (Layer 2). The workbench
436
+ // bridge ignores it; a server-resolved host reads it off the query call.
437
+ // Kept in the query effect's deps (like queryId) so the host never receives a
438
+ // stale interval — it's stable in practice, so this triggers no extra fetches.
439
+ const refreshInterval = refreshIntervalOption ?? refreshIntervalBinding;
435
440
  const [rows, setRows] = (0, react_1.useState)(EMPTY_ROWS);
436
441
  const [columns, setColumns] = (0, react_1.useState)(EMPTY_COLUMNS);
437
442
  const [queryLoading, setQueryLoading] = (0, react_1.useState)(false);
@@ -496,7 +501,9 @@ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, so
496
501
  : processedSql;
497
502
  log(`SQL query started: ${truncatedSql}`);
498
503
  const t0 = performance.now();
499
- bridge.sql.query(processedSql, { signal: controller.signal, queryId }).then((result) => {
504
+ bridge.sql
505
+ .query(processedSql, { signal: controller.signal, queryId, refreshInterval })
506
+ .then((result) => {
500
507
  if (cancelled)
501
508
  return;
502
509
  const elapsed = Math.round(performance.now() - t0);
@@ -544,6 +551,7 @@ function useDuckDbSqlQuery({ sql, enabled = true, maxRows = DEFAULT_MAX_ROWS, so
544
551
  fetchKey,
545
552
  log,
546
553
  queryId,
554
+ refreshInterval,
547
555
  ]);
548
556
  return { rows, columns, loading, error, refetch };
549
557
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusedio/widget-sdk",
3
- "version": "0.3.1",
3
+ "version": "0.4.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",