@fnet/cli 1.5.0 → 1.5.1

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.
@@ -1,3 +1,3 @@
1
1
  import"./index.bfgjmapr.js";import V from"fs";import $ from"path";import J from"chalk";import C from"@fnet/yaml";import H,{ProcessManager as M}from"@fnet/shell-flow";function L(q){if(Array.isArray(q))return q;if(q&&typeof q==="object"&&q.steps)return q.steps;return q}async function k({projectType:q,group:E,tags:z,args:B,argv:K,processManager:Q}){try{let A=await x(q),{parsed:R}=await C({file:A.path,tags:z}),I=R.commands;if(!I)throw Error(`Commands section not found in ${A.name}`);let D=I[E];if(!D)throw Error(`Command group '${E}' not found in ${A.name}`);let U=L(D);await H({commands:U,context:{args:B,argv:K,projectType:A.type},processManager:Q})}catch(A){console.error(`Error: ${A.message}`),process.exit(1)}}async function T({projectType:q,tags:E}){try{let z=await x(q),{parsed:B}=await C({file:z.path,tags:E}),K=B.commands;if(!K){console.log(J.yellow(`No commands found in ${z.name}`));return}console.log(`
2
2
  ${J.bold("Available commands")} ${J.dim(`(${z.name})`)}:
3
- `);let Q=Object.entries(K),A=Math.max(...Q.map(([I])=>I.length)),R=!1;for(let[I,D]of Q){let U=D&&typeof D==="object"&&!Array.isArray(D),Z=U?D.description||"":"",W=U?D.usage||"":"",X=!!(Z||W);if(X&&R)console.log("");let _=I.padEnd(A);if(X){if(console.log(` ${J.bold.cyan(_)} ${Z}`),W)console.log(` ${"".padEnd(A)} ${J.dim("$ "+W)}`);console.log("")}else console.log(` ${J.cyan(_)}`);R=X}}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function x(q){let E=process.cwd(),z=$.resolve(E,"fnode.yaml"),B=$.resolve(E,"fnet.yaml");if(q==="fnode"){if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}export{k as runCommandGroup,T as listCommandGroups,x as detectProjectFile};
3
+ `);let Q=Object.entries(K),A=Math.max(...Q.map(([I])=>I.length)),R=!1;for(let[I,D]of Q){let U=D&&typeof D==="object"&&!Array.isArray(D),Z=U?D.description||"":"",W=U?D.usage||"":"",X=!!(Z||W);if(X&&R)console.log("");let _=I.padEnd(A);if(X){if(console.log(` ${J.bold.cyan(_)} ${Z}`),W)console.log(` ${"".padEnd(A)} ${J.dim("$ "+W)}`)}else console.log(` ${J.cyan(_)}`);R=X}}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function x(q){let E=process.cwd(),z=$.resolve(E,"fnode.yaml"),B=$.resolve(E,"fnet.yaml");if(q==="fnode"){if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}export{k as runCommandGroup,T as listCommandGroups,x as detectProjectFile};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as b0,b as M0}from"./index.2084z2ed.js";import{c as b5,d as N9,e as h}from"./index.bfgjmapr.js";var b9=N9((Eq,D9)=>{D9.exports=P9;function P9(Q,Z,X){if(Q instanceof RegExp)Q=S9(Q,X);if(Z instanceof RegExp)Z=S9(Z,X);var q=k9(Q,Z,X);return q&&{start:q[0],end:q[1],pre:X.slice(0,q[0]),body:X.slice(q[0]+Q.length,q[1]),post:X.slice(q[1]+Z.length)}}function S9(Q,Z){var X=Z.match(Q);return X?X[0]:null}P9.range=k9;function k9(Q,Z,X){var q,Y,J,H,W,V=X.indexOf(Q),K=X.indexOf(Z,V+1),z=V;if(V>=0&&K>0){if(Q===Z)return[V,K];q=[],J=X.length;while(z>=0&&!W){if(z==V)q.push(z),V=X.indexOf(Q,z+1);else if(q.length==1)W=[q.pop(),K];else{if(Y=q.pop(),Y<J)J=Y,H=K;K=X.indexOf(Z,z+1)}z=V<K&&V>=0?V:K}if(q.length)W=[J,H]}return W}});var g9=N9((xq,h9)=>{var v9=b9();h9.exports=B5;var y9="\x00SLASH"+Math.random()+"\x00",E9="\x00OPEN"+Math.random()+"\x00",p6="\x00CLOSE"+Math.random()+"\x00",x9="\x00COMMA"+Math.random()+"\x00",u9="\x00PERIOD"+Math.random()+"\x00";function d6(Q){return parseInt(Q,10)==Q?parseInt(Q,10):Q.charCodeAt(0)}function A5(Q){return Q.split("\\\\").join(y9).split("\\{").join(E9).split("\\}").join(p6).split("\\,").join(x9).split("\\.").join(u9)}function R5(Q){return Q.split(y9).join("\\").split(E9).join("{").split(p6).join("}").split(x9).join(",").split(u9).join(".")}function f9(Q){if(!Q)return[""];var Z=[],X=v9("{","}",Q);if(!X)return Q.split(",");var{pre:q,body:Y,post:J}=X,H=q.split(",");H[H.length-1]+="{"+Y+"}";var W=f9(J);if(J.length)H[H.length-1]+=W.shift(),H.push.apply(H,W);return Z.push.apply(Z,H),Z}function B5(Q){if(!Q)return[];if(Q.substr(0,2)==="{}")Q="\\{\\}"+Q.substr(2);return r0(A5(Q),!0).map(R5)}function I5(Q){return"{"+Q+"}"}function L5(Q){return/^-?0\d/.test(Q)}function F5(Q,Z){return Q<=Z}function T5(Q,Z){return Q>=Z}function r0(Q,Z){var X=[],q=v9("{","}",Q);if(!q)return[Q];var Y=q.pre,J=q.post.length?r0(q.post,!1):[""];if(/\$$/.test(q.pre))for(var H=0;H<J.length;H++){var W=Y+"{"+q.body+"}"+J[H];X.push(W)}else{var V=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(q.body),K=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(q.body),z=V||K,G=q.body.indexOf(",")>=0;if(!z&&!G){if(q.post.match(/,.*\}/))return Q=q.pre+"{"+q.body+p6+q.post,r0(Q);return[Q]}var _;if(z)_=q.body.split(/\.\./);else if(_=f9(q.body),_.length===1){if(_=r0(_[0],!1).map(I5),_.length===1)return J.map(function(b7){return q.pre+_[0]+b7})}var O;if(z){var $=d6(_[0]),A=d6(_[1]),U=Math.max(_[0].length,_[1].length),R=_.length==3?Math.abs(d6(_[2])):1,M=F5,B=A<$;if(B)R*=-1,M=T5;var T=_.some(L5);O=[];for(var S=$;M(S,A);S+=R){var y;if(K){if(y=String.fromCharCode(S),y==="\\")y=""}else if(y=String(S),T){var v=U-y.length;if(v>0){var Y0=Array(v+1).join("0");if(S<0)y="-"+Y0+y.slice(1);else y=Y0+y}}O.push(y)}}else{O=[];for(var J0=0;J0<_.length;J0++)O.push.apply(O,r0(_[J0],!1))}for(var J0=0;J0<O.length;J0++)for(var H=0;H<J.length;H++){var W=Y+O[J0]+J[H];if(!Z||z||W)X.push(W)}}return X}});import N1 from"yargs";import AZ from"chalk";import{ProcessManager as P1}from"@fnet/shell-flow";import n0 from"node:path";import{spawn as h7}from"node:child_process";import O8 from"node:fs";import a0 from"chalk";import kZ from"@fnet/config";import{promisify as NZ}from"node:util";import PZ from"tree-kill";var f7=NZ(PZ),e8=!1;async function t8(Q,Z){if(e8)return;if(e8=!0,!Q.killed&&Q.pid)try{if(await f7(Q.pid,"SIGTERM").catch(()=>{}),await new Promise((q)=>setTimeout(q,500)),!Q.killed)await f7(Q.pid,"SIGKILL").catch(()=>{})}catch(q){}await new Promise((q)=>setTimeout(q,100));let X=Z==="SIGINT"?130:Z==="SIGTERM"?143:1;process.exit(X)}function Q6(Q){["SIGINT","SIGTERM","SIGQUIT"].forEach((Z)=>{process.once(Z,async()=>{await t8(Q,Z)})}),process.on("uncaughtException",async(Z)=>{await t8(Q)}),process.on("unhandledRejection",async(Z)=>{await t8(Q)}),Q.on("close",(Z)=>{if(!e8)process.exit(Z)})}function s(Q,{name:Z,bin:X,preArgs:q=[],createContext:Y}){if(typeof X==="function")X=X();return Q.command(`${Z||X} [commands..]`,`${X} ${q.join(" ")}`,(J)=>{return J.help(!1).version(!1)},async(J)=>{try{let H=await Y(J),{projectDir:W}=H,V=(O)=>{if(!O.includes(" "))return O;if(process.platform==="win32")return`"${O.replace(/(["^])/g,"^$1")}"`;else return`"${O.replace(/(["\\$`])/g,"\\$1")}"`},K=process.argv.slice(3).map(V),z={...process.env},G=n0.join(W,"node_modules");z.NODE_PATH=G,z.NODE_PRESERVE_SYMLINKS=1;let _=h7(X,[...q,...K],{cwd:W,stdio:"inherit",shell:!0,detached:!0,env:z});Q6(_)}catch(H){console.error(H.message),process.exit(1)}})}function g7(Q,{name:Z,preArgs:X=[],createContext:q}){return Q.command(`${Z} <config> <command> [options..]`,"Run a command with a config context",(Y)=>{return Y.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)},async(Y)=>{try{let J=await q(Y),{projectDir:H}=J,W=Y.config,K=(await kZ({name:W,dir:H,transferEnv:!1,optional:!0,tags:J.tags}))?.data?.env||void 0,z=Y.command,G=process.argv.slice(5),_=h7(z,[...X,...G],{cwd:O8.existsSync(H)?H:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...K}});Q6(_)}catch(J){console.error(J.message),process.exit(1)}})}function m7(Q,{name:Z,projectType:X="auto",processManager:q}){return Q.command(`${Z} group [options..]`,"Run a command group.",(Y)=>{return Y.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)},async(Y)=>{try{let{runCommandGroup:J}=await import("./index.hzcer2ks.js");await J({projectType:X,group:Y.group,tags:Y.ftag,args:Y,argv:process.argv,processManager:q})}catch(J){console.error(J.message),process.exit(1)}})}function c7(Q,{name:Z,createContext:X}){return Q.command(`${Z} [options]`,"Install the project as a binary",(q)=>{return q.option("name",{alias:"n",describe:"Name to use for the installed binary",type:"string"}).option("force",{alias:"f",describe:"Force overwrite if binary already exists",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Automatically answer yes to all prompts",type:"boolean",default:!1})},async(q)=>{try{let Y=await X(q),{projectDir:J}=Y;console.log(a0.blue("Compiling project..."));let H=n0.join(J,".bin");if(!O8.existsSync(H))O8.mkdirSync(H,{recursive:!0});let W=n0.basename(n0.dirname(J)),V=Y.project?.projectFileParsed?.features?.cli?.bin,K=q.name||V||W;console.log(a0.blue(`Using binary name: ${K}`));let z=n0.join(H,K),{spawn:G}=await import("child_process"),_=G("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${z}`],{cwd:J,stdio:"inherit",shell:!0});if(await new Promise((A,U)=>{_.on("close",(R)=>{if(R===0)A();else U(Error(`Compilation failed with code ${R}`))}),_.on("error",(R)=>{U(R)})}),process.platform!=="win32")O8.chmodSync(z,493);console.log(a0.green(`Binary compiled successfully: ${z}`)),console.log(a0.blue("Installing binary..."));let O=["install",z];if(q.name)O.push("--name",q.name);if(q.force)O.push("--force");if(q.yes)O.push("--yes");let $=G("fbin",O,{stdio:"inherit",shell:!0});await new Promise((A,U)=>{$.on("close",(R)=>{if(R===0)A();else U(Error(`Installation failed with code ${R}`))}),$.on("error",(R)=>{U(R)})})}catch(Y){console.error(a0.red(`Failed to install binary: ${Y.message}`)),process.exit(1)}})}import o from"node:path";import $0 from"node:fs";import A8 from"@fnet/yaml";import DZ from"yaml";async function b(Q){try{let Z=await bZ({tags:Q.ftag,flowsPath:Q.flows});return{buildId:Q.buildId,mode:Q.mode,protocol:Q.protocol||"src:",templateDir:b0("./template/fnet/node"),coreDir:b0("./template/fnet/core"),projectDir:o.resolve(Z.projectDir,"./.workspace"),projectSrcDir:o.resolve(Z.projectDir,"./src"),projectSrcDirSymlink:o.resolve(Z.projectDir,"./.workspace/src-core"),projectAppDir:o.resolve(Z.projectDir,"./app"),projectAppDirSymlink:o.resolve(Z.projectDir,"./.workspace/app"),projectCliDir:o.resolve(Z.projectDir,"./cli"),projectCliDirSymlink:o.resolve(Z.projectDir,"./.workspace/cli"),project:Z,tags:Q.ftag,dev:Q.dev,bpmn:Q.bpmn===!0}}catch(Z){return console.warn(`Warning: Could not load project: ${Z.message}`),{projectDir:process.cwd(),tags:Q.ftag}}}async function bZ({tags:Q,flowsPath:Z}){let X=vZ(process.cwd());if(!$0.existsSync(X))throw Error("fnet.yaml file not found in current directory.");let{raw:q,parsed:Y}=await A8({file:X,tags:Q}),J=o.dirname(X);Y.features=Y.features||{};let H=Y.features;H.runtime=H.runtime||{},H.runtime.type=H.runtime.type||"node";let W;if(Z){let _=o.resolve(J,Z);if(!$0.existsSync(_))throw Error(`Flows file not found: ${_}`);let{parsed:O}=await A8({file:_,tags:Q});W=O}else if(typeof Y.flows==="object")W=Y.flows;else{let _="flow.main.yaml";if($0.existsSync(o.join(J,"fnet","flows.yaml")))_=o.join("fnet","flows.yaml");let O=Y.main||_,$=o.resolve(J,O);if(!$0.existsSync($))W={main:{steps:[]}};else{let{parsed:A}=await A8({file:$,tags:Q});W=A}}let K={workflowAtom:{doc:{...Y,content:W}},projectDir:J,projectFilePath:X,projectFileContent:q,projectFileParsed:Y,runtime:H.runtime},z=o.resolve(J,"fnet/targets.yaml");if($0.existsSync(z)){let{raw:_,parsed:O}=await A8({file:z,tags:Q}),$=DZ.parseDocument(_);K.devops={filePath:z,fileContent:_,yamlDocument:$,doc:{...O},type:"workflow.deploy",save:async()=>{$0.writeFileSync(K.devops.filePath,$.toString())}}}let G=o.resolve(J,"readme.md");if($0.existsSync(G)){let _=$0.readFileSync(G,"utf8");K.readme={filePath:G,fileContent:_,doc:{content:_,"content-type":"markdown"},type:"wiki"}}return K}function vZ(Q){let Z=o.resolve(Q,"fnet.yaml");if($0.existsSync(Z))return Z;let X=o.resolve(Q,"fnet.yml");if($0.existsSync(X))return X;return Z}import yZ from"node:path";import l7 from"node:fs";import EZ from"node:os";import xZ from"@flownet/lib-render-templates-dir";import Z6 from"@fnet/shelljs";var uZ={command:"create",describe:"Initialize a new fnet project",builder:(Q)=>{return Q.option("name",{type:"string",describe:"Project name"}).option("vscode",{type:"boolean",default:!0,alias:"vs",describe:"Open in VS Code after creation"}).option("runtime",{type:"string",default:"node",choices:["node"],describe:"Runtime environment"})},handler:async(Q)=>{try{let Z=process.cwd(),X=b0("./template/fnet/project"),q=yZ.resolve(Z,Q.name);if(!l7.existsSync(q))l7.mkdirSync(q);await xZ({dir:X,outDir:q,context:Q,copyUnmatchedAlso:!0,platform:EZ.platform()});let Y=await Z6("fnet build",{cwd:q});if(Y.code!==0)throw Error("Failed to build project.");if(M0("git")){if(Y=await Z6("git init --initial-branch=main",{cwd:q}),Y.code!==0)throw Error("Failed to initialize git.")}if(M0("code")&&Q.vscode){if(Y=await Z6(`cd ${q} && code .`),Y.code!==0)throw Error("Failed to open vscode.")}console.log("Creating project succeeded!"),process.exit(0)}catch(Z){console.error("Initialization failed!",Z.message),process.exit(1)}}},d7=uZ;import fZ from"node:os";import hZ from"@flownet/lib-render-templates-dir";import gZ from"@fnet/shelljs";var mZ={command:"project",describe:"Manage fnet project",builder:(Q)=>{return Q.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"})},handler:async(Q)=>{try{let Z=b0("./template/fnet/project"),X=process.cwd(),q=await b(Q);if(Q.update){if(await hZ({dir:Z,outDir:X,context:{name:q.project.projectFileParsed.name,runtime:"node"},copyUnmatchedAlso:!0,platform:fZ.platform()}),(await gZ("fnet build",{cwd:X})).code!==0)throw Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(Z){console.error("Project failed.",Z.message),process.exit(1)}}},p7=mZ;import C from"node:fs";import D from"node:path";import eQ from"yaml";import QZ from"@fnet/shelljs";import $8 from"nunjucks";import ZZ from"lodash.clonedeep";import Q1 from"isobject";import{randomUUID as XZ}from"node:crypto";import X6 from"winston";var{combine:i7,timestamp:a7,printf:cZ,colorize:lZ}=X6.format,n7=cZ(({level:Q,message:Z,timestamp:X,category:q,depth:Y,...J})=>{let H=" ".repeat(Y||0),W=q?`[${q}]`:"",V=`${X} ${Q} ${W} ${H}${Z}`;if(Object.keys(J).length>0)V+=`
2
+ import{a as b0,b as M0}from"./index.2084z2ed.js";import{c as b5,d as N9,e as h}from"./index.bfgjmapr.js";var b9=N9((Eq,D9)=>{D9.exports=P9;function P9(Q,Z,X){if(Q instanceof RegExp)Q=S9(Q,X);if(Z instanceof RegExp)Z=S9(Z,X);var q=k9(Q,Z,X);return q&&{start:q[0],end:q[1],pre:X.slice(0,q[0]),body:X.slice(q[0]+Q.length,q[1]),post:X.slice(q[1]+Z.length)}}function S9(Q,Z){var X=Z.match(Q);return X?X[0]:null}P9.range=k9;function k9(Q,Z,X){var q,Y,J,H,W,V=X.indexOf(Q),K=X.indexOf(Z,V+1),z=V;if(V>=0&&K>0){if(Q===Z)return[V,K];q=[],J=X.length;while(z>=0&&!W){if(z==V)q.push(z),V=X.indexOf(Q,z+1);else if(q.length==1)W=[q.pop(),K];else{if(Y=q.pop(),Y<J)J=Y,H=K;K=X.indexOf(Z,z+1)}z=V<K&&V>=0?V:K}if(q.length)W=[J,H]}return W}});var g9=N9((xq,h9)=>{var v9=b9();h9.exports=B5;var y9="\x00SLASH"+Math.random()+"\x00",E9="\x00OPEN"+Math.random()+"\x00",p6="\x00CLOSE"+Math.random()+"\x00",x9="\x00COMMA"+Math.random()+"\x00",u9="\x00PERIOD"+Math.random()+"\x00";function d6(Q){return parseInt(Q,10)==Q?parseInt(Q,10):Q.charCodeAt(0)}function A5(Q){return Q.split("\\\\").join(y9).split("\\{").join(E9).split("\\}").join(p6).split("\\,").join(x9).split("\\.").join(u9)}function R5(Q){return Q.split(y9).join("\\").split(E9).join("{").split(p6).join("}").split(x9).join(",").split(u9).join(".")}function f9(Q){if(!Q)return[""];var Z=[],X=v9("{","}",Q);if(!X)return Q.split(",");var{pre:q,body:Y,post:J}=X,H=q.split(",");H[H.length-1]+="{"+Y+"}";var W=f9(J);if(J.length)H[H.length-1]+=W.shift(),H.push.apply(H,W);return Z.push.apply(Z,H),Z}function B5(Q){if(!Q)return[];if(Q.substr(0,2)==="{}")Q="\\{\\}"+Q.substr(2);return r0(A5(Q),!0).map(R5)}function I5(Q){return"{"+Q+"}"}function L5(Q){return/^-?0\d/.test(Q)}function F5(Q,Z){return Q<=Z}function T5(Q,Z){return Q>=Z}function r0(Q,Z){var X=[],q=v9("{","}",Q);if(!q)return[Q];var Y=q.pre,J=q.post.length?r0(q.post,!1):[""];if(/\$$/.test(q.pre))for(var H=0;H<J.length;H++){var W=Y+"{"+q.body+"}"+J[H];X.push(W)}else{var V=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(q.body),K=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(q.body),z=V||K,G=q.body.indexOf(",")>=0;if(!z&&!G){if(q.post.match(/,.*\}/))return Q=q.pre+"{"+q.body+p6+q.post,r0(Q);return[Q]}var _;if(z)_=q.body.split(/\.\./);else if(_=f9(q.body),_.length===1){if(_=r0(_[0],!1).map(I5),_.length===1)return J.map(function(b7){return q.pre+_[0]+b7})}var O;if(z){var $=d6(_[0]),A=d6(_[1]),U=Math.max(_[0].length,_[1].length),R=_.length==3?Math.abs(d6(_[2])):1,M=F5,B=A<$;if(B)R*=-1,M=T5;var T=_.some(L5);O=[];for(var S=$;M(S,A);S+=R){var y;if(K){if(y=String.fromCharCode(S),y==="\\")y=""}else if(y=String(S),T){var v=U-y.length;if(v>0){var Y0=Array(v+1).join("0");if(S<0)y="-"+Y0+y.slice(1);else y=Y0+y}}O.push(y)}}else{O=[];for(var J0=0;J0<_.length;J0++)O.push.apply(O,r0(_[J0],!1))}for(var J0=0;J0<O.length;J0++)for(var H=0;H<J.length;H++){var W=Y+O[J0]+J[H];if(!Z||z||W)X.push(W)}}return X}});import N1 from"yargs";import AZ from"chalk";import{ProcessManager as P1}from"@fnet/shell-flow";import n0 from"node:path";import{spawn as h7}from"node:child_process";import O8 from"node:fs";import a0 from"chalk";import kZ from"@fnet/config";import{promisify as NZ}from"node:util";import PZ from"tree-kill";var f7=NZ(PZ),e8=!1;async function t8(Q,Z){if(e8)return;if(e8=!0,!Q.killed&&Q.pid)try{if(await f7(Q.pid,"SIGTERM").catch(()=>{}),await new Promise((q)=>setTimeout(q,500)),!Q.killed)await f7(Q.pid,"SIGKILL").catch(()=>{})}catch(q){}await new Promise((q)=>setTimeout(q,100));let X=Z==="SIGINT"?130:Z==="SIGTERM"?143:1;process.exit(X)}function Q6(Q){["SIGINT","SIGTERM","SIGQUIT"].forEach((Z)=>{process.once(Z,async()=>{await t8(Q,Z)})}),process.on("uncaughtException",async(Z)=>{await t8(Q)}),process.on("unhandledRejection",async(Z)=>{await t8(Q)}),Q.on("close",(Z)=>{if(!e8)process.exit(Z)})}function s(Q,{name:Z,bin:X,preArgs:q=[],createContext:Y}){if(typeof X==="function")X=X();return Q.command(`${Z||X} [commands..]`,`${X} ${q.join(" ")}`,(J)=>{return J.help(!1).version(!1)},async(J)=>{try{let H=await Y(J),{projectDir:W}=H,V=(O)=>{if(!O.includes(" "))return O;if(process.platform==="win32")return`"${O.replace(/(["^])/g,"^$1")}"`;else return`"${O.replace(/(["\\$`])/g,"\\$1")}"`},K=process.argv.slice(3).map(V),z={...process.env},G=n0.join(W,"node_modules");z.NODE_PATH=G,z.NODE_PRESERVE_SYMLINKS=1;let _=h7(X,[...q,...K],{cwd:W,stdio:"inherit",shell:!0,detached:!0,env:z});Q6(_)}catch(H){console.error(H.message),process.exit(1)}})}function g7(Q,{name:Z,preArgs:X=[],createContext:q}){return Q.command(`${Z} <config> <command> [options..]`,"Run a command with a config context",(Y)=>{return Y.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)},async(Y)=>{try{let J=await q(Y),{projectDir:H}=J,W=Y.config,K=(await kZ({name:W,dir:H,transferEnv:!1,optional:!0,tags:J.tags}))?.data?.env||void 0,z=Y.command,G=process.argv.slice(5),_=h7(z,[...X,...G],{cwd:O8.existsSync(H)?H:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...K}});Q6(_)}catch(J){console.error(J.message),process.exit(1)}})}function m7(Q,{name:Z,projectType:X="auto",processManager:q}){return Q.command(`${Z} group [options..]`,"Run a command group.",(Y)=>{return Y.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)},async(Y)=>{try{let{runCommandGroup:J}=await import("./index.c28e53p3.js");await J({projectType:X,group:Y.group,tags:Y.ftag,args:Y,argv:process.argv,processManager:q})}catch(J){console.error(J.message),process.exit(1)}})}function c7(Q,{name:Z,createContext:X}){return Q.command(`${Z} [options]`,"Install the project as a binary",(q)=>{return q.option("name",{alias:"n",describe:"Name to use for the installed binary",type:"string"}).option("force",{alias:"f",describe:"Force overwrite if binary already exists",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Automatically answer yes to all prompts",type:"boolean",default:!1})},async(q)=>{try{let Y=await X(q),{projectDir:J}=Y;console.log(a0.blue("Compiling project..."));let H=n0.join(J,".bin");if(!O8.existsSync(H))O8.mkdirSync(H,{recursive:!0});let W=n0.basename(n0.dirname(J)),V=Y.project?.projectFileParsed?.features?.cli?.bin,K=q.name||V||W;console.log(a0.blue(`Using binary name: ${K}`));let z=n0.join(H,K),{spawn:G}=await import("child_process"),_=G("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${z}`],{cwd:J,stdio:"inherit",shell:!0});if(await new Promise((A,U)=>{_.on("close",(R)=>{if(R===0)A();else U(Error(`Compilation failed with code ${R}`))}),_.on("error",(R)=>{U(R)})}),process.platform!=="win32")O8.chmodSync(z,493);console.log(a0.green(`Binary compiled successfully: ${z}`)),console.log(a0.blue("Installing binary..."));let O=["install",z];if(q.name)O.push("--name",q.name);if(q.force)O.push("--force");if(q.yes)O.push("--yes");let $=G("fbin",O,{stdio:"inherit",shell:!0});await new Promise((A,U)=>{$.on("close",(R)=>{if(R===0)A();else U(Error(`Installation failed with code ${R}`))}),$.on("error",(R)=>{U(R)})})}catch(Y){console.error(a0.red(`Failed to install binary: ${Y.message}`)),process.exit(1)}})}import o from"node:path";import $0 from"node:fs";import A8 from"@fnet/yaml";import DZ from"yaml";async function b(Q){try{let Z=await bZ({tags:Q.ftag,flowsPath:Q.flows});return{buildId:Q.buildId,mode:Q.mode,protocol:Q.protocol||"src:",templateDir:b0("./template/fnet/node"),coreDir:b0("./template/fnet/core"),projectDir:o.resolve(Z.projectDir,"./.workspace"),projectSrcDir:o.resolve(Z.projectDir,"./src"),projectSrcDirSymlink:o.resolve(Z.projectDir,"./.workspace/src-core"),projectAppDir:o.resolve(Z.projectDir,"./app"),projectAppDirSymlink:o.resolve(Z.projectDir,"./.workspace/app"),projectCliDir:o.resolve(Z.projectDir,"./cli"),projectCliDirSymlink:o.resolve(Z.projectDir,"./.workspace/cli"),project:Z,tags:Q.ftag,dev:Q.dev,bpmn:Q.bpmn===!0}}catch(Z){return console.warn(`Warning: Could not load project: ${Z.message}`),{projectDir:process.cwd(),tags:Q.ftag}}}async function bZ({tags:Q,flowsPath:Z}){let X=vZ(process.cwd());if(!$0.existsSync(X))throw Error("fnet.yaml file not found in current directory.");let{raw:q,parsed:Y}=await A8({file:X,tags:Q}),J=o.dirname(X);Y.features=Y.features||{};let H=Y.features;H.runtime=H.runtime||{},H.runtime.type=H.runtime.type||"node";let W;if(Z){let _=o.resolve(J,Z);if(!$0.existsSync(_))throw Error(`Flows file not found: ${_}`);let{parsed:O}=await A8({file:_,tags:Q});W=O}else if(typeof Y.flows==="object")W=Y.flows;else{let _="flow.main.yaml";if($0.existsSync(o.join(J,"fnet","flows.yaml")))_=o.join("fnet","flows.yaml");let O=Y.main||_,$=o.resolve(J,O);if(!$0.existsSync($))W={main:{steps:[]}};else{let{parsed:A}=await A8({file:$,tags:Q});W=A}}let K={workflowAtom:{doc:{...Y,content:W}},projectDir:J,projectFilePath:X,projectFileContent:q,projectFileParsed:Y,runtime:H.runtime},z=o.resolve(J,"fnet/targets.yaml");if($0.existsSync(z)){let{raw:_,parsed:O}=await A8({file:z,tags:Q}),$=DZ.parseDocument(_);K.devops={filePath:z,fileContent:_,yamlDocument:$,doc:{...O},type:"workflow.deploy",save:async()=>{$0.writeFileSync(K.devops.filePath,$.toString())}}}let G=o.resolve(J,"readme.md");if($0.existsSync(G)){let _=$0.readFileSync(G,"utf8");K.readme={filePath:G,fileContent:_,doc:{content:_,"content-type":"markdown"},type:"wiki"}}return K}function vZ(Q){let Z=o.resolve(Q,"fnet.yaml");if($0.existsSync(Z))return Z;let X=o.resolve(Q,"fnet.yml");if($0.existsSync(X))return X;return Z}import yZ from"node:path";import l7 from"node:fs";import EZ from"node:os";import xZ from"@flownet/lib-render-templates-dir";import Z6 from"@fnet/shelljs";var uZ={command:"create",describe:"Initialize a new fnet project",builder:(Q)=>{return Q.option("name",{type:"string",describe:"Project name"}).option("vscode",{type:"boolean",default:!0,alias:"vs",describe:"Open in VS Code after creation"}).option("runtime",{type:"string",default:"node",choices:["node"],describe:"Runtime environment"})},handler:async(Q)=>{try{let Z=process.cwd(),X=b0("./template/fnet/project"),q=yZ.resolve(Z,Q.name);if(!l7.existsSync(q))l7.mkdirSync(q);await xZ({dir:X,outDir:q,context:Q,copyUnmatchedAlso:!0,platform:EZ.platform()});let Y=await Z6("fnet build",{cwd:q});if(Y.code!==0)throw Error("Failed to build project.");if(M0("git")){if(Y=await Z6("git init --initial-branch=main",{cwd:q}),Y.code!==0)throw Error("Failed to initialize git.")}if(M0("code")&&Q.vscode){if(Y=await Z6(`cd ${q} && code .`),Y.code!==0)throw Error("Failed to open vscode.")}console.log("Creating project succeeded!"),process.exit(0)}catch(Z){console.error("Initialization failed!",Z.message),process.exit(1)}}},d7=uZ;import fZ from"node:os";import hZ from"@flownet/lib-render-templates-dir";import gZ from"@fnet/shelljs";var mZ={command:"project",describe:"Manage fnet project",builder:(Q)=>{return Q.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"})},handler:async(Q)=>{try{let Z=b0("./template/fnet/project"),X=process.cwd(),q=await b(Q);if(Q.update){if(await hZ({dir:Z,outDir:X,context:{name:q.project.projectFileParsed.name,runtime:"node"},copyUnmatchedAlso:!0,platform:fZ.platform()}),(await gZ("fnet build",{cwd:X})).code!==0)throw Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(Z){console.error("Project failed.",Z.message),process.exit(1)}}},p7=mZ;import C from"node:fs";import D from"node:path";import eQ from"yaml";import QZ from"@fnet/shelljs";import $8 from"nunjucks";import ZZ from"lodash.clonedeep";import Q1 from"isobject";import{randomUUID as XZ}from"node:crypto";import X6 from"winston";var{combine:i7,timestamp:a7,printf:cZ,colorize:lZ}=X6.format,n7=cZ(({level:Q,message:Z,timestamp:X,category:q,depth:Y,...J})=>{let H=" ".repeat(Y||0),W=q?`[${q}]`:"",V=`${X} ${Q} ${W} ${H}${Z}`;if(Object.keys(J).length>0)V+=`
3
3
  ${H} ${JSON.stringify(J,null,2)}`;return V}),R8=X6.createLogger({level:process.env.FNET_LOG_LEVEL||"info",format:i7(a7({format:"HH:mm:ss.SSS"}),n7),transports:[new X6.transports.Console({format:i7(lZ(),a7({format:"HH:mm:ss.SSS"}),n7)})]}),s7=(Q)=>{return{debug:(Z,X={})=>R8.debug(Z,{category:Q,...X}),info:(Z,X={})=>R8.info(Z,{category:Q,...X}),warn:(Z,X={})=>R8.warn(Z,{category:Q,...X}),error:(Z,X={})=>R8.error(Z,{category:Q,...X})}},f=s7("tree"),x=s7("bpmn"),r7=process.env.FNET_LOG_CATEGORIES?.split(",")||[],j=(Q)=>{if(r7.length===0)return!1;return r7.includes(Q)};import{Api as B8}from"@flownet/lib-atom-api-js";class o7{init({config:Q,accessToken:Z}){return new Promise((X,q)=>{if(B8.set_api_url(Q.data.url),Z){B8.set_req_token(Z),X(Z);return}fetch(`${Q.data.issuer}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(Q.data.grant.params)}).then(async(Y)=>{if(!Y.ok)throw Error(await Y.text());return Y.json()}).then((Y)=>{B8.set_req_token(Y.access_token),X(Y.access_token)}).catch((Y)=>{B8.set_req_token(),q(Y)})})}}import u0 from"lodash.merge";import I8 from"node:fs";import _0 from"node:path";import f0 from"@flownet/lib-parse-imports-js";import dZ from"lodash.merge";function E({feature:Q,features:Z,packageDevDependencies:X}){let{name:q,packages:Y,options:J,extraCheck:H,explicit:W}=Q,V=`${q}_enabled`,K=Z.rollup_output||{},z=Object.keys(K),G=J||{},_=Z[q]?.options;if(_)G=dZ(G,_);let O=!Z[q]||Z[q]?.enabled===!1;z.forEach((A)=>{let U=Z.rollup_output[A];if(!U)return;if(Reflect.has(U,q)){if(O||!U[q]||U[q]?.enabled===!1){delete U[q];return}if(U[q]===!0)U[q]={enabled:!0,options:G}}else if(!O&&!W&&Z[V]!==!1)U[q]={enabled:!0};else return;U[q]=U[q]||{},U[q].options={...G,...U[q].options}});let $=z.some((A)=>Z.rollup_output[A][q]?.enabled===!0);if(H)$=H()&&$;if(Z[V]=$,$)Y.forEach((A)=>X.push({package:A[0],version:A[1]}))}function q6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"workbox",packages:[["rollup-plugin-workbox","^8"]],options:{generate:{swDest:"dist/app/esm/sw.js",globDirectory:"dist/app/esm",globPatterns:["**/*.{html,js,css,png,jpg}"],skipWaiting:!0,clientsClaim:!0}},explicit:!0},features:q,packageDevDependencies:X})}function Y6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:q,packageDevDependencies:X})}function J6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:q,packageDevDependencies:X})}function W6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:q,packageDevDependencies:X})}function H6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]],expilicit:!0},features:q,packageDevDependencies:X})}function V6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:q,packageDevDependencies:X})}function K6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:q,packageDevDependencies:X})}function _6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:q,packageDevDependencies:X})}function z6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;if(q.runtime.type==="bun")return;E({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:q,packageDevDependencies:X})}function G6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:q,packageDevDependencies:X})}function U6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;E({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:q,packageDevDependencies:X})}function $6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features;if(q.runtime.type==="bun")return;let Y={};if(q.app?.enabled===!0){if(Y.targets=Y.targets||[],Y.targets.push({src:"./src/app/index.html",dest:q.app.dir}),!Reflect.has(q.app,"copy")){if(!Reflect.has(q,"copy"))q.copy=!0}}E({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:Y},features:q,packageDevDependencies:X})}function M6(Q){let{atom:Z,packageDevDependencies:X}=Q,q=Z.doc.features,Y=q.css&&q.css.enabled!==!1,J=[];if(Y)J.push(["rollup-plugin-postcss","^4"]),J.push(["sass","^1.66"]),(q.css?.options?.plugins||[]).forEach((W)=>{switch(W.name){case"postcss-import":J.push(["postcss-import","^15"]);break;case"postcss-url":J.push(["postcss-url","^10"]);break;case"postcss-preset-env":J.push(["postcss-preset-env","^9"]);break;case"autoprefixer":J.push(["autoprefixer","^10"]);break;case"cssnano":J.push(["cssnano","^6"]);break}});E({feature:{name:"css",packages:J},features:q,packageDevDependencies:X})}function O6({dir:Q,name:Z="index"}){let X=_0.resolve(Q,`./${Z}.tsx`);if(!I8.existsSync(X))X=_0.resolve(Q,`./${Z}.ts`);if(!I8.existsSync(X))X=_0.resolve(Q,`./${Z}.jsx`);if(!I8.existsSync(X))X=_0.resolve(Q,`./${Z}.js`);if(!I8.existsSync(X))return{};let q=X,Y=_0.extname(X);return{file:q,ext:Y,ts:Y===".ts"||Y===".tsx",name:Z}}async function A6(Q){let{atom:Z,context:X,setProgress:q}=Q;q("Initializing features..."),Z.doc.features=Z.doc.features||{};let Y=Z.doc.features;Y.project=Y.project||{},Y.project.format=Y.project.format||Y.project_format||"esm",Y.project_format=Y.project.format,Y.dts_enabled=Y.dts===!0||typeof Y.dts<"u"&&Y.dts!==!1;let J=_0.resolve(X.project.projectDir),H=O6({dir:_0.resolve(J,"./app")});if(H.file){q("Parsing app entry imports...");let A=await f0({file:H.file,recursive:!0}),U=A.all.some((R)=>R.usesJSX===!0&&R.type==="local");Y.app_uses_jsx=U,Y.app_has_entry=!0,A=await f0({file:H.file}),U=A.all.some((R)=>R.usesJSX===!0&&R.type==="local"),Y.app_entry_uses_jsx=U,Y.app_entry_is_ts=H.ts,Y.app_entry_ext=H.ext}let W=O6({dir:_0.resolve(J,"./cli")});if(W.file){q("Parsing cli entry imports...");let A=await f0({file:W.file,recursive:!0}),U=A.all.some((R)=>R.usesJSX===!0&&R.type==="local");Y.cli_uses_jsx=U,Y.cli_has_entry=!0,A=await f0({file:W.file}),U=A.all.some((R)=>R.usesJSX===!0&&R.type==="local"),Y.cli_entry_uses_jsx=U,Y.cli_entry_is_ts=W.ts,Y.cli_entry_ext=W.ext}if(Z.type==="workflow.lib"){let A=O6({dir:_0.resolve(J,"./src")});if(A.file){q("Parsing src entry imports...");let U=await f0({file:A.file,recursive:!0}),R=U.all.some((M)=>M.usesJSX===!0&&M.type==="local");Y.src_uses_jsx=R,Y.src_has_entry=!0,U=await f0({file:A.file}),R=U.all.some((M)=>M.usesJSX===!0&&M.type==="local"),Y.src_entry_uses_jsx=R,Y.src_entry_is_ts=A.ts,Y.src_entry_ext=A.ext}}let V=Reflect.has(Y,"app_entry_uses_jsx")?Y.app_entry_uses_jsx===!0:Y.src_entry_uses_jsx===!0,K=Reflect.has(Y,"cli_entry_uses_jsx")?Y.cli_entry_uses_jsx===!0:Y.src_entry_uses_jsx===!0;if(Y.form_enabled=V||K||Y.form===!0||Y.form?.enabled===!0,Y.multiple_enabled=Y.multiple_enabled||Y.multiple===!0||Y.multiple?.enabled===!0,Y.app===!1)Y.app={enabled:!1};else if(Y.app===!0)Y.app={enabled:!0,extend:Y.app_has_entry===!0,export:!0,react:V};else Y.app={enabled:!0,extend:Y.app_has_entry===!0,export:!0,react:V,...Y.app||{}};if(Y.app.enabled=Y.app.enabled===!0&&(Z.doc.features.form_enabled===!0||Y.app.extend===!0||Y.app.enabled===!0),Y.app.format=Y.app.format||"esm",Y.app.folder=Y.app.folder||Y.app.format||"default",Y.cli===!1)Y.cli={enabled:!1};else if(Y.cli===!0)Y.cli={enabled:!0,extend:Y.cli_has_entry===!0,export:!0,react:K};else Y.cli={enabled:!0,extend:Y.cli_has_entry===!0,export:!0,react:K,...Y.cli||{}};if(Y.cli.enabled=Y.cli.enabled===!0&&(Z.doc.features.form_enabled===!1||Y.cli.extend===!0||Y.cli.enabled===!0),Y.cli.format=Y.cli.format||"esm",Y.cli.folder=Y.cli.folder||Y.cli.folder||"esm",Y.cli.node_options=Y.cli.node?.options||Y.cli.node_options||"",Y.cli.bin=Y.cli.bin||Z.doc.name,Y.cli.installable=Y.cli.installable===!0,Y.cli.enabled)Z.doc["npm::bin"]=Y.cli.bin;Y.json=Y.cli.enabled||Y.json;let z={cjs:{format:"cjs",context:Y.form_enabled?"window":"global",babel:Y.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!0,enabled:Y.cjs!==!1,copy:!1},esm:{format:"esm",context:Y.form_enabled?"window":"global",babel:Y.src_uses_jsx===!0||!1,browser:!1,replace:!0,terser:!1,enabled:Y.esm!==!1,copy:!0},iife:{format:"iife",context:Y.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:Y.iife===!0,terser:!0,copy:!1}},G={targets:{browsers:"last 9 versions, not dead",node:"18"}},_={};if(Y.webos===!0)z.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,input:"./src/app/index.js",output_dir:"./dist/app/webos",copy:!1,babel_options:{targets:{chrome:"79"}}};if(Y.electron===!0)z.electron={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/electron"};if(Y.nextjs===!0)z.nextjs={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/nextjs"};if(Y.ios===!0)z.ios={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/ios"};if(Y.macos===!0)z.macos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,copy:!1,input:"./src/app/index.js",output_dir:"./dist/app/macos"};if(Y.app.enabled===!0)Y.app.dir=`./dist/app/${Y.app.folder}`,Y.app.output={file:`./dist/app/${Y.app.folder}/index.js`,dir:`./dist/app/${Y.app.folder}/`,...Y.app.output||{}},Y.app.input={file:"./src/app/index.js",dir:"./src/app/",...Y.app.input||{}},z.app={format:Y.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:Y.app.input.file,output_dir:Y.app.dir,terser:!0,output_exports:Y.app.export===!1?"none":"auto",browsersync:!0};if(Y.cli.enabled===!0)Y.cli.dir=`./dist/cli/${Y.cli.folder}`,Y.cli.output={file:`./dist/cli/${Y.cli.folder}/index.js`,dir:`./dist/cli/${Y.cli.folder}/`,...Y.cli.output||{}},Y.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...Y.cli.input||{}},z.cli={format:Y.cli.format,context:"global",babel:Y.src_uses_jsx===!0||Y.cli_uses_jsx===!0||!1,browser:!1,replace:!0,enabled:!0,input:Y.cli.input.file,output_dir:Y.cli.dir,banner:"#!/usr/bin/env bun",terser:!0,output_exports:Y.cli.export===!1?"none":"auto"};let O={server:".",startPath:`${_0.normalize(Y.app.dir||".")}`,files:[_0.normalize("./dist/**/*")],cors:!0,open:!1};if(Y.babel_options=u0(G,Y.babel_options||Y.babel?.options),Y.browsersync_options=u0(O,Y.browsersync_options||Y.browsersync?.options||{}),Y.replace_options=u0(_,Y.replace_options||Y.replace?.options||{}),Reflect.has(Y.browsersync_options,"proxy"))delete Y.browsersync_options.server;Y.rollup=Y.rollup||{},Y.rollup_output=u0(z,Y.rollup_output||Y.rollup?.output||{}),Y.preact_enabled=Y.preact===!0||Y.preact&&Y.preact?.enabled!==!1;let $=Object.keys(z);for(let A of $){let U=z[A];if(!U)continue;if(Y.rollup[A]===!1){delete Y.rollup_output[A];continue}if(U.babel_options=U.babel_options||Y.babel_options,U.browsersync_options=u0(Y.browsersync_options,U.browsersync_options),U.replace_options=u0(Y.replace_options,U.replace_options),Y.preact_enabled)U.alias_enabled=!0,U.alias=U.alias||{},U.alias.entries=U.alias.entries||{},U.alias.entries.react="preact/compat",U.alias.entries["react-dom"]="preact/compat";if(Y.form_enabled||Y.babel)U.babel=!0}$=Object.keys(Y.rollup_output),Y.babel_enabled=$.some((A)=>Y.rollup_output[A].babel===!0),Y.browser_enabled=$.some((A)=>Y.rollup_output[A].babel===!0),Y.browsersync_enabled=Y.browsersync!==!1&&$.some((A)=>Y.rollup_output[A].browsersync===!0),Y.browsersync_enabled=Y.browsersync_enabled&&Y.app.enabled,Y.dependency_auto_enabled=Y.dependency_auto!==!1&&Y.dependency_auto?.enabled!==!1,Y.npm_install_flags=Y.npm_install_flags||"",Y.react_version=Y.react_version||Y.react?.version||18,Y.bpmn=Y.bpmn||{},Y.bpmn.enabled=Y.bpmn.enabled!==!1,Y.bpmn.per_flow=Y.bpmn.per_flow===!0,M6(Q),$6(Q),U6(Q),G6(Q),z6(Q),K6(Q),_6(Q),V6(Q),H6(Q),W6(Q),J6(Q),q6(Q),Y6(Q)}import pZ from"@fnet/npm-list-versions";async function R6({atom:Q,packageDependencies:Z,packageDevDependencies:X,setProgress:q}){q("Initializing dependencies");let Y=Q.doc.dependencies||[];if(Y.filter((J)=>!J.dev).forEach((J)=>Z.push(J)),Y.filter((J)=>J.dev).forEach((J)=>X.push(J)),Q.type==="workflow")Z.push({package:"dot-prop",version:"^10"});if(Q.doc.features.form_enabled){if(Q.doc.features.dependency_auto_enabled){let J="^18.2";if(q("Fetching React versions"),J=`^${(await pZ({name:"react",groupBy:{major:!0}})).find((V)=>V[0]===Q.doc.features.react_version.toString())[0]}`,Z.push({package:"react",version:J}),Z.push({package:"react-dom",version:J}),Q.type==="workflow")Z.push({package:"@fnet/react-app",version:"^0.1"}),Z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if(Q.doc.features.preact_enabled)Z.push({package:"preact",version:"^10"});if(Q.doc.features.cli.enabled===!0){if(Z.push({package:"@fnet/args",version:"^0.1"}),Q.doc.features.cli.fargs&&Q.doc.features.cli.fargs?.enabled!==!1)Z.push({package:"@fnet/config",version:"0.2.21"});if(Q.doc.features.cli.mcp&&Q.doc.features.cli.mcp.enabled===!0)Z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),Z.push({package:"express",version:"^4.18"})}if(Q.doc.features.render&&Q.doc.features.render.enabled!==!1)X.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"});if(X.push({package:"@babel/core",version:"^7"}),X.push({package:"@rollup/plugin-commonjs",version:"^28"}),X.push({package:"@rollup/plugin-node-resolve",version:"^16"}),X.push({package:"@rollup/plugin-replace",version:"^6"}),X.push({package:"rollup",version:"^4"}),Q.doc.features.dts_enabled)X.push({package:"rollup-plugin-dts",version:"^6"});if(X.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),X.push({package:"@rollup/plugin-alias",version:"^5"}),X.push({package:"fs-extra",version:"^11"}),Q.doc.features.babel_enabled)X.push({package:"@rollup/plugin-babel",version:"^6"}),X.push({package:"@babel/preset-env",version:"^7"}),X.push({package:"@babel/preset-react",version:"^7"}),Q.doc.features.babel?.options?.plugins?.forEach((J)=>{switch(J[0]){case"@babel/plugin-proposal-decorators":X.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":X.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":X.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":X.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":X.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"});break}});if(X.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),Q.doc.features.browsersync_enabled)X.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}import iZ from"@fnet/npm-list-versions";async function B6({atom:Q,packageDependencies:Z,packageDevDependencies:X,setProgress:q}){q("Initializing dependencies for Bun");let Y=Q.doc.dependencies||[];if(Y.filter((J)=>!J.dev).forEach((J)=>Z.push(J)),Y.filter((J)=>J.dev).forEach((J)=>X.push(J)),Q.type==="workflow")Z.push({package:"dot-prop",version:"^10"});if(Q.doc.features.form_enabled){if(Q.doc.features.dependency_auto_enabled){let J="^18.2";if(q("Fetching React versions"),J=`^${(await iZ({name:"react",groupBy:{major:!0}})).find((V)=>V[0]===Q.doc.features.react_version.toString())[0]}`,Z.push({package:"react",version:J}),Z.push({package:"react-dom",version:J}),Q.type==="workflow")Z.push({package:"@fnet/react-app",version:"^0.1"}),Z.push({package:"@fnet/react-app-state",version:"^0.1"})}}if(Q.doc.features.preact_enabled)Z.push({package:"preact",version:"^10"});if(Q.doc.features.cli.enabled===!0){if(Z.push({package:"@fnet/args",version:"^0.1"}),Q.doc.features.cli.fargs&&Q.doc.features.cli.fargs?.enabled!==!1)Z.push({package:"@fnet/config",version:"0.2.21"});if(Q.doc.features.cli.mcp&&Q.doc.features.cli.mcp.enabled===!0)Z.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),Z.push({package:"express",version:"^4.18"})}if(Q.doc.features.render&&Q.doc.features.render.enabled!==!1)X.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}import t7 from"node:fs";import e7 from"node:path";import aZ from"@flownet/lib-render-templates-dir";async function I6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){if(Q.doc.features.app.enabled!==!0)return;await Z({message:"Creating app folder"});let Y={atom:Q,packageDependencies:q,ts:Date.now()},J=X.templateDir,H=e7.resolve(X.projectDir,"src/app");if(!t7.existsSync(H))t7.mkdirSync(H,{recursive:!0});let W=["index.js.njk"];if(Q.doc.features.app.html!==!1)W.push("index.html.njk");await aZ({pattern:W,dir:e7.resolve(J,"src/app"),outDir:H,context:Y})}import Z9 from"nunjucks";import I0 from"node:fs";import w0 from"node:path";import sZ from"@flownet/lib-parse-imports-js";import nZ from"@fnet/npm-pick-versions";import rZ from"object-hash";import L8 from"node:fs";import Q9 from"node:path";async function C0({projectDir:Q,name:Z,setProgress:X,count:q=1}){let Y,H=rZ(["npm-pick-versions",Z,q]),W=Q9.join(Q,".cache"),V=Q9.join(W,H+".json");if(L8.existsSync(V)){if(X)X(`Picking npm version of ${Z} from cache ...`);Y=JSON.parse(L8.readFileSync(V,"utf8"))}else{if(X)X(`Picking npm version of ${Z} ...`);Y=await nZ({name:Z,count:q}),L8.mkdirSync(W,{recursive:!0}),L8.writeFileSync(V,JSON.stringify(Y),"utf8")}return Y}async function L6({atom:Q,context:Z,packageDependencies:X,packageDevDependencies:q,setProgress:Y}){await Y({message:"Creating package.json."}),X.filter((U)=>U.dev===!0).forEach((U)=>{if(!q.find((M)=>M.package===U.package))q.push(U);let R=X.findIndex((M)=>M.package===U.package);X.splice(R,1)});let H=X.find((U)=>U.package==="react"),W=X.find((U)=>U.package==="react-dom");if(H&&!W)X.push({package:"react-dom",version:H.version});else if(H&&W)W.version=H.version;if(H&&Q.doc.features.react_version>=17){if(!X.find((U)=>U.package==="@emotion/react"))X.push({package:"@emotion/react",version:"^11"});if(!X.find((U)=>U.package==="@emotion/styled"))X.push({package:"@emotion/styled",version:"^11"})}let V=[];if(Q.doc.features.app.enabled===!0)V.push({file:w0.resolve(Z.projectDir,"src/app/index.js"),dev:Q.doc.features.app.dev===!0});if(Q.doc.features.cli.enabled===!0)V.push({file:w0.resolve(Z.projectDir,"src/cli/index.js"),dev:Q.doc.features.cli.dev===!0});for await(let U of V){let R=U.file;if(!I0.existsSync(R))throw Error(`App file not found: ${R}`);let B=(await sZ({file:R,recursive:!0,verbose:!1})).all;for await(let T of B){if(T.type!=="npm")continue;if(X.find((v)=>v.package===T.package))continue;if(q.find((v)=>v.package===T.package))continue;let S=await C0({name:T.package,projectDir:Z.projectDir,setProgress:Y});(U.dev===!0?q:X).push({package:T.package,subpath:T.subpath,version:S.minorRange,type:"npm"})}}for await(let U of X){if(U.version!==void 0)continue;let R=await C0({name:U.package,projectDir:Z.projectDir,setProgress:Y});U.version=R.minorRange}for await(let U of q){if(U.version!==void 0)continue;let R=await C0({name:U.package,projectDir:Z.projectDir,setProgress:Y});U.version=R.minorRange}let K={atom:Q,packageDependencies:X,packageDevDependencies:q},z=Z.templateDir,_=Z9.compile(I0.readFileSync(w0.resolve(z,"package.json.njk"),"utf8"),Z9.configure(z)).render(K),O=Z.projectDir,$=w0.resolve(O,"package.json");I0.writeFileSync($,_,"utf8");let A=w0.resolve(Z.project.projectDir,"fnet");if(I0.existsSync(A)){let U=w0.resolve(Z.projectDir,"fnet");if(!I0.existsSync(U))I0.mkdirSync(U);let R=I0.readdirSync(A);for(let M of R){let B=w0.resolve(A,M);if(!I0.lstatSync(B).isFile())continue;let T=w0.resolve(U,M);I0.copyFileSync(B,T)}}}import X9 from"node:fs";import q9 from"node:path";import oZ from"@flownet/lib-render-templates-dir";async function F6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){if(Q.doc.features.cli.enabled!==!0)return;await Z({message:"Creating cli."});let Y={atom:Q,packageDependencies:q},J=X.templateDir,H=q9.resolve(X.projectDir,"src/cli");if(!X9.existsSync(H))X9.mkdirSync(H,{recursive:!0});await oZ({pattern:["index.js.njk"],dir:q9.resolve(J,"src/cli"),outDir:H,context:Y})}import T6 from"node:fs";import j6 from"node:path";import Y9 from"nunjucks";import tZ from"@flownet/lib-parse-imports-js";async function C6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){await Z({message:"Creating rollup file."});let Y={atom:Q,packageDependencies:q},J=j6.resolve(X.projectDir,"src","default/index.js");if(!T6.existsSync(J))throw Error(`Entry file not found: ${J}`);let W=(await tZ({file:J,recursive:!0})).all.filter((A)=>A.type==="node").map((A)=>A.path),V=Q.doc.features.rollup_output,K=Object.keys(V);for(let A=0;A<K.length;A++){let U=K[A],R=V[U];if(R.browser===!0){if(W.length>0){R.globals_enabled=!0,R.globals=R.globals||[],R.globals=R.globals.concat(W.map((M)=>{return{key:M,value:M}})),R.alias_enabled=!0,R.alias=R.alias||{},R.alias.entries=R.alias.entries||{};for(let M=0;M<W.length;M++){let B=W[M];R.alias.entries[B]=`node:${B}`,R.alias.entries[`node:${B}`]=B}R.external_enabled=!0,R.external=R.external||[],R.external=R.external.concat(W)}}}let z=X.templateDir,_=Y9.compile(T6.readFileSync(j6.resolve(z,"rollup.config.mjs.njk"),"utf8"),Y9.configure(z)).render(Y),O=X.projectDir,$=j6.resolve(O,"rollup.config.mjs");T6.writeFileSync($,_,"utf8")}import w6 from"node:fs";import J9 from"node:path";import W9 from"nunjucks";async function S6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){await Z({message:"Creating build.js file."});let Y={atom:Q,packageDependencies:q},J=X.templateDir,W=W9.compile(w6.readFileSync(J9.resolve(J,"build.js.njk"),"utf8"),W9.configure(J)).render(Y),V=X.projectDir,K=J9.resolve(V,"build.js");w6.writeFileSync(K,W,"utf8"),w6.chmodSync(K,"755")}import N6 from"node:fs";import P6 from"node:path";import eZ from"nunjucks";import Q5 from"ajv/dist/2020.js";import Z5 from"ajv/dist/standalone/index.js";import X5 from"ajv-formats";async function k6({atom:Q,setProgress:Z,context:X,njEnv:q}){if(Q.doc.features.cli.enabled!==!0)return;await Z({message:"Creating input args."});let Y={},J=[];if(Q.doc.input)Y=Q.doc.input;else Y={type:"object",properties:{},required:[]};if(Q.doc.features.cli.fargs&&Q.doc.features.cli.fargs?.enabled!==!1){let R=Q.doc.features.cli.fargs,M={type:"string",description:"Config name to load args",hidden:!1},B={type:"array",description:"Tags to filter the config",hidden:!1};if(Reflect.has(R,"default"))M.default=R.default}let W={imports:J,atom:Q},V=X.templateDir,z=eZ.compile(N6.readFileSync(P6.resolve(V,"src/default/input.args.js.njk"),"utf8"),q).render(W),G=X.projectDir,_=P6.resolve(G,"src/default/input.args.js");N6.writeFileSync(_,z,"utf8");let O=new Q5({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});X5(O);let $=O.compile(Y),U=Z5(O,$)+`
4
4
  export { schema31 as schema };`;N6.writeFileSync(P6.resolve(G,"src/default/validate_input.js"),U,"utf8")}import H9 from"node:fs";import V9 from"node:path";import K9 from"nunjucks";async function D6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){await Z({message:"Creating .gitignore"});let Y={atom:Q,packageDependencies:q},J=X.templateDir,W=K9.compile(H9.readFileSync(V9.resolve(J,".gitignore.njk"),"utf8"),K9.configure(J)).render(Y),V=X.projectDir,K=V9.resolve(V,".gitignore");H9.writeFileSync(K,W,"utf8")}import _9 from"node:fs";import z9 from"node:path";import G9 from"nunjucks";async function b6({atom:Q,setProgress:Z,context:X,packageDependencies:q}){await Z({message:"Creating tsconfig.json."});let Y={atom:Q,packageDependencies:q},J=X.templateDir,W=G9.compile(_9.readFileSync(z9.resolve(J,"tsconfig.json.njk"),"utf8"),G9.configure(J)).render(Y),V=X.projectDir,K=z9.resolve(V,"tsconfig.json");_9.writeFileSync(K,W,"utf8")}import F8 from"nunjucks";import S0 from"node:fs";import v0 from"node:path";import U9 from"@fnet/yaml";async function v6({atom:Q,context:Z,setProgress:X,Atom:q}){if(await X({message:"Creating readme.md"}),Z.project?.readme){let H=Z.projectDir,W={content:Z.project.readme.doc.content},V=v0.resolve(Z.project.projectDir,"fnet/how-to.md");if(S0.existsSync(V)){let A=S0.readFileSync(V,"utf8");W.howto=A}let K=v0.resolve(Z.project.projectDir,"fnet/input.yaml");if(S0.existsSync(K)){let A=await U9({file:K,tags:Z.tags});W.input=A.content}let z=v0.resolve(Z.project.projectDir,"fnet/output.yaml");if(S0.existsSync(z)){let A=await U9({file:z,tags:Z.tags});W.output=A.content}let G=Z.templateDir,O=F8.compile(S0.readFileSync(v0.resolve(G,"readme.md.njk"),"utf8"),F8.configure(G)).render(W),$=v0.resolve(H,"readme.md");S0.writeFileSync($,O,"utf8")}else if(Q.id){let H=await q.first({type:"wiki",parent_id:Q.id});if(!H||H.doc?.["content-type"]!=="markdown")return;let{content:W,...V}=H.doc,K={content:W},z=Z.templateDir,_=F8.compile(S0.readFileSync(v0.resolve(z,"readme.md.njk"),"utf8"),F8.configure(z)).render(K),O=Z.projectDir,$=v0.resolve(O,"readme.md");S0.writeFileSync($,_,"utf8")}}import q5 from"node:path";import $9 from"@fnet/shelljs";async function y6({setProgress:Q,context:Z}){let X=Z.projectDir;await Q({message:"Prettifiying source files."});let q=q5.join("src","**","*");if(M0("bun")){let Y=await $9(`prettier --write ${q} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:X});if(Y.code!==0)throw Error(Y.stderr)}else{let Y=await $9(`prettier --write ${q} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:X});if(Y.code!==0)throw Error(Y.stderr)}}import Y5 from"@fnet/shelljs";async function E6({atom:Q,setProgress:Z,context:X}){if(!Q.doc.features.dts_enabled)return;let q=X.projectDir;if(await Z({message:"Creating .d.ts"}),(await Y5("tsc",{cwd:q})).code!==0)throw Error("Couldnt create .d.ts files.")}import M9 from"@fnet/shelljs";async function x6({setProgress:Q,atom:Z,context:X}){let q=X.projectDir;if(await Q({message:"Installing npm packages."}),M0("bun")){if((await M9(`bun install ${Z.doc.features.npm_install_flags}`,{cwd:q})).code!==0)throw Error("Couldnt install npm packages.")}else if((await M9(`npm install ${Z.doc.features.npm_install_flags}`,{cwd:q})).code!==0)throw Error("Couldnt install npm packages.")}import O9 from"node:fs";import J5 from"node:path";import{spawn as W5}from"node:child_process";async function A9(Q){let{projectDir:Z,scriptName:X,args:q=[],env:Y=process.env,shell:J=!0,detached:H=!0,onSpawn:W}=Q;if(!Z||!X)throw Error("projectDir and scriptName are required");let V=J5.resolve(Z,"package.json");if(!O9.existsSync(V))throw Error(`package.json not found at ${V}`);let K=JSON.parse(O9.readFileSync(V,"utf8")),z=K.scripts?.[X];if(!z){let O=Object.keys(K.scripts||{}).join(", ");throw Error(`Script '${X}' not found. Available: ${O}`)}let G=q.length>0?`${z} ${q.join(" ")}`:z,_=W5(G,[],{cwd:Z,stdio:"inherit",shell:J,detached:H,env:{...Y}});if(W)W(_);return new Promise((O,$)=>{_.on("error",(A)=>{$(Error(`Failed to start '${X}': ${A.message}`))}),_.on("close",(A)=>{O({subprocess:_,exitCode:A})})})}import H5 from"node:path";async function u6({setProgress:Q,context:Z}){let X=Z.projectDir;await Q({message:"Building main project."});let q=Z.dev?"build:dev":"build",Y={...process.env},J=H5.join(X,"node_modules");Y.NODE_PATH=J,Y.NODE_PRESERVE_SYMLINKS=1,await A9({projectDir:X,scriptName:q,shell:!0,detached:!0,env:Y})}var R9=async(Q)=>{let{atom:Z,packageDependencies:X,context:q,deploymentProjectTarget:Y,setProgress:J,deploymentProject:H,yamlTarget:W}=Q;if(Y.enabled!==!0)return;let V=Y.type;try{if(V==="lib")await(await import("./index.nw663a3f.js")).default({...Q});else if(V==="red")await(await import("./index.r2vf2y39.js")).default({...Q});else if(V==="npm")await(await import("./index.8rjk97vr.js")).default({...Q});else if(V==="gcs")await(await import("./index.45cmcbgj.js")).default({...Q});else if(V==="gitlab")await(await import("./index.csewbp01.js")).default({...Q});else if(V==="fnet-package")await(await import("./index.vsdjwxjr.js")).default({...Q});else if(V==="fnet-form")await(await import("./index.5n4c3bt9.js")).default({...Q});else if(V==="fnet-node")await(await import("./index.hjqqrn9q.js")).default({...Q});else if(V==="fnet-flow")await(await import("./index.xgmnb1yb.js")).default({...Q});else if(V==="nextjs")await(await import("./index.88perqhm.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="webos")await(await import("./index.kacxf1cj.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="electron")await(await import("./index.c6w3x23h.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="docker")await(await import("./index.h915z0xh.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="ios")await(await import("./index.f7f1p3sd.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="macos")await(await import("./index.hjf7cfd2.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="rust")await(await import("./index.jw757ba0.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else if(V==="pypi")await(await import("./index.sy0ns8yw.js")).default({atom:Z,target:Y,onProgress:J,projectDir:q.projectDir,dependencies:X,context:q,yamlTarget:W}),H.isDirty=!0;else{console.warn(`No deployer found for type: ${V}`);return}}catch(K){throw console.error(`Error during deployment for type "${V}":`,K),K}};import{Atom as B0}from"@flownet/lib-atom-api-js";import Z1 from"@flownet/lib-parse-node-url";import I9 from"bpmn-moddle";import B9 from"dagre";import g6 from"lodash.clonedeep";var f6={name:"ATOM",uri:"http://atom.org/bpmn",prefix:"atom",types:[{name:"AtomExtension",extends:["bpmn:BaseElement"],properties:[{name:"atom",type:"atom:Atom",isMany:!1}]},{name:"Atom",properties:[{name:"type",type:"String",isAttr:!0}]}]};function L9(Q){let{nodes:Z,nodeIndex:X,root:q}=Q,Y=[],J=new Set,H=(W)=>{if(J.has(W.indexKey))return;if(J.add(W.indexKey),W.hasReturn&&W.type!=="return"){let V=`${W.indexKey}/_inline_end`;if(X[V])return;let K={name:"",type:"return",virtual:!0,parent:W.parent,childs:[],definition:{return:W.definition.return},index:W.parent.childs.length,indexKey:V,pathKey:`${W.pathKey}._inline_end`,codeKey:`${W.codeKey}_inline_end`,context:{next:null},hasReturn:!0,_inlineParent:W};if(Y.push(K),j("bpmn"))x.info(`[INLINE-RETURN] EndEvent: ${K.indexKey} (parent: ${W.indexKey})`)}W.childs.forEach((V)=>H(V))};Z.forEach((W)=>H(W)),Y.forEach((W)=>{W.parent.childs.push(W),X[W.indexKey]=W,Z.push(W)}),Z.forEach((W)=>{let V=[],K=[],z=($)=>{let A=Y.find((U)=>U._inlineParent===$);if(A)V.push({from:$,to:A,type:"bpmn:SequenceFlow"});else if($.context.next){if(V.push({from:$,to:$.context.next,type:"bpmn:SequenceFlow"}),$===W)K.push({to:$.context.next,type:"bpmn:SequenceFlow",next:!0})}$.childs.forEach((U)=>{if($===W){if(W.type==="switch"){if(!(U.indexKey&&U.indexKey.endsWith("/_inline_end")))K.push({to:U,type:"bpmn:SequenceFlow"})}}z(U)})};z(W);let G=V.filter(($)=>$.to.parent.indexKey===W.parent.indexKey).map(($)=>{return{...$,from:W.indexKey,to:$.to.indexKey}}),_=V.filter(($)=>$.to.parent.indexKey!==W.parent.indexKey&&!$.to.indexKey.startsWith(W.indexKey+"/")).map(($)=>{return{...$,from:W.indexKey,to:$.to.indexKey}}),O=K.map(($)=>{return{...$,to:$.to.indexKey}});if(W.bpmn=W.bpmn||{},W.bpmn.edges=h6(G,"to"),W.bpmn.outside=h6(_,"to"),W.bpmn.starts=h6(O,"to"),W.bpmn.type=K5(W),W.bpmn.width=120,W.bpmn.height=80,W.type==="return")W.bpmn.width=36,W.bpmn.height=36;if(W.bpmn.type==="bpmn:CallActivity")W.bpmn.fill="#E1F5FE",W.bpmn.stroke="#0277BD"})}function K5(Q){let Z;if(Q.type==="call"){if(Q.context?.lib?.type==="subworkflow"||Q.context?.lib?.type==="workflow"){if(Z="bpmn:CallActivity",j("bpmn"))x.info(`[CALL] CallActivity (subworkflow): ${Q.indexKey} (${Q.context?.lib?.name||"unknown"})`)}else if(Z="bpmn:ServiceTask",j("bpmn"))x.info(`[CALL] ServiceTask (external): ${Q.indexKey} (${Q.context?.lib?.name||"unknown"})`)}else if(Q.type==="form"){if(Z="bpmn:UserTask",j("bpmn"))x.info(`[FORM] UserTask: ${Q.indexKey}`)}else if(Q.type==="return"){if(Z="bpmn:EndEvent",j("bpmn"))x.info(`[RETURN] EndEvent: ${Q.indexKey}`)}else if(Q.type==="raise"){let X=!1;if(Q.name==="try"&&Q.parent?.type==="tryexcept")X=!0;else{let q=Q.parent;while(q){if(q.name==="try"&&q.parent?.type==="tryexcept"){X=!0;break}q=q.parent}}if(X){if(Z="bpmn:IntermediateThrowEvent",j("bpmn"))x.info(`[RAISE] IntermediateThrowEvent (inside try): ${Q.indexKey}`)}else if(Z="bpmn:EndEvent",j("bpmn"))x.info(`[RAISE] EndEvent (error): ${Q.indexKey}`)}else if(Q.type==="pipeline"){if(Z="bpmn:ServiceTask",j("bpmn"))x.info(`[PIPELINE] ServiceTask (external binary): ${Q.indexKey} (${Q.context?.binaryName||"unknown"})`)}else if(Q.type==="http"){if(Z="bpmn:ServiceTask",j("bpmn"))x.info(`[HTTP] ServiceTask (external API): ${Q.indexKey} (${Q.context?.http?.method||"GET"} ${Q.context?.http?.url||"unknown"})`)}else if(Q.type==="assign"||Q.type==="new"){if(Z="bpmn:ScriptTask",j("bpmn"))x.info(`[${Q.type.toUpperCase()}] ScriptTask: ${Q.indexKey}`)}else if(Z="bpmn:Task",j("bpmn"))x.info(`[${Q.type.toUpperCase()}] Task: ${Q.indexKey}`);return Z}function h6(Q,Z){return Q.filter((X,q,Y)=>{return Y.map((J)=>J[Z]).indexOf(X[Z])===q})}function m6(Q){let{nodes:Z,nodeIndex:X,root:q}=Q,Y=Q.targetNodes||q.childs;Y.forEach((J)=>{let H=J.type==="workflow"||J.type==="subworkflow",W=!H&&J.childs.filter((G)=>!G.virtual).length>0,V=(J.name==="try"||J.name==="except")&&J.parent?.type==="tryexcept",K=J.type==="schedule",z=J.type==="retry";if(W||V||K||z){if(J.bpmn.type="bpmn:SubProcess",J.type==="for"){if(J.bpmn.loopCharacteristics=!0,j("bpmn"))x.info(`[FOR] SubProcess + Loop Marker: ${J.indexKey}`)}if(J.name==="try"&&J.type==="raise"&&J.parent?.type==="tryexcept"){let G=t({location:0,...Q,parent:J,bpmnType:"bpmn:IntermediateThrowEvent",type:"raise",attrs:{},definitions:[{type:"bpmn:ErrorEventDefinition"}]});if(j("bpmn"))x.info(`[VIRTUAL] IntermediateThrowEvent for single-step try block: ${J.indexKey}`)}}if(H||W){let G=J.childs.filter((M)=>M.module!==!0&&!M.indexKey.endsWith("/_inline_end"))[0];J.childs.filter((M)=>M.module===!0).forEach((M)=>{let B=t({...Q,parent:J,bpmnType:"bpmn:IntermediateCatchEvent",type:"inter",definitions:[{type:"bpmn:SignalEventDefinition"}]});B.bpmn.edges=[{from:B.indexKey,to:M.indexKey,type:"bpmn:SequenceFlow"}]});let O=J.childs.find((M)=>M.name==="try"&&J.type==="tryexcept"),$=J.childs.filter((M)=>M.name==="except"&&J.type==="tryexcept");if(O&&$.length)$.forEach((M)=>{let B=t({location:J.childs.indexOf(M),...Q,parent:J,bpmnType:"bpmn:BoundaryEvent",type:"boundary",attrs:{attachedToRef:O},definitions:[{type:"bpmn:ErrorEventDefinition"}]});if(B.bpmn.edges=[{from:B.indexKey,to:M.indexKey,type:"bpmn:SequenceFlow"}],j("bpmn"))x.info(`[TRY-EXCEPT] BoundaryEvent: ${J.indexKey} (try: ${O.indexKey}, except: ${M.indexKey})`)});let A=J.childs.find((M)=>M.type==="raise");if(A){let M=t({...Q,parent:J,bpmnType:"bpmn:EndEvent",type:"end",name:"ERROR",definitions:[{type:"bpmn:ErrorEventDefinition"}]});A.bpmn.edges=[{from:A.indexKey,to:M.indexKey,type:"bpmn:SequenceFlow"}]}if(J.type==="schedule"){let M=J.childs[0];if(M){let B=t({...Q,parent:J,bpmnType:"bpmn:StartEvent",type:"timer-start",definitions:[{type:"bpmn:TimerEventDefinition",timerType:"timeCycle",expression:J.context?.cron||"* * * * *"}]});if(B.bpmn.edges=[{from:B.indexKey,to:M.indexKey,type:"bpmn:SequenceFlow"}],j("bpmn"))x.info(`[SCHEDULE] SubProcess + TimerStartEvent: ${J.indexKey} (cron: ${J.context?.cron})`)}}if(G)if(J.type==="schedule"){if(j("bpmn"))x.info(`[SCHEDULE] Skipping normal StartEvent (using TimerStartEvent): ${J.indexKey}`)}else if(J.type==="retry"){let M=t({...Q,parent:J,bpmnType:"bpmn:StartEvent",type:"start"});if(M.bpmn.edges.push({from:M.indexKey,to:G.indexKey,type:"bpmn:SequenceFlow"}),j("bpmn"))x.info(`[RETRY] SubProcess with loop characteristics: ${J.indexKey} (attempts: ${J.context?.attempts})`)}else if(J.type==="parallel"){let M=t({...Q,parent:J,bpmnType:"bpmn:StartEvent",type:"start"}),B=t({...Q,parent:J,bpmnType:"bpmn:ParallelGateway",type:"fork"}),T=t({...Q,parent:J,bpmnType:"bpmn:ParallelGateway",type:"join"}),S=t({...Q,parent:J,bpmnType:"bpmn:EndEvent",type:"end"});M.bpmn.edges=[{from:M.indexKey,to:B.indexKey,type:"bpmn:SequenceFlow"}];let y=J.childs.filter((v)=>!v.virtual&&!v.module&&!v.indexKey.endsWith("/_inline_end"));if(B.bpmn.edges=y.map((v)=>{return{from:B.indexKey,to:v.indexKey,type:"bpmn:SequenceFlow"}}),y.forEach((v)=>{v.bpmn.edges=[{from:v.indexKey,to:T.indexKey,type:"bpmn:SequenceFlow"}]}),T.bpmn.edges=[{from:T.indexKey,to:S.indexKey,type:"bpmn:SequenceFlow"}],j("bpmn"))x.info(`[PARALLEL] Fork/Join Gateways: ${J.indexKey} (${y.length} children)`)}else if(J.bpmn.starts.length>1){let M=t({...Q,parent:J,bpmnType:"bpmn:StartEvent",type:"start"}),B=t({...Q,parent:J,bpmnType:"bpmn:ExclusiveGateway",type:"switch"});M.bpmn.edges=[{from:M.indexKey,to:B.indexKey,type:"bpmn:SequenceFlow"}],B.bpmn.edges=J.bpmn.starts.map((S)=>{return{...S,from:B.indexKey}});let T=B.bpmn.edges.find((S)=>S.next===!0);if(T){let S=t({...Q,parent:J,bpmnType:"bpmn:EndEvent",type:"end",name:T.to});T.to=S.indexKey}}else{let M=t({...Q,parent:J,bpmnType:"bpmn:StartEvent",type:"start"});M.bpmn.edges.push({from:M.indexKey,to:G.indexKey,type:"bpmn:SequenceFlow"})}else if(j("bpmn"))x.info(`[START-EVENT] skipped (no valid firstNode): ${J.indexKey}`);J.childs.filter((M)=>M.virtual!==!0&&M.bpmn.outside.length&&M.bpmn.type!=="bpmn:EndEvent").forEach((M)=>{M.bpmn.outside.forEach((B)=>{let T=Y.indexOf(J),S=t({...Q,parent:J,bpmnType:"bpmn:EndEvent",type:"end",name:B.to,location:T+1});M.bpmn.edges.push({from:M.indexKey,to:S.indexKey,type:"bpmn:SequenceFlow"})})}),J.childs.filter((M)=>M.virtual!==!0&&M.bpmn.edges.length>1).forEach((M)=>{let B=Y.indexOf(M),T=t({...Q,parent:J,bpmnType:"bpmn:ExclusiveGateway",type:"switch",location:B+1});T.bpmn.edges=M.bpmn.edges.map((S)=>{return{...S,from:T.indexKey}}),M.bpmn.edges=[{from:M.indexKey,to:T.indexKey,type:"bpmn:SequenceFlow"}],M.bpmn.outside=[]})}m6({...Q,targetNodes:J.childs})})}function t(Q){let{parent:Z,nodes:X,nodeIndex:q,bpmnType:Y,type:J,name:H,outside:W,location:V,definitions:K,attrs:z}=Q,G=Z.childs.filter((O)=>O.type===`v${J}`).length;if(j("bpmn"))x.info(`[VIRTUAL] ${J.toUpperCase()} → ${Y}: ${Z.indexKey}/_${J}${G}`);let _={indexKey:`${Z.indexKey}/_${J}${G}`,pathKey:`${Z.pathKey}._${J}${G}`,type:`v${J}`,name:H,bpmn:{edges:[],outside:[],type:Y,width:36,height:36,fill:"#c8e6c9",stroke:"#205022",definitions:K,attrs:z},virtual:!0,childs:[]};return Z.childs.splice(V||0,0,_),X.push(_),q[_.indexKey]=_,_}function c6(Q){let{targetNode:Z,targetFlowElementsContainer:X,targetPlaneElement:q,moddle:Y,elementIndex:J,nodeIndex:H,diagrams:W,nodes:V}=Q;_5(Q),z5(Q),G5(Q),U5(Q)}function _5(Q){let{targetNode:Z,targetFlowElementsContainer:X,targetPlaneElement:q,moddle:Y,elementIndex:J,nodeIndex:H,nodes:W}=Q,V=X.get("flowElements");if(X.$nodes=X.$nodes||[],j("bpmn"))x.info(`[BPMN] Creating elements for: ${Z.indexKey} (${Z.childs.length} children)`);Z.childs.forEach((K)=>{let z=Y.create(K.bpmn.type,{id:`node.${K.pathKey}`,name:K.definition?.title||K.name});if(J[z.id]=z,z.$isNode=!0,z.$node=K,K.$flow=z,X.$nodes.push(z),V.push(z),K.bpmn.type==="bpmn:CallActivity"&&K.context?.lib){if(z.calledElement=K.context.lib.name,j("bpmn"))x.info(`[CREATED] ${K.bpmn.type} (chip!): ${z.id} → ${z.calledElement}`)}else if(j("bpmn"))x.info(`[CREATED] ${K.bpmn.type}: ${z.id}${K.virtual?" (virtual)":""}`);if(K.bpmn.attrs)Object.keys(K.bpmn.attrs).forEach((_)=>{if(_==="attachedToRef")z.set(_,K.bpmn.attrs[_].$flow)});if(K.bpmn.definitions){let G=K.bpmn.definitions.map((_)=>{let O=Y.create(_.type);return Object.keys(_.attrs||{}).forEach((A)=>{O.set(A,_.attrs[A])}),O});z.eventDefinitions=G}if(K.bpmn.loopCharacteristics&&K.bpmn.type==="bpmn:SubProcess"){if(z.loopCharacteristics=Y.create("bpmn:StandardLoopCharacteristics"),j("bpmn"))x.info(`[LOOP] Added loop marker to: ${z.id} (${K.type})`)}})}function z5(Q){let{targetNode:Z,targetFlowElementsContainer:X,targetPlaneElement:q,moddle:Y,elementIndex:J,nodeIndex:H}=Q,W=X.get("flowElements");X.$edges=X.$edges||[],Z.childs.forEach((V)=>{V.bpmn.edges.forEach((z)=>{let G=V,_=H[z.to],O=`edge.${G.pathKey}_${_.pathKey}`;if(J[O])return;let $=J[`node.${G.pathKey}`],A=J[`node.${_.pathKey}`],U=Y.create(z.type,{id:O,sourceRef:$,targetRef:A});J[U.id]=U,U.$is_edge=!0,$.get("outgoing").push(U),A.get("incoming").push(U),X.$edges.push({from:$,to:A,flow:U}),W.push(U)})})}function G5(Q){let{targetNode:Z,targetFlowElementsContainer:X,targetPlaneElement:q,moddle:Y,elementIndex:J,nodeIndex:H}=Q,W=120,V=80,K=160,z=160,G=new B9.graphlib.Graph;G.setDefaultEdgeLabel(()=>({})),G.setGraph({rankdir:"TB",nodesep:120,ranksep:80,xranker:"longest-path"}),X.$nodes.forEach((_)=>{G.setNode(_.id,{width:_.$node?.bpmn.width||120,height:_.$node?.bpmn.height||80,label:_.id})}),X.$edges.forEach((_)=>{G.setEdge(_.from.id,_.to.id)}),B9.layout(G),X.$nodes.forEach((_)=>{let O=G.node(_.id),$=O.width,A=O.height,U=Y.create("bpmndi:BPMNShape",{id:`shape.${_.id}`,bpmnElement:_,bounds:Y.create("dc:Bounds",{x:160+O.x-O.width/2,y:160+O.y-O.height/2,width:$,height:A}),label:Y.create("bpmndi:BPMNLabel")});if(_.$node.bpmn.fill)U.set("bioc:fill",_.$node.bpmn.fill);if(_.$node.bpmn.stroke)U.set("bioc:stroke",_.$node.bpmn.stroke);q.get("planeElement").push(U)}),X.$edges.forEach((_)=>{let O=G.edge(_.from.id,_.to.id),$=Y.create("bpmndi:BPMNEdge",{id:`edge.${_.from.id}_${_.to.id}`,bpmnElement:_.flow,label:Y.create("bpmndi:BPMNLabel")});O.points.forEach((U)=>{let R=Y.create("dc:Point",{x:160+U.x,y:160+U.y});$.get("waypoint").push(R)}),q.get("planeElement").push($)})}function U5(Q){let{targetNode:Z,targetFlowElementsContainer:X,targetPlaneElement:q,moddle:Y,elementIndex:J,nodeIndex:H,diagrams:W}=Q;Z.childs.filter((K)=>K.bpmn.type==="bpmn:SubProcess").forEach((K)=>{let z=J[`node.${K.pathKey}`],G=Y.create("bpmndi:BPMNDiagram",{id:`diagram_${K.pathKey}`});J[G.id]=G,W.push(G);let _=Y.create("bpmndi:BPMNPlane",{id:`plane_${K.pathKey}`});J[_.id]=_,G.plane=_,_.bpmnElement=z,c6({...Q,targetNode:K,targetFlowElementsContainer:z,targetPlaneElement:_})})}async function $5(Q){let Z=Q.root,X=Z.context.index,q=Object.keys(X).map((K)=>X[K]);L9({nodes:q,nodeIndex:X,root:Z}),m6({nodes:q,nodeIndex:X,root:Z});let Y=void 0,J=new I9({atom:f6}),H={},W=J.create("bpmn:Definitions",{id:"definitions_0"});H[W.id]=W;for await(let K of Z.childs){let z=W.get("rootElements"),G=W.get("diagrams"),_=J.create("bpmn:Process",{id:`process_${K.pathKey}`,name:K.name,documentation:[J.create("bpmn:Documentation",{text:`Workflow - ${K.name}`})]});H[_.id]=_,_.isExecutable=!0,z.push(_);let O=J.create("bpmndi:BPMNDiagram",{id:`diagram_${K.pathKey}`});H[O.id]=O,G.push(O);let $=J.create("bpmndi:BPMNPlane",{id:`plane_${K.pathKey}`});H[$.id]=$,O.plane=$,$.bpmnElement=_,c6({targetNode:K,targetFlowElementsContainer:_,targetPlaneElement:$,moddle:J,elementIndex:H,nodeIndex:X,nodes:q,diagrams:G})}let V=await J.toXML(W,{format:!0});return{diagramXML:Y||V.xml}}async function M5(Q){let{root:Z,flowName:X}=Q,q=g6(Z),Y=q.childs.find((T)=>T.name===X);if(!Y)throw Error(`Flow "${X}" not found`);let J={...q,childs:[Y]},H=J.context.index,W=Object.keys(H).map((T)=>H[T]);L9({nodes:W,nodeIndex:H,root:J}),m6({nodes:W,nodeIndex:H,root:J});let V=new I9({atom:f6}),K={},z=V.create("bpmn:Definitions",{id:`definitions_${X}`});K[z.id]=z;let G=z.get("rootElements"),_=z.get("diagrams"),O=V.create("bpmn:Process",{id:`process_${Y.pathKey}`,name:Y.name,documentation:[V.create("bpmn:Documentation",{text:`Workflow - ${Y.name}`})]});K[O.id]=O,O.isExecutable=!0,G.push(O);let $=V.create("bpmndi:BPMNDiagram",{id:`diagram_${Y.pathKey}`});K[$.id]=$,_.push($);let A=V.create("bpmndi:BPMNPlane",{id:`plane_${Y.pathKey}`});return K[A.id]=A,$.plane=A,A.bpmnElement=O,c6({targetNode:Y,targetFlowElementsContainer:O,targetPlaneElement:A,moddle:V,elementIndex:K,nodeIndex:H,nodes:W,diagrams:_}),{diagramXML:(await V.toXML(z,{format:!0})).xml,flowName:Y.name}}async function T8(Q={}){return await $5(g6(Q))}async function F9(Q={}){let Z=g6(Q),{root:X}=Z,q=[];for(let Y of X.childs){let J=await M5({root:X,flowName:Y.name});q.push(J)}return q}import X1 from"@fnet/config";import q1 from"@flownet/lib-parse-imports-js";class j8 extends SyntaxError{constructor(Q,Z,X,q){super(Q);this.expected=Z,this.found=X,this.location=q,this.name="SyntaxError"}format(Q){let Z="Error: "+this.message;if(this.location){let X=null,q=Q.find((W)=>W.source===this.location.source);if(q)X=q.text.split(/\r\n|\n|\r/g);let Y=this.location.start,J=this.location.source&&typeof this.location.source.offset==="function"?this.location.source.offset(Y):Y,H=this.location.source+":"+J.line+":"+J.column;if(X){let W=this.location.end,V="".padEnd(J.line.toString().length," "),K=X[Y.line-1],G=(Y.line===W.line?W.column:K.length+1)-Y.column||1;Z+=`
5
5
  --> `+H+`
@@ -1,3 +1,3 @@
1
1
  import"./index.a0fxx5cv.js";import V from"fs";import $ from"path";import J from"chalk";import C from"@fnet/yaml";import H,{ProcessManager as M}from"@fnet/shell-flow";function L(q){if(Array.isArray(q))return q;if(q&&typeof q==="object"&&q.steps)return q.steps;return q}async function k({projectType:q,group:E,tags:z,args:B,argv:K,processManager:Q}){try{let A=await x(q),{parsed:R}=await C({file:A.path,tags:z}),I=R.commands;if(!I)throw Error(`Commands section not found in ${A.name}`);let D=I[E];if(!D)throw Error(`Command group '${E}' not found in ${A.name}`);let U=L(D);await H({commands:U,context:{args:B,argv:K,projectType:A.type},processManager:Q})}catch(A){console.error(`Error: ${A.message}`),process.exit(1)}}async function T({projectType:q,tags:E}){try{let z=await x(q),{parsed:B}=await C({file:z.path,tags:E}),K=B.commands;if(!K){console.log(J.yellow(`No commands found in ${z.name}`));return}console.log(`
2
2
  ${J.bold("Available commands")} ${J.dim(`(${z.name})`)}:
3
- `);let Q=Object.entries(K),A=Math.max(...Q.map(([I])=>I.length)),R=!1;for(let[I,D]of Q){let U=D&&typeof D==="object"&&!Array.isArray(D),Z=U?D.description||"":"",W=U?D.usage||"":"",X=!!(Z||W);if(X&&R)console.log("");let _=I.padEnd(A);if(X){if(console.log(` ${J.bold.cyan(_)} ${Z}`),W)console.log(` ${"".padEnd(A)} ${J.dim("$ "+W)}`);console.log("")}else console.log(` ${J.cyan(_)}`);R=X}}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function x(q){let E=process.cwd(),z=$.resolve(E,"fnode.yaml"),B=$.resolve(E,"fnet.yaml");if(q==="fnode"){if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}export{k as runCommandGroup,T as listCommandGroups,x as detectProjectFile};
3
+ `);let Q=Object.entries(K),A=Math.max(...Q.map(([I])=>I.length)),R=!1;for(let[I,D]of Q){let U=D&&typeof D==="object"&&!Array.isArray(D),Z=U?D.description||"":"",W=U?D.usage||"":"",X=!!(Z||W);if(X&&R)console.log("");let _=I.padEnd(A);if(X){if(console.log(` ${J.bold.cyan(_)} ${Z}`),W)console.log(` ${"".padEnd(A)} ${J.dim("$ "+W)}`)}else console.log(` ${J.cyan(_)}`);R=X}}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function x(q){let E=process.cwd(),z=$.resolve(E,"fnode.yaml"),B=$.resolve(E,"fnet.yaml");if(q==="fnode"){if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(V.existsSync(z))return{path:z,name:"fnode.yaml",type:"fnode"};if(V.existsSync(B))return{path:B,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}export{k as runCommandGroup,T as listCommandGroups,x as detectProjectFile};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{e as S}from"./index.9qgtmxq3.js";import{f as s}from"./index.05n3mvs9.js";import{i as E}from"./index.a0fxx5cv.js";import Qz from"yargs";import _q from"chalk";import{ProcessManager as Zz}from"@fnet/shell-flow";import k from"node:path";import{spawn as P}from"node:child_process";import f from"node:fs";import x from"chalk";import Rq from"@fnet/config";import{promisify as Fq}from"node:util";import Aq from"tree-kill";var r=Fq(Aq),n=!1;async function m(q,z){if(n)return;if(n=!0,!q.killed&&q.pid)try{if(await r(q.pid,"SIGTERM").catch(()=>{}),await new Promise((Q)=>setTimeout(Q,500)),!q.killed)await r(q.pid,"SIGKILL").catch(()=>{})}catch(Q){}await new Promise((Q)=>setTimeout(Q,100));let Z=z==="SIGINT"?130:z==="SIGTERM"?143:1;process.exit(Z)}function D(q){["SIGINT","SIGTERM","SIGQUIT"].forEach((z)=>{process.once(z,async()=>{await m(q,z)})}),process.on("uncaughtException",async(z)=>{await m(q)}),process.on("unhandledRejection",async(z)=>{await m(q)}),q.on("close",(z)=>{if(!n)process.exit(z)})}function w(q,{name:z,bin:Z,preArgs:Q=[],createContext:$}){if(typeof Z==="function")Z=Z();return q.command(`${z||Z} [commands..]`,`${Z} ${Q.join(" ")}`,(W)=>{return W.help(!1).version(!1)},async(W)=>{try{let G=await $(W),{projectDir:K}=G,O=(F)=>{if(!F.includes(" "))return F;if(process.platform==="win32")return`"${F.replace(/(["^])/g,"^$1")}"`;else return`"${F.replace(/(["\\$`])/g,"\\$1")}"`},H=process.argv.slice(3).map(O),U={...process.env},Y=k.join(K,"node_modules");U.NODE_PATH=Y,U.NODE_PRESERVE_SYMLINKS=1;let X=P(Z,[...Q,...H],{cwd:K,stdio:"inherit",shell:!0,detached:!0,env:U});D(X)}catch(G){console.error(G.message),process.exit(1)}})}function y(q,{name:z,bin:Z,preArgs:Q=[],createContext:$}){return q.command(`${z||Z} [commands..]`,`${Z} ${Q.join(" ")}`,(W)=>{return W.help(!1).version(!1)},async(W)=>{try{let G=await $(W),{projectDir:K}=G,O=(Y)=>{if(!Y.includes(" "))return Y;if(process.platform==="win32")return`"${Y.replace(/(["^])/g,"^$1")}"`;else return`"${Y.replace(/(["\\$`])/g,"\\$1")}"`},H=process.argv.slice(3).map(O);Z=k.join(K,".conda","bin",Z||z);let U=P(Z,[...Q,...H],{cwd:K,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:K}});D(U)}catch(G){console.error(G.message),process.exit(1)}})}function t(q,{name:z,createContext:Z}){return q.command(`${z} <binary> [commands..]`,"Run a binary from conda environment",(Q)=>{return Q.positional("binary",{type:"string",describe:"Binary name to run from .conda/bin"}).help(!1).version(!1)},async(Q)=>{try{let $=await Z(Q),{projectDir:W}=$,G=(Y)=>{if(!Y.includes(" "))return Y;if(process.platform==="win32")return`"${Y.replace(/(["^])/g,"^$1")}"`;else return`"${Y.replace(/(["\\$`])/g,"\\$1")}"`},K=Q.binary,O=process.argv.slice(4).map(G),H=k.join(W,".conda","bin",K),U=P(H,O,{cwd:W,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:W}});D(U)}catch($){console.error($.message),process.exit(1)}})}function e(q,{name:z,preArgs:Z=[],createContext:Q}){return q.command(`${z} <config> <command> [options..]`,"Run a command with a config context",($)=>{return $.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)},async($)=>{try{let W=await Q($),{projectDir:G}=W,K=$.config,H=(await Rq({name:K,dir:G,transferEnv:!1,optional:!0,tags:W.tags}))?.data?.env||void 0,U=$.command,Y=process.argv.slice(5),X=P(U,[...Z,...Y],{cwd:f.existsSync(G)?G:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...H}});D(X)}catch(W){console.error(W.message),process.exit(1)}})}function qq(q,{name:z,projectType:Z="auto",processManager:Q}){return q.command(`${z} group [options..]`,"Run a command group.",($)=>{return $.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)},async($)=>{try{let{runCommandGroup:W}=await import("./index.fyef3yts.js");await W({projectType:Z,group:$.group,tags:$.ftag,args:$,argv:process.argv,processManager:Q})}catch(W){console.error(W.message),process.exit(1)}})}function zq(q,{name:z,createContext:Z}){return q.command(`${z} [options]`,"Install the project as a binary",(Q)=>{return Q.option("name",{alias:"n",describe:"Name to use for the installed binary",type:"string"}).option("force",{alias:"f",describe:"Force overwrite if binary already exists",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Automatically answer yes to all prompts",type:"boolean",default:!1})},async(Q)=>{try{let $=await Z(Q),{projectDir:W}=$;console.log(x.blue("Compiling project..."));let G=k.join(W,".bin");if(!f.existsSync(G))f.mkdirSync(G,{recursive:!0});let K=k.basename(k.dirname(W)),O=$.project?.projectFileParsed?.features?.cli?.bin,H=Q.name||O||K;console.log(x.blue(`Using binary name: ${H}`));let U=k.join(G,H),{spawn:Y}=await import("child_process"),X=Y("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${U}`],{cwd:W,stdio:"inherit",shell:!0});if(await new Promise((b,A)=>{X.on("close",(R)=>{if(R===0)b();else A(Error(`Compilation failed with code ${R}`))}),X.on("error",(R)=>{A(R)})}),process.platform!=="win32")f.chmodSync(U,493);console.log(x.green(`Binary compiled successfully: ${U}`)),console.log(x.blue("Installing binary..."));let F=["install",U];if(Q.name)F.push("--name",Q.name);if(Q.force)F.push("--force");if(Q.yes)F.push("--yes");let C=Y("fbin",F,{stdio:"inherit",shell:!0});await new Promise((b,A)=>{C.on("close",(R)=>{if(R===0)b();else A(Error(`Installation failed with code ${R}`))}),C.on("error",(R)=>{A(R)})})}catch($){console.error(x.red(`Failed to install binary: ${$.message}`)),process.exit(1)}})}import _ from"node:path";import I from"node:fs";import Qq from"@fnet/yaml";import Nq from"yaml";async function V(q){if(q.id)return{id:q.id,buildId:q.buildId,mode:q.mode,protocol:q.protocol||"ac:",templateDir:S("./template/fnode/node"),projectDir:_.resolve(process.cwd(),`./.output/${q.id}`),tags:q.ftag,dev:q.dev,bpmn:q.bpmn===!0};else try{let z=await Bq({tags:q.ftag}),Z=z.runtime.type==="bun"?"node":z.runtime.type;return{buildId:q.buildId,mode:q.mode,protocol:q.protocol||"src:",templateDir:S(`./template/fnode/${Z}`),projectDir:_.resolve(z.projectDir,"./.workspace"),projectSrcDir:_.resolve(z.projectDir,"./src"),projectSrcDirSymlink:_.resolve(z.projectDir,"./.workspace/src-core"),projectAppDir:_.resolve(z.projectDir,"./app"),projectAppDirSymlink:_.resolve(z.projectDir,"./.workspace/app"),projectCliDir:_.resolve(z.projectDir,"./cli"),projectCliDirSymlink:_.resolve(z.projectDir,"./.workspace/cli"),project:z,tags:q.ftag,dev:q.dev,bpmn:q.bpmn===!0}}catch(z){return console.warn(`Warning: Could not load project: ${z.message}`),{projectDir:process.cwd(),tags:q.ftag}}}async function Bq({tags:q}){let z=kq(process.cwd());if(!I.existsSync(z))throw Error("fnode.yaml file not found in current directory.");let{raw:Z,parsed:Q}=await Qq({file:z,tags:q}),$=_.dirname(z);Q.features=Q.features||{};let W=Q.features;if(W.runtime=W.runtime||{},W.runtime.type=W.runtime.type||"node",W.runtime.type==="python")W.runtime.template=W.runtime.template||"python";else if(W.runtime.type==="bun")W.runtime.template=W.runtime.template||"node";else W.runtime.template=W.runtime.template||"node";let G={libraryAtom:{doc:{...Q},fileName:"index"},projectDir:$,projectFilePath:z,projectFileContent:Z,projectFileParsed:Q,runtime:W.runtime},K=_.resolve($,"fnet/targets.yaml");if(!I.existsSync(K)){if(K=_.resolve($,"node.devops.yaml"),I.existsSync(K)){let H=_.resolve($,"fnet");if(!I.existsSync(H))I.mkdirSync(H);I.copyFileSync(K,_.resolve($,"fnet/targets.yaml")),I.unlinkSync(K)}}if(I.existsSync(K)){let{raw:H,parsed:U}=await Qq({file:K,tags:q}),Y=Nq.parseDocument(H);G.devops={filePath:K,fileContent:H,yamlDocument:Y,doc:{...U},type:"library.deploy",save:async()=>{I.writeFileSync(G.devops.filePath,Y.toString())}}}let O=_.resolve($,"readme.md");if(I.existsSync(O)){let H=I.readFileSync(O,"utf8");G.readme={filePath:O,fileContent:H,doc:{content:H,"content-type":"markdown"},type:"wiki"}}return G}function kq(q){let z=_.resolve(q,"node.yaml"),Z=_.resolve(q,"fnode.yaml");if(I.existsSync(Z))return Z;if(I.existsSync(z))try{let Q=I.readFileSync(z,"utf8");return I.writeFileSync(Z,Q,"utf8"),I.unlinkSync(z),console.log(`Migrated node.yaml to fnode.yaml in ${q}`),Z}catch(Q){return console.error(`Error migrating node.yaml to fnode.yaml: ${Q.message}`),z}return Z}import Eq from"node:path";import Zq from"node:fs";import Sq from"node:os";import Dq from"@flownet/lib-render-templates-dir";import c from"@fnet/shelljs";var xq={command:"create",describe:"Create a new fnode project",builder:(q)=>{return q.option("name",{type:"string",describe:"Project name",demandOption:!0}).option("vscode",{type:"boolean",default:!0,alias:"vs",describe:"Open in VS Code after creation"}).option("runtime",{type:"string",default:"node",choices:["node","python","bun"],describe:"Runtime environment"})},handler:async(q)=>{try{let z=process.cwd(),Z=S("./template/fnode/project"),Q=Eq.resolve(z,q.name);if(!Zq.existsSync(Q))Zq.mkdirSync(Q);await Dq({dir:Z,outDir:Q,context:{name:q.name,runtime:q.runtime,platform:Sq.platform()},copyUnmatchedAlso:!0});let $=await c("fnode build",{cwd:Q});if($.code!==0)throw Error("Failed to build project.");if(s("git")){if($=await c("git init --initial-branch=main",{cwd:Q}),$.code!==0)throw Error("Failed to initialize git.")}if(s("code")&&q.vscode){if($=await c(`cd ${Q} && code .`),$.code!==0)throw Error("Failed to open vscode.")}console.log("Creating project succeeded!"),process.exit(0)}catch(z){console.error("Initialization failed!",z.message),process.exit(1)}}},$q=xq;import yq from"node:os";import Cq from"@flownet/lib-render-templates-dir";import bq from"@fnet/shelljs";var fq={command:"project",describe:"Manage fnode project",builder:(q)=>{return q.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"})},handler:async(q)=>{try{let z=S("./template/fnode/project"),Z=process.cwd(),Q=await V(q);if(q.update){if(await Cq({dir:z,outDir:Z,context:{name:Q.project.projectFileParsed.name,runtime:Q.project.runtime.type,platform:yq.platform()},copyUnmatchedAlso:!0}),(await bq("fnode build",{cwd:Z})).code!==0)throw Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(z){console.error("Project failed.",z.message),process.exit(1)}}},Gq=fq;class Wq{static async createBuilder(q){if(!q.project)return console.warn("No project provided, defaulting to node runtime"),new(await import("./index.f9z32b48.js")).default(q);let z=q.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(z))(q)}catch(Z){throw Error(`Failed to create builder for runtime '${z}': ${Z.message}`)}}static async loadBuilderClass(q){switch(q.toLowerCase()){case"node":case"bun":return(await import("./index.f9z32b48.js")).default;case"python":return(await import("./index.hc15cpdb.js")).default;default:throw Error(`Unsupported runtime type: ${q}`)}}}var B=Wq;var Pq={command:"build",describe:"Build fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("mode",{type:"string",default:"build",choices:["all","file","build","deploy","bpmn"],describe:"Build mode"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).option("dev",{type:"boolean",default:!1,describe:"Development mode"}).option("bpmn",{type:"boolean",default:!1,describe:"Generate BPMN diagram"})},handler:async(q)=>{try{let z=await V(q),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Kq=Pq;var vq={command:"build:dev",describe:"Build fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("mode",{type:"string",default:"build",choices:["all","file","build","deploy","bpmn"],describe:"Build mode"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).option("dev",{type:"boolean",default:!1,describe:"Development mode"}).option("bpmn",{type:"boolean",default:!1,describe:"Generate BPMN diagram"})},handler:async(q)=>{try{q.dev=!0;let z=await V(q),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Yq=vq;var jq={command:"deploy",describe:"Build and deploy fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"})},handler:async(q)=>{try{let z=await V({...q,mode:"all"}),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Jq=jq;var uq={command:"file",describe:"Just create files",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"})},handler:async(q)=>{try{let z=await V({...q,mode:"file"}),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Uq=uq;import Hq from"node:path";import v from"node:fs";import gq from"@fnet/prompt";var hq={command:"input [name]",describe:"Create or modify an input config file",builder:(q)=>{return q.positional("name",{type:"string",demandOption:!1,describe:"Input name"})},handler:async(q)=>{try{let z=await V(q),{project:Z}=z,{projectDir:Q,projectFileParsed:$}=Z,W=$.input;if(!W)throw Error("Config schema not found in project file.");if(!Reflect.has(q,"name")){let{inputName:Y}=await gq({type:"input",name:"inputName",message:"Input name:",initial:"dev"});q.name=Y}let G=Hq.resolve(Q,".fnet");if(!v.existsSync(G))v.mkdirSync(G);let K=Hq.resolve(G,`${q.name}.fnet`),O=v.existsSync(K),H=(await import("@fnet/object-from-schema")).default,U=await H({schema:W,format:"yaml",ref:O?K:void 0});v.writeFileSync(K,U)}catch(z){console.error(z.message),process.exit(1)}}},Lq=hq;import M from"node:path";import L from"node:fs";import u from"node:os";import{spawn as g}from"node:child_process";import J from"chalk";import N from"@fnet/prompt";import j from"chalk";import Oq from"@fnet/prompt";async function pq(q){let{items:z,message:Z,nameField:Q="name",valueField:$="name",initialValue:W=null,allowAbort:G=!0}=q;if(!z||z.length===0)return console.log(j.yellow("No items available for selection.")),null;if(z.length===1&&!G){let Y=z[0],X=typeof Y==="string"?Y:Y[$];return console.log(j.blue(`Only one option available: ${typeof Y==="string"?Y:Y[Q]}`)),X}let K=z.map((Y)=>{if(typeof Y==="string")return{name:Y,value:Y,message:Y};else return{name:Y[$],value:Y[$],message:Y[Q]||Y[$]}});if(G)K.push({name:"cancel",value:null,message:j.yellow("Cancel")});let O=null;if(W){let Y=K.findIndex((X)=>X.name===W);if(Y!==-1)O=Y}let H="selectedItem",{[H]:U}=await Oq({type:"select",name:H,message:Z,choices:K,initial:O});if(U==="cancel")return null;return U}async function lq(q){let{items:z,message:Z,nameField:Q="name",valueField:$="name",initialValues:W=[],allowAbort:G=!0}=q;if(!z||z.length===0)return console.log(j.yellow("No items available for selection.")),null;let K=z.map((Y)=>{if(typeof Y==="string")return{name:Y,value:Y,message:Y};else return{name:Y[$],value:Y[$],message:Y[Q]||Y[$]}}),O=[];if(W&&W.length>0)O=K.map((Y,X)=>W.includes(Y.name)?X:-1).filter((Y)=>Y!==-1);let H="selectedItems",U=await Oq({type:"multiselect",name:H,message:Z,choices:K,initial:O,hint:"(Use space to select, enter to confirm)",validate:(Y)=>{if(Y.length===0&&!G)return"Please select at least one item";return!0}});if(G&&U[H].length===0)return null;return U[H]}var i={promptForSelection:pq,promptForMultipleSelection:lq};var T=M.join(u.homedir(),".fnet","express");async function Mq(q){q.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(z)=>{return z.positional("project-name",{describe:"Name of the project",type:"string"}).option("yes",{alias:"y",describe:"Skip all prompts and use defaults",type:"boolean",default:!1}).option("runtime",{describe:"Runtime to use (node, python, bun)",type:"string",choices:["node","python","bun"],default:"node"})},async(z)=>{await dq(z)}).command("list","List express projects",(z)=>{return z.option("today",{describe:"Show only projects created today",type:"boolean",default:!1}).option("type",{describe:"Filter by project type (fnode or fnet)",type:"string",choices:["fnode","fnet"]}).option("all",{describe:"Show all projects regardless of type",type:"boolean",default:!1,alias:"a"}).option("name",{describe:"Filter by project name",type:"string"})},async(z)=>{await mq(z)}).command("open [project-name]","Open an express project",(z)=>{return z.positional("project-name",{describe:"Name of the project to open",type:"string"}).option("latest",{describe:"Open the most recent project",type:"boolean",default:!1})},async(z)=>{await nq(z)}).command("move [project-name] [destination]","Move an express project to a real project location",(z)=>{return z.positional("project-name",{describe:"Name of the project to move",type:"string"}).positional("destination",{describe:"Destination directory",type:"string"}).option("latest",{describe:"Move the most recent project",type:"boolean",default:!1})},async(z)=>{await cq(z)}).command("remove [project-name]","Remove an express project",(z)=>{return z.positional("project-name",{describe:"Name of the project to remove",type:"string"}).option("latest",{describe:"Remove the most recent project",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Skip confirmation prompt",type:"boolean",default:!1})},async(z)=>{await iq(z)}).command("enter [project-name]","Enter the directory of an express project in the active terminal",(z)=>{return z.positional("project-name",{describe:"Name of the project to enter",type:"string"}).option("latest",{describe:"Enter the most recent project directory",type:"boolean",default:!1})},async(z)=>{await oq(z)}).demandCommand(1,"You need to specify a command").help()}async function dq(q){try{if(!L.existsSync(T))L.mkdirSync(T,{recursive:!0});let z=new Date().toISOString().slice(0,10).replace(/-/g,""),Z=M.join(T,z);if(!L.existsSync(Z))L.mkdirSync(Z,{recursive:!0});let Q=q.projectName,$,W=q.runtime;if(!q.yes){if(!Q){let X=L.readdirSync(Z).filter((A)=>A.startsWith("fnode-")).map((A)=>parseInt(A.replace("fnode-",""),10)).filter((A)=>!isNaN(A)),C=`fnode-${X.length>0?Math.max(...X)+1:1}`;Q=(await N([{type:"input",name:"projectName",message:"Enter project name:",default:C}])).projectName}W=(await N({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:W||"node"})).runtime}else{if(!Q){let U=L.readdirSync(Z).filter((X)=>X.startsWith("fnode-")).map((X)=>parseInt(X.replace("fnode-",""),10)).filter((X)=>!isNaN(X));Q=`fnode-${U.length>0?Math.max(...U)+1:1}`}if(!W)W="node"}if($=M.join(Z,Q),L.existsSync($)){let U=1;while(L.existsSync(M.join(Z,`${Q}-${U}`)))U++;Q=`${Q}-${U}`,$=M.join(Z,Q)}if(!q.yes){if(!(await N([{type:"confirm",name:"proceed",message:`Create express project "${Q}" in ${$}?`,default:!0}])).proceed){console.log(J.yellow("Project creation cancelled."));return}}console.log(J.blue(`Creating express project "${Q}" in ${$}...`));let G=M.dirname($),O=["create","--name",M.basename($)];if(O.push("--runtime",W),q.yes)O.push("--yes");if(!L.existsSync(G))L.mkdirSync(G,{recursive:!0});let H=g("fnode",O,{stdio:"inherit",shell:!0,cwd:G});return new Promise((U,Y)=>{H.on("close",(X)=>{if(X===0)if(console.log(J.green(`
2
+ import{e as S}from"./index.9qgtmxq3.js";import{f as s}from"./index.05n3mvs9.js";import{i as E}from"./index.a0fxx5cv.js";import Qz from"yargs";import _q from"chalk";import{ProcessManager as Zz}from"@fnet/shell-flow";import k from"node:path";import{spawn as P}from"node:child_process";import f from"node:fs";import x from"chalk";import Rq from"@fnet/config";import{promisify as Fq}from"node:util";import Aq from"tree-kill";var r=Fq(Aq),n=!1;async function m(q,z){if(n)return;if(n=!0,!q.killed&&q.pid)try{if(await r(q.pid,"SIGTERM").catch(()=>{}),await new Promise((Q)=>setTimeout(Q,500)),!q.killed)await r(q.pid,"SIGKILL").catch(()=>{})}catch(Q){}await new Promise((Q)=>setTimeout(Q,100));let Z=z==="SIGINT"?130:z==="SIGTERM"?143:1;process.exit(Z)}function D(q){["SIGINT","SIGTERM","SIGQUIT"].forEach((z)=>{process.once(z,async()=>{await m(q,z)})}),process.on("uncaughtException",async(z)=>{await m(q)}),process.on("unhandledRejection",async(z)=>{await m(q)}),q.on("close",(z)=>{if(!n)process.exit(z)})}function w(q,{name:z,bin:Z,preArgs:Q=[],createContext:$}){if(typeof Z==="function")Z=Z();return q.command(`${z||Z} [commands..]`,`${Z} ${Q.join(" ")}`,(W)=>{return W.help(!1).version(!1)},async(W)=>{try{let G=await $(W),{projectDir:K}=G,O=(F)=>{if(!F.includes(" "))return F;if(process.platform==="win32")return`"${F.replace(/(["^])/g,"^$1")}"`;else return`"${F.replace(/(["\\$`])/g,"\\$1")}"`},H=process.argv.slice(3).map(O),U={...process.env},Y=k.join(K,"node_modules");U.NODE_PATH=Y,U.NODE_PRESERVE_SYMLINKS=1;let X=P(Z,[...Q,...H],{cwd:K,stdio:"inherit",shell:!0,detached:!0,env:U});D(X)}catch(G){console.error(G.message),process.exit(1)}})}function y(q,{name:z,bin:Z,preArgs:Q=[],createContext:$}){return q.command(`${z||Z} [commands..]`,`${Z} ${Q.join(" ")}`,(W)=>{return W.help(!1).version(!1)},async(W)=>{try{let G=await $(W),{projectDir:K}=G,O=(Y)=>{if(!Y.includes(" "))return Y;if(process.platform==="win32")return`"${Y.replace(/(["^])/g,"^$1")}"`;else return`"${Y.replace(/(["\\$`])/g,"\\$1")}"`},H=process.argv.slice(3).map(O);Z=k.join(K,".conda","bin",Z||z);let U=P(Z,[...Q,...H],{cwd:K,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:K}});D(U)}catch(G){console.error(G.message),process.exit(1)}})}function t(q,{name:z,createContext:Z}){return q.command(`${z} <binary> [commands..]`,"Run a binary from conda environment",(Q)=>{return Q.positional("binary",{type:"string",describe:"Binary name to run from .conda/bin"}).help(!1).version(!1)},async(Q)=>{try{let $=await Z(Q),{projectDir:W}=$,G=(Y)=>{if(!Y.includes(" "))return Y;if(process.platform==="win32")return`"${Y.replace(/(["^])/g,"^$1")}"`;else return`"${Y.replace(/(["\\$`])/g,"\\$1")}"`},K=Q.binary,O=process.argv.slice(4).map(G),H=k.join(W,".conda","bin",K),U=P(H,O,{cwd:W,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:W}});D(U)}catch($){console.error($.message),process.exit(1)}})}function e(q,{name:z,preArgs:Z=[],createContext:Q}){return q.command(`${z} <config> <command> [options..]`,"Run a command with a config context",($)=>{return $.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)},async($)=>{try{let W=await Q($),{projectDir:G}=W,K=$.config,H=(await Rq({name:K,dir:G,transferEnv:!1,optional:!0,tags:W.tags}))?.data?.env||void 0,U=$.command,Y=process.argv.slice(5),X=P(U,[...Z,...Y],{cwd:f.existsSync(G)?G:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...H}});D(X)}catch(W){console.error(W.message),process.exit(1)}})}function qq(q,{name:z,projectType:Z="auto",processManager:Q}){return q.command(`${z} group [options..]`,"Run a command group.",($)=>{return $.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)},async($)=>{try{let{runCommandGroup:W}=await import("./index.2q2ggmej.js");await W({projectType:Z,group:$.group,tags:$.ftag,args:$,argv:process.argv,processManager:Q})}catch(W){console.error(W.message),process.exit(1)}})}function zq(q,{name:z,createContext:Z}){return q.command(`${z} [options]`,"Install the project as a binary",(Q)=>{return Q.option("name",{alias:"n",describe:"Name to use for the installed binary",type:"string"}).option("force",{alias:"f",describe:"Force overwrite if binary already exists",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Automatically answer yes to all prompts",type:"boolean",default:!1})},async(Q)=>{try{let $=await Z(Q),{projectDir:W}=$;console.log(x.blue("Compiling project..."));let G=k.join(W,".bin");if(!f.existsSync(G))f.mkdirSync(G,{recursive:!0});let K=k.basename(k.dirname(W)),O=$.project?.projectFileParsed?.features?.cli?.bin,H=Q.name||O||K;console.log(x.blue(`Using binary name: ${H}`));let U=k.join(G,H),{spawn:Y}=await import("child_process"),X=Y("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${U}`],{cwd:W,stdio:"inherit",shell:!0});if(await new Promise((b,A)=>{X.on("close",(R)=>{if(R===0)b();else A(Error(`Compilation failed with code ${R}`))}),X.on("error",(R)=>{A(R)})}),process.platform!=="win32")f.chmodSync(U,493);console.log(x.green(`Binary compiled successfully: ${U}`)),console.log(x.blue("Installing binary..."));let F=["install",U];if(Q.name)F.push("--name",Q.name);if(Q.force)F.push("--force");if(Q.yes)F.push("--yes");let C=Y("fbin",F,{stdio:"inherit",shell:!0});await new Promise((b,A)=>{C.on("close",(R)=>{if(R===0)b();else A(Error(`Installation failed with code ${R}`))}),C.on("error",(R)=>{A(R)})})}catch($){console.error(x.red(`Failed to install binary: ${$.message}`)),process.exit(1)}})}import _ from"node:path";import I from"node:fs";import Qq from"@fnet/yaml";import Nq from"yaml";async function V(q){if(q.id)return{id:q.id,buildId:q.buildId,mode:q.mode,protocol:q.protocol||"ac:",templateDir:S("./template/fnode/node"),projectDir:_.resolve(process.cwd(),`./.output/${q.id}`),tags:q.ftag,dev:q.dev,bpmn:q.bpmn===!0};else try{let z=await Bq({tags:q.ftag}),Z=z.runtime.type==="bun"?"node":z.runtime.type;return{buildId:q.buildId,mode:q.mode,protocol:q.protocol||"src:",templateDir:S(`./template/fnode/${Z}`),projectDir:_.resolve(z.projectDir,"./.workspace"),projectSrcDir:_.resolve(z.projectDir,"./src"),projectSrcDirSymlink:_.resolve(z.projectDir,"./.workspace/src-core"),projectAppDir:_.resolve(z.projectDir,"./app"),projectAppDirSymlink:_.resolve(z.projectDir,"./.workspace/app"),projectCliDir:_.resolve(z.projectDir,"./cli"),projectCliDirSymlink:_.resolve(z.projectDir,"./.workspace/cli"),project:z,tags:q.ftag,dev:q.dev,bpmn:q.bpmn===!0}}catch(z){return console.warn(`Warning: Could not load project: ${z.message}`),{projectDir:process.cwd(),tags:q.ftag}}}async function Bq({tags:q}){let z=kq(process.cwd());if(!I.existsSync(z))throw Error("fnode.yaml file not found in current directory.");let{raw:Z,parsed:Q}=await Qq({file:z,tags:q}),$=_.dirname(z);Q.features=Q.features||{};let W=Q.features;if(W.runtime=W.runtime||{},W.runtime.type=W.runtime.type||"node",W.runtime.type==="python")W.runtime.template=W.runtime.template||"python";else if(W.runtime.type==="bun")W.runtime.template=W.runtime.template||"node";else W.runtime.template=W.runtime.template||"node";let G={libraryAtom:{doc:{...Q},fileName:"index"},projectDir:$,projectFilePath:z,projectFileContent:Z,projectFileParsed:Q,runtime:W.runtime},K=_.resolve($,"fnet/targets.yaml");if(!I.existsSync(K)){if(K=_.resolve($,"node.devops.yaml"),I.existsSync(K)){let H=_.resolve($,"fnet");if(!I.existsSync(H))I.mkdirSync(H);I.copyFileSync(K,_.resolve($,"fnet/targets.yaml")),I.unlinkSync(K)}}if(I.existsSync(K)){let{raw:H,parsed:U}=await Qq({file:K,tags:q}),Y=Nq.parseDocument(H);G.devops={filePath:K,fileContent:H,yamlDocument:Y,doc:{...U},type:"library.deploy",save:async()=>{I.writeFileSync(G.devops.filePath,Y.toString())}}}let O=_.resolve($,"readme.md");if(I.existsSync(O)){let H=I.readFileSync(O,"utf8");G.readme={filePath:O,fileContent:H,doc:{content:H,"content-type":"markdown"},type:"wiki"}}return G}function kq(q){let z=_.resolve(q,"node.yaml"),Z=_.resolve(q,"fnode.yaml");if(I.existsSync(Z))return Z;if(I.existsSync(z))try{let Q=I.readFileSync(z,"utf8");return I.writeFileSync(Z,Q,"utf8"),I.unlinkSync(z),console.log(`Migrated node.yaml to fnode.yaml in ${q}`),Z}catch(Q){return console.error(`Error migrating node.yaml to fnode.yaml: ${Q.message}`),z}return Z}import Eq from"node:path";import Zq from"node:fs";import Sq from"node:os";import Dq from"@flownet/lib-render-templates-dir";import c from"@fnet/shelljs";var xq={command:"create",describe:"Create a new fnode project",builder:(q)=>{return q.option("name",{type:"string",describe:"Project name",demandOption:!0}).option("vscode",{type:"boolean",default:!0,alias:"vs",describe:"Open in VS Code after creation"}).option("runtime",{type:"string",default:"node",choices:["node","python","bun"],describe:"Runtime environment"})},handler:async(q)=>{try{let z=process.cwd(),Z=S("./template/fnode/project"),Q=Eq.resolve(z,q.name);if(!Zq.existsSync(Q))Zq.mkdirSync(Q);await Dq({dir:Z,outDir:Q,context:{name:q.name,runtime:q.runtime,platform:Sq.platform()},copyUnmatchedAlso:!0});let $=await c("fnode build",{cwd:Q});if($.code!==0)throw Error("Failed to build project.");if(s("git")){if($=await c("git init --initial-branch=main",{cwd:Q}),$.code!==0)throw Error("Failed to initialize git.")}if(s("code")&&q.vscode){if($=await c(`cd ${Q} && code .`),$.code!==0)throw Error("Failed to open vscode.")}console.log("Creating project succeeded!"),process.exit(0)}catch(z){console.error("Initialization failed!",z.message),process.exit(1)}}},$q=xq;import yq from"node:os";import Cq from"@flownet/lib-render-templates-dir";import bq from"@fnet/shelljs";var fq={command:"project",describe:"Manage fnode project",builder:(q)=>{return q.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"})},handler:async(q)=>{try{let z=S("./template/fnode/project"),Z=process.cwd(),Q=await V(q);if(q.update){if(await Cq({dir:z,outDir:Z,context:{name:Q.project.projectFileParsed.name,runtime:Q.project.runtime.type,platform:yq.platform()},copyUnmatchedAlso:!0}),(await bq("fnode build",{cwd:Z})).code!==0)throw Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(z){console.error("Project failed.",z.message),process.exit(1)}}},Gq=fq;class Wq{static async createBuilder(q){if(!q.project)return console.warn("No project provided, defaulting to node runtime"),new(await import("./index.f9z32b48.js")).default(q);let z=q.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(z))(q)}catch(Z){throw Error(`Failed to create builder for runtime '${z}': ${Z.message}`)}}static async loadBuilderClass(q){switch(q.toLowerCase()){case"node":case"bun":return(await import("./index.f9z32b48.js")).default;case"python":return(await import("./index.hc15cpdb.js")).default;default:throw Error(`Unsupported runtime type: ${q}`)}}}var B=Wq;var Pq={command:"build",describe:"Build fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("mode",{type:"string",default:"build",choices:["all","file","build","deploy","bpmn"],describe:"Build mode"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).option("dev",{type:"boolean",default:!1,describe:"Development mode"}).option("bpmn",{type:"boolean",default:!1,describe:"Generate BPMN diagram"})},handler:async(q)=>{try{let z=await V(q),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Kq=Pq;var vq={command:"build:dev",describe:"Build fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("mode",{type:"string",default:"build",choices:["all","file","build","deploy","bpmn"],describe:"Build mode"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).option("dev",{type:"boolean",default:!1,describe:"Development mode"}).option("bpmn",{type:"boolean",default:!1,describe:"Generate BPMN diagram"})},handler:async(q)=>{try{q.dev=!0;let z=await V(q),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Yq=vq;var jq={command:"deploy",describe:"Build and deploy fnode project",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"})},handler:async(q)=>{try{let z=await V({...q,mode:"all"}),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Jq=jq;var uq={command:"file",describe:"Just create files",builder:(q)=>{return q.option("id",{type:"string",describe:"Project ID"}).option("buildId",{type:"string",alias:"bid",describe:"Build ID"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"})},handler:async(q)=>{try{let z=await V({...q,mode:"file"}),Z=await B.createBuilder(z);await Z.init(),await Z.build(),console.log("Building library succeeded!"),process.exit(0)}catch(z){console.error("Building library failed!",z.message),process.exit(1)}}},Uq=uq;import Hq from"node:path";import v from"node:fs";import gq from"@fnet/prompt";var hq={command:"input [name]",describe:"Create or modify an input config file",builder:(q)=>{return q.positional("name",{type:"string",demandOption:!1,describe:"Input name"})},handler:async(q)=>{try{let z=await V(q),{project:Z}=z,{projectDir:Q,projectFileParsed:$}=Z,W=$.input;if(!W)throw Error("Config schema not found in project file.");if(!Reflect.has(q,"name")){let{inputName:Y}=await gq({type:"input",name:"inputName",message:"Input name:",initial:"dev"});q.name=Y}let G=Hq.resolve(Q,".fnet");if(!v.existsSync(G))v.mkdirSync(G);let K=Hq.resolve(G,`${q.name}.fnet`),O=v.existsSync(K),H=(await import("@fnet/object-from-schema")).default,U=await H({schema:W,format:"yaml",ref:O?K:void 0});v.writeFileSync(K,U)}catch(z){console.error(z.message),process.exit(1)}}},Lq=hq;import M from"node:path";import L from"node:fs";import u from"node:os";import{spawn as g}from"node:child_process";import J from"chalk";import N from"@fnet/prompt";import j from"chalk";import Oq from"@fnet/prompt";async function pq(q){let{items:z,message:Z,nameField:Q="name",valueField:$="name",initialValue:W=null,allowAbort:G=!0}=q;if(!z||z.length===0)return console.log(j.yellow("No items available for selection.")),null;if(z.length===1&&!G){let Y=z[0],X=typeof Y==="string"?Y:Y[$];return console.log(j.blue(`Only one option available: ${typeof Y==="string"?Y:Y[Q]}`)),X}let K=z.map((Y)=>{if(typeof Y==="string")return{name:Y,value:Y,message:Y};else return{name:Y[$],value:Y[$],message:Y[Q]||Y[$]}});if(G)K.push({name:"cancel",value:null,message:j.yellow("Cancel")});let O=null;if(W){let Y=K.findIndex((X)=>X.name===W);if(Y!==-1)O=Y}let H="selectedItem",{[H]:U}=await Oq({type:"select",name:H,message:Z,choices:K,initial:O});if(U==="cancel")return null;return U}async function lq(q){let{items:z,message:Z,nameField:Q="name",valueField:$="name",initialValues:W=[],allowAbort:G=!0}=q;if(!z||z.length===0)return console.log(j.yellow("No items available for selection.")),null;let K=z.map((Y)=>{if(typeof Y==="string")return{name:Y,value:Y,message:Y};else return{name:Y[$],value:Y[$],message:Y[Q]||Y[$]}}),O=[];if(W&&W.length>0)O=K.map((Y,X)=>W.includes(Y.name)?X:-1).filter((Y)=>Y!==-1);let H="selectedItems",U=await Oq({type:"multiselect",name:H,message:Z,choices:K,initial:O,hint:"(Use space to select, enter to confirm)",validate:(Y)=>{if(Y.length===0&&!G)return"Please select at least one item";return!0}});if(G&&U[H].length===0)return null;return U[H]}var i={promptForSelection:pq,promptForMultipleSelection:lq};var T=M.join(u.homedir(),".fnet","express");async function Mq(q){q.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(z)=>{return z.positional("project-name",{describe:"Name of the project",type:"string"}).option("yes",{alias:"y",describe:"Skip all prompts and use defaults",type:"boolean",default:!1}).option("runtime",{describe:"Runtime to use (node, python, bun)",type:"string",choices:["node","python","bun"],default:"node"})},async(z)=>{await dq(z)}).command("list","List express projects",(z)=>{return z.option("today",{describe:"Show only projects created today",type:"boolean",default:!1}).option("type",{describe:"Filter by project type (fnode or fnet)",type:"string",choices:["fnode","fnet"]}).option("all",{describe:"Show all projects regardless of type",type:"boolean",default:!1,alias:"a"}).option("name",{describe:"Filter by project name",type:"string"})},async(z)=>{await mq(z)}).command("open [project-name]","Open an express project",(z)=>{return z.positional("project-name",{describe:"Name of the project to open",type:"string"}).option("latest",{describe:"Open the most recent project",type:"boolean",default:!1})},async(z)=>{await nq(z)}).command("move [project-name] [destination]","Move an express project to a real project location",(z)=>{return z.positional("project-name",{describe:"Name of the project to move",type:"string"}).positional("destination",{describe:"Destination directory",type:"string"}).option("latest",{describe:"Move the most recent project",type:"boolean",default:!1})},async(z)=>{await cq(z)}).command("remove [project-name]","Remove an express project",(z)=>{return z.positional("project-name",{describe:"Name of the project to remove",type:"string"}).option("latest",{describe:"Remove the most recent project",type:"boolean",default:!1}).option("yes",{alias:"y",describe:"Skip confirmation prompt",type:"boolean",default:!1})},async(z)=>{await iq(z)}).command("enter [project-name]","Enter the directory of an express project in the active terminal",(z)=>{return z.positional("project-name",{describe:"Name of the project to enter",type:"string"}).option("latest",{describe:"Enter the most recent project directory",type:"boolean",default:!1})},async(z)=>{await oq(z)}).demandCommand(1,"You need to specify a command").help()}async function dq(q){try{if(!L.existsSync(T))L.mkdirSync(T,{recursive:!0});let z=new Date().toISOString().slice(0,10).replace(/-/g,""),Z=M.join(T,z);if(!L.existsSync(Z))L.mkdirSync(Z,{recursive:!0});let Q=q.projectName,$,W=q.runtime;if(!q.yes){if(!Q){let X=L.readdirSync(Z).filter((A)=>A.startsWith("fnode-")).map((A)=>parseInt(A.replace("fnode-",""),10)).filter((A)=>!isNaN(A)),C=`fnode-${X.length>0?Math.max(...X)+1:1}`;Q=(await N([{type:"input",name:"projectName",message:"Enter project name:",default:C}])).projectName}W=(await N({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:W||"node"})).runtime}else{if(!Q){let U=L.readdirSync(Z).filter((X)=>X.startsWith("fnode-")).map((X)=>parseInt(X.replace("fnode-",""),10)).filter((X)=>!isNaN(X));Q=`fnode-${U.length>0?Math.max(...U)+1:1}`}if(!W)W="node"}if($=M.join(Z,Q),L.existsSync($)){let U=1;while(L.existsSync(M.join(Z,`${Q}-${U}`)))U++;Q=`${Q}-${U}`,$=M.join(Z,Q)}if(!q.yes){if(!(await N([{type:"confirm",name:"proceed",message:`Create express project "${Q}" in ${$}?`,default:!0}])).proceed){console.log(J.yellow("Project creation cancelled."));return}}console.log(J.blue(`Creating express project "${Q}" in ${$}...`));let G=M.dirname($),O=["create","--name",M.basename($)];if(O.push("--runtime",W),q.yes)O.push("--yes");if(!L.existsSync(G))L.mkdirSync(G,{recursive:!0});let H=g("fnode",O,{stdio:"inherit",shell:!0,cwd:G});return new Promise((U,Y)=>{H.on("close",(X)=>{if(X===0)if(console.log(J.green(`
3
3
  Express project "${Q}" created successfully!`)),console.log(J.blue(`
4
4
  Project location: ${$}`)),!q.yes)sq($);else U();else console.error(J.red(`
5
5
  Failed to create express project "${Q}".`)),Y(Error(`Process exited with code ${X}`))})})}catch(z){console.error(J.red(`Error creating express project: ${z.message}`)),process.exit(1)}}async function mq(q){try{if(!L.existsSync(T)){console.log(J.yellow("No express projects found."));return}let z=L.readdirSync(T).filter((G)=>/^\d{8}$/.test(G)).sort((G,K)=>K.localeCompare(G));if(q.today){let G=new Date().toISOString().slice(0,10).replace(/-/g,""),K=z.indexOf(G);if(K===-1){console.log(J.yellow("No express projects found for today."));return}z.splice(0,K),z.splice(1)}let Z=[];if(!q.type&&!q.all)q.type="fnode";for(let G of z){let K=M.join(T,G),O=L.readdirSync(K);for(let H of O){let U=M.join(K,H),Y=L.statSync(U),X="unknown";if(H.startsWith("fnode-")||L.existsSync(M.join(U,"fnode.yaml")))X="fnode";else if(H.startsWith("fnet-")||L.existsSync(M.join(U,"fnet.yaml")))X="fnet";if(q.type&&X!==q.type)continue;if(q.name&&!H.includes(q.name))continue;let F=`${G.slice(0,4)}-${G.slice(4,6)}-${G.slice(6,8)}`;Z.push({name:H,type:X,date:F,path:U,created:Y.birthtime})}}if(Z.sort((G,K)=>K.created-G.created),Z.length===0){console.log(J.yellow("No express projects found matching the criteria."));return}console.log(J.blue(`
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import C from"yargs";import{hideBin as T}from"yargs/helpers";import{ProcessManager as Y}from"@fnet/shell-flow";import _ from"fs";import x from"path";import W from"chalk";import H from"@fnet/yaml";import b,{ProcessManager as y}from"@fnet/shell-flow";function w(q){if(Array.isArray(q))return q;if(q&&typeof q==="object"&&q.steps)return q.steps;return q}async function L({projectType:q,group:A,tags:D,args:E,argv:J,processManager:U}){try{let I=await S(q),{parsed:X}=await H({file:I.path,tags:D}),V=X.commands;if(!V)throw Error(`Commands section not found in ${I.name}`);let Q=V[A];if(!Q)throw Error(`Command group '${A}' not found in ${I.name}`);let Z=w(Q);await b({commands:Z,context:{args:E,argv:J,projectType:I.type},processManager:U})}catch(I){console.error(`Error: ${I.message}`),process.exit(1)}}async function O({projectType:q,tags:A}){try{let D=await S(q),{parsed:E}=await H({file:D.path,tags:A}),J=E.commands;if(!J){console.log(W.yellow(`No commands found in ${D.name}`));return}console.log(`
3
3
  ${W.bold("Available commands")} ${W.dim(`(${D.name})`)}:
4
- `);let U=Object.entries(J),I=Math.max(...U.map(([V])=>V.length)),X=!1;for(let[V,Q]of U){let Z=Q&&typeof Q==="object"&&!Array.isArray(Q),K=Z?Q.description||"":"",$=Z?Q.usage||"":"",z=!!(K||$);if(z&&X)console.log("");let R=V.padEnd(I);if(z){if(console.log(` ${W.bold.cyan(R)} ${K}`),$)console.log(` ${"".padEnd(I)} ${W.dim("$ "+$)}`);console.log("")}else console.log(` ${W.cyan(R)}`);X=z}}catch(D){console.error(`Error: ${D.message}`),process.exit(1)}}async function S(q){let A=process.cwd(),D=x.resolve(A,"fnode.yaml"),E=x.resolve(A,"fnet.yaml");if(q==="fnode"){if(_.existsSync(D))return{path:D,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(_.existsSync(E))return{path:E,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(_.existsSync(D))return{path:D,name:"fnode.yaml",type:"fnode"};if(_.existsSync(E))return{path:E,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}function B({processManager:q}){return{command:"$0 [group] [options..]",describe:"Run a command group from project file",builder:(A)=>{return A.parserConfiguration({}).middleware((D)=>{let E=/^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)+$/;Object.keys(D).forEach((J)=>{if(E.test(J)){let U=J.replace(/-/g,"_");D[U]=D[J]}})}).positional("group",{type:"string",describe:"Command group to run"}).option("list",{type:"boolean",describe:"List all available command groups",alias:"l"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).example("$0 build","Run the build command group").example("$0 --list","List all available command groups").example("$0 test --ftag dev","Run the test command group with dev tag")},handler:async(A)=>{try{if(A.list){await O({projectType:"auto",tags:A.ftag});return}if(!A.group)console.error("Error: Please specify a command group or use --list to see available commands."),process.exit(1);await L({projectType:"auto",group:A.group,tags:A.ftag,args:A,argv:process.argv,processManager:q})}catch(D){console.error(`Error: ${D.message}`),await q.dispose(),process.exit(1)}}}}var N=new Y;C(T(process.argv)).scriptName("frun").usage("Usage: $0 <command> [options]").command(B({processManager:N})).help().version("1.5.0").fail(async(q,A)=>{if(A)console.error(`Error: ${A.message}`);else if(q)console.error(`Error: ${q}`);await N.dispose(),process.exit(1)}).parse();
4
+ `);let U=Object.entries(J),I=Math.max(...U.map(([V])=>V.length)),X=!1;for(let[V,Q]of U){let Z=Q&&typeof Q==="object"&&!Array.isArray(Q),K=Z?Q.description||"":"",$=Z?Q.usage||"":"",z=!!(K||$);if(z&&X)console.log("");let R=V.padEnd(I);if(z){if(console.log(` ${W.bold.cyan(R)} ${K}`),$)console.log(` ${"".padEnd(I)} ${W.dim("$ "+$)}`)}else console.log(` ${W.cyan(R)}`);X=z}}catch(D){console.error(`Error: ${D.message}`),process.exit(1)}}async function S(q){let A=process.cwd(),D=x.resolve(A,"fnode.yaml"),E=x.resolve(A,"fnet.yaml");if(q==="fnode"){if(_.existsSync(D))return{path:D,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(q==="fnet"){if(_.existsSync(E))return{path:E,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(_.existsSync(D))return{path:D,name:"fnode.yaml",type:"fnode"};if(_.existsSync(E))return{path:E,name:"fnet.yaml",type:"fnet"};throw Error("No project file (fnode.yaml or fnet.yaml) found in current directory")}function B({processManager:q}){return{command:"$0 [group] [options..]",describe:"Run a command group from project file",builder:(A)=>{return A.parserConfiguration({}).middleware((D)=>{let E=/^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)+$/;Object.keys(D).forEach((J)=>{if(E.test(J)){let U=J.replace(/-/g,"_");D[U]=D[J]}})}).positional("group",{type:"string",describe:"Command group to run"}).option("list",{type:"boolean",describe:"List all available command groups",alias:"l"}).option("ftag",{type:"array",describe:"Tags for conditional configuration"}).example("$0 build","Run the build command group").example("$0 --list","List all available command groups").example("$0 test --ftag dev","Run the test command group with dev tag")},handler:async(A)=>{try{if(A.list){await O({projectType:"auto",tags:A.ftag});return}if(!A.group)console.error("Error: Please specify a command group or use --list to see available commands."),process.exit(1);await L({projectType:"auto",group:A.group,tags:A.ftag,args:A,argv:process.argv,processManager:q})}catch(D){console.error(`Error: ${D.message}`),await q.dispose(),process.exit(1)}}}}var N=new Y;C(T(process.argv)).scriptName("frun").usage("Usage: $0 <command> [options]").command(B({processManager:N})).help().version("1.5.0").fail(async(q,A)=>{if(A)console.error(`Error: ${A.message}`);else if(q)console.error(`Error: ${q}`);await N.dispose(),process.exit(1)}).parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "files": [
5
5
  "dist",
6
6
  "template",