@marimo-team/frontend 0.23.7-dev55 → 0.23.7-dev56
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/assets/{CellStatus-DXNmZJpi.js → CellStatus-DGBvmSvq.js} +1 -1
- package/dist/assets/{JsonOutput-Dxol3ZtH.js → JsonOutput-BPqXvbC7.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-YGhIA85d.js → MarimoErrorOutput-XWqnhvJ6.js} +1 -1
- package/dist/assets/{RenderHTML-Dz1OIbOh.js → RenderHTML-B5r25cP5.js} +1 -1
- package/dist/assets/{RunButton-D1IZ1Yr0.js → RunButton-Cq4E1fUj.js} +1 -1
- package/dist/assets/{add-cell-with-ai-hIPYl46r.js → add-cell-with-ai-DXs7NQH8.js} +1 -1
- package/dist/assets/{add-connection-dialog-CMR-c9XE.js → add-connection-dialog-B7rzO6Bd.js} +1 -1
- package/dist/assets/{agent-panel-DnBAoLsM.js → agent-panel-BrZgfzbb.js} +1 -1
- package/dist/assets/{ai-model-dropdown-zvokTxf_.js → ai-model-dropdown-CfAujhNQ.js} +1 -1
- package/dist/assets/{app-config-button-BjFAqaTN.js → app-config-button-BauNrGJV.js} +1 -1
- package/dist/assets/{cell-editor-Dak_jwhB.js → cell-editor-BfL0GQm4.js} +1 -1
- package/dist/assets/{cell-link-pRI-YfIp.js → cell-link-PQYiMZw1.js} +1 -1
- package/dist/assets/{cells-DbE28H1u.js → cells-Dnu4nDoy.js} +1 -1
- package/dist/assets/{chat-display-D_nDPZek.js → chat-display-CpTxtOxb.js} +1 -1
- package/dist/assets/{chat-panel-BktSpl2P.js → chat-panel-B3nmnXWi.js} +1 -1
- package/dist/assets/{chat-ui-C0_KcXrv.js → chat-ui-BjxCdllv.js} +1 -1
- package/dist/assets/{column-preview-CNeXQtKn.js → column-preview-D_CJGSJp.js} +1 -1
- package/dist/assets/{command-palette-CcjZs_TG.js → command-palette-DxTYJO96.js} +1 -1
- package/dist/assets/{common-CWRr25jC.js → common-BaBE_ygg.js} +1 -1
- package/dist/assets/{components-DUd0ki0p.js → components-CvGaLA5d.js} +1 -1
- package/dist/assets/{components-Cj3Al1Y6.js → components-DDdymb5T.js} +1 -1
- package/dist/assets/config-C2lTvbuU.js +1 -0
- package/dist/assets/{datasource-Prn_GWOB.js → datasource-I-LOgxeP.js} +1 -1
- package/dist/assets/{dependency-graph-panel-DUUCij85.js → dependency-graph-panel-C9UUaBId.js} +1 -1
- package/dist/assets/{documentation-panel-CB8xalFX.js → documentation-panel-DMdFXuBf.js} +1 -1
- package/dist/assets/{download-DEJbA1IY.js → download-7bMr0q_N.js} +1 -1
- package/dist/assets/{edit-page-BkHYt2if.js → edit-page-Cyargy5N.js} +4 -4
- package/dist/assets/{error-panel-DG6AtqLR.js → error-panel-iXznkJZ1.js} +1 -1
- package/dist/assets/{file-explorer-panel-Co6MlwYD.js → file-explorer-panel-C_yDXl56.js} +1 -1
- package/dist/assets/{file-icons-BjTIuMQg.js → file-icons-B6DaZdP0.js} +1 -1
- package/dist/assets/{floating-outline-uy6dAsIe.js → floating-outline-DbOtUfo-.js} +1 -1
- package/dist/assets/{focus-0RBjdtZw.js → focus-lmUjuV78.js} +1 -1
- package/dist/assets/{form-DNa2VnwU.js → form-D4sbBaU7.js} +1 -1
- package/dist/assets/{globals-DI5QlXvl.js → globals-CpVAcN9Z.js} +1 -1
- package/dist/assets/{home-page-BSuXANlw.js → home-page-6lENki1m.js} +1 -1
- package/dist/assets/{hooks-B7pYZHjF.js → hooks-B26B49RX.js} +1 -1
- package/dist/assets/{html-to-image-CIu-0LbU.js → html-to-image-CPRGrFLO.js} +1 -1
- package/dist/assets/{index-DySiGerD.js → index-BhMdGN-p.js} +5 -5
- package/dist/assets/{kiosk-mode-Ch75k65P.js → kiosk-mode-Czvj3vmL.js} +1 -1
- package/dist/assets/{layout-DFhJt7oJ.js → layout-C50t7RQF.js} +3 -3
- package/dist/assets/{logs-panel-DR-1BC0S.js → logs-panel-BMAfoMJg.js} +1 -1
- package/dist/assets/{markdown-renderer-DGqYztXR.js → markdown-renderer-CKEFGuRo.js} +1 -1
- package/dist/assets/{name-cell-input-DwfyLq31.js → name-cell-input-Dn6uYwZh.js} +1 -1
- package/dist/assets/{outline-panel-CWunrooQ.js → outline-panel-CkZUQcZ1.js} +1 -1
- package/dist/assets/{packages-panel-BdcXUFQJ.js → packages-panel-CUqt7J6d.js} +1 -1
- package/dist/assets/panels-CbhLLxJW.js +1 -0
- package/dist/assets/{process-output-CS4QGJvL.js → process-output-9W-JyYdE.js} +1 -1
- package/dist/assets/{radio-group-BS2PIEzV.js → radio-group-CrX1YUJ8.js} +1 -1
- package/dist/assets/{readonly-python-code-C5JNX2fu.js → readonly-python-code-DqYAw8-1.js} +1 -1
- package/dist/assets/{reveal-component-PiSHIrbA.js → reveal-component-ll7qNbhl.js} +1 -1
- package/dist/assets/{run-page-BovrPK0f.js → run-page-JsNyhyM9.js} +1 -1
- package/dist/assets/{scratchpad-panel-CAWFveBD.js → scratchpad-panel-DS3OYn5P.js} +1 -1
- package/dist/assets/{session-panel-BR9h5w96.js → session-panel-BMqKXWPA.js} +1 -1
- package/dist/assets/{snippets-panel-Y2etH9Qg.js → snippets-panel-DJ63gDxT.js} +1 -1
- package/dist/assets/{state-1SbOXCLX.js → state-D9EoHCkz.js} +1 -1
- package/dist/assets/{state-Fa6RzVTL.js → state-NEwDS-mc.js} +1 -1
- package/dist/assets/{switch-CTn-kJzM.js → switch-BtkQp293.js} +1 -1
- package/dist/assets/{terminal-DI2XRUUH.js → terminal-CV-XivGh.js} +1 -1
- package/dist/assets/{textarea-wgoQLrBS.js → textarea-BBTcSr-i.js} +1 -1
- package/dist/assets/{tracing-C9PZ0Pr1.js → tracing-886qE50I.js} +1 -1
- package/dist/assets/{tracing-panel-C20Rk6hU.js → tracing-panel-rFRw8uXs.js} +2 -2
- package/dist/assets/{useBoolean-DP3412N2.js → useBoolean-DamyMuo_.js} +1 -1
- package/dist/assets/{useCellActionButton-D_-iAhme.js → useCellActionButton-Z2BNpaPg.js} +1 -1
- package/dist/assets/{useDeleteCell-41mvwiyA.js → useDeleteCell-Cd-d4sq2.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-ELdrL73c.js → useDependencyPanelTab-CFcdGAEr.js} +1 -1
- package/dist/assets/{useNotebookActions-CgN-58GN.js → useNotebookActions-buQjCsjn.js} +1 -1
- package/dist/assets/{useRunCells-CfHlqXY6.js → useRunCells-C0BPo9m1.js} +1 -1
- package/dist/assets/{useSplitCell-gHtyz873.js → useSplitCell-fwbSsYi6.js} +1 -1
- package/dist/assets/{vega-component-BPU1T-x7.js → vega-component-BLse2pH8.js} +1 -1
- package/dist/index.html +26 -26
- package/package.json +1 -1
- package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
- package/src/core/runtime/__tests__/runtime.test.ts +38 -17
- package/src/core/runtime/runtime.ts +57 -34
- package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +5 -4
- package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +18 -54
- package/src/core/websocket/transports/__tests__/ws.test.ts +125 -0
- package/src/core/websocket/transports/basic.ts +1 -3
- package/src/core/websocket/transports/transport.ts +0 -1
- package/src/core/websocket/transports/ws.ts +94 -0
- package/src/core/websocket/useMarimoKernelConnection.tsx +30 -26
- package/src/core/websocket/useWebSocket.tsx +3 -18
- package/dist/assets/config-DGudsRYK.js +0 -1
- package/dist/assets/panels-CJ1t18_z.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as Z}from"./chunk-LvLJmgfZ.js";import{n as C}from"./useEvent-D91BmmQi.js";import{t as Y}from"./react-Bj1aDYRI.js";import"./react-dom-CSu739Rf.js";import{t as tt}from"./compiler-runtime-B3qBwwSJ.js";import{t as et}from"./debounce-DhnxH9Rh.js";import{_,d as V}from"./useEventListener-DvoEXWke.js";import{n as H}from"./config-DGudsRYK.js";import{t as nt}from"./cn-DCUzRj2J.js";import{t as rt}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import{t as at}from"./tooltip-DTV9tlSr.js";import{r as it}from"./button-BbCh-29a.js";import{d as N}from"./arrays-DYDL-3-i.js";import{u as ot}from"./toDate-B5A0DFEz.js";import"./session-DGdfs0bJ.js";import{r as lt}from"./useTheme-Kwyx4PvL.js";import{t as ct}from"./isValid-DdlR4-BY.js";import{a as st,r as mt,t as pt}from"./utils-DQRuLEof.js";import{n as ut}from"./vega-loader.browser-xq8miGHn.js";import{t as ft}from"./react-vega-4VQqM03t.js";import"./defaultLocale-DPBdGRrH.js";import"./defaultLocale-Lfi0pexn.js";import{r as dt,t as ht}from"./alert-DrHguQlr.js";import{n as gt}from"./error-banner-CLO6LFll.js";import{n as yt}from"./useAsyncData-C5i0IRVM.js";import{t as vt}from"./formats-CJQ67TPE.js";import{t as F}from"./useDeepCompareMemoize-zUHU--0D.js";import{t as kt}from"./semaphore-X3ApuO41.js";var bt=tt(),S=Z(Y(),1);function wt(t){return t.data&&"url"in t.data&&(t.data.url=H(t.data.url).href),t}const u={arc:"arc",area:"area",bar:"bar",image:"image",line:"line",point:"point",rect:"rect",rule:"rule",text:"text",tick:"tick",trail:"trail",circle:"circle",square:"square",geoshape:"geoshape"};var W=new Set(["boxplot","errorband","errorbar"]);const x={getMarkType(t){let e=typeof t=="string"?t:t.type;if(W.has(e))throw Error("Not supported");return e},isInteractive(t){let e=typeof t=="string"?t:t.type;return!W.has(e)},makeClickable(t){let e=typeof t=="string"?t:t.type;return e in u?typeof t=="string"?{type:t,cursor:"pointer",tooltip:!0}:{...t,type:e,cursor:"pointer",tooltip:!0}:t},getOpacity(t){return typeof t=="string"?null:"opacity"in t&&typeof t.opacity=="number"?t.opacity:null}},v={point(t){return t==null?"select_point":`select_point_${t}`},interval(t){return t==null?"select_interval":`select_interval_${t}`},legendSelection(t){return`legend_selection_${t}`},binColoring(t){return t==null?"bin_coloring":`bin_coloring_${t}`},HIGHLIGHT:"highlight",PAN_ZOOM:"pan_zoom",hasPoint(t){return t.some(e=>e.startsWith("select_point"))},hasInterval(t){return t.some(e=>e.startsWith("select_interval"))},hasLegend(t){return t.some(e=>e.startsWith("legend_selection"))},hasPanZoom(t){return t.some(e=>e.startsWith("pan_zoom"))},isBinColoring(t){return t.startsWith("bin_coloring")}},j={highlight(){return{name:v.HIGHLIGHT,select:{type:"point",on:"mouseover"}}},interval(t,e){return{name:v.interval(e),select:{type:"interval",encodings:D(t),mark:{fill:"#669EFF",fillOpacity:.07,stroke:"#669EFF",strokeOpacity:.4},on:"[mousedown[!event.metaKey], mouseup] > mousemove[!event.metaKey]",translate:"[mousedown[!event.metaKey], mouseup] > mousemove[!event.metaKey]"}}},point(t,e){return{name:v.point(e),select:{type:"point",encodings:D(t),on:"click[!event.metaKey]"}}},binColoring(t){return{name:v.binColoring(t),select:{type:"point",on:"click[!event.metaKey]"}}},legend(t){return{name:v.legendSelection(t),select:{type:"point",fields:[t]},bind:"legend"}},panZoom(){return{name:v.PAN_ZOOM,bind:"scales",select:{type:"interval",on:"[mousedown[event.metaKey], window:mouseup] > window:mousemove!",translate:"[mousedown[event.metaKey], window:mouseup] > window:mousemove!",zoom:"wheel![event.metaKey]"}}}};function D(t){switch(x.getMarkType(t.mark)){case u.image:case u.trail:return;case u.area:case u.arc:return["color"];case u.bar:{let e=St(t);return e==="horizontal"?["y"]:e==="vertical"?["x"]:void 0}case u.circle:case u.geoshape:case u.line:case u.point:case u.rect:case u.rule:case u.square:case u.text:case u.tick:return["x","y"]}}function P(t){return"params"in t&&t.params&&t.params.length>0?N(t.params.filter(e=>e==null?!1:"select"in e&&e.select!==void 0).map(e=>e.name)):"layer"in t?N(t.layer.flatMap(P)):"vconcat"in t?N(t.vconcat.flatMap(P)):"hconcat"in t?N(t.hconcat.flatMap(P)):[]}function St(t){var a,i;if(!t||!("mark"in t))return;let e=(a=t.encoding)==null?void 0:a.x,n=(i=t.encoding)==null?void 0:i.y;if(e&&"type"in e&&e.type==="nominal")return"vertical";if(n&&"type"in n&&n.type==="nominal"||e&&"aggregate"in e)return"horizontal";if(n&&"aggregate"in n)return"vertical"}function xt(t){if(!t.encoding)return[];let e=[];for(let n of Object.values(t.encoding))n&&typeof n=="object"&&"bin"in n&&n.bin&&"field"in n&&typeof n.field=="string"&&e.push(n.field);return e}function G(t){if(!t||!("encoding"in t))return[];let{encoding:e}=t;return e?Object.entries(e).flatMap(n=>{let[a,i]=n;return!i||!At.has(a)?[]:"field"in i&&typeof i.field=="string"?[i.field]:"condition"in i&&i.condition&&typeof i.condition=="object"&&"field"in i.condition&&i.condition.field&&typeof i.condition.field=="string"?[i.condition.field]:[]}):[]}var At=new Set(["color","fill","fillOpacity","opacity","shape","size"]);function $(t,e,n,a){let i=n.filter(o=>v.isBinColoring(o)),r={and:(i.length>0?i:n).map(o=>({param:o}))};if(t==="opacity"){let o=x.getOpacity(a)||1;return{...e,opacity:{condition:{test:r,value:o},value:o/5}}}else return e}function _t(t){if(!("select"in t)||!t.select)return JSON.stringify(t);let e=t.select;if(typeof e=="string")return JSON.stringify({type:e,bind:t.bind});let n={type:e.type,encodings:"encodings"in e&&e.encodings?[...e.encodings].toSorted():void 0,fields:"fields"in e&&e.fields?[...e.fields].toSorted():void 0,bind:t.bind};return JSON.stringify(n)}function q(t){let e=E(t);if(e.length===0)return t;let n=jt(e);return n.length===0?t:{...L(K(t,new Set(n.map(a=>a.name))),n.map(a=>a.name)),params:[...t.params||[],...n]}}function E(t){let e=[];if("vconcat"in t&&Array.isArray(t.vconcat))for(let n of t.vconcat)e.push(...E(n));else if("hconcat"in t&&Array.isArray(t.hconcat))for(let n of t.hconcat)e.push(...E(n));else{if("layer"in t)return[];"mark"in t&&"params"in t&&t.params&&t.params.length>0&&e.push({params:t.params})}return e}function jt(t){if(t.length===0)return[];let e=new Map,n=t.length;for(let{params:i}of t){let r=new Set;for(let o of i){let s=_t(o);r.has(s)||(r.add(s),e.has(s)||e.set(s,{count:0,param:o}),e.get(s).count++)}}let a=[];for(let[,{count:i,param:r}]of e)i===n&&a.push(r);return a}function K(t,e){if("vconcat"in t&&Array.isArray(t.vconcat))return{...t,vconcat:t.vconcat.map(n=>K(n,e))};if("hconcat"in t&&Array.isArray(t.hconcat))return{...t,hconcat:t.hconcat.map(n=>K(n,e))};if("mark"in t&&"params"in t&&t.params){let n=t.params,a=[];for(let i of n){if(!i||typeof i!="object"||!("name"in i)){a.push(i);continue}e.has(i.name)||a.push(i)}if(a.length===0){let{params:i,...r}=t;return r}return{...t,params:a}}return t}function L(t,e){return"vconcat"in t&&Array.isArray(t.vconcat)?{...t,vconcat:t.vconcat.map(n=>L(n,e))}:"hconcat"in t&&Array.isArray(t.hconcat)?{...t,hconcat:t.hconcat.map(n=>L(n,e))}:"layer"in t?t:"mark"in t&&x.isInteractive(t.mark)?{...t,mark:x.makeClickable(t.mark),encoding:$("opacity",t.encoding||{},e,t.mark)}:t}function T(t,e){var s,h;let{chartSelection:n=!0,fieldSelection:a=!0}=e;if(!n&&!a)return t;(s=t.params)!=null&&s.some(l=>l.bind==="legend")&&(a=!1);let i=(h=t.params)==null?void 0:h.some(l=>!l.bind);i&&(n=!1);let r="vconcat"in t||"hconcat"in t;if(i&&r)return t;if("vconcat"in t){let l=t.vconcat.map(m=>"mark"in m?T(m,{chartSelection:n,fieldSelection:a}):m);return q({...t,vconcat:l})}if("hconcat"in t){let l=t.hconcat.map(m=>"mark"in m?T(m,{chartSelection:n,fieldSelection:a}):m);return q({...t,hconcat:l})}if("layer"in t){let l=t.params&&t.params.length>0,m=a!==!1&&!l,k=[];if(m){let p=t.layer.flatMap(f=>"mark"in f?G(f):[]);k=[...new Set(p)],Array.isArray(a)&&(k=k.filter(f=>a.includes(f)))}let w=t.layer.map((p,f)=>{if(!("mark"in p))return p;let g=p;if(f===0&&k.length>0){let O=k.map(M=>j.legend(M));g={...g,params:[...g.params||[],...O]}}return g=z(g,n,f),g=J(g),f===0&&(g=B(g)),g});return{...t,layer:w}}if(!("mark"in t)||!x.isInteractive(t.mark))return t;let o=t;return o=Ot(o,a),o=z(o,n,void 0),o=J(o),o=B(o),o}function Ot(t,e){if(e===!1)return t;let n=G(t);Array.isArray(e)&&(n=n.filter(r=>e.includes(r)));let a=n.map(r=>j.legend(r)),i=[...t.params||[],...a];return{...t,params:i}}function z(t,e,n){if(e===!1)return t;let a;try{a=x.getMarkType(t.mark)}catch{return t}if(a==="geoshape")return t;let i=xt(t),r=e===!0?i.length>0?["point"]:Mt(a):[e];if(!r||r.length===0)return t;let o=r.map(h=>h==="interval"?j.interval(t,n):j.point(t,n)),s=[...t.params||[],...o];return i.length>0&&r.includes("point")&&s.push(j.binColoring(n)),{...t,params:s}}function B(t){let e;try{e=x.getMarkType(t.mark)}catch{}if(e==="geoshape")return t;let n=t.params||[];return n.some(a=>a.bind==="scales")?t:{...t,params:[...n,j.panZoom()]}}function J(t){let e="encoding"in t?t.encoding:void 0,n=t.params||[],a=n.map(i=>i.name);return n.length===0||!x.isInteractive(t.mark)?t:{...t,mark:x.makeClickable(t.mark),encoding:$("opacity",e||{},a,t.mark)}}function Mt(t){switch(t){case"arc":case"area":return["point"];case"text":case"bar":return["point","interval"];case"line":return;default:return["point","interval"]}}var Nt=5;async function Pt(t){if(!t)return t;let e="datasets"in t?{...t.datasets}:{},n=new kt(Nt),a=async r=>{if(!r)return r;if("layer"in r){let l=await Promise.all(r.layer.map(a));r={...r,layer:l}}if("hconcat"in r){let l=await Promise.all(r.hconcat.map(a));r={...r,hconcat:l}}if("vconcat"in r){let l=await Promise.all(r.vconcat.map(a));r={...r,vconcat:l}}if("spec"in r&&(r={...r,spec:await a(r.spec)}),!r.data||!("url"in r.data))return r;let o;try{o=H(r.data.url)}catch{return r}let s=r.data.format,h=await n.run(()=>st(o.href,s));return e[o.pathname]=h,{...r,data:{name:o.pathname}}},i=await a(t);return Object.keys(e).length===0?i:{...i,datasets:e}}var d=Z(rt(),1);ut("arrow",vt);var It=t=>{let e=(0,bt.c)(12),{value:n,setValue:a,chartSelection:i,fieldSelection:r,spec:o,embedOptions:s}=t,h,l;e[0]===o?(h=e[1],l=e[2]):(h=async()=>Pt(o),l=[o],e[0]=o,e[1]=h,e[2]=l);let{data:m,error:k}=yt(h,l);if(k){let p;return e[3]===k?p=e[4]:(p=(0,d.jsx)(gt,{error:k}),e[3]=k,e[4]=p),p}if(!m)return null;let w;return e[5]!==i||e[6]!==s||e[7]!==r||e[8]!==m||e[9]!==a||e[10]!==n?(w=(0,d.jsx)(Ct,{value:n,setValue:a,chartSelection:i,fieldSelection:r,spec:m,embedOptions:s}),e[5]=i,e[6]=s,e[7]=r,e[8]=m,e[9]=a,e[10]=n,e[11]=w):w=e[11],w},Ct=({value:t,setValue:e,chartSelection:n,fieldSelection:a,spec:i,embedOptions:r})=>{let{theme:o}=lt(),s=(0,S.useRef)(null),h=(0,S.useRef)(void 0),[l,m]=(0,S.useState)(),k=(0,S.useMemo)(()=>r&&"actions"in r?r.actions:{source:!1,compiled:!1},[r]),w=F(i),p=(0,S.useMemo)(()=>T(wt(w),{chartSelection:n,fieldSelection:a}),[w,n,a]),f=(0,S.useMemo)(()=>P(p),[p]),g=C(c=>{e({...t,...c})}),O=(0,S.useMemo)(()=>et((c,y)=>{_.debug("[Vega signal]",c,y);let b=V.mapValues(y,Kt);b=V.mapValues(b,Et),g({[c]:b})},100),[g]),M=F(f),I=(0,S.useMemo)(()=>M.reduce((c,y)=>(v.PAN_ZOOM===y||v.isBinColoring(y)||c.push({signalName:y,handler:(b,X)=>O(b,X)}),c),[]),[M,O]),R=C(c=>{_.error(c),_.debug(p),m(c)}),Q=C(c=>{_.debug("[Vega view] created",c),h.current=c,m(void 0)}),U=()=>{let c=[];return v.hasPoint(f)&&c.push(["Point selection","click to select a point; hold shift for multi-select"]),v.hasInterval(f)&&c.push(["Interval selection","click and drag to select an interval"]),v.hasLegend(f)&&c.push(["Legend selection","click to select a legend item; hold shift for multi-select"]),v.hasPanZoom(f)&&c.push(["Pan","hold the meta key and drag"],["Zoom","hold the meta key and scroll"]),c.length===0?null:(0,d.jsx)(at,{delayDuration:300,side:"left",content:(0,d.jsx)("div",{className:"text-xs flex flex-col",children:c.map((y,b)=>(0,d.jsxs)("div",{children:[(0,d.jsxs)("span",{className:"font-bold tracking-wide",children:[y[0],":"]})," ",y[1]]},b))}),children:(0,d.jsx)(ot,{className:"absolute bottom-1 right-0 m-2 h-4 w-4 cursor-help text-muted-foreground hover:text-foreground"})})},A=ft({ref:s,spec:p,options:{theme:o==="dark"?"dark":void 0,actions:k,mode:"vega-lite",tooltip:mt.call,renderer:"canvas"},onError:R,onEmbed:Q});return(0,S.useEffect)(()=>(I.forEach(({signalName:c,handler:y})=>{try{A==null||A.view.addSignalListener(c,y)}catch(b){_.error(b)}}),()=>{I.forEach(({signalName:c,handler:y})=>{try{A==null||A.view.removeSignalListener(c,y)}catch(b){_.error(b)}})}),[A,I]),(0,d.jsxs)(d.Fragment,{children:[l&&(0,d.jsxs)(ht,{variant:"destructive",children:[(0,d.jsx)(dt,{children:l.message}),(0,d.jsx)("div",{className:"text-md",children:l.stack})]}),(0,d.jsxs)("div",{className:nt("relative"),onPointerDown:it.stopPropagation(),children:[(0,d.jsx)("div",{ref:s,"data-container-width":pt(p)}),U()]})]})};function Et(t){return t instanceof Set?[...t]:t}function Kt(t){return Array.isArray(t)?t.map(e=>e instanceof Date&&ct(e)?new Date(e).getTime():e):t}var Lt=It;export{Lt as default};
|
|
1
|
+
import{s as Z}from"./chunk-LvLJmgfZ.js";import{n as C}from"./useEvent-D91BmmQi.js";import{t as Y}from"./react-Bj1aDYRI.js";import"./react-dom-CSu739Rf.js";import{t as tt}from"./compiler-runtime-B3qBwwSJ.js";import{t as et}from"./debounce-DhnxH9Rh.js";import{_,d as V}from"./useEventListener-DvoEXWke.js";import{n as H}from"./config-C2lTvbuU.js";import{t as nt}from"./cn-DCUzRj2J.js";import{t as rt}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import{t as at}from"./tooltip-DTV9tlSr.js";import{r as it}from"./button-BbCh-29a.js";import{d as N}from"./arrays-DYDL-3-i.js";import{u as ot}from"./toDate-B5A0DFEz.js";import"./session-DGdfs0bJ.js";import{r as lt}from"./useTheme-Kwyx4PvL.js";import{t as ct}from"./isValid-DdlR4-BY.js";import{a as st,r as mt,t as pt}from"./utils-DQRuLEof.js";import{n as ut}from"./vega-loader.browser-xq8miGHn.js";import{t as ft}from"./react-vega-4VQqM03t.js";import"./defaultLocale-DPBdGRrH.js";import"./defaultLocale-Lfi0pexn.js";import{r as dt,t as ht}from"./alert-DrHguQlr.js";import{n as gt}from"./error-banner-CLO6LFll.js";import{n as yt}from"./useAsyncData-C5i0IRVM.js";import{t as vt}from"./formats-CJQ67TPE.js";import{t as F}from"./useDeepCompareMemoize-zUHU--0D.js";import{t as kt}from"./semaphore-X3ApuO41.js";var bt=tt(),S=Z(Y(),1);function wt(t){return t.data&&"url"in t.data&&(t.data.url=H(t.data.url).href),t}const u={arc:"arc",area:"area",bar:"bar",image:"image",line:"line",point:"point",rect:"rect",rule:"rule",text:"text",tick:"tick",trail:"trail",circle:"circle",square:"square",geoshape:"geoshape"};var W=new Set(["boxplot","errorband","errorbar"]);const x={getMarkType(t){let e=typeof t=="string"?t:t.type;if(W.has(e))throw Error("Not supported");return e},isInteractive(t){let e=typeof t=="string"?t:t.type;return!W.has(e)},makeClickable(t){let e=typeof t=="string"?t:t.type;return e in u?typeof t=="string"?{type:t,cursor:"pointer",tooltip:!0}:{...t,type:e,cursor:"pointer",tooltip:!0}:t},getOpacity(t){return typeof t=="string"?null:"opacity"in t&&typeof t.opacity=="number"?t.opacity:null}},v={point(t){return t==null?"select_point":`select_point_${t}`},interval(t){return t==null?"select_interval":`select_interval_${t}`},legendSelection(t){return`legend_selection_${t}`},binColoring(t){return t==null?"bin_coloring":`bin_coloring_${t}`},HIGHLIGHT:"highlight",PAN_ZOOM:"pan_zoom",hasPoint(t){return t.some(e=>e.startsWith("select_point"))},hasInterval(t){return t.some(e=>e.startsWith("select_interval"))},hasLegend(t){return t.some(e=>e.startsWith("legend_selection"))},hasPanZoom(t){return t.some(e=>e.startsWith("pan_zoom"))},isBinColoring(t){return t.startsWith("bin_coloring")}},j={highlight(){return{name:v.HIGHLIGHT,select:{type:"point",on:"mouseover"}}},interval(t,e){return{name:v.interval(e),select:{type:"interval",encodings:D(t),mark:{fill:"#669EFF",fillOpacity:.07,stroke:"#669EFF",strokeOpacity:.4},on:"[mousedown[!event.metaKey], mouseup] > mousemove[!event.metaKey]",translate:"[mousedown[!event.metaKey], mouseup] > mousemove[!event.metaKey]"}}},point(t,e){return{name:v.point(e),select:{type:"point",encodings:D(t),on:"click[!event.metaKey]"}}},binColoring(t){return{name:v.binColoring(t),select:{type:"point",on:"click[!event.metaKey]"}}},legend(t){return{name:v.legendSelection(t),select:{type:"point",fields:[t]},bind:"legend"}},panZoom(){return{name:v.PAN_ZOOM,bind:"scales",select:{type:"interval",on:"[mousedown[event.metaKey], window:mouseup] > window:mousemove!",translate:"[mousedown[event.metaKey], window:mouseup] > window:mousemove!",zoom:"wheel![event.metaKey]"}}}};function D(t){switch(x.getMarkType(t.mark)){case u.image:case u.trail:return;case u.area:case u.arc:return["color"];case u.bar:{let e=St(t);return e==="horizontal"?["y"]:e==="vertical"?["x"]:void 0}case u.circle:case u.geoshape:case u.line:case u.point:case u.rect:case u.rule:case u.square:case u.text:case u.tick:return["x","y"]}}function P(t){return"params"in t&&t.params&&t.params.length>0?N(t.params.filter(e=>e==null?!1:"select"in e&&e.select!==void 0).map(e=>e.name)):"layer"in t?N(t.layer.flatMap(P)):"vconcat"in t?N(t.vconcat.flatMap(P)):"hconcat"in t?N(t.hconcat.flatMap(P)):[]}function St(t){var a,i;if(!t||!("mark"in t))return;let e=(a=t.encoding)==null?void 0:a.x,n=(i=t.encoding)==null?void 0:i.y;if(e&&"type"in e&&e.type==="nominal")return"vertical";if(n&&"type"in n&&n.type==="nominal"||e&&"aggregate"in e)return"horizontal";if(n&&"aggregate"in n)return"vertical"}function xt(t){if(!t.encoding)return[];let e=[];for(let n of Object.values(t.encoding))n&&typeof n=="object"&&"bin"in n&&n.bin&&"field"in n&&typeof n.field=="string"&&e.push(n.field);return e}function G(t){if(!t||!("encoding"in t))return[];let{encoding:e}=t;return e?Object.entries(e).flatMap(n=>{let[a,i]=n;return!i||!At.has(a)?[]:"field"in i&&typeof i.field=="string"?[i.field]:"condition"in i&&i.condition&&typeof i.condition=="object"&&"field"in i.condition&&i.condition.field&&typeof i.condition.field=="string"?[i.condition.field]:[]}):[]}var At=new Set(["color","fill","fillOpacity","opacity","shape","size"]);function $(t,e,n,a){let i=n.filter(o=>v.isBinColoring(o)),r={and:(i.length>0?i:n).map(o=>({param:o}))};if(t==="opacity"){let o=x.getOpacity(a)||1;return{...e,opacity:{condition:{test:r,value:o},value:o/5}}}else return e}function _t(t){if(!("select"in t)||!t.select)return JSON.stringify(t);let e=t.select;if(typeof e=="string")return JSON.stringify({type:e,bind:t.bind});let n={type:e.type,encodings:"encodings"in e&&e.encodings?[...e.encodings].toSorted():void 0,fields:"fields"in e&&e.fields?[...e.fields].toSorted():void 0,bind:t.bind};return JSON.stringify(n)}function q(t){let e=E(t);if(e.length===0)return t;let n=jt(e);return n.length===0?t:{...L(K(t,new Set(n.map(a=>a.name))),n.map(a=>a.name)),params:[...t.params||[],...n]}}function E(t){let e=[];if("vconcat"in t&&Array.isArray(t.vconcat))for(let n of t.vconcat)e.push(...E(n));else if("hconcat"in t&&Array.isArray(t.hconcat))for(let n of t.hconcat)e.push(...E(n));else{if("layer"in t)return[];"mark"in t&&"params"in t&&t.params&&t.params.length>0&&e.push({params:t.params})}return e}function jt(t){if(t.length===0)return[];let e=new Map,n=t.length;for(let{params:i}of t){let r=new Set;for(let o of i){let s=_t(o);r.has(s)||(r.add(s),e.has(s)||e.set(s,{count:0,param:o}),e.get(s).count++)}}let a=[];for(let[,{count:i,param:r}]of e)i===n&&a.push(r);return a}function K(t,e){if("vconcat"in t&&Array.isArray(t.vconcat))return{...t,vconcat:t.vconcat.map(n=>K(n,e))};if("hconcat"in t&&Array.isArray(t.hconcat))return{...t,hconcat:t.hconcat.map(n=>K(n,e))};if("mark"in t&&"params"in t&&t.params){let n=t.params,a=[];for(let i of n){if(!i||typeof i!="object"||!("name"in i)){a.push(i);continue}e.has(i.name)||a.push(i)}if(a.length===0){let{params:i,...r}=t;return r}return{...t,params:a}}return t}function L(t,e){return"vconcat"in t&&Array.isArray(t.vconcat)?{...t,vconcat:t.vconcat.map(n=>L(n,e))}:"hconcat"in t&&Array.isArray(t.hconcat)?{...t,hconcat:t.hconcat.map(n=>L(n,e))}:"layer"in t?t:"mark"in t&&x.isInteractive(t.mark)?{...t,mark:x.makeClickable(t.mark),encoding:$("opacity",t.encoding||{},e,t.mark)}:t}function T(t,e){var s,h;let{chartSelection:n=!0,fieldSelection:a=!0}=e;if(!n&&!a)return t;(s=t.params)!=null&&s.some(l=>l.bind==="legend")&&(a=!1);let i=(h=t.params)==null?void 0:h.some(l=>!l.bind);i&&(n=!1);let r="vconcat"in t||"hconcat"in t;if(i&&r)return t;if("vconcat"in t){let l=t.vconcat.map(m=>"mark"in m?T(m,{chartSelection:n,fieldSelection:a}):m);return q({...t,vconcat:l})}if("hconcat"in t){let l=t.hconcat.map(m=>"mark"in m?T(m,{chartSelection:n,fieldSelection:a}):m);return q({...t,hconcat:l})}if("layer"in t){let l=t.params&&t.params.length>0,m=a!==!1&&!l,k=[];if(m){let p=t.layer.flatMap(f=>"mark"in f?G(f):[]);k=[...new Set(p)],Array.isArray(a)&&(k=k.filter(f=>a.includes(f)))}let w=t.layer.map((p,f)=>{if(!("mark"in p))return p;let g=p;if(f===0&&k.length>0){let O=k.map(M=>j.legend(M));g={...g,params:[...g.params||[],...O]}}return g=z(g,n,f),g=J(g),f===0&&(g=B(g)),g});return{...t,layer:w}}if(!("mark"in t)||!x.isInteractive(t.mark))return t;let o=t;return o=Ot(o,a),o=z(o,n,void 0),o=J(o),o=B(o),o}function Ot(t,e){if(e===!1)return t;let n=G(t);Array.isArray(e)&&(n=n.filter(r=>e.includes(r)));let a=n.map(r=>j.legend(r)),i=[...t.params||[],...a];return{...t,params:i}}function z(t,e,n){if(e===!1)return t;let a;try{a=x.getMarkType(t.mark)}catch{return t}if(a==="geoshape")return t;let i=xt(t),r=e===!0?i.length>0?["point"]:Mt(a):[e];if(!r||r.length===0)return t;let o=r.map(h=>h==="interval"?j.interval(t,n):j.point(t,n)),s=[...t.params||[],...o];return i.length>0&&r.includes("point")&&s.push(j.binColoring(n)),{...t,params:s}}function B(t){let e;try{e=x.getMarkType(t.mark)}catch{}if(e==="geoshape")return t;let n=t.params||[];return n.some(a=>a.bind==="scales")?t:{...t,params:[...n,j.panZoom()]}}function J(t){let e="encoding"in t?t.encoding:void 0,n=t.params||[],a=n.map(i=>i.name);return n.length===0||!x.isInteractive(t.mark)?t:{...t,mark:x.makeClickable(t.mark),encoding:$("opacity",e||{},a,t.mark)}}function Mt(t){switch(t){case"arc":case"area":return["point"];case"text":case"bar":return["point","interval"];case"line":return;default:return["point","interval"]}}var Nt=5;async function Pt(t){if(!t)return t;let e="datasets"in t?{...t.datasets}:{},n=new kt(Nt),a=async r=>{if(!r)return r;if("layer"in r){let l=await Promise.all(r.layer.map(a));r={...r,layer:l}}if("hconcat"in r){let l=await Promise.all(r.hconcat.map(a));r={...r,hconcat:l}}if("vconcat"in r){let l=await Promise.all(r.vconcat.map(a));r={...r,vconcat:l}}if("spec"in r&&(r={...r,spec:await a(r.spec)}),!r.data||!("url"in r.data))return r;let o;try{o=H(r.data.url)}catch{return r}let s=r.data.format,h=await n.run(()=>st(o.href,s));return e[o.pathname]=h,{...r,data:{name:o.pathname}}},i=await a(t);return Object.keys(e).length===0?i:{...i,datasets:e}}var d=Z(rt(),1);ut("arrow",vt);var It=t=>{let e=(0,bt.c)(12),{value:n,setValue:a,chartSelection:i,fieldSelection:r,spec:o,embedOptions:s}=t,h,l;e[0]===o?(h=e[1],l=e[2]):(h=async()=>Pt(o),l=[o],e[0]=o,e[1]=h,e[2]=l);let{data:m,error:k}=yt(h,l);if(k){let p;return e[3]===k?p=e[4]:(p=(0,d.jsx)(gt,{error:k}),e[3]=k,e[4]=p),p}if(!m)return null;let w;return e[5]!==i||e[6]!==s||e[7]!==r||e[8]!==m||e[9]!==a||e[10]!==n?(w=(0,d.jsx)(Ct,{value:n,setValue:a,chartSelection:i,fieldSelection:r,spec:m,embedOptions:s}),e[5]=i,e[6]=s,e[7]=r,e[8]=m,e[9]=a,e[10]=n,e[11]=w):w=e[11],w},Ct=({value:t,setValue:e,chartSelection:n,fieldSelection:a,spec:i,embedOptions:r})=>{let{theme:o}=lt(),s=(0,S.useRef)(null),h=(0,S.useRef)(void 0),[l,m]=(0,S.useState)(),k=(0,S.useMemo)(()=>r&&"actions"in r?r.actions:{source:!1,compiled:!1},[r]),w=F(i),p=(0,S.useMemo)(()=>T(wt(w),{chartSelection:n,fieldSelection:a}),[w,n,a]),f=(0,S.useMemo)(()=>P(p),[p]),g=C(c=>{e({...t,...c})}),O=(0,S.useMemo)(()=>et((c,y)=>{_.debug("[Vega signal]",c,y);let b=V.mapValues(y,Kt);b=V.mapValues(b,Et),g({[c]:b})},100),[g]),M=F(f),I=(0,S.useMemo)(()=>M.reduce((c,y)=>(v.PAN_ZOOM===y||v.isBinColoring(y)||c.push({signalName:y,handler:(b,X)=>O(b,X)}),c),[]),[M,O]),R=C(c=>{_.error(c),_.debug(p),m(c)}),Q=C(c=>{_.debug("[Vega view] created",c),h.current=c,m(void 0)}),U=()=>{let c=[];return v.hasPoint(f)&&c.push(["Point selection","click to select a point; hold shift for multi-select"]),v.hasInterval(f)&&c.push(["Interval selection","click and drag to select an interval"]),v.hasLegend(f)&&c.push(["Legend selection","click to select a legend item; hold shift for multi-select"]),v.hasPanZoom(f)&&c.push(["Pan","hold the meta key and drag"],["Zoom","hold the meta key and scroll"]),c.length===0?null:(0,d.jsx)(at,{delayDuration:300,side:"left",content:(0,d.jsx)("div",{className:"text-xs flex flex-col",children:c.map((y,b)=>(0,d.jsxs)("div",{children:[(0,d.jsxs)("span",{className:"font-bold tracking-wide",children:[y[0],":"]})," ",y[1]]},b))}),children:(0,d.jsx)(ot,{className:"absolute bottom-1 right-0 m-2 h-4 w-4 cursor-help text-muted-foreground hover:text-foreground"})})},A=ft({ref:s,spec:p,options:{theme:o==="dark"?"dark":void 0,actions:k,mode:"vega-lite",tooltip:mt.call,renderer:"canvas"},onError:R,onEmbed:Q});return(0,S.useEffect)(()=>(I.forEach(({signalName:c,handler:y})=>{try{A==null||A.view.addSignalListener(c,y)}catch(b){_.error(b)}}),()=>{I.forEach(({signalName:c,handler:y})=>{try{A==null||A.view.removeSignalListener(c,y)}catch(b){_.error(b)}})}),[A,I]),(0,d.jsxs)(d.Fragment,{children:[l&&(0,d.jsxs)(ht,{variant:"destructive",children:[(0,d.jsx)(dt,{children:l.message}),(0,d.jsx)("div",{className:"text-md",children:l.stack})]}),(0,d.jsxs)("div",{className:nt("relative"),onPointerDown:it.stopPropagation(),children:[(0,d.jsx)("div",{ref:s,"data-container-width":pt(p)}),U()]})]})};function Et(t){return t instanceof Set?[...t]:t}function Kt(t){return Array.isArray(t)?t.map(e=>e instanceof Date&&ct(e)?new Date(e).getTime():e):t}var Lt=It;export{Lt as default};
|
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-BhMdGN-p.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-DdZsAcJe.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/chunk-LvLJmgfZ.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/react-Bj1aDYRI.js">
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
<link rel="modulepreload" crossorigin href="./assets/DeferredRequestRegistry-CzVJLtsG.js">
|
|
105
105
|
<link rel="modulepreload" crossorigin href="./assets/constants-DMpttj8Q.js">
|
|
106
106
|
<link rel="modulepreload" crossorigin href="./assets/session-DGdfs0bJ.js">
|
|
107
|
-
<link rel="modulepreload" crossorigin href="./assets/config-
|
|
107
|
+
<link rel="modulepreload" crossorigin href="./assets/config-C2lTvbuU.js">
|
|
108
108
|
<link rel="modulepreload" crossorigin href="./assets/requests-DIwGYs0l.js">
|
|
109
109
|
<link rel="modulepreload" crossorigin href="./assets/useLifecycle-DieWOfXE.js">
|
|
110
110
|
<link rel="modulepreload" crossorigin href="./assets/useNonce-DfoVjkkH.js">
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<link rel="modulepreload" crossorigin href="./assets/debounce-DhnxH9Rh.js">
|
|
134
134
|
<link rel="modulepreload" crossorigin href="./assets/database-zap-kIkTfzTX.js">
|
|
135
135
|
<link rel="modulepreload" crossorigin href="./assets/main-B0OX4z33.js">
|
|
136
|
-
<link rel="modulepreload" crossorigin href="./assets/cells-
|
|
136
|
+
<link rel="modulepreload" crossorigin href="./assets/cells-Dnu4nDoy.js">
|
|
137
137
|
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-DyYDV0HI.js">
|
|
138
138
|
<link rel="modulepreload" crossorigin href="./assets/kbd-BJB2rf7K.js">
|
|
139
139
|
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-hKfTes-m.js">
|
|
@@ -147,34 +147,34 @@
|
|
|
147
147
|
<link rel="modulepreload" crossorigin href="./assets/usePress-jH2RfcUG.js">
|
|
148
148
|
<link rel="modulepreload" crossorigin href="./assets/input-CVE-gIjt.js">
|
|
149
149
|
<link rel="modulepreload" crossorigin href="./assets/ImperativeModal-DEC1mXgV.js">
|
|
150
|
-
<link rel="modulepreload" crossorigin href="./assets/cell-link-
|
|
150
|
+
<link rel="modulepreload" crossorigin href="./assets/cell-link-PQYiMZw1.js">
|
|
151
151
|
<link rel="modulepreload" crossorigin href="./assets/multi-map-CUuNtzHt.js">
|
|
152
152
|
<link rel="modulepreload" crossorigin href="./assets/alert-DrHguQlr.js">
|
|
153
153
|
<link rel="modulepreload" crossorigin href="./assets/chevron-right-CG5QYXYk.js">
|
|
154
154
|
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-CR7cnzLX.js">
|
|
155
155
|
<link rel="modulepreload" crossorigin href="./assets/links-B8WzCnbo.js">
|
|
156
|
-
<link rel="modulepreload" crossorigin href="./assets/useRunCells-
|
|
156
|
+
<link rel="modulepreload" crossorigin href="./assets/useRunCells-C0BPo9m1.js">
|
|
157
157
|
<link rel="modulepreload" crossorigin href="./assets/copy-Ch48HVPK.js">
|
|
158
158
|
<link rel="modulepreload" crossorigin href="./assets/copy-BwrPA9zQ.js">
|
|
159
159
|
<link rel="modulepreload" crossorigin href="./assets/copy-icon-BdZPgXgo.js">
|
|
160
|
-
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-
|
|
161
|
-
<link rel="modulepreload" crossorigin href="./assets/datasource-
|
|
162
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
160
|
+
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-B5r25cP5.js">
|
|
161
|
+
<link rel="modulepreload" crossorigin href="./assets/datasource-I-LOgxeP.js">
|
|
162
|
+
<link rel="modulepreload" crossorigin href="./assets/state-D9EoHCkz.js">
|
|
163
163
|
<link rel="modulepreload" crossorigin href="./assets/package-B8oXOUM-.js">
|
|
164
164
|
<link rel="modulepreload" crossorigin href="./assets/sparkles-CC9Bko6a.js">
|
|
165
|
-
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-
|
|
165
|
+
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-XWqnhvJ6.js">
|
|
166
166
|
<link rel="modulepreload" crossorigin href="./assets/spinner-UuZAUjoP.js">
|
|
167
|
-
<link rel="modulepreload" crossorigin href="./assets/html-to-image-
|
|
168
|
-
<link rel="modulepreload" crossorigin href="./assets/focus-
|
|
167
|
+
<link rel="modulepreload" crossorigin href="./assets/html-to-image-CPRGrFLO.js">
|
|
168
|
+
<link rel="modulepreload" crossorigin href="./assets/focus-lmUjuV78.js">
|
|
169
169
|
<link rel="modulepreload" crossorigin href="./assets/useAsyncData-C5i0IRVM.js">
|
|
170
170
|
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-B2pl_WA3.js">
|
|
171
171
|
<link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-P--XWZhg.js">
|
|
172
172
|
<link rel="modulepreload" crossorigin href="./assets/chunk-5FQGJX7Z-DILIU9Rm.js">
|
|
173
|
-
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-
|
|
173
|
+
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-CKEFGuRo.js">
|
|
174
174
|
<link rel="modulepreload" crossorigin href="./assets/command-2NPJCYDa.js">
|
|
175
175
|
<link rel="modulepreload" crossorigin href="./assets/popover-Bz_0Vkyf.js">
|
|
176
176
|
<link rel="modulepreload" crossorigin href="./assets/errors-iwK4b4VF.js">
|
|
177
|
-
<link rel="modulepreload" crossorigin href="./assets/download-
|
|
177
|
+
<link rel="modulepreload" crossorigin href="./assets/download-7bMr0q_N.js">
|
|
178
178
|
<link rel="modulepreload" crossorigin href="./assets/table-DUSsaCYD.js">
|
|
179
179
|
<link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-DPVTppnD.js">
|
|
180
180
|
<link rel="modulepreload" crossorigin href="./assets/error-banner-CLO6LFll.js">
|
|
@@ -193,44 +193,44 @@
|
|
|
193
193
|
<link rel="modulepreload" crossorigin href="./assets/message-circle-1YLdnr8A.js">
|
|
194
194
|
<link rel="modulepreload" crossorigin href="./assets/trash-2-BJLYnZpG.js">
|
|
195
195
|
<link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-CgWOEYeG.js">
|
|
196
|
-
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-
|
|
196
|
+
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-BPqXvbC7.js">
|
|
197
197
|
<link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-nqk474t8.js">
|
|
198
198
|
<link rel="modulepreload" crossorigin href="./assets/square-function-blYaQso8.js">
|
|
199
199
|
<link rel="modulepreload" crossorigin href="./assets/spec-D1ptWKg6.js">
|
|
200
200
|
<link rel="modulepreload" crossorigin href="./assets/ellipsis-vertical-CkwWkOQL.js">
|
|
201
201
|
<link rel="modulepreload" crossorigin href="./assets/refresh-cw-a_9k9BK7.js">
|
|
202
202
|
<link rel="modulepreload" crossorigin href="./assets/tree-actions-D9i3o3Zk.js">
|
|
203
|
-
<link rel="modulepreload" crossorigin href="./assets/components-
|
|
204
|
-
<link rel="modulepreload" crossorigin href="./assets/column-preview-
|
|
203
|
+
<link rel="modulepreload" crossorigin href="./assets/components-DDdymb5T.js">
|
|
204
|
+
<link rel="modulepreload" crossorigin href="./assets/column-preview-D_CJGSJp.js">
|
|
205
205
|
<link rel="modulepreload" crossorigin href="./assets/icons-Ol38nIbL.js">
|
|
206
|
-
<link rel="modulepreload" crossorigin href="./assets/radio-group-
|
|
207
|
-
<link rel="modulepreload" crossorigin href="./assets/floating-outline-
|
|
206
|
+
<link rel="modulepreload" crossorigin href="./assets/radio-group-CrX1YUJ8.js">
|
|
207
|
+
<link rel="modulepreload" crossorigin href="./assets/floating-outline-DbOtUfo-.js">
|
|
208
208
|
<link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-DoKw85w0.js">
|
|
209
209
|
<link rel="modulepreload" crossorigin href="./assets/esm-DLYpPRvw.js">
|
|
210
210
|
<link rel="modulepreload" crossorigin href="./assets/eye-off-BT-KOYV5.js">
|
|
211
211
|
<link rel="modulepreload" crossorigin href="./assets/plus-CxkHs8QM.js">
|
|
212
|
-
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-
|
|
212
|
+
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-DqYAw8-1.js">
|
|
213
213
|
<link rel="modulepreload" crossorigin href="./assets/file-headphone-B3fuktN0.js">
|
|
214
214
|
<link rel="modulepreload" crossorigin href="./assets/file-HTLbeC2b.js">
|
|
215
215
|
<link rel="modulepreload" crossorigin href="./assets/image-BIibSXT6.js">
|
|
216
|
-
<link rel="modulepreload" crossorigin href="./assets/file-icons-
|
|
217
|
-
<link rel="modulepreload" crossorigin href="./assets/switch-
|
|
216
|
+
<link rel="modulepreload" crossorigin href="./assets/file-icons-B6DaZdP0.js">
|
|
217
|
+
<link rel="modulepreload" crossorigin href="./assets/switch-BtkQp293.js">
|
|
218
218
|
<link rel="modulepreload" crossorigin href="./assets/events-CBm-hwqS.js">
|
|
219
|
-
<link rel="modulepreload" crossorigin href="./assets/globals-
|
|
219
|
+
<link rel="modulepreload" crossorigin href="./assets/globals-CpVAcN9Z.js">
|
|
220
220
|
<link rel="modulepreload" crossorigin href="./assets/share-oorMPghT.js">
|
|
221
221
|
<link rel="modulepreload" crossorigin href="./assets/blob-3_FN0u9S.js">
|
|
222
222
|
<link rel="modulepreload" crossorigin href="./assets/memoize-Tp7rARFe.js">
|
|
223
223
|
<link rel="modulepreload" crossorigin href="./assets/get-C-qh_et5.js">
|
|
224
224
|
<link rel="modulepreload" crossorigin href="./assets/_baseSet-CxV9N1bc.js">
|
|
225
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
225
|
+
<link rel="modulepreload" crossorigin href="./assets/state-NEwDS-mc.js">
|
|
226
226
|
<link rel="modulepreload" crossorigin href="./assets/label-xHqFtfdz.js">
|
|
227
|
-
<link rel="modulepreload" crossorigin href="./assets/textarea-
|
|
227
|
+
<link rel="modulepreload" crossorigin href="./assets/textarea-BBTcSr-i.js">
|
|
228
228
|
<link rel="modulepreload" crossorigin href="./assets/refresh-ccw-DLc784Sj.js">
|
|
229
|
-
<link rel="modulepreload" crossorigin href="./assets/form-
|
|
229
|
+
<link rel="modulepreload" crossorigin href="./assets/form-D4sbBaU7.js">
|
|
230
230
|
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-D7FYCtYQ.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="./assets/field-CQGpbXj3.js">
|
|
232
232
|
<link rel="modulepreload" crossorigin href="./assets/RSPContexts-Bk1r00gJ.js">
|
|
233
|
-
<link rel="modulepreload" crossorigin href="./assets/useBoolean-
|
|
233
|
+
<link rel="modulepreload" crossorigin href="./assets/useBoolean-DamyMuo_.js">
|
|
234
234
|
<link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-zUHU--0D.js">
|
|
235
235
|
<link rel="modulepreload" crossorigin href="./assets/types-BYwxXaSY.js">
|
|
236
236
|
<link rel="modulepreload" crossorigin href="./assets/semaphore-X3ApuO41.js">
|
package/package.json
CHANGED
|
@@ -275,14 +275,14 @@ describe("RuntimeManager", () => {
|
|
|
275
275
|
});
|
|
276
276
|
});
|
|
277
277
|
|
|
278
|
-
describe("
|
|
278
|
+
describe("probeHealth", () => {
|
|
279
279
|
it("should return true for successful health check", async () => {
|
|
280
280
|
global.fetch = vi.fn().mockResolvedValue({
|
|
281
281
|
ok: true,
|
|
282
282
|
});
|
|
283
283
|
|
|
284
284
|
const runtime = new RuntimeManager(mockConfig);
|
|
285
|
-
const result = await runtime.
|
|
285
|
+
const result = await runtime.probeHealth();
|
|
286
286
|
|
|
287
287
|
expect(result).toBe(true);
|
|
288
288
|
expect(fetch).toHaveBeenCalledWith("https://example.com/health");
|
|
@@ -294,7 +294,7 @@ describe("RuntimeManager", () => {
|
|
|
294
294
|
});
|
|
295
295
|
|
|
296
296
|
const runtime = new RuntimeManager(mockConfig);
|
|
297
|
-
const result = await runtime.
|
|
297
|
+
const result = await runtime.probeHealth();
|
|
298
298
|
|
|
299
299
|
expect(result).toBe(false);
|
|
300
300
|
});
|
|
@@ -304,11 +304,32 @@ describe("RuntimeManager", () => {
|
|
|
304
304
|
global.fetch = vi.fn().mockRejectedValue(error);
|
|
305
305
|
|
|
306
306
|
const runtime = new RuntimeManager(mockConfig);
|
|
307
|
-
const result = await runtime.
|
|
307
|
+
const result = await runtime.probeHealth();
|
|
308
308
|
|
|
309
309
|
expect(result).toBe(false);
|
|
310
310
|
});
|
|
311
311
|
|
|
312
|
+
it("should not mutate config.url on redirect", async () => {
|
|
313
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
314
|
+
ok: true,
|
|
315
|
+
redirected: true,
|
|
316
|
+
url: "https://sandbox.example.com/health?some_value=abc123",
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
const runtime = new RuntimeManager(
|
|
320
|
+
{
|
|
321
|
+
...mockConfig,
|
|
322
|
+
url: "https://backend.example.com/lazy?some_value=abc123",
|
|
323
|
+
},
|
|
324
|
+
true,
|
|
325
|
+
);
|
|
326
|
+
const result = await runtime.probeHealth();
|
|
327
|
+
expect(result).toBe(true);
|
|
328
|
+
expect(runtime.httpURL.hostname).toBe("backend.example.com");
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
describe("reconcileFromHealth", () => {
|
|
312
333
|
it("should update config.url on redirect, stripping /health from pathname", async () => {
|
|
313
334
|
global.fetch = vi.fn().mockResolvedValue({
|
|
314
335
|
ok: true,
|
|
@@ -323,7 +344,7 @@ describe("RuntimeManager", () => {
|
|
|
323
344
|
},
|
|
324
345
|
true, // lazy — don't call init() in constructor
|
|
325
346
|
);
|
|
326
|
-
const result = await runtime.
|
|
347
|
+
const result = await runtime.reconcileFromHealth();
|
|
327
348
|
|
|
328
349
|
expect(result).toBe(true);
|
|
329
350
|
// Should strip /health from pathname but preserve query params
|
|
@@ -342,7 +363,7 @@ describe("RuntimeManager", () => {
|
|
|
342
363
|
it("should resolve immediately if healthy", async () => {
|
|
343
364
|
const runtime = new RuntimeManager(mockConfig, true);
|
|
344
365
|
|
|
345
|
-
vi.spyOn(runtime, "
|
|
366
|
+
vi.spyOn(runtime, "reconcileFromHealth").mockResolvedValue(true);
|
|
346
367
|
runtime.init();
|
|
347
368
|
|
|
348
369
|
await expect(runtime.waitForHealthy()).resolves.toBeUndefined();
|
|
@@ -351,7 +372,7 @@ describe("RuntimeManager", () => {
|
|
|
351
372
|
it("should retry and eventually succeed", async () => {
|
|
352
373
|
const runtime = new RuntimeManager(mockConfig, true);
|
|
353
374
|
const healthySpy = vi
|
|
354
|
-
.spyOn(runtime, "
|
|
375
|
+
.spyOn(runtime, "reconcileFromHealth")
|
|
355
376
|
.mockResolvedValueOnce(false)
|
|
356
377
|
.mockResolvedValueOnce(false)
|
|
357
378
|
.mockResolvedValueOnce(true);
|
|
@@ -364,7 +385,7 @@ describe("RuntimeManager", () => {
|
|
|
364
385
|
|
|
365
386
|
it("should throw after max retries", async () => {
|
|
366
387
|
const runtime = new RuntimeManager(mockConfig, true);
|
|
367
|
-
vi.spyOn(runtime, "
|
|
388
|
+
vi.spyOn(runtime, "reconcileFromHealth").mockResolvedValue(false);
|
|
368
389
|
runtime.init({ disableRetryDelay: true });
|
|
369
390
|
|
|
370
391
|
await expect(runtime.waitForHealthy()).rejects.toThrow(
|
|
@@ -431,7 +452,7 @@ describe("RuntimeManager", () => {
|
|
|
431
452
|
// Mock failed health check
|
|
432
453
|
global.fetch = vi.fn().mockResolvedValue({ ok: false });
|
|
433
454
|
|
|
434
|
-
await runtime.
|
|
455
|
+
await runtime.reconcileFromHealth();
|
|
435
456
|
|
|
436
457
|
baseElement = document.querySelector("base");
|
|
437
458
|
expect(baseElement).toBeNull();
|
|
@@ -443,7 +464,7 @@ describe("RuntimeManager", () => {
|
|
|
443
464
|
// Mock successful health check
|
|
444
465
|
global.fetch = vi.fn().mockResolvedValue({ ok: true });
|
|
445
466
|
|
|
446
|
-
await runtime.
|
|
467
|
+
await runtime.reconcileFromHealth();
|
|
447
468
|
|
|
448
469
|
const baseElement = document.querySelector("base");
|
|
449
470
|
expect(baseElement).toBeTruthy();
|
|
@@ -461,7 +482,7 @@ describe("RuntimeManager", () => {
|
|
|
461
482
|
// Mock successful health check
|
|
462
483
|
global.fetch = vi.fn().mockResolvedValue({ ok: true });
|
|
463
484
|
|
|
464
|
-
await runtime.
|
|
485
|
+
await runtime.reconcileFromHealth();
|
|
465
486
|
|
|
466
487
|
const baseElement = document.querySelector("base");
|
|
467
488
|
expect(baseElement).toBe(existingBase); // Should be the same element
|
|
@@ -483,7 +504,7 @@ describe("RuntimeManager", () => {
|
|
|
483
504
|
// Mock successful health check
|
|
484
505
|
global.fetch = vi.fn().mockResolvedValue({ ok: true });
|
|
485
506
|
|
|
486
|
-
await runtime.
|
|
507
|
+
await runtime.reconcileFromHealth();
|
|
487
508
|
|
|
488
509
|
const baseElement = document.querySelector("base");
|
|
489
510
|
expect(baseElement).toBeTruthy();
|
|
@@ -524,11 +545,11 @@ describe("RuntimeManager", () => {
|
|
|
524
545
|
});
|
|
525
546
|
|
|
526
547
|
const wsUrl = runtime.getWsURL("test" as SessionId);
|
|
527
|
-
const httpUrl = runtime.formatHttpURL(
|
|
528
|
-
"api/test",
|
|
529
|
-
new URLSearchParams(),
|
|
530
|
-
false,
|
|
531
|
-
);
|
|
548
|
+
const httpUrl = runtime.formatHttpURL({
|
|
549
|
+
path: "api/test",
|
|
550
|
+
searchParams: new URLSearchParams(),
|
|
551
|
+
restrictToKnownQueryParams: false,
|
|
552
|
+
});
|
|
532
553
|
|
|
533
554
|
// Should preserve base URL query params
|
|
534
555
|
expect(wsUrl.searchParams.get("base_param")).toBe("existing");
|
|
@@ -44,17 +44,22 @@ export class RuntimeManager {
|
|
|
44
44
|
return this.httpURL.origin === window.location.origin;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
private get isServerless(): boolean {
|
|
48
|
+
return isWasm() || isIslands() || isStaticNotebook();
|
|
49
|
+
}
|
|
50
|
+
|
|
47
51
|
/**
|
|
48
52
|
* The base URL of the runtime.
|
|
49
53
|
*/
|
|
50
|
-
formatHttpURL(
|
|
51
|
-
path
|
|
52
|
-
searchParams
|
|
54
|
+
formatHttpURL({
|
|
55
|
+
path = "",
|
|
56
|
+
searchParams,
|
|
53
57
|
restrictToKnownQueryParams = true,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
}: {
|
|
59
|
+
path?: string;
|
|
60
|
+
searchParams?: URLSearchParams;
|
|
61
|
+
restrictToKnownQueryParams?: boolean;
|
|
62
|
+
}): URL {
|
|
58
63
|
// URL may be something like "http://localhost:8000?auth=123"
|
|
59
64
|
const baseUrl = this.httpURL;
|
|
60
65
|
const currentParams = new URLSearchParams(window.location.search);
|
|
@@ -84,11 +89,11 @@ export class RuntimeManager {
|
|
|
84
89
|
formatWsURL(path: string, searchParams?: URLSearchParams): URL {
|
|
85
90
|
// We don't restrict to known query parameters, since mo.query_params()
|
|
86
91
|
// can accept arbitrary parameters.
|
|
87
|
-
const url = this.formatHttpURL(
|
|
92
|
+
const url = this.formatHttpURL({
|
|
88
93
|
path,
|
|
89
94
|
searchParams,
|
|
90
|
-
|
|
91
|
-
);
|
|
95
|
+
restrictToKnownQueryParams: false,
|
|
96
|
+
});
|
|
92
97
|
|
|
93
98
|
// For cross-origin runtimes, pass the auth token as a query parameter.
|
|
94
99
|
// WebSocket connections cannot send custom headers (no Authorization
|
|
@@ -168,45 +173,63 @@ export class RuntimeManager {
|
|
|
168
173
|
}
|
|
169
174
|
|
|
170
175
|
getAiURL(path: "completion" | "chat"): URL {
|
|
171
|
-
return this.formatHttpURL(`/api/ai/${path}`);
|
|
176
|
+
return this.formatHttpURL({ path: `/api/ai/${path}` });
|
|
172
177
|
}
|
|
173
178
|
|
|
174
179
|
/**
|
|
175
180
|
* The URL of the health check endpoint.
|
|
176
181
|
*/
|
|
177
182
|
healthURL(): URL {
|
|
178
|
-
return this.formatHttpURL("/health");
|
|
183
|
+
return this.formatHttpURL({ path: "/health" });
|
|
179
184
|
}
|
|
180
185
|
|
|
181
|
-
async
|
|
182
|
-
// Always healthy if WASM, Islands, or a static notebook (no server)
|
|
183
|
-
if (isWasm() || isIslands() || isStaticNotebook()) {
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
|
|
186
|
+
private async fetchHealth(): Promise<Response | null> {
|
|
187
187
|
try {
|
|
188
|
-
|
|
189
|
-
// If there is a redirect, update the URL in the config
|
|
190
|
-
if (response.redirected) {
|
|
191
|
-
Logger.debug(`Runtime redirected to ${response.url}`);
|
|
192
|
-
// strip /health from the URL, using URL parsing to handle query params
|
|
193
|
-
const redirected = new URL(response.url);
|
|
194
|
-
redirected.pathname = redirected.pathname.replace(/\/health$/, "");
|
|
195
|
-
this.config.url = redirected.toString();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const success = response.ok;
|
|
199
|
-
if (success) {
|
|
200
|
-
this.setDOMBaseUri(this.config.url);
|
|
201
|
-
}
|
|
202
|
-
return success;
|
|
188
|
+
return await fetch(this.healthURL().toString());
|
|
203
189
|
} catch (error) {
|
|
204
190
|
Logger.error(
|
|
205
191
|
`Failed to check health: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
206
192
|
{ cause: error },
|
|
207
193
|
);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async reconcileFromHealth(): Promise<boolean> {
|
|
199
|
+
// Always healthy if WASM, Islands, or a static notebook (no server)
|
|
200
|
+
if (this.isServerless) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const response = await this.fetchHealth();
|
|
205
|
+
|
|
206
|
+
if (!response) {
|
|
208
207
|
return false;
|
|
209
208
|
}
|
|
209
|
+
|
|
210
|
+
if (response.redirected) {
|
|
211
|
+
Logger.debug(`Runtime redirected to ${response.url}`);
|
|
212
|
+
// strip /health from the URL, using URL parsing to handle query params
|
|
213
|
+
const redirected = new URL(response.url);
|
|
214
|
+
redirected.pathname = redirected.pathname.replace(/\/health$/, "");
|
|
215
|
+
this.config.url = redirected.toString();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (response.ok) {
|
|
219
|
+
this.setDOMBaseUri(this.config.url);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return response.ok;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async probeHealth(): Promise<boolean> {
|
|
226
|
+
// Always healthy if WASM, Islands, or a static notebook (no server)
|
|
227
|
+
if (this.isServerless) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const response = await this.fetchHealth();
|
|
232
|
+
return response?.ok ?? false;
|
|
210
233
|
}
|
|
211
234
|
|
|
212
235
|
/**
|
|
@@ -251,7 +274,7 @@ export class RuntimeManager {
|
|
|
251
274
|
const growthFactor = 1.2;
|
|
252
275
|
const maxDelay = 2000;
|
|
253
276
|
|
|
254
|
-
while (!(await this.
|
|
277
|
+
while (!(await this.reconcileFromHealth())) {
|
|
255
278
|
if (retries >= maxRetries) {
|
|
256
279
|
Logger.error(`Failed to connect after ${maxRetries} retries`);
|
|
257
280
|
this.initialHealthyCheck.reject(
|
|
@@ -35,7 +35,6 @@ import { useConnectionTransport } from "../useWebSocket";
|
|
|
35
35
|
|
|
36
36
|
interface MockTransport {
|
|
37
37
|
readyState: 0 | 1 | 2 | 3;
|
|
38
|
-
retryCount: number;
|
|
39
38
|
reconnect: ReturnType<typeof vi.fn>;
|
|
40
39
|
close: ReturnType<typeof vi.fn>;
|
|
41
40
|
send: ReturnType<typeof vi.fn>;
|
|
@@ -48,7 +47,6 @@ function makeTransport(
|
|
|
48
47
|
): MockTransport {
|
|
49
48
|
return {
|
|
50
49
|
readyState,
|
|
51
|
-
retryCount: 0,
|
|
52
50
|
reconnect: vi.fn(),
|
|
53
51
|
close: vi.fn(),
|
|
54
52
|
send: vi.fn(),
|
|
@@ -57,9 +55,12 @@ function makeTransport(
|
|
|
57
55
|
};
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
function makeRuntimeManager(
|
|
58
|
+
function makeRuntimeManager(
|
|
59
|
+
reconcileFromHealth = vi.fn().mockResolvedValue(true),
|
|
60
|
+
) {
|
|
61
61
|
return {
|
|
62
|
-
|
|
62
|
+
reconcileFromHealth,
|
|
63
|
+
probeHealth: vi.fn().mockResolvedValue(true),
|
|
63
64
|
getWsURL: () => new URL("ws://localhost/ws"),
|
|
64
65
|
waitForHealthy: vi.fn().mockResolvedValue(undefined),
|
|
65
66
|
isSameOrigin: true,
|