From 1325387c81fd974642b4961d629562c5edd1cafa Mon Sep 17 00:00:00 2001 From: Julian Kimmig Date: Wed, 7 Jan 2026 15:32:15 +0100 Subject: [PATCH 1/2] chore: bump version to 2.2.1 and update changelog --- CHANGELOG.md | 2 +- pyproject.toml | 2 +- src/react/package.json | 2 +- src/react/packages/funcnodes-react-flow-plugin/package.json | 2 +- src/react/packages/funcnodes-react-flow/package.json | 2 +- uv.lock | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 708b263..a7f8661 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project are documented here. -## 2.2.1a0 (2026-01-07) +## 2.2.1 (2026-01-07) ### Fix diff --git a/pyproject.toml b/pyproject.toml index 403d358..a9cf596 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "funcnodes-react-flow" -version = "2.2.1a0" +version = "2.2.1" description = "funcnodes frontend for react flow" readme = "README.md" classifiers = [ "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",] diff --git a/src/react/package.json b/src/react/package.json index 10d1d8e..56b15a3 100755 --- a/src/react/package.json +++ b/src/react/package.json @@ -1,6 +1,6 @@ { "name": "funcnodes-react-flow-monorepo", - "version": "2.2.1a0", + "version": "2.2.1", "private": true, "packageManager": "yarn@4.9.2", "workspaces": [ diff --git a/src/react/packages/funcnodes-react-flow-plugin/package.json b/src/react/packages/funcnodes-react-flow-plugin/package.json index d63e17b..74fb36a 100644 --- a/src/react/packages/funcnodes-react-flow-plugin/package.json +++ b/src/react/packages/funcnodes-react-flow-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@linkdlab/funcnodes-react-flow-plugin", - "version": "2.2.1a0", + "version": "2.2.1", "type": "module", "description": "Type definitions for FuncNodes React Flow plugins", "repository": { diff --git a/src/react/packages/funcnodes-react-flow/package.json b/src/react/packages/funcnodes-react-flow/package.json index 9c5aa27..404070b 100644 --- a/src/react/packages/funcnodes-react-flow/package.json +++ b/src/react/packages/funcnodes-react-flow/package.json @@ -1,6 +1,6 @@ { "name": "@linkdlab/funcnodes_react_flow", - "version": "2.2.1a0", + "version": "2.2.1", "description": "Frontend with React Flow for FuncNodes", "repository": { "type": "git", diff --git a/uv.lock b/uv.lock index d482892..153ab48 100644 --- a/uv.lock +++ b/uv.lock @@ -423,7 +423,7 @@ wheels = [ [[package]] name = "funcnodes-react-flow" -version = "2.2.1a0" +version = "2.2.1" source = { editable = "." } dependencies = [ { name = "funcnodes" }, From 039b06cc134c45556274632b639aa84343a5b6a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 7 Jan 2026 14:33:49 +0000 Subject: [PATCH 2/2] chore: update build files [skip ci] --- src/funcnodes_react_flow/static/funcnodes_react_flow.es.js | 2 +- src/funcnodes_react_flow/static/funcnodes_react_flow.iife.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/funcnodes_react_flow/static/funcnodes_react_flow.es.js b/src/funcnodes_react_flow/static/funcnodes_react_flow.es.js index ab3585d..8911283 100755 --- a/src/funcnodes_react_flow/static/funcnodes_react_flow.es.js +++ b/src/funcnodes_react_flow/static/funcnodes_react_flow.es.js @@ -74858,7 +74858,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho ); }; window.FuncNodes = Pq; - window.FuncNodes.version = "2.2.1a0"; + window.FuncNodes.version = "2.2.1"; window.FuncNodes.utils = { logger: { ConsoleLogger: ik, diff --git a/src/funcnodes_react_flow/static/funcnodes_react_flow.iife.js b/src/funcnodes_react_flow/static/funcnodes_react_flow.iife.js index c333348..8410414 100755 --- a/src/funcnodes_react_flow/static/funcnodes_react_flow.iife.js +++ b/src/funcnodes_react_flow/static/funcnodes_react_flow.iife.js @@ -831,4 +831,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho ${r} return FuncNodesPlugin; })(); - `)(bl,ra);this.add_plugin(t,i)}catch(o){o instanceof Error?this.context.rf.logger.error(`Error building plugin ${t}`,o):this.context.rf.logger.error(`Error building plugin ${t}`,new Error(String(o))),this.stateManager.toaster?.error({title:"Error",description:`Error building plugin ${t}: ${o}`,duration:5e3})}}}}class h4e extends fd{constructor(t){super(t),this.on_rf_node_change=n=>{const r=this.useReactFlowStore.getState();for(const o of n)switch(o.type){case"position":if(o.position){const i=r.getNode(o.id);if(i===void 0)continue;i.type==="group"?this.nodespaceManager.change_group_position(o):this.nodespaceManager.change_fn_node_position(o),i.data.groupID&&this.nodespaceManager.auto_resize_group(i.data.groupID)}break;case"dimensions":if(o.dimensions){const i=r.getNode(o.id);if(i===void 0)continue;i.type==="group"?this.nodespaceManager.change_group_dimensions(o):this.nodespaceManager.change_fn_node_dimensions(o),i.data.groupID&&this.nodespaceManager.auto_resize_group(i.data.groupID)}break}},this.on_rf_edge_change=n=>{},this.on_connect=n=>{n.source===null||n.target===null||n.sourceHandle===null||n.targetHandle===null||!this.workerManager.worker||this.workerManager.worker.api.edge.add_edge({src_nid:n.source,src_ioid:n.sourceHandle,trg_nid:n.target,trg_ioid:n.targetHandle,replace:!0})},this.useReactFlowStore=dPe({on_node_change:this.on_rf_node_change.bind(this),on_edge_change:this.on_rf_edge_change.bind(this),on_connect:this.on_connect.bind(this)})}}let m4e=class{constructor(t){this.reactflowRef=null,this.dev_settings={debug:fh()},this.options=t,this.logger=t.logger??new X1("fn",fh()?qR:WR);const n={rf:this};this._nodespaceManager=new a4e(n),this._libManager=new l4e(n),this._workerManager=new c4e(n),this._stateManager=new u4e(n),this._pluginManager=new p4e(n),this._reactFlowManager=new h4e(n)}getNodespaceManager(){return this._nodespaceManager}getLibManager(){return this._libManager}getWorkerManager(){return this._workerManager}getStateManager(){return this._stateManager}getPluginManager(){return this._pluginManager}getReactFlowManager(){return this._reactFlowManager}get nodespace(){return this._nodespaceManager.nodespace}get on_node_action(){return this._nodespaceManager.on_node_action.bind(this._nodespaceManager)}get on_edge_action(){return this._nodespaceManager.on_edge_action.bind(this._nodespaceManager)}get on_group_action(){return this._nodespaceManager.on_group_action.bind(this._nodespaceManager)}get clear_all(){return this._nodespaceManager.clear_all.bind(this._nodespaceManager)}get center_node(){return this._nodespaceManager.center_node.bind(this._nodespaceManager)}get center_all(){return this._nodespaceManager.center_all.bind(this._nodespaceManager)}get lib(){return this._libManager.lib}get set_worker(){return this._workerManager.set_worker.bind(this._workerManager)}get workermanager(){return this._workerManager.workermanager}set workermanager(t){this._workerManager.workermanager=t}get worker(){return this._workerManager.worker}get workers(){return this._workerManager.workers}get workerstate(){return this._workerManager.workerstate}get _unsubscribeFromWorker(){return this._workerManager._unsubscribeFromWorker?.bind(this._workerManager)}get set_progress(){return this._stateManager.set_progress.bind(this._stateManager)}get auto_progress(){return this._stateManager.auto_progress.bind(this._stateManager)}get progress_state(){return this._stateManager.progress_state}get local_settings(){return this._stateManager.local_settings}get local_state(){return this._stateManager.local_state}update_view_settings(t){this._stateManager.update_view_settings(t)}get plugins(){return this._pluginManager.plugins.bind(this._pluginManager)}get add_plugin(){return this._pluginManager.add_plugin.bind(this._pluginManager)}get add_packed_plugin(){return this._pluginManager.add_packed_plugin.bind(this._pluginManager)}get render_options(){return this._pluginManager.render_options.bind(this._pluginManager)}get update_render_options(){return this._pluginManager.update_render_options.bind(this._pluginManager)}get useReactFlowStore(){return this._reactFlowManager.useReactFlowStore.bind(this._reactFlowManager)}get rf_instance(){return this._reactFlowManager.rf_instance}set rf_instance(t){this._reactFlowManager.rf_instance=t}};const g4e=Em(aue,e=>(e.id=IS(),e)),y4e=e=>{if(!e.useWorkerManager&&e.worker===void 0)throw new Error("If you don't use a worker manager, you must provide a default worker.");if(e.useWorkerManager&&e.workermanager_url===void 0)throw new Error("Error: If you use a worker manager, you must provide a worker managerurl.")},_T={};window.fnrf_zst===void 0&&(window.fnrf_zst=_T);const YU=e=>{const[t,n]=T.useState(void 0),[r,o]=T.useState(void 0),[i,a]=T.useState(!1);if(T.useEffect(()=>{const s=g4e(e);s.logger=s.logger||new X1("FuncNodes",s.debug?"debug":"info"),s.logger.debug("Initializing FuncNodes with props:",s),n(s),a(!1)},[e]),T.useEffect(()=>{if(!t)return;t.logger?.debug("Initializing/Getting Zustand store");const s=_T[t.id];if(s===void 0){const c=new m4e(t);_T[t.id]=c,o(c)}else o(s),s.options.debug=t.debug},[t?.id,t?.debug]),T.useEffect(()=>{if(!(!t||!r)&&!(t.useWorkerManager||!t.worker_url&&!t.worker))if(t.logger?.debug("Worker effect running"),!t.worker&&t.worker_url){t.logger?.debug("Creating WebSocket worker");const s=new jj({url:t.worker_url,uuid:t.id,on_sync_complete:t.on_sync_complete});return s.set_zustand(r),n(c=>c&&{...c,worker:s,useWorkerManager:!1}),()=>{t.logger?.debug("Disconnecting worker"),s.disconnect(),n(c=>c&&{...c,worker:void 0})}}else{t.worker?.set_zustand(r);return}},[t?.worker_url,t?.id,t?.useWorkerManager,r,t?.on_sync_complete]),T.useEffect(()=>{if(!t?.fnw_url||!t.worker)return;t.logger?.debug("Loading fnw_url data");let s=!1;const c=t.worker.getSyncManager();let u;return(async()=>{try{const p=await eW(t.fnw_url);if(s)return;u=async m=>{s||await m.update_from_export(p)},c.add_after_next_sync(u)}catch(p){p instanceof Error?t.logger?.error("Failed to load fnw_url:",p):t.logger?.error("Failed to load fnw_url:",new Error(String(p)))}})(),()=>{s=!0,u&&c.remove_after_next_sync(u)}},[t?.fnw_url,t?.worker]),T.useEffect(()=>{if(!t||!r||!t.useWorkerManager)return;if(!t.workermanager_url)throw new Error("Error: If you use a worker manager, you must provide a worker manager url.");r.logger.info("Worker manager effect running");const s=!r.workermanager,c=r.workermanager&&r.workermanager.wsuri!==t.workermanager_url;if(s||c){r.workermanager&&(r.logger.info("Removing existing worker manager"),r.workermanager.remove(),r.workermanager=void 0),r.logger.info("Creating new worker manager");const u=new iue(t.workermanager_url,r);return r.workermanager=u,n(f=>f&&{...f,workermanager:u}),()=>{r.logger.info("Worker manager cleanup running"),r.workermanager===u?(r.logger.info("Removing worker manager instance"),u.remove(),r.workermanager=void 0):r.logger.info("Worker manager instance mismatch, skipping cleanup")}}else{r.logger.info("Worker manager already initialized with correct URL");return}},[t?.useWorkerManager,t?.workermanager_url,t?.id,r]),T.useEffect(()=>{if(!t||!r||i)return;(t.useWorkerManager?r.workermanager!==void 0:t.worker!==void 0)&&t.on_ready&&typeof t.on_ready=="function"&&(t.logger?.debug("Firing on_ready callback"),t.on_ready({fnrf_zst:r}),a(!0))},[t,r,i,t?.useWorkerManager,r?.workermanager,t?.worker]),t===void 0||r===void 0)return S.jsx("div",{children:"Loading..."});try{y4e(t)}catch(s){return S.jsx(tW,{error:s})}return S.jsx("div",{className:"FuncnodesApp",children:S.jsx(Ine,{available_themes:Dj,children:S.jsx(dle,{duration:5e3,children:S.jsx(o4e,{fnrf_zst:r,header:t.header,library:t.library,flow:t.flow})})})})},XU=(e,t)=>{t===void 0&&(t={});const{element:n,eleid:r}=typeof e=="string"?{element:document.getElementById(e),eleid:e}:{element:e,eleid:e.id};Uq.createRoot(n).render(S.jsx(T.StrictMode,{children:S.jsx(YU,{...t,id:t.id||r})}))};window.FuncNodes=XU,window.FuncNodes.version="2.2.1a0",window.FuncNodes.utils={logger:{ConsoleLogger:X1,DivLogger:Wq,BaseLogger:Y1,DEBUG:qR,INFO:WR,WARN:Vq,ERROR:Hq}}})(); + `)(bl,ra);this.add_plugin(t,i)}catch(o){o instanceof Error?this.context.rf.logger.error(`Error building plugin ${t}`,o):this.context.rf.logger.error(`Error building plugin ${t}`,new Error(String(o))),this.stateManager.toaster?.error({title:"Error",description:`Error building plugin ${t}: ${o}`,duration:5e3})}}}}class h4e extends fd{constructor(t){super(t),this.on_rf_node_change=n=>{const r=this.useReactFlowStore.getState();for(const o of n)switch(o.type){case"position":if(o.position){const i=r.getNode(o.id);if(i===void 0)continue;i.type==="group"?this.nodespaceManager.change_group_position(o):this.nodespaceManager.change_fn_node_position(o),i.data.groupID&&this.nodespaceManager.auto_resize_group(i.data.groupID)}break;case"dimensions":if(o.dimensions){const i=r.getNode(o.id);if(i===void 0)continue;i.type==="group"?this.nodespaceManager.change_group_dimensions(o):this.nodespaceManager.change_fn_node_dimensions(o),i.data.groupID&&this.nodespaceManager.auto_resize_group(i.data.groupID)}break}},this.on_rf_edge_change=n=>{},this.on_connect=n=>{n.source===null||n.target===null||n.sourceHandle===null||n.targetHandle===null||!this.workerManager.worker||this.workerManager.worker.api.edge.add_edge({src_nid:n.source,src_ioid:n.sourceHandle,trg_nid:n.target,trg_ioid:n.targetHandle,replace:!0})},this.useReactFlowStore=dPe({on_node_change:this.on_rf_node_change.bind(this),on_edge_change:this.on_rf_edge_change.bind(this),on_connect:this.on_connect.bind(this)})}}let m4e=class{constructor(t){this.reactflowRef=null,this.dev_settings={debug:fh()},this.options=t,this.logger=t.logger??new X1("fn",fh()?qR:WR);const n={rf:this};this._nodespaceManager=new a4e(n),this._libManager=new l4e(n),this._workerManager=new c4e(n),this._stateManager=new u4e(n),this._pluginManager=new p4e(n),this._reactFlowManager=new h4e(n)}getNodespaceManager(){return this._nodespaceManager}getLibManager(){return this._libManager}getWorkerManager(){return this._workerManager}getStateManager(){return this._stateManager}getPluginManager(){return this._pluginManager}getReactFlowManager(){return this._reactFlowManager}get nodespace(){return this._nodespaceManager.nodespace}get on_node_action(){return this._nodespaceManager.on_node_action.bind(this._nodespaceManager)}get on_edge_action(){return this._nodespaceManager.on_edge_action.bind(this._nodespaceManager)}get on_group_action(){return this._nodespaceManager.on_group_action.bind(this._nodespaceManager)}get clear_all(){return this._nodespaceManager.clear_all.bind(this._nodespaceManager)}get center_node(){return this._nodespaceManager.center_node.bind(this._nodespaceManager)}get center_all(){return this._nodespaceManager.center_all.bind(this._nodespaceManager)}get lib(){return this._libManager.lib}get set_worker(){return this._workerManager.set_worker.bind(this._workerManager)}get workermanager(){return this._workerManager.workermanager}set workermanager(t){this._workerManager.workermanager=t}get worker(){return this._workerManager.worker}get workers(){return this._workerManager.workers}get workerstate(){return this._workerManager.workerstate}get _unsubscribeFromWorker(){return this._workerManager._unsubscribeFromWorker?.bind(this._workerManager)}get set_progress(){return this._stateManager.set_progress.bind(this._stateManager)}get auto_progress(){return this._stateManager.auto_progress.bind(this._stateManager)}get progress_state(){return this._stateManager.progress_state}get local_settings(){return this._stateManager.local_settings}get local_state(){return this._stateManager.local_state}update_view_settings(t){this._stateManager.update_view_settings(t)}get plugins(){return this._pluginManager.plugins.bind(this._pluginManager)}get add_plugin(){return this._pluginManager.add_plugin.bind(this._pluginManager)}get add_packed_plugin(){return this._pluginManager.add_packed_plugin.bind(this._pluginManager)}get render_options(){return this._pluginManager.render_options.bind(this._pluginManager)}get update_render_options(){return this._pluginManager.update_render_options.bind(this._pluginManager)}get useReactFlowStore(){return this._reactFlowManager.useReactFlowStore.bind(this._reactFlowManager)}get rf_instance(){return this._reactFlowManager.rf_instance}set rf_instance(t){this._reactFlowManager.rf_instance=t}};const g4e=Em(aue,e=>(e.id=IS(),e)),y4e=e=>{if(!e.useWorkerManager&&e.worker===void 0)throw new Error("If you don't use a worker manager, you must provide a default worker.");if(e.useWorkerManager&&e.workermanager_url===void 0)throw new Error("Error: If you use a worker manager, you must provide a worker managerurl.")},_T={};window.fnrf_zst===void 0&&(window.fnrf_zst=_T);const YU=e=>{const[t,n]=T.useState(void 0),[r,o]=T.useState(void 0),[i,a]=T.useState(!1);if(T.useEffect(()=>{const s=g4e(e);s.logger=s.logger||new X1("FuncNodes",s.debug?"debug":"info"),s.logger.debug("Initializing FuncNodes with props:",s),n(s),a(!1)},[e]),T.useEffect(()=>{if(!t)return;t.logger?.debug("Initializing/Getting Zustand store");const s=_T[t.id];if(s===void 0){const c=new m4e(t);_T[t.id]=c,o(c)}else o(s),s.options.debug=t.debug},[t?.id,t?.debug]),T.useEffect(()=>{if(!(!t||!r)&&!(t.useWorkerManager||!t.worker_url&&!t.worker))if(t.logger?.debug("Worker effect running"),!t.worker&&t.worker_url){t.logger?.debug("Creating WebSocket worker");const s=new jj({url:t.worker_url,uuid:t.id,on_sync_complete:t.on_sync_complete});return s.set_zustand(r),n(c=>c&&{...c,worker:s,useWorkerManager:!1}),()=>{t.logger?.debug("Disconnecting worker"),s.disconnect(),n(c=>c&&{...c,worker:void 0})}}else{t.worker?.set_zustand(r);return}},[t?.worker_url,t?.id,t?.useWorkerManager,r,t?.on_sync_complete]),T.useEffect(()=>{if(!t?.fnw_url||!t.worker)return;t.logger?.debug("Loading fnw_url data");let s=!1;const c=t.worker.getSyncManager();let u;return(async()=>{try{const p=await eW(t.fnw_url);if(s)return;u=async m=>{s||await m.update_from_export(p)},c.add_after_next_sync(u)}catch(p){p instanceof Error?t.logger?.error("Failed to load fnw_url:",p):t.logger?.error("Failed to load fnw_url:",new Error(String(p)))}})(),()=>{s=!0,u&&c.remove_after_next_sync(u)}},[t?.fnw_url,t?.worker]),T.useEffect(()=>{if(!t||!r||!t.useWorkerManager)return;if(!t.workermanager_url)throw new Error("Error: If you use a worker manager, you must provide a worker manager url.");r.logger.info("Worker manager effect running");const s=!r.workermanager,c=r.workermanager&&r.workermanager.wsuri!==t.workermanager_url;if(s||c){r.workermanager&&(r.logger.info("Removing existing worker manager"),r.workermanager.remove(),r.workermanager=void 0),r.logger.info("Creating new worker manager");const u=new iue(t.workermanager_url,r);return r.workermanager=u,n(f=>f&&{...f,workermanager:u}),()=>{r.logger.info("Worker manager cleanup running"),r.workermanager===u?(r.logger.info("Removing worker manager instance"),u.remove(),r.workermanager=void 0):r.logger.info("Worker manager instance mismatch, skipping cleanup")}}else{r.logger.info("Worker manager already initialized with correct URL");return}},[t?.useWorkerManager,t?.workermanager_url,t?.id,r]),T.useEffect(()=>{if(!t||!r||i)return;(t.useWorkerManager?r.workermanager!==void 0:t.worker!==void 0)&&t.on_ready&&typeof t.on_ready=="function"&&(t.logger?.debug("Firing on_ready callback"),t.on_ready({fnrf_zst:r}),a(!0))},[t,r,i,t?.useWorkerManager,r?.workermanager,t?.worker]),t===void 0||r===void 0)return S.jsx("div",{children:"Loading..."});try{y4e(t)}catch(s){return S.jsx(tW,{error:s})}return S.jsx("div",{className:"FuncnodesApp",children:S.jsx(Ine,{available_themes:Dj,children:S.jsx(dle,{duration:5e3,children:S.jsx(o4e,{fnrf_zst:r,header:t.header,library:t.library,flow:t.flow})})})})},XU=(e,t)=>{t===void 0&&(t={});const{element:n,eleid:r}=typeof e=="string"?{element:document.getElementById(e),eleid:e}:{element:e,eleid:e.id};Uq.createRoot(n).render(S.jsx(T.StrictMode,{children:S.jsx(YU,{...t,id:t.id||r})}))};window.FuncNodes=XU,window.FuncNodes.version="2.2.1",window.FuncNodes.utils={logger:{ConsoleLogger:X1,DivLogger:Wq,BaseLogger:Y1,DEBUG:qR,INFO:WR,WARN:Vq,ERROR:Hq}}})();