@fnet/cli 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fbin/index.js +1 -1
- package/dist/fnet/index.68132vn6.js +3 -0
- package/dist/fnet/index.js +2 -2
- package/dist/fnode/index.js +2 -2
- package/dist/fnode/index.wyb1c48x.js +3 -0
- package/dist/frun/index.js +3 -3
- package/dist/fservice/index.js +1 -1
- package/package.json +1 -1
- package/dist/fnet/index.hzcer2ks.js +0 -3
- package/dist/fnode/index.fyef3yts.js +0 -3
package/dist/fbin/index.js
CHANGED
|
@@ -12,4 +12,4 @@ echo Path updated successfully`;default:return`export PATH="${Y}:$PATH"`}}async
|
|
|
12
12
|
# Added by @fnet/cli
|
|
13
13
|
${Q}
|
|
14
14
|
`;if(I.writeFileSync(Y,K),$==="powershell"||$==="powershell-core")console.log(D.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(D.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"));return!0}catch(Z){return console.error(D.red(`Failed to add bin directory to PATH: ${Z.message}`)),!1}}function g(){return E.join(y.homedir(),".fnet","backups")}function L1(){let $=new Date().toISOString().replace(/:/g,"-").replace(/\..+/,""),Y=E.join(g(),$);if(!I.existsSync(Y))I.mkdirSync(Y,{recursive:!0});return Y}function R1($,Y,J=null){try{if(!I.existsSync($))return!1;let G=J||E.basename($),Z=E.join(Y,G),Q=E.dirname(Z);if(!I.existsSync(Q))I.mkdirSync(Q,{recursive:!0});return I.copyFileSync($,Z),!0}catch(G){return console.error(D.red(`Failed to backup file ${$}: ${G.message}`)),!1}}function W1($,Y={}){let J={timestamp:new Date().toISOString(),type:Y.type||"manual",message:Y.message||"",command:Y.command||"",files:Y.files||[],...Y},G=E.join($,"metadata.json");I.writeFileSync(G,JSON.stringify(J,null,2))}function o1(){let $=g();if(!I.existsSync($))return[];let Y=[],J=I.readdirSync($);for(let G of J){let Z=E.join($,G),Q=I.statSync(Z);if(Q.isDirectory()&&G!=="latest"){let H=E.join(Z,"metadata.json"),K={};if(I.existsSync(H))try{K=JSON.parse(I.readFileSync(H,"utf8"))}catch(_){}Y.push({timestamp:G,path:Z,created:Q.mtime,...K})}}return Y.sort((G,Z)=>new Date(Z.created)-new Date(G.created)),Y}function E1($){let Y=E.join(g(),"latest");try{if(I.existsSync(Y))I.unlinkSync(Y);if(process.platform==="win32")I.writeFileSync(Y+".txt",$);else I.symlinkSync($,Y)}catch(J){console.warn(D.yellow(`Could not create latest symlink: ${J.message}`))}}var R={getBinDirectory:Z1,getMetadataDirectory:e,getMetadataFilePath:_1,checkIfInPath:f1,detectUserShell:G1,getShellConfigPath:b1,getAllShellConfigPaths:K1,createBinDirectoryStructure:g1,getExportPathCommand:H1,addBinToPath:h1,getBackupDirectory:g,createBackupDirectory:L1,backupFile:R1,createBackupMetadata:W1,listBackups:o1,updateLatestSymlink:E1};import h from"node:path";import{fileURLToPath as l1}from"node:url";import I1 from"node:os";import o from"node:fs";var JY=h.dirname(l1(import.meta.url));function M1(){}function O1(){let $=I1.homedir(),Y=h.join($,".fnet","bin");if(!o.existsSync(Y))o.mkdirSync(Y,{recursive:!0});return Y}function V1(){let $=I1.homedir(),Y=h.join($,".fnet");if(!o.existsSync(Y))o.mkdirSync(Y,{recursive:!0});return h.join(Y,"bin-registry.json")}import U1 from"node:fs";async function z($){let Y=O1(),J=V1(),G={};if(U1.existsSync(J))try{let Z=U1.readFileSync(J,"utf8");G=JSON.parse(Z)}catch(Z){console.warn(`Warning: Could not parse bin registry: ${Z.message}`)}return{binDir:Y,registryPath:J,registry:G,args:$}}var c1="setup",s1="Initialize the bin system",r1={yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},i1=async($)=>{try{let Y=await z($);console.log(O.blue("Setting up the bin system...")),await R.createBinDirectoryStructure();let J=R.getBinDirectory();if(console.log(O.green(`Bin directory: ${J}`)),!R.checkIfInPath(J)){console.log(O.yellow("Bin directory is not in PATH."));let Z=$.yes;if(!$.yes)Z=(await v({type:"confirm",name:"confirmAddToPath",message:`Would you like to add ${J} to your PATH?`,initial:!0})).confirmAddToPath;else console.log(O.yellow("Auto-confirming to add bin directory to PATH due to --yes flag"));if(Z){let Q=R.detectUserShell();if(Q==="unknown")if($.yes)Q=process.platform==="win32"?"powershell":"bash",console.log(O.yellow(`Auto-selecting ${Q} shell due to --yes flag`));else{let{selectedShell:L}=await v({type:"select",name:"selectedShell",message:"Select your shell:",choices:[{name:"bash",message:"Bash"},{name:"zsh",message:"Zsh"},{name:"fish",message:"Fish"},{name:"powershell",message:"PowerShell"},{name:"powershell-core",message:"PowerShell Core"},{name:"cmd",message:"Windows Command Prompt"},{name:"ksh",message:"Korn Shell (ksh)"},{name:"csh",message:"C Shell (csh/tcsh)"}]});Q=L}else if($.yes)console.log(O.yellow(`Auto-confirming detected shell: ${Q} due to --yes flag`));else{let{confirmShell:L}=await v({type:"confirm",name:"confirmShell",message:`Detected shell: ${Q}. Is this correct?`,initial:!0});if(!L){let{selectedShell:X}=await v({type:"select",name:"selectedShell",message:"Select your shell:",choices:[{name:"bash",message:"Bash"},{name:"zsh",message:"Zsh"},{name:"fish",message:"Fish"},{name:"powershell",message:"PowerShell"},{name:"powershell-core",message:"PowerShell Core"},{name:"cmd",message:"Windows Command Prompt"},{name:"ksh",message:"Korn Shell (ksh)"},{name:"csh",message:"C Shell (csh/tcsh)"}]});Q=X}}let H=R.getAllShellConfigPaths(Q),K;if(H.length>1){let L=H.filter((X)=>n1.existsSync(X.path));if(L.length>0)if($.yes)K=L[0].path,console.log(O.yellow(`Auto-selecting config file: ${K} due to --yes flag`));else{let{selectedConfigPath:X}=await v({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:L.map((q)=>({name:q.path,message:`${q.name} (${q.path})`}))});K=X}else if($.yes)K=H[0].path,console.log(O.yellow(`Auto-selecting config file to create: ${K} due to --yes flag`));else{let{selectedConfigPath:X}=await v({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:H.map((q)=>({name:q.path,message:`${q.name} (${q.path})`}))});K=X}}else if(H.length===1)K=H[0].path;else if($.yes)K=z1.join(w1.homedir(),process.platform==="win32"?"_profile":".bashrc"),console.log(O.yellow(`Auto-selecting default config file: ${K} due to --yes flag`));else{let{enteredConfigPath:L}=await v({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:z1.join(w1.homedir(),".bashrc")});K=L}if(await R.addBinToPath(Q,K,J))console.log(O.green(`Added bin directory to PATH in ${K}`)),console.log(O.yellow("Please restart your terminal or run the following command:")),console.log(O.green(`source ${K}`));else console.log(O.red(`Failed to add bin directory to PATH in ${K}`)),console.log(O.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(O.green(R.getExportPathCommand(Q,J)))}else console.log(O.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(O.green(`export PATH="${J}:$PATH"`)),console.log(O.yellow("Or run:")),console.log(O.green("fbin path"))}else console.log(O.green("Bin directory is already in PATH."));console.log(O.green("Bin system setup completed successfully."))}catch(Y){console.error(O.red(`Failed to set up bin system: ${Y.message}`)),process.exit(1)}},T1={command:c1,describe:s1,builder:r1,handler:i1};import N1 from"node:path";import t1 from"node:fs";import A1 from"node:os";import A from"chalk";import u from"@fnet/prompt";var e1="path",a1="Add bin directory to PATH",$$={yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},Y$=async($)=>{try{let Y=await z($),J=R.getBinDirectory();if(console.log(A.blue(`Adding ${J} to PATH...`)),!R.createBinDirectoryStructure())console.log(A.yellow("Creating bin directory structure...")),await R.createBinDirectoryStructure();if(R.checkIfInPath(J)){console.log(A.green("Bin directory is already in PATH."));return}let Z=R.detectUserShell();if(Z==="unknown")if($.yes)Z=process.platform==="win32"?"powershell":"bash",console.log(A.yellow(`Auto-selecting ${Z} shell due to --yes flag`));else{let{selectedShell:_}=await u({type:"select",name:"selectedShell",message:"Select your shell:",choices:[{name:"bash",message:"Bash"},{name:"zsh",message:"Zsh"},{name:"fish",message:"Fish"},{name:"powershell",message:"PowerShell"},{name:"powershell-core",message:"PowerShell Core"},{name:"cmd",message:"Windows Command Prompt"},{name:"ksh",message:"Korn Shell (ksh)"},{name:"csh",message:"C Shell (csh/tcsh)"}]});Z=_}else if($.yes)console.log(A.yellow(`Auto-confirming detected shell: ${Z} due to --yes flag`));else{let{confirmShell:_}=await u({type:"confirm",name:"confirmShell",message:`Detected shell: ${Z}. Is this correct?`,initial:!0});if(!_){let{selectedShell:L}=await u({type:"select",name:"selectedShell",message:"Select your shell:",choices:[{name:"bash",message:"Bash"},{name:"zsh",message:"Zsh"},{name:"fish",message:"Fish"},{name:"powershell",message:"PowerShell"},{name:"powershell-core",message:"PowerShell Core"},{name:"cmd",message:"Windows Command Prompt"},{name:"ksh",message:"Korn Shell (ksh)"},{name:"csh",message:"C Shell (csh/tcsh)"}]});Z=L}}let Q=R.getAllShellConfigPaths(Z),H;if(Q.length>1){let _=Q.filter((L)=>t1.existsSync(L.path));if(_.length>0)if($.yes)H=_[0].path,console.log(A.yellow(`Auto-selecting config file: ${H} due to --yes flag`));else{let{selectedConfigPath:L}=await u({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:_.map((X)=>({name:X.path,message:`${X.name} (${X.path})`}))});H=L}else if($.yes)H=Q[0].path,console.log(A.yellow(`Auto-selecting config file to create: ${H} due to --yes flag`));else{let{selectedConfigPath:L}=await u({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:Q.map((X)=>({name:X.path,message:`${X.name} (${X.path})`}))});H=L}}else if(Q.length===1)H=Q[0].path;else if($.yes)H=N1.join(A1.homedir(),process.platform==="win32"?"_profile":".bashrc"),console.log(A.yellow(`Auto-selecting default config file: ${H} due to --yes flag`));else{let{enteredConfigPath:_}=await u({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:N1.join(A1.homedir(),".bashrc")});H=_}if(await R.addBinToPath(Z,H,J))console.log(A.green(`Added bin directory to PATH in ${H}`)),console.log(A.yellow("Please restart your terminal or run the following command:")),console.log(A.green(`source ${H}`));else console.log(A.red(`Failed to add bin directory to PATH in ${H}`)),console.log(A.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(A.green(R.getExportPathCommand(Z,J)))}catch(Y){console.error(A.red(`Failed to add bin directory to PATH: ${Y.message}`)),process.exit(1)}},B1={command:e1,describe:a1,builder:$$,handler:Y$};import l from"node:path";import f from"node:fs";import x from"chalk";import q$ from"@fnet/prompt";var J$="compile [source] [options]",Q$="Compile a CLI project to a binary",X$={source:{describe:"Source file to compile",type:"string",default:"./dist/cli/esm/index.js"},output:{describe:"Output file name",type:"string",alias:"o"},name:{describe:"Binary name",type:"string",alias:"n"},force:{describe:"Force overwrite if binary already exists",type:"boolean",default:!1,alias:"f"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"},target:{describe:"Target platform (auto, linux, macos, windows)",type:"string",choices:["auto","linux","macos","windows"],default:"auto"},minify:{describe:"Minify the output binary",type:"boolean",default:!0},external:{describe:"External packages to exclude from the bundle (comma-separated)",type:"string"}},Z$=async($)=>{try{let Y=await z($),J=process.cwd(),G=l.basename(J),Z=$.name||G,Q;if($.output)Q=$.output;else{let q=l.join(J,".bin");if(!f.existsSync(q))f.mkdirSync(q,{recursive:!0});Q=l.join(q,Z)}let H=l.resolve(process.cwd(),$.source);if(!f.existsSync(H))console.error(x.red(`Source file not found: ${H}`)),console.error(x.yellow("Make sure to build your project first.")),process.exit(1);if(f.existsSync(Q)&&!$.force&&!$.yes){let{confirmOverwrite:q}=await q$({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${Q}. Overwrite?`,initial:!1});if(!q){console.log(x.yellow("Compilation cancelled."));return}}let K=process.platform;if(console.log(x.blue(`Detected platform: ${K}`)),K==="win32"&&!Q.endsWith(".exe"))Q=`${Q}.exe`,console.log(x.blue(`Adjusted output path for Windows: ${Q}`));console.log(x.blue(`Compiling ${H} to ${Q}...`));let{spawn:_}=await import("child_process");try{let q=_("bun",["--version"],{stdio:"pipe"});await new Promise((W,M)=>{q.on("close",(T)=>{if(T===0)W();else M(Error("Bun is not available. Please install Bun first."))}),q.on("error",(T)=>{M(Error(`Bun is not available: ${T.message}`))})})}catch(q){console.error(x.red(`Bun is not available: ${q.message}`)),console.error(x.yellow("Please install Bun first: https://bun.sh/")),process.exit(1)}let L=["build",H,"--compile",`--outfile=${Q}`];if($.target&&$.target!=="auto")L.push(`--target=${$.target}`);if($.minify===!1)L.push("--no-minify");if($.external)$.external.split(",").map((W)=>W.trim()).forEach((W)=>{L.push(`--external:${W}`)});console.log(x.blue(`Running: bun ${L.join(" ")}`));let X=_("bun",L,{stdio:"inherit"});if(await new Promise((q,W)=>{X.on("close",(M)=>{if(M===0)q();else W(Error(`Compilation failed with code ${M}`))}),X.on("error",(M)=>{W(M)})}),K!=="win32")f.chmodSync(Q,493);if(console.log(x.green(`Binary compiled successfully: ${Q}`)),K==="win32")console.log(x.yellow("Note: On Windows, you may need to run the binary from a command prompt or PowerShell."));else if(K==="darwin")console.log(x.yellow("Note: On macOS, you may need to allow the binary to run in System Preferences > Security & Privacy."))}catch(Y){console.error(x.red(`Failed to compile binary: ${Y.message}`)),process.exit(1)}},j1={command:J$,describe:Q$,builder:X$,handler:Z$};import n from"node:path";import C from"node:fs";import B from"chalk";import _$ from"@fnet/prompt";var G$="install [source] [options]",K$="Install a binary to the bin directory",H$={source:{describe:"Source binary to install",type:"string",demandOption:!0},name:{describe:"Name to use for the installed binary",type:"string",alias:"n"},force:{describe:"Force overwrite if binary already exists",type:"boolean",default:!1,alias:"f"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"},symlink:{describe:"Create a symlink instead of copying the binary",type:"boolean",default:!1,alias:"s"}},L$=async($)=>{try{let Y=await z($),J=n.resolve(process.cwd(),$.source);if(!C.existsSync(J))console.error(B.red(`Source file not found: ${J}`)),process.exit(1);await R.createBinDirectoryStructure();let G=R.getBinDirectory(),Z;if($.name)Z=$.name;else Z=n.basename(J);if(process.platform==="win32"&&!Z.endsWith(".exe"))Z=`${Z}.exe`;let Q=n.join(G,Z);if(C.existsSync(Q)&&!$.force&&!$.yes){let{confirmOverwrite:X}=await _$({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${Q}. Overwrite?`,initial:!1});if(!X){console.log(B.yellow("Installation cancelled."));return}}if($.symlink){if(console.log(B.blue(`Creating symlink from ${J} to ${Q}...`)),C.existsSync(Q))C.unlinkSync(Q);if(process.platform==="win32")C.symlinkSync(J,Q,"file");else C.symlinkSync(J,Q);console.log(B.green("Symlink created successfully."))}else if(console.log(B.blue(`Installing ${J} to ${Q}...`)),C.copyFileSync(J,Q),process.platform!=="win32")C.chmodSync(Q,493);let H=R.getMetadataFilePath(),K={binaries:{},lastUpdated:new Date().toISOString()};if(C.existsSync(H))try{K=JSON.parse(C.readFileSync(H,"utf8"))}catch(X){console.warn(B.yellow(`Failed to parse metadata file: ${X.message}`)),console.warn(B.yellow("Creating new metadata file."))}let _="0.0.0";try{let{execSync:X}=X1("child_process"),q=X(`"${Q}" --version`,{timeout:5000,stdio:["ignore","pipe","ignore"]}).toString().trim(),W=q.match(/v?(\d+\.\d+\.\d+)/);if(W)_=W[1],console.log(B.blue(`Detected binary version: ${_}`));else console.log(B.yellow(`Could not parse version from output: ${q}`)),console.log(B.yellow(`Using default version: ${_}`))}catch(X){console.log(B.yellow(`Could not detect binary version, using default: ${_}`))}if(K.binaries[Z]={path:Q,source:J,created:new Date().toISOString(),platform:process.platform,version:_,project:n.basename(process.cwd()),isSymlink:$.symlink||!1},K.lastUpdated=new Date().toISOString(),C.writeFileSync(H,JSON.stringify(K,null,2)),console.log(B.green(`Binary installed successfully: ${Q}`)),!R.checkIfInPath(G))console.log(B.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."));else console.log(B.green(`You can now run '${Z}' from anywhere.`))}catch(Y){console.error(B.red(`Failed to install binary: ${Y.message}`)),process.exit(1)}},F1={command:G$,describe:K$,builder:H$,handler:L$};import P from"node:fs";import w from"chalk";import E$ from"@fnet/prompt";import c from"chalk";import x1 from"@fnet/prompt";async function R$($){let{items:Y,message:J,nameField:G="name",valueField:Z="name",initialValue:Q=null,allowAbort:H=!0}=$;if(!Y||Y.length===0)return console.log(c.yellow("No items available for selection.")),null;if(Y.length===1&&!H){let q=Y[0],W=typeof q==="string"?q:q[Z];return console.log(c.blue(`Only one option available: ${typeof q==="string"?q:q[G]}`)),W}let K=Y.map((q)=>{if(typeof q==="string")return{name:q,value:q,message:q};else return{name:q[Z],value:q[Z],message:q[G]||q[Z]}});if(H)K.push({name:"cancel",value:null,message:c.yellow("Cancel")});let _=null;if(Q){let q=K.findIndex((W)=>W.name===Q);if(q!==-1)_=q}let L="selectedItem",{[L]:X}=await x1({type:"select",name:L,message:J,choices:K,initial:_});if(X==="cancel")return null;return X}async function W$($){let{items:Y,message:J,nameField:G="name",valueField:Z="name",initialValues:Q=[],allowAbort:H=!0}=$;if(!Y||Y.length===0)return console.log(c.yellow("No items available for selection.")),null;let K=Y.map((q)=>{if(typeof q==="string")return{name:q,value:q,message:q};else return{name:q[Z],value:q[Z],message:q[G]||q[Z]}}),_=[];if(Q&&Q.length>0)_=K.map((q,W)=>Q.includes(q.name)?W:-1).filter((q)=>q!==-1);let L="selectedItems",X=await x1({type:"multiselect",name:L,message:J,choices:K,initial:_,hint:"(Use space to select, enter to confirm)",validate:(q)=>{if(q.length===0&&!H)return"Please select at least one item";return!0}});if(H&&X[L].length===0)return null;return X[L]}var s={promptForSelection:R$,promptForMultipleSelection:W$};var I$="uninstall [name] [options]",M$="Uninstall a binary from the bin directory",O$={name:{describe:"Name of the binary to uninstall",type:"string",demandOption:!1},force:{describe:"Skip confirmation prompt",type:"boolean",default:!1,alias:"f"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},V$=async($)=>{try{let Y=await z($),J=R.getBinDirectory(),G=R.getMetadataFilePath();if(!P.existsSync(J))console.error(w.red(`Bin directory not found: ${J}`)),console.error(w.yellow("Run fbin setup first.")),process.exit(1);if(!P.existsSync(G))console.error(w.red(`Metadata file not found: ${G}`)),console.error(w.yellow("Run fbin setup first.")),process.exit(1);let Z;try{Z=JSON.parse(P.readFileSync(G,"utf8"))}catch(K){console.error(w.red(`Failed to parse metadata file: ${K.message}`)),process.exit(1)}if(!$.name&&!$.yes){let K=Object.keys(Z.binaries);if(K.length===0){console.log(w.yellow("No binaries installed."));return}let _=await s.promptForSelection({items:K,message:"Select a binary to uninstall:",allowAbort:!0});if(_===null){console.log(w.yellow("Uninstallation cancelled."));return}$.name=_}let Q=$.name;if(!Q)console.error(w.red("Binary name is required.")),console.error(w.yellow("Use --name to specify a binary or run without --yes to select interactively.")),process.exit(1);if(!Z.binaries[Q])console.error(w.red(`Binary not found in metadata: ${Q}`)),console.log(w.yellow("Use fbin list to see installed binaries.")),process.exit(1);let H=Z.binaries[Q].path;if(!P.existsSync(H))console.warn(w.yellow(`Binary file not found: ${H}`)),console.warn(w.yellow("Metadata will be updated anyway."));if(!$.force&&!$.yes){let{confirmUninstall:K}=await E$({type:"confirm",name:"confirmUninstall",message:`Are you sure you want to uninstall ${Q}?`,initial:!1});if(!K){console.log(w.yellow("Uninstallation cancelled."));return}}if(P.existsSync(H))try{P.unlinkSync(H),console.log(w.green(`Binary file removed: ${H}`))}catch(K){console.error(w.red(`Failed to remove binary file: ${K.message}`))}delete Z.binaries[Q],Z.lastUpdated=new Date().toISOString(),P.writeFileSync(G,JSON.stringify(Z,null,2)),console.log(w.green(`Binary uninstalled successfully: ${Q}`))}catch(Y){console.error(w.red(`Failed to uninstall binary: ${Y.message}`)),process.exit(1)}},C1={command:I$,describe:M$,builder:O$,handler:V$};import a from"node:fs";import S from"chalk";import U$ from"cli-table3";import k from"chalk";function S1($,Y={}){let G={...{chars:{top:"─","top-mid":"─","top-left":" ","top-right":" ",bottom:"─","bottom-mid":"─","bottom-left":" ","bottom-right":" ",left:" ","left-mid":" ",mid:"─","mid-mid":"─",right:" ","right-mid":" ",middle:" "},style:{head:[],border:[],compact:!0},wordWrap:!0},...Y,head:$.map((Z)=>k.bold(Z))};return new U$(G)}function z$($,Y,J={}){let G=S1($,J);if(Array.isArray(Y))Y.forEach((Z)=>{G.push(Z)});return G.toString()}function w$($){switch($){case"running":return k.green;case"stopped":return k.yellow;case"failed":return k.red;case"registered":return k.blue;default:return k.gray}}var p={createTable:S1,createTableWithData:z$,getStatusColor:w$};var T$="list [options]",N$="List installed binaries",A$={json:{describe:"Output in JSON format",type:"boolean",default:!1,alias:"j"},filter:{describe:"Filter binaries by name",type:"string",alias:"f"}},B$=async($)=>{try{let Y=await z($),J=R.getBinDirectory(),G=R.getMetadataFilePath();if(!a.existsSync(J))console.error(S.red(`Bin directory not found: ${J}`)),console.error(S.yellow("Run fbin setup first.")),process.exit(1);if(!a.existsSync(G))console.error(S.red(`Metadata file not found: ${G}`)),console.error(S.yellow("Run fbin setup first.")),process.exit(1);let Z;try{Z=JSON.parse(a.readFileSync(G,"utf8"))}catch(X){console.error(S.red(`Failed to parse metadata file: ${X.message}`)),process.exit(1)}let Q=Z.binaries;if($.filter){let X=$.filter.toLowerCase();Q=Object.entries(Q).filter(([q])=>q.toLowerCase().includes(X)).reduce((q,[W,M])=>{return q[W]=M,q},{})}if($.json){console.log(JSON.stringify(Q,null,2));return}let H=Object.keys(Q).length;if(H===0){console.log(S.yellow("No binaries installed."));return}console.log(S.blue(`Found ${H} installed binaries:`)),console.log();let K=["NAME","VERSION","PLATFORM","CREATED"],_=p.createTable(K,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});if(Object.entries(Q).forEach(([X,q])=>{let W=new Date(q.created).toLocaleString();_.push([S.white(X),q.version||"N/A",q.platform||"N/A",W])}),console.log(_.toString()),console.log(),console.log(S.blue(`Bin directory: ${J}`)),!R.checkIfInPath(J))console.log(S.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."))}catch(Y){console.error(S.red(`Failed to list binaries: ${Y.message}`)),process.exit(1)}},D1={command:T$,describe:N$,builder:A$,handler:B$};import $1 from"node:path";import d from"node:fs";import j from"chalk";var j$="backup [options]",F$="Backup shell configs and binaries",x$={config:{describe:"Backup shell configuration files",type:"boolean",default:!1,alias:"c"},binaries:{describe:"Backup installed binaries",type:"boolean",default:!1,alias:"b"},all:{describe:"Backup everything (configs + binaries)",type:"boolean",default:!1,alias:"a"},message:{describe:"Backup description message",type:"string",alias:"m"}},C$=async($)=>{try{let Y=await z($),J=$.all||!$.config&&!$.binaries,G=$.config||J,Z=$.binaries||J;console.log(j.blue("Creating backup..."));let Q=R.createBackupDirectory(),H=[];if(G){console.log(j.blue("Backing up shell configurations..."));let K=$1.join(Q,"configs");d.mkdirSync(K,{recursive:!0});let _=R.detectUserShell(),L=R.getAllShellConfigPaths(_),X=0;for(let q of L)if(d.existsSync(q.path)){if(R.backupFile(q.path,K,q.name))H.push(q.path),X++,console.log(j.green(` ✓ ${q.name}`))}if(X===0)console.log(j.yellow(" No configuration files found to backup"));else console.log(j.green(` Backed up ${X} configuration file(s)`))}if(Z){console.log(j.blue("Backing up binaries..."));let K=$1.join(Q,"binaries");d.mkdirSync(K,{recursive:!0});let _=R.getBinDirectory(),L=R.getMetadataFilePath();if(d.existsSync(L))R.backupFile(L,K,"metadata.json"),H.push(L);if(d.existsSync(_)){let X=d.readdirSync(_),q=0;for(let W of X){let M=$1.join(_,W);if(d.statSync(M).isFile()){if(R.backupFile(M,K,W))H.push(M),q++,console.log(j.green(` ✓ ${W}`))}}if(q===0)console.log(j.yellow(" No binaries found to backup"));else console.log(j.green(` Backed up ${q} binary(ies)`))}else console.log(j.yellow(" Bin directory not found"))}if(R.createBackupMetadata(Q,{type:"manual",command:"fbin backup",message:$.message||"Manual backup",files:H,config:G,binaries:Z}),R.updateLatestSymlink(Q),console.log(),console.log(j.green("✓ Backup created successfully!")),console.log(j.blue(` Location: ${Q}`)),console.log(j.blue(` Files backed up: ${H.length}`)),$.message)console.log(j.blue(` Message: ${$.message}`))}catch(Y){console.error(j.red(`Failed to create backup: ${Y.message}`)),process.exit(1)}},y1={command:j$,describe:F$,builder:x$,handler:C$};import m from"node:path";import F from"node:fs";import U from"chalk";import S$ from"@fnet/prompt";var D$="restore [options]",y$="Restore from backup",v$={config:{describe:"Restore shell configuration files",type:"boolean",default:!1,alias:"c"},binaries:{describe:"Restore installed binaries",type:"boolean",default:!1,alias:"b"},all:{describe:"Restore everything (configs + binaries)",type:"boolean",default:!1,alias:"a"},list:{describe:"List available backups",type:"boolean",default:!1,alias:"l"},timestamp:{describe:"Backup timestamp to restore (defaults to latest)",type:"string",alias:"t"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},P$=async($)=>{try{let Y=await z($);if($.list){let _=R.listBackups();if(_.length===0){console.log(U.yellow("No backups found."));return}console.log(U.blue(`Found ${_.length} backup(s):
|
|
15
|
-
`));let L=["TIMESTAMP","TYPE","MESSAGE","FILES"],X=p.createTable(L,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(let q of _){let W=q.timestamp||"unknown",M=q.type||"manual",T=q.message||"",N=q.files?q.files.length:0;X.push([U.white(W),M,T.substring(0,40)+(T.length>40?"...":""),N.toString()])}console.log(X.toString()),console.log(),console.log(U.blue(`Backup directory: ${R.getBackupDirectory()}`));return}let J=R.listBackups();if(J.length===0){console.log(U.yellow("No backups found.")),console.log(U.blue("Create a backup first with: fbin backup"));return}let G;if($.timestamp){if(G=J.find((_)=>_.timestamp===$.timestamp),!G)console.error(U.red(`Backup not found: ${$.timestamp}`)),console.log(U.yellow("Use --list to see available backups")),process.exit(1)}else if($.yes)G=J[0],console.log(U.yellow(`Auto-selecting latest backup: ${G.timestamp}`));else{let _=J.map((X)=>({name:X.timestamp,message:`${X.timestamp} - ${X.message||"No message"} (${X.files?.length||0} files)`})),L=await s.promptForSelection({items:_.map((X)=>X.name),message:"Select a backup to restore:",allowAbort:!0});if(L===null){console.log(U.yellow("Restore cancelled."));return}G=J.find((X)=>X.timestamp===L)}console.log(U.blue(`Restoring from backup: ${G.timestamp}`));let Z=$.all||!$.config&&!$.binaries,Q=$.config||Z,H=$.binaries||Z;if(!$.yes){let{confirmRestore:_}=await S$({type:"confirm",name:"confirmRestore",message:"This will overwrite current files. Continue?",initial:!1});if(!_){console.log(U.yellow("Restore cancelled."));return}}let K=0;if(Q){let _=m.join(G.path,"configs");if(F.existsSync(_)){console.log(U.blue("Restoring shell configurations..."));let L=F.readdirSync(_);for(let X of L){let q=m.join(_,X),W=R.detectUserShell(),T=R.getAllShellConfigPaths(W).find((N)=>N.name===X);if(T){let N=T.path,b=m.dirname(N);if(!F.existsSync(b))F.mkdirSync(b,{recursive:!0});F.copyFileSync(q,N),console.log(U.green(` ✓ ${X}`)),K++}}}}if(H){let _=m.join(G.path,"binaries");if(F.existsSync(_)){console.log(U.blue("Restoring binaries..."));let L=R.getBinDirectory();if(!F.existsSync(L))F.mkdirSync(L,{recursive:!0});let X=F.readdirSync(_);for(let q of X){let W=m.join(_,q),M=m.join(L,q);if(q==="metadata.json"){let T=R.getMetadataFilePath(),N=m.dirname(T);if(!F.existsSync(N))F.mkdirSync(N,{recursive:!0});F.copyFileSync(W,T),console.log(U.green(" ✓ metadata.json")),K++;continue}if(F.copyFileSync(W,M),process.platform!=="win32")F.chmodSync(M,493);console.log(U.green(` ✓ ${q}`)),K++}}}console.log(),console.log(U.green("✓ Restore completed successfully!")),console.log(U.blue(` Files restored: ${K}`))}catch(Y){console.error(U.red(`Failed to restore backup: ${Y.message}`)),process.exit(1)}},v1={command:D$,describe:y$,builder:v$,handler:P$};import d$ from"node:path";import Y1 from"node:fs";import V from"chalk";import m$ from"@fnet/prompt";var u$="cleanup [options]",k$="Clean up old backups",p$={keep:{describe:"Number of recent backups to keep",type:"number",default:10,alias:"k"},older:{describe:"Remove backups older than N days",type:"number",alias:"o"},all:{describe:"Remove all backups",type:"boolean",default:!1,alias:"a"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"},"dry-run":{describe:"Show what would be deleted without actually deleting",type:"boolean",default:!1,alias:"d"}},f$=async($)=>{try{let Y=await z($),J=R.listBackups();if(J.length===0){console.log(V.yellow("No backups found."));return}console.log(V.blue(`Found ${J.length} backup(s)`));let G=[];if($.all)G=J;else if($.older){let X=new Date;X.setDate(X.getDate()-$.older),G=J.filter((q)=>{return new Date(q.created)<X}),console.log(V.blue(`Removing backups older than ${$.older} days (before ${X.toLocaleDateString()})`))}else if(J.length>$.keep)G=J.slice($.keep),console.log(V.blue(`Keeping ${$.keep} most recent backup(s), removing ${G.length} old backup(s)`));else{console.log(V.green(`Only ${J.length} backup(s) found, keeping all (limit: ${$.keep})`));return}if(G.length===0){console.log(V.green("No backups to delete."));return}console.log(),console.log(V.yellow(`Backups to be deleted (${G.length}):`)),console.log();let Z=["TIMESTAMP","TYPE","MESSAGE","FILES","SIZE"],Q=p.createTable(Z,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}}),H=0;for(let X of G){let q=X.timestamp||"unknown",W=X.type||"manual",M=X.message||"",T=X.files?X.files.length:0,N=0;try{let i=(q1)=>{let t=0,u1=Y1.readdirSync(q1);for(let k1 of u1){let J1=d$.join(q1,k1),Q1=Y1.statSync(J1);if(Q1.isDirectory())t+=i(J1);else t+=Q1.size}return t};N=i(X.path),H+=N}catch(i){}let b=N>0?`${(N/1024/1024).toFixed(2)} MB`:"N/A";Q.push([V.white(q),W,M.substring(0,30)+(M.length>30?"...":""),T.toString(),b])}if(console.log(Q.toString()),console.log(),console.log(V.blue(`Total size to free: ${(H/1024/1024).toFixed(2)} MB`)),$["dry-run"]){console.log(),console.log(V.yellow("DRY RUN: No backups were deleted.")),console.log(V.blue("Run without --dry-run to actually delete these backups."));return}if(!$.yes){console.log();let{confirmDelete:X}=await m$({type:"confirm",name:"confirmDelete",message:`Delete ${G.length} backup(s)?`,initial:!1});if(!X){console.log(V.yellow("Cleanup cancelled."));return}}console.log(),console.log(V.blue("Deleting backups..."));let K=0,_=0;for(let X of G)try{Y1.rmSync(X.path,{recursive:!0,force:!0}),console.log(V.green(` ✓ ${X.timestamp}`)),K++}catch(q){console.log(V.red(` ✗ ${X.timestamp}: ${q.message}`)),_++}if(console.log(),console.log(V.green("✓ Cleanup completed!")),console.log(V.blue(` Deleted: ${K}`)),_>0)console.log(V.yellow(` Failed: ${_}`));console.log(V.blue(` Space freed: ${(H/1024/1024).toFixed(2)} MB`));let L=R.listBackups();console.log(V.blue(` Remaining backups: ${L.length}`))}catch(Y){console.error(V.red(`Failed to cleanup backups: ${Y.message}`)),process.exit(1)}},P1={command:u$,describe:k$,builder:p$,handler:f$};import{promisify as b$}from"node:util";import g$ from"tree-kill";var F0=b$(g$),r=!1;function d1(){process.on("uncaughtException",($)=>{if(!r)r=!0,setTimeout(()=>process.exit(1),500)}),process.on("unhandledRejection",($)=>{if(!r)r=!0,setTimeout(()=>process.exit(1),500)})}d1();M1();async function l$(){try{h$(o$(process.argv)).scriptName("fbin").usage("Usage: $0 <command> [options]").command(T1).command(B1).command(j1).command(F1).command(C1).command(D1).command(y1).command(v1).command(P1).demandCommand(1,"You need to specify a command").help().version("1.
|
|
15
|
+
`));let L=["TIMESTAMP","TYPE","MESSAGE","FILES"],X=p.createTable(L,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(let q of _){let W=q.timestamp||"unknown",M=q.type||"manual",T=q.message||"",N=q.files?q.files.length:0;X.push([U.white(W),M,T.substring(0,40)+(T.length>40?"...":""),N.toString()])}console.log(X.toString()),console.log(),console.log(U.blue(`Backup directory: ${R.getBackupDirectory()}`));return}let J=R.listBackups();if(J.length===0){console.log(U.yellow("No backups found.")),console.log(U.blue("Create a backup first with: fbin backup"));return}let G;if($.timestamp){if(G=J.find((_)=>_.timestamp===$.timestamp),!G)console.error(U.red(`Backup not found: ${$.timestamp}`)),console.log(U.yellow("Use --list to see available backups")),process.exit(1)}else if($.yes)G=J[0],console.log(U.yellow(`Auto-selecting latest backup: ${G.timestamp}`));else{let _=J.map((X)=>({name:X.timestamp,message:`${X.timestamp} - ${X.message||"No message"} (${X.files?.length||0} files)`})),L=await s.promptForSelection({items:_.map((X)=>X.name),message:"Select a backup to restore:",allowAbort:!0});if(L===null){console.log(U.yellow("Restore cancelled."));return}G=J.find((X)=>X.timestamp===L)}console.log(U.blue(`Restoring from backup: ${G.timestamp}`));let Z=$.all||!$.config&&!$.binaries,Q=$.config||Z,H=$.binaries||Z;if(!$.yes){let{confirmRestore:_}=await S$({type:"confirm",name:"confirmRestore",message:"This will overwrite current files. Continue?",initial:!1});if(!_){console.log(U.yellow("Restore cancelled."));return}}let K=0;if(Q){let _=m.join(G.path,"configs");if(F.existsSync(_)){console.log(U.blue("Restoring shell configurations..."));let L=F.readdirSync(_);for(let X of L){let q=m.join(_,X),W=R.detectUserShell(),T=R.getAllShellConfigPaths(W).find((N)=>N.name===X);if(T){let N=T.path,b=m.dirname(N);if(!F.existsSync(b))F.mkdirSync(b,{recursive:!0});F.copyFileSync(q,N),console.log(U.green(` ✓ ${X}`)),K++}}}}if(H){let _=m.join(G.path,"binaries");if(F.existsSync(_)){console.log(U.blue("Restoring binaries..."));let L=R.getBinDirectory();if(!F.existsSync(L))F.mkdirSync(L,{recursive:!0});let X=F.readdirSync(_);for(let q of X){let W=m.join(_,q),M=m.join(L,q);if(q==="metadata.json"){let T=R.getMetadataFilePath(),N=m.dirname(T);if(!F.existsSync(N))F.mkdirSync(N,{recursive:!0});F.copyFileSync(W,T),console.log(U.green(" ✓ metadata.json")),K++;continue}if(F.copyFileSync(W,M),process.platform!=="win32")F.chmodSync(M,493);console.log(U.green(` ✓ ${q}`)),K++}}}console.log(),console.log(U.green("✓ Restore completed successfully!")),console.log(U.blue(` Files restored: ${K}`))}catch(Y){console.error(U.red(`Failed to restore backup: ${Y.message}`)),process.exit(1)}},v1={command:D$,describe:y$,builder:v$,handler:P$};import d$ from"node:path";import Y1 from"node:fs";import V from"chalk";import m$ from"@fnet/prompt";var u$="cleanup [options]",k$="Clean up old backups",p$={keep:{describe:"Number of recent backups to keep",type:"number",default:10,alias:"k"},older:{describe:"Remove backups older than N days",type:"number",alias:"o"},all:{describe:"Remove all backups",type:"boolean",default:!1,alias:"a"},yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"},"dry-run":{describe:"Show what would be deleted without actually deleting",type:"boolean",default:!1,alias:"d"}},f$=async($)=>{try{let Y=await z($),J=R.listBackups();if(J.length===0){console.log(V.yellow("No backups found."));return}console.log(V.blue(`Found ${J.length} backup(s)`));let G=[];if($.all)G=J;else if($.older){let X=new Date;X.setDate(X.getDate()-$.older),G=J.filter((q)=>{return new Date(q.created)<X}),console.log(V.blue(`Removing backups older than ${$.older} days (before ${X.toLocaleDateString()})`))}else if(J.length>$.keep)G=J.slice($.keep),console.log(V.blue(`Keeping ${$.keep} most recent backup(s), removing ${G.length} old backup(s)`));else{console.log(V.green(`Only ${J.length} backup(s) found, keeping all (limit: ${$.keep})`));return}if(G.length===0){console.log(V.green("No backups to delete."));return}console.log(),console.log(V.yellow(`Backups to be deleted (${G.length}):`)),console.log();let Z=["TIMESTAMP","TYPE","MESSAGE","FILES","SIZE"],Q=p.createTable(Z,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}}),H=0;for(let X of G){let q=X.timestamp||"unknown",W=X.type||"manual",M=X.message||"",T=X.files?X.files.length:0,N=0;try{let i=(q1)=>{let t=0,u1=Y1.readdirSync(q1);for(let k1 of u1){let J1=d$.join(q1,k1),Q1=Y1.statSync(J1);if(Q1.isDirectory())t+=i(J1);else t+=Q1.size}return t};N=i(X.path),H+=N}catch(i){}let b=N>0?`${(N/1024/1024).toFixed(2)} MB`:"N/A";Q.push([V.white(q),W,M.substring(0,30)+(M.length>30?"...":""),T.toString(),b])}if(console.log(Q.toString()),console.log(),console.log(V.blue(`Total size to free: ${(H/1024/1024).toFixed(2)} MB`)),$["dry-run"]){console.log(),console.log(V.yellow("DRY RUN: No backups were deleted.")),console.log(V.blue("Run without --dry-run to actually delete these backups."));return}if(!$.yes){console.log();let{confirmDelete:X}=await m$({type:"confirm",name:"confirmDelete",message:`Delete ${G.length} backup(s)?`,initial:!1});if(!X){console.log(V.yellow("Cleanup cancelled."));return}}console.log(),console.log(V.blue("Deleting backups..."));let K=0,_=0;for(let X of G)try{Y1.rmSync(X.path,{recursive:!0,force:!0}),console.log(V.green(` ✓ ${X.timestamp}`)),K++}catch(q){console.log(V.red(` ✗ ${X.timestamp}: ${q.message}`)),_++}if(console.log(),console.log(V.green("✓ Cleanup completed!")),console.log(V.blue(` Deleted: ${K}`)),_>0)console.log(V.yellow(` Failed: ${_}`));console.log(V.blue(` Space freed: ${(H/1024/1024).toFixed(2)} MB`));let L=R.listBackups();console.log(V.blue(` Remaining backups: ${L.length}`))}catch(Y){console.error(V.red(`Failed to cleanup backups: ${Y.message}`)),process.exit(1)}},P1={command:u$,describe:k$,builder:p$,handler:f$};import{promisify as b$}from"node:util";import g$ from"tree-kill";var F0=b$(g$),r=!1;function d1(){process.on("uncaughtException",($)=>{if(!r)r=!0,setTimeout(()=>process.exit(1),500)}),process.on("unhandledRejection",($)=>{if(!r)r=!0,setTimeout(()=>process.exit(1),500)})}d1();M1();async function l$(){try{h$(o$(process.argv)).scriptName("fbin").usage("Usage: $0 <command> [options]").command(T1).command(B1).command(j1).command(F1).command(C1).command(D1).command(y1).command(v1).command(P1).demandCommand(1,"You need to specify a command").help().version("1.6.0").parse()}catch($){console.error(m1.red(`Fatal error: ${$.message}`)),process.exit(1)}}l$().catch(($)=>{console.error(m1.red(`Fatal error: ${$.message}`)),process.exit(1)});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import"./index.bfgjmapr.js";import U from"fs";import _ from"path";import E from"chalk";import $ from"@fnet/yaml";import x,{ProcessManager as N}from"@fnet/shell-flow";import G from"os";async function k({projectType:D,group:C,tags:q,args:A,argv:Q,processManager:R}){try{let z=await S(D);q=q||[];let I=G.platform();if(!q.includes(I))q.push(I);let{parsed:J}=await $({file:z.path,tags:q}),B=J.commands;if(!B)throw Error(`Commands section not found in ${z.name}`);let K=B[C];if(!K)throw Error(`Command group '${C}' not found in ${z.name}`);await x({commands:K,context:{args:A,argv:Q,projectType:z.type},processManager:R})}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function T({projectType:D,tags:C}){try{let q=await S(D),{parsed:A}=await $({file:q.path,tags:C}),Q=A.commands;if(!Q){console.log(E.yellow(`No commands found in ${q.name}`));return}console.log(`
|
|
2
|
+
${E.bold("Available commands")} ${E.dim(`(${q.name})`)}:
|
|
3
|
+
`);let R=Object.entries(Q),z=Math.max(...R.map(([J])=>J.length)),I=!1;for(let[J,B]of R){let K=B&&typeof B==="object"&&!Array.isArray(B),X=K?B.description||"":"",V=K?B.usage||"":"",W=!!(X||V);if(W&&I)console.log("");let Z=J.padEnd(z);if(W){if(console.log(` ${E.bold.cyan(Z)} ${X}`),V)console.log(` ${"".padEnd(z)} ${E.dim("$ "+V)}`)}else console.log(` ${E.cyan(Z)}`);I=W}}catch(q){console.error(`Error: ${q.message}`),process.exit(1)}}async function S(D){let C=process.cwd(),q=_.resolve(C,"fnode.yaml"),A=_.resolve(C,"fnet.yaml");if(D==="fnode"){if(U.existsSync(q))return{path:q,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(D==="fnet"){if(U.existsSync(A))return{path:A,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(U.existsSync(q))return{path:q,name:"fnode.yaml",type:"fnode"};if(U.existsSync(A))return{path:A,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,S as detectProjectFile};
|
package/dist/fnet/index.js
CHANGED
|
@@ -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.68132vn6.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+`
|
|
@@ -17,4 +17,4 @@ Express Projects:`));let q=(await import("./index.tnk86191.js")).default,Y=["NAM
|
|
|
17
17
|
Total: ${X.length} projects`))}catch(Z){console.error(F.red(`Error listing express projects: ${Z.message}`)),process.exit(1)}}async function A1(Q){try{if(!N.existsSync(c)){console.log(F.yellow("No express projects found."));return}let Z;if(Q.latest){if(Z=await a8(),!Z){console.log(F.yellow("No express projects found."));return}}else if(Q.projectName){if(Z=await n8(Q.projectName),!Z){console.log(F.yellow(`Project "${Q.projectName}" not found.`));return}}else{let X=await r8();if(!X){console.log(F.yellow("No project selected."));return}Z=P.join(c,X)}await k7(Z)}catch(Z){console.error(F.red(`Error opening express project: ${Z.message}`)),process.exit(1)}}async function R1(Q){try{let Z=process.cwd(),X=Z.includes(c),q;if(X)q=Z,console.log(F.blue(`Using current express project: ${P.basename(q)}`));else if(Q.latest){if(q=await a8(),!q){console.log(F.yellow("No express projects found."));return}}else if(Q.projectName){if(q=await n8(Q.projectName),!q){console.log(F.yellow(`Project "${Q.projectName}" not found.`));return}}else{let H=await r8();if(!H){console.log(F.yellow("No project selected."));return}q=P.join(c,H)}let Y=Q.destination;if(!Y)Y=(await T0({type:"input",name:"destination",message:"Enter destination directory:",initial:P.join(process.cwd(),P.basename(q))})).destination;if(Y.startsWith("~"))Y=P.join(p8.homedir(),Y.slice(1));if(Y=P.resolve(Y),Y.startsWith(q+P.sep)||Y===q){console.log(F.red("Destination cannot be inside the source directory."));return}if(N.existsSync(Y)){if(!N.statSync(Y).isDirectory()){console.log(F.red(`Destination "${Y}" is not a directory.`));return}if(N.readdirSync(Y).length>0){if(!(await T0({type:"confirm",name:"overwrite",message:`Destination "${Y}" is not empty. Continue anyway?`,initial:!1})).overwrite){console.log(F.yellow("Project move cancelled."));return}}}else N.mkdirSync(Y,{recursive:!0});if(console.log(F.blue(`Moving project from ${q} to ${Y}...`)),UZ(q,Y),console.log(F.green(`
|
|
18
18
|
Project moved successfully to ${Y}`)),(await T0({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal)N.rmSync(q,{recursive:!0,force:!0}),console.log(F.green("Original project deleted."));await k7(Y)}catch(Z){console.error(F.red(`Error moving express project: ${Z.message}`)),process.exit(1)}}async function a8(){let Q=N.readdirSync(c).filter((H)=>/^\d{8}$/.test(H)).sort((H,W)=>W.localeCompare(H));if(Q.length===0)return null;let Z=Q[0],X=P.join(c,Z),q=N.readdirSync(X);if(q.length===0)return null;let Y=null,J=0;for(let H of q){let W=P.join(X,H),V=N.statSync(W);if(V.birthtimeMs>J)J=V.birthtimeMs,Y=W}return Y}async function n8(Q){let Z=N.readdirSync(c).filter((X)=>/^\d{8}$/.test(X)).sort((X,q)=>q.localeCompare(X));for(let X of Z){let q=P.join(c,X),Y=N.readdirSync(q);if(Y.includes(Q))return P.join(q,Q);let J=Y.filter((H)=>H.includes(Q));if(J.length>0)if(J.length===1)return P.join(q,J[0]);else{let H=J.map((V)=>({name:P.join(q,V),value:P.join(q,V),message:`${V} (${X})`})),W=await P7.promptForSelection({items:H,message:`Multiple projects match "${Q}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});if(W===null)return console.log(F.yellow("Operation cancelled.")),null;return W}}return null}async function r8(){let Q=[],Z=N.readdirSync(c).filter((q)=>/^\d{8}$/.test(q)).sort((q,Y)=>Y.localeCompare(q));for(let q of Z){let Y=P.join(c,q),J=N.readdirSync(Y);for(let H of J){let W=P.join(Y,H),V=N.statSync(W),K=`${q}/${H}`;Q.push({name:K,value:K,created:V.birthtime})}}if(Q.sort((q,Y)=>Y.created-q.created),Q.length===0)return null;let X=await P7.promptForSelection({items:Q,message:"Select a project:",nameField:"value",valueField:"value",allowAbort:!0});if(X===null)return console.log(F.yellow("Operation cancelled.")),null;return X}async function B1(Q){try{if((await T0({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE)await k7(Q)}catch(Z){console.error(F.red(`Error opening IDE: ${Z.message}`))}}async function k7(Q){let Z=await zZ("code --version"),X=await zZ("code-insiders --version"),q=null;if(Z&&X)q=(await T0({type:"select",name:"ide",message:"Which IDE would you like to use?",choices:[{name:"Visual Studio Code",value:"code"},{name:"Visual Studio Code Insiders",value:"code-insiders"}]})).ide;else if(Z)q="code";else if(X)q="code-insiders";else{console.log(F.yellow("No supported IDE found. Please open the project manually.")),console.log(F.blue(`Project path: ${Q}`));return}console.log(F.blue(`Opening project in ${q}...`)),console.log(F.blue(`Project path: ${Q}`));let Y=i8(q,[Q],{stdio:"inherit",shell:!0});return new Promise((J,H)=>{Y.on("close",(W)=>{if(W===0)console.log(F.green(`Project opened in ${q}.`)),J();else console.error(F.red(`Failed to open project in ${q}.`)),H(Error(`Process exited with code ${W}`))})})}async function zZ(Q){return new Promise((Z)=>{i8(Q,{shell:!0,stdio:"ignore"}).on("close",(q)=>{Z(q===0)})})}function UZ(Q,Z){if(!N.existsSync(Z))N.mkdirSync(Z,{recursive:!0});let X=N.readdirSync(Q,{withFileTypes:!0});for(let q of X){let Y=P.join(Q,q.name),J=P.join(Z,q.name);if(q.isDirectory()){if(q.name===".git"||q.name===".workspace")continue;UZ(Y,J)}else N.copyFileSync(Y,J)}}async function I1(Q){try{if(!N.existsSync(c)){console.log(F.yellow("No express projects found."));return}let Z;if(Q.latest){if(Z=await a8(),!Z){console.log(F.yellow("No express projects found."));return}}else if(Q.projectName){if(Z=await n8(Q.projectName),!Z){console.log(F.yellow(`Project "${Q.projectName}" not found.`));return}}else{let q=await r8();if(!q){console.log(F.yellow("No project selected."));return}Z=P.join(c,q)}let X=P.basename(Z);if(!Q.yes){if(!(await T0({type:"confirm",name:"confirm",message:`Are you sure you want to remove project "${X}"?`,initial:!1})).confirm){console.log(F.yellow("Project removal cancelled."));return}}console.log(F.blue(`Removing project "${X}"...`)),N.rmSync(Z,{recursive:!0,force:!0}),console.log(F.green(`Project "${X}" removed successfully.`))}catch(Z){console.error(F.red(`Error removing express project: ${Z.message}`)),process.exit(1)}}async function L1(Q){try{if(!N.existsSync(c)){console.log(F.yellow("No express projects found."));return}let Z;if(Q.latest){if(Z=await a8(),!Z){console.log(F.yellow("No express projects found."));return}}else if(Q.projectName){if(Z=await n8(Q.projectName),!Z){console.log(F.yellow(`Project "${Q.projectName}" not found.`));return}}else{let Y=await r8();if(!Y){console.log(F.yellow("No project selected."));return}Z=P.join(c,Y)}console.log(F.blue(`Entering project directory: ${Z}`)),console.log(F.yellow(`
|
|
19
19
|
Opening a new shell in the project directory...`));let X=process.env.SHELL||"/bin/bash",q=i8(X,[],{stdio:"inherit",cwd:Z,shell:!0});return new Promise((Y)=>{q.on("close",()=>{console.log(F.green(`
|
|
20
|
-
Returned from project directory.`)),Y()})})}catch(Z){console.error(F.red(`Error entering express project directory: ${Z.message}`)),process.exit(1)}}import MZ from"node:path";import{fileURLToPath as w1}from"node:url";import F1 from"node:fs";import s8 from"node:path";import{fileURLToPath as T1}from"node:url";var j1=s8.dirname(T1(import.meta.url));function C1({baseDir:Q}){Q=Q||j1;let Z=Q;while(Z!==s8.parse(Z).root){let X=s8.join(Z,"node_modules");if(F1.existsSync(X))return X;Z=s8.dirname(Z)}return null}var $Z=C1;var S1=MZ.dirname(w1(import.meta.url));function OZ(){let Q=$Z({baseDir:S1}),Z=process.platform==="win32"?";":":";if(Q)process.env.PATH=`${MZ.join(Q,"/.bin")}${Z}${process.env.PATH}`}var D7=new P1;OZ();async function k1(){try{let Q=N1(process.argv.slice(2)).scriptName("fnet").usage("Usage: fnet <command> [options]").command(d7).command(p7).command(YZ).command(JZ).command(WZ).command(HZ).command(KZ).command("express","Create and manage express projects",GZ);Q=s(Q,{bin:"npm",createContext:b}),Q=s(Q,{bin:"node",createContext:b}),Q=s(Q,{bin:"bun",createContext:b}),Q=s(Q,{name:"serve",bin:"bun",preArgs:["run","serve","--"],createContext:b}),Q=s(Q,{name:"watch",bin:"bun",preArgs:["run","watch","--"],createContext:b}),Q=s(Q,{name:"app",bin:"bun",preArgs:["run","app","--"],createContext:b}),Q=s(Q,{name:"cli",bin:"bun",preArgs:["run","cli","--"],createContext:b}),Q=s(Q,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"],createContext:b}),Q=s(Q,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"],createContext:b}),Q=s(Q,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"],createContext:b}),Q=s(Q,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"],createContext:b}),Q=s(Q,{name:"compile",bin:"bun",preArgs:["run","compile","--"],createContext:b}),Q=c7(Q,{name:"install",createContext:b}),Q=s(Q,{bin:"npx",createContext:b}),Q=s(Q,{bin:"cdk",createContext:b}),Q=s(Q,{bin:"aws",createContext:b}),Q=g7(Q,{name:"with",createContext:b}),Q=m7(Q,{name:"run",projectType:"fnet",processManager:D7}),Q.demandCommand(1,"You need at least one command before moving on").help().version("1.
|
|
20
|
+
Returned from project directory.`)),Y()})})}catch(Z){console.error(F.red(`Error entering express project directory: ${Z.message}`)),process.exit(1)}}import MZ from"node:path";import{fileURLToPath as w1}from"node:url";import F1 from"node:fs";import s8 from"node:path";import{fileURLToPath as T1}from"node:url";var j1=s8.dirname(T1(import.meta.url));function C1({baseDir:Q}){Q=Q||j1;let Z=Q;while(Z!==s8.parse(Z).root){let X=s8.join(Z,"node_modules");if(F1.existsSync(X))return X;Z=s8.dirname(Z)}return null}var $Z=C1;var S1=MZ.dirname(w1(import.meta.url));function OZ(){let Q=$Z({baseDir:S1}),Z=process.platform==="win32"?";":":";if(Q)process.env.PATH=`${MZ.join(Q,"/.bin")}${Z}${process.env.PATH}`}var D7=new P1;OZ();async function k1(){try{let Q=N1(process.argv.slice(2)).scriptName("fnet").usage("Usage: fnet <command> [options]").command(d7).command(p7).command(YZ).command(JZ).command(WZ).command(HZ).command(KZ).command("express","Create and manage express projects",GZ);Q=s(Q,{bin:"npm",createContext:b}),Q=s(Q,{bin:"node",createContext:b}),Q=s(Q,{bin:"bun",createContext:b}),Q=s(Q,{name:"serve",bin:"bun",preArgs:["run","serve","--"],createContext:b}),Q=s(Q,{name:"watch",bin:"bun",preArgs:["run","watch","--"],createContext:b}),Q=s(Q,{name:"app",bin:"bun",preArgs:["run","app","--"],createContext:b}),Q=s(Q,{name:"cli",bin:"bun",preArgs:["run","cli","--"],createContext:b}),Q=s(Q,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"],createContext:b}),Q=s(Q,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"],createContext:b}),Q=s(Q,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"],createContext:b}),Q=s(Q,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"],createContext:b}),Q=s(Q,{name:"compile",bin:"bun",preArgs:["run","compile","--"],createContext:b}),Q=c7(Q,{name:"install",createContext:b}),Q=s(Q,{bin:"npx",createContext:b}),Q=s(Q,{bin:"cdk",createContext:b}),Q=s(Q,{bin:"aws",createContext:b}),Q=g7(Q,{name:"with",createContext:b}),Q=m7(Q,{name:"run",projectType:"fnet",processManager:D7}),Q.demandCommand(1,"You need at least one command before moving on").help().version("1.6.0").parse()}catch(Q){console.error(AZ.red(`Fatal error: ${Q.message}`)),await D7.dispose(),process.exit(1)}}k1().catch(async(Q)=>{console.error(AZ.red(`Fatal error: ${Q.message}`)),await D7.dispose(),process.exit(1)});
|
package/dist/fnode/index.js
CHANGED
|
@@ -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.wyb1c48x.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(`
|
|
@@ -7,4 +7,4 @@ Express Projects:`));let Q=(await import("./index.xw4a37ev.js")).default,$=["NAM
|
|
|
7
7
|
Total: ${Z.length} projects`))}catch(z){console.error(J.red(`Error listing express projects: ${z.message}`)),process.exit(1)}}async function nq(q){try{if(!L.existsSync(T)){console.log(J.yellow("No express projects found."));return}let z;if(q.latest){if(z=await h(),!z){console.log(J.yellow("No express projects found."));return}}else if(q.projectName){if(z=await p(q.projectName),!z){console.log(J.yellow(`Project "${q.projectName}" not found.`));return}}else{let Z=await l();if(!Z){console.log(J.yellow("No project selected."));return}z=M.join(T,Z)}await o(z)}catch(z){console.error(J.red(`Error opening express project: ${z.message}`)),process.exit(1)}}async function cq(q){try{let z=process.cwd(),Z=z.includes(T),Q;if(Z)Q=z,console.log(J.blue(`Using current express project: ${M.basename(Q)}`));else if(q.latest){if(Q=await h(),!Q){console.log(J.yellow("No express projects found."));return}}else if(q.projectName){if(Q=await p(q.projectName),!Q){console.log(J.yellow(`Project "${q.projectName}" not found.`));return}}else{let G=await l();if(!G){console.log(J.yellow("No project selected."));return}Q=M.join(T,G)}let $=q.destination;if(!$)$=(await N({type:"input",name:"destination",message:"Enter destination directory:",initial:M.join(process.cwd(),M.basename(Q))})).destination;if($.startsWith("~"))$=M.join(u.homedir(),$.slice(1));if($=M.resolve($),$.startsWith(Q+M.sep)||$===Q){console.log(J.red("Destination cannot be inside the source directory."));return}if(L.existsSync($)){if(!L.statSync($).isDirectory()){console.log(J.red(`Destination "${$}" is not a directory.`));return}if(L.readdirSync($).length>0){if(!(await N({type:"confirm",name:"overwrite",message:`Destination "${$}" is not empty. Continue anyway?`,initial:!1})).overwrite){console.log(J.yellow("Project move cancelled."));return}}}else L.mkdirSync($,{recursive:!0});if(console.log(J.blue(`Moving project from ${Q} to ${$}...`)),Xq(Q,$),console.log(J.green(`
|
|
8
8
|
Project moved successfully to ${$}`)),(await N({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal)L.rmSync(Q,{recursive:!0,force:!0}),console.log(J.green("Original project deleted."));await o($)}catch(z){console.error(J.red(`Error moving express project: ${z.message}`)),process.exit(1)}}async function h(){let q=L.readdirSync(T).filter((G)=>/^\d{8}$/.test(G)).sort((G,K)=>K.localeCompare(G));if(q.length===0)return null;let z=q[0],Z=M.join(T,z),Q=L.readdirSync(Z);if(Q.length===0)return null;let $=null,W=0;for(let G of Q){let K=M.join(Z,G),O=L.statSync(K);if(O.birthtimeMs>W)W=O.birthtimeMs,$=K}return $}async function p(q){let z=L.readdirSync(T).filter((Z)=>/^\d{8}$/.test(Z)).sort((Z,Q)=>Q.localeCompare(Z));for(let Z of z){let Q=M.join(T,Z),$=L.readdirSync(Q);if($.includes(q))return M.join(Q,q);let W=$.filter((G)=>G.includes(q));if(W.length>0)if(W.length===1)return M.join(Q,W[0]);else{let G=W.map((O)=>({name:M.join(Q,O),value:M.join(Q,O),message:`${O} (${Z})`})),K=await i.promptForSelection({items:G,message:`Multiple projects match "${q}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});if(K===null)return console.log(J.yellow("Operation cancelled.")),null;return K}}return null}async function l(){let q=[],z=L.readdirSync(T).filter((Q)=>/^\d{8}$/.test(Q)).sort((Q,$)=>$.localeCompare(Q));for(let Q of z){let $=M.join(T,Q),W=L.readdirSync($);for(let G of W){let K=M.join($,G),O=L.statSync(K),H=`${Q}/${G}`;q.push({name:H,value:H,message:`${G} (${Q})`,created:O.birthtime})}}if(q.sort((Q,$)=>$.created-Q.created),q.length===0)return null;let Z=await i.promptForSelection({items:q,message:"Select a project:",nameField:"message",valueField:"value",allowAbort:!0});if(Z===null)return console.log(J.yellow("Operation cancelled.")),null;return Z}async function sq(q){try{if((await N({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE)await o(q)}catch(z){console.error(J.red(`Error opening IDE: ${z.message}`))}}async function o(q){let z=await Vq("code --version"),Z=await Vq("code-insiders --version"),Q=null;if(z&&Z)Q=(await N({type:"select",name:"ide",message:"Which IDE would you like to use?",choices:[{name:"Visual Studio Code",value:"code"},{name:"Visual Studio Code Insiders",value:"code-insiders"}]})).ide;else if(z)Q="code";else if(Z)Q="code-insiders";else{console.log(J.yellow("No supported IDE found. Please open the project manually.")),console.log(J.blue(`Project path: ${q}`));return}console.log(J.blue(`Opening project in ${Q}...`)),console.log(J.blue(`Project path: ${q}`));let $=g(Q,[q],{stdio:"inherit",shell:!0});return new Promise((W,G)=>{$.on("close",(K)=>{if(K===0)console.log(J.green(`Project opened in ${Q}.`)),W();else console.error(J.red(`Failed to open project in ${Q}.`)),G(Error(`Process exited with code ${K}`))})})}async function Vq(q){return new Promise((z)=>{g(q,{shell:!0,stdio:"ignore"}).on("close",(Q)=>{z(Q===0)})})}function Xq(q,z){if(!L.existsSync(z))L.mkdirSync(z,{recursive:!0});let Z=L.readdirSync(q,{withFileTypes:!0});for(let Q of Z){let $=M.join(q,Q.name),W=M.join(z,Q.name);if(Q.isDirectory()){if(Q.name===".git"||Q.name===".workspace")continue;Xq($,W)}else L.copyFileSync($,W)}}async function iq(q){try{if(!L.existsSync(T)){console.log(J.yellow("No express projects found."));return}let z;if(q.latest){if(z=await h(),!z){console.log(J.yellow("No express projects found."));return}}else if(q.projectName){if(z=await p(q.projectName),!z){console.log(J.yellow(`Project "${q.projectName}" not found.`));return}}else{let Q=await l();if(!Q){console.log(J.yellow("No project selected."));return}z=M.join(T,Q)}let Z=M.basename(z);if(!q.yes){if(!(await N({type:"confirm",name:"confirm",message:`Are you sure you want to remove project "${Z}"?`,initial:!1})).confirm){console.log(J.yellow("Project removal cancelled."));return}}console.log(J.blue(`Removing project "${Z}"...`)),L.rmSync(z,{recursive:!0,force:!0}),console.log(J.green(`Project "${Z}" removed successfully.`))}catch(z){console.error(J.red(`Error removing express project: ${z.message}`)),process.exit(1)}}async function oq(q){try{if(!L.existsSync(T)){console.log(J.yellow("No express projects found."));return}let z;if(q.latest){if(z=await h(),!z){console.log(J.yellow("No express projects found."));return}}else if(q.projectName){if(z=await p(q.projectName),!z){console.log(J.yellow(`Project "${q.projectName}" not found.`));return}}else{let $=await l();if(!$){console.log(J.yellow("No project selected."));return}z=M.join(T,$)}console.log(J.blue(`Entering project directory: ${z}`)),console.log(J.yellow(`
|
|
9
9
|
Opening a new shell in the project directory...`));let Z=process.env.SHELL||"/bin/bash",Q=g(Z,[],{stdio:"inherit",cwd:z,shell:!0});return new Promise(($)=>{Q.on("close",()=>{console.log(J.green(`
|
|
10
|
-
Returned from project directory.`)),$()})})}catch(z){console.error(J.red(`Error entering express project directory: ${z.message}`)),process.exit(1)}}import wq from"node:path";import{fileURLToPath as qz}from"node:url";import aq from"node:fs";import d from"node:path";import{fileURLToPath as rq}from"node:url";var tq=d.dirname(rq(import.meta.url));function eq({baseDir:q}){q=q||tq;let z=q;while(z!==d.parse(z).root){let Z=d.join(z,"node_modules");if(aq.existsSync(Z))return Z;z=d.dirname(z)}return null}var Tq=eq;var zz=wq.dirname(qz(import.meta.url));function Iq(){let q=Tq({baseDir:zz}),z=process.platform==="win32"?";":":";if(q)process.env.PATH=`${wq.join(q,"/.bin")}${z}${process.env.PATH}`}var a=new Zz;Iq();async function $z(){try{let q=Qz(process.argv.slice(2)).scriptName("fnode").usage("Usage: fnode <command> [options]").command($q).command(Gq).command(Kq).command(Yq).command(Jq).command(Uq).command(Lq).command("express","Create and manage express projects",Mq);q=w(q,{bin:"npm",createContext:V}),q=w(q,{bin:"node",createContext:V}),q=w(q,{bin:"bun",createContext:V}),q=w(q,{name:"serve",bin:"bun",preArgs:["run","serve","--"],createContext:V}),q=w(q,{name:"watch",bin:"bun",preArgs:["run","watch","--"],createContext:V}),q=w(q,{name:"app",bin:"bun",preArgs:["run","app","--"],createContext:V}),q=w(q,{name:"cli",bin:"bun",preArgs:["run","cli","--"],createContext:V}),q=w(q,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"],createContext:V}),q=w(q,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"],createContext:V}),q=w(q,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"],createContext:V}),q=w(q,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"],createContext:V}),q=w(q,{name:"compile",bin:"bun",preArgs:["run","compile","--"],createContext:V}),q=zq(q,{name:"install",createContext:V}),q=w(q,{bin:"npx",createContext:V}),q=w(q,{bin:"cdk",createContext:V}),q=w(q,{bin:"aws",createContext:V}),q=e(q,{name:"with",createContext:V}),q=qq(q,{name:"run",projectType:"fnode",processManager:a}),q=y(q,{name:"python",createContext:V}),q=y(q,{name:"python3",createContext:V}),q=y(q,{name:"pip",createContext:V}),q=y(q,{name:"pip3",createContext:V}),q=t(q,{name:"bin",createContext:V}),q.demandCommand(1,"You need at least one command before moving on").help().version("1.
|
|
10
|
+
Returned from project directory.`)),$()})})}catch(z){console.error(J.red(`Error entering express project directory: ${z.message}`)),process.exit(1)}}import wq from"node:path";import{fileURLToPath as qz}from"node:url";import aq from"node:fs";import d from"node:path";import{fileURLToPath as rq}from"node:url";var tq=d.dirname(rq(import.meta.url));function eq({baseDir:q}){q=q||tq;let z=q;while(z!==d.parse(z).root){let Z=d.join(z,"node_modules");if(aq.existsSync(Z))return Z;z=d.dirname(z)}return null}var Tq=eq;var zz=wq.dirname(qz(import.meta.url));function Iq(){let q=Tq({baseDir:zz}),z=process.platform==="win32"?";":":";if(q)process.env.PATH=`${wq.join(q,"/.bin")}${z}${process.env.PATH}`}var a=new Zz;Iq();async function $z(){try{let q=Qz(process.argv.slice(2)).scriptName("fnode").usage("Usage: fnode <command> [options]").command($q).command(Gq).command(Kq).command(Yq).command(Jq).command(Uq).command(Lq).command("express","Create and manage express projects",Mq);q=w(q,{bin:"npm",createContext:V}),q=w(q,{bin:"node",createContext:V}),q=w(q,{bin:"bun",createContext:V}),q=w(q,{name:"serve",bin:"bun",preArgs:["run","serve","--"],createContext:V}),q=w(q,{name:"watch",bin:"bun",preArgs:["run","watch","--"],createContext:V}),q=w(q,{name:"app",bin:"bun",preArgs:["run","app","--"],createContext:V}),q=w(q,{name:"cli",bin:"bun",preArgs:["run","cli","--"],createContext:V}),q=w(q,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"],createContext:V}),q=w(q,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"],createContext:V}),q=w(q,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"],createContext:V}),q=w(q,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"],createContext:V}),q=w(q,{name:"compile",bin:"bun",preArgs:["run","compile","--"],createContext:V}),q=zq(q,{name:"install",createContext:V}),q=w(q,{bin:"npx",createContext:V}),q=w(q,{bin:"cdk",createContext:V}),q=w(q,{bin:"aws",createContext:V}),q=e(q,{name:"with",createContext:V}),q=qq(q,{name:"run",projectType:"fnode",processManager:a}),q=y(q,{name:"python",createContext:V}),q=y(q,{name:"python3",createContext:V}),q=y(q,{name:"pip",createContext:V}),q=y(q,{name:"pip3",createContext:V}),q=t(q,{name:"bin",createContext:V}),q.demandCommand(1,"You need at least one command before moving on").help().version("1.6.0").parse()}catch(q){console.error(_q.red(`Fatal error: ${q.message}`)),await a.dispose(),process.exit(1)}}$z().catch(async(q)=>{console.error(_q.red(`Fatal error: ${q.message}`)),await a.dispose(),process.exit(1)});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import"./index.a0fxx5cv.js";import U from"fs";import _ from"path";import E from"chalk";import $ from"@fnet/yaml";import x,{ProcessManager as N}from"@fnet/shell-flow";import G from"os";async function k({projectType:D,group:C,tags:q,args:A,argv:Q,processManager:R}){try{let z=await S(D);q=q||[];let I=G.platform();if(!q.includes(I))q.push(I);let{parsed:J}=await $({file:z.path,tags:q}),B=J.commands;if(!B)throw Error(`Commands section not found in ${z.name}`);let K=B[C];if(!K)throw Error(`Command group '${C}' not found in ${z.name}`);await x({commands:K,context:{args:A,argv:Q,projectType:z.type},processManager:R})}catch(z){console.error(`Error: ${z.message}`),process.exit(1)}}async function T({projectType:D,tags:C}){try{let q=await S(D),{parsed:A}=await $({file:q.path,tags:C}),Q=A.commands;if(!Q){console.log(E.yellow(`No commands found in ${q.name}`));return}console.log(`
|
|
2
|
+
${E.bold("Available commands")} ${E.dim(`(${q.name})`)}:
|
|
3
|
+
`);let R=Object.entries(Q),z=Math.max(...R.map(([J])=>J.length)),I=!1;for(let[J,B]of R){let K=B&&typeof B==="object"&&!Array.isArray(B),X=K?B.description||"":"",V=K?B.usage||"":"",W=!!(X||V);if(W&&I)console.log("");let Z=J.padEnd(z);if(W){if(console.log(` ${E.bold.cyan(Z)} ${X}`),V)console.log(` ${"".padEnd(z)} ${E.dim("$ "+V)}`)}else console.log(` ${E.cyan(Z)}`);I=W}}catch(q){console.error(`Error: ${q.message}`),process.exit(1)}}async function S(D){let C=process.cwd(),q=_.resolve(C,"fnode.yaml"),A=_.resolve(C,"fnet.yaml");if(D==="fnode"){if(U.existsSync(q))return{path:q,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(D==="fnet"){if(U.existsSync(A))return{path:A,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(U.existsSync(q))return{path:q,name:"fnode.yaml",type:"fnode"};if(U.existsSync(A))return{path:A,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,S as detectProjectFile};
|
package/dist/frun/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
${
|
|
4
|
-
`);let U=Object.entries(J),I=Math.max(...U.map(([
|
|
2
|
+
import w from"yargs";import{hideBin as C}from"yargs/helpers";import{ProcessManager as T}from"@fnet/shell-flow";import _ from"fs";import S from"path";import V from"chalk";import x from"@fnet/yaml";import N,{ProcessManager as y}from"@fnet/shell-flow";import b from"os";async function H({projectType:D,group:A,tags:q,args:E,argv:J,processManager:U}){try{let I=await O(D);q=q||[];let W=b.platform();if(!q.includes(W))q.push(W);let{parsed:X}=await x({file:I.path,tags:q}),Q=X.commands;if(!Q)throw Error(`Commands section not found in ${I.name}`);let Z=Q[A];if(!Z)throw Error(`Command group '${A}' not found in ${I.name}`);await N({commands:Z,context:{args:E,argv:J,projectType:I.type},processManager:U})}catch(I){console.error(`Error: ${I.message}`),process.exit(1)}}async function L({projectType:D,tags:A}){try{let q=await O(D),{parsed:E}=await x({file:q.path,tags:A}),J=E.commands;if(!J){console.log(V.yellow(`No commands found in ${q.name}`));return}console.log(`
|
|
3
|
+
${V.bold("Available commands")} ${V.dim(`(${q.name})`)}:
|
|
4
|
+
`);let U=Object.entries(J),I=Math.max(...U.map(([X])=>X.length)),W=!1;for(let[X,Q]of U){let Z=Q&&typeof Q==="object"&&!Array.isArray(Q),K=Z?Q.description||"":"",$=Z?Q.usage||"":"",z=!!(K||$);if(z&&W)console.log("");let R=X.padEnd(I);if(z){if(console.log(` ${V.bold.cyan(R)} ${K}`),$)console.log(` ${"".padEnd(I)} ${V.dim("$ "+$)}`)}else console.log(` ${V.cyan(R)}`);W=z}}catch(q){console.error(`Error: ${q.message}`),process.exit(1)}}async function O(D){let A=process.cwd(),q=S.resolve(A,"fnode.yaml"),E=S.resolve(A,"fnet.yaml");if(D==="fnode"){if(_.existsSync(q))return{path:q,name:"fnode.yaml",type:"fnode"};throw Error("fnode.yaml file not found in current directory")}if(D==="fnet"){if(_.existsSync(E))return{path:E,name:"fnet.yaml",type:"fnet"};throw Error("fnet.yaml file not found in current directory")}if(_.existsSync(q))return{path:q,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:D}){return{command:"$0 [group] [options..]",describe:"Run a command group from project file",builder:(A)=>{return A.parserConfiguration({}).middleware((q)=>{let E=/^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)+$/;Object.keys(q).forEach((J)=>{if(E.test(J)){let U=J.replace(/-/g,"_");q[U]=q[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 L({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 H({projectType:"auto",group:A.group,tags:A.ftag,args:A,argv:process.argv,processManager:D})}catch(q){console.error(`Error: ${q.message}`),await D.dispose(),process.exit(1)}}}}var G=new T;w(C(process.argv)).scriptName("frun").usage("Usage: $0 <command> [options]").command(B({processManager:G})).help().version("1.6.0").fail(async(D,A)=>{if(A)console.error(`Error: ${A.message}`);else if(D)console.error(`Error: ${D}`);await G.dispose(),process.exit(1)}).parse();
|
package/dist/fservice/index.js
CHANGED
|
@@ -15,5 +15,5 @@ ${z}
|
|
|
15
15
|
`).filter((T)=>T.includes("=")).reduce((T,E)=>{let[z,...K]=E.split("=");return T[z.trim()]=K.join("=").trim(),T},{})}}},workingDir:{type:"string",description:"Working directory","x-prompt":{type:"input",message:"Enter working directory (optional):"}},autoStart:{type:"boolean",description:"Start on boot",default:!1,"x-prompt":{type:"confirm",message:"Start service on boot?",initial:!1}},restartOnFailure:{type:"boolean",description:"Restart on failure",default:!0,"x-prompt":{type:"confirm",message:"Restart service on failure?",initial:!0}},system:{type:"boolean",description:"System service",default:!0,"x-prompt":{type:"confirm",message:"Register as system service?",initial:!0}},user:{type:"string",description:"User to run the service as","x-prompt":{type:"input",message:"Enter user to run the service as (optional):"}},instances:{type:"integer",description:"Number of instances to run",default:1,minimum:1,"x-prompt":{type:"number",message:"Enter number of instances to run:",initial:1}},metadata:{type:"object",additionalProperties:!0,description:"Custom metadata"}}}}var h={getServiceManifestSchema:j$};import p from"chalk";import E$ from"@fnet/prompt";async function D$($){let{items:_,message:Y,nameField:T="name",valueField:E="name",initialValue:z=null,allowAbort:K=!0}=$;if(!_||_.length===0)return console.log(p.yellow("No items available for selection.")),null;if(_.length===1&&!K){let q=_[0],P=typeof q==="string"?q:q[E];return console.log(p.blue(`Only one option available: ${typeof q==="string"?q:q[T]}`)),P}let Q=_.map((q)=>{if(typeof q==="string")return{name:q,value:q,message:q};else return{name:q[E],value:q[E],message:q[T]||q[E]}});if(K)Q.push({name:"cancel",value:null,message:p.yellow("Cancel")});let G=null;if(z){let q=Q.findIndex((P)=>P.name===z);if(q!==-1)G=q}let O="selectedItem",{[O]:M}=await E$({type:"select",name:O,message:Y,choices:Q,initial:G});if(M==="cancel")return null;return M}async function P$($){let{items:_,message:Y,nameField:T="name",valueField:E="name",initialValues:z=[],allowAbort:K=!0}=$;if(!_||_.length===0)return console.log(p.yellow("No items available for selection.")),null;let Q=_.map((q)=>{if(typeof q==="string")return{name:q,value:q,message:q};else return{name:q[E],value:q[E],message:q[T]||q[E]}}),G=[];if(z&&z.length>0)G=Q.map((q,P)=>z.includes(q.name)?P:-1).filter((q)=>q!==-1);let O="selectedItems",M=await E$({type:"multiselect",name:O,message:Y,choices:Q,initial:G,hint:"(Use space to select, enter to confirm)",validate:(q)=>{if(q.length===0&&!K)return"Please select at least one item";return!0}});if(K&&M[O].length===0)return null;return M[O]}var w={promptForSelection:D$,promptForMultipleSelection:P$};var b$={command:"manifest <subcommand>",describe:"Manage service manifests",builder:($)=>{return $.command({command:"create",describe:"Create a new service manifest",builder:(_)=>{return _.option("name",{describe:"Service manifest name",type:"string"}).option("output",{describe:"Output file path",type:"string",alias:"o"})},handler:S$}).command({command:"list",describe:"List service manifests",builder:(_)=>{return _.option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:N$}).command({command:"show [n]",describe:"Show service manifest details",builder:(_)=>{return _.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("format",{describe:"Output format",type:"string",choices:["json","yaml"],default:"yaml"})},handler:y$}).command({command:"edit [n]",describe:"Edit a service manifest",builder:(_)=>{return _.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:u$}).command({command:"delete [n]",describe:"Delete a service manifest",builder:(_)=>{return _.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1}).option("force",{describe:"Force deletion without confirmation",type:"boolean",default:!1,alias:"f"})},handler:k$}).command({command:"validate [n]",describe:"Validate a service manifest",builder:(_)=>{return _.positional("name",{describe:"Service manifest name",type:"string",demandOption:!1})},handler:d$}).demandCommand(1,"You need to specify a subcommand")},handler:()=>{}};async function S$($){try{let _=await I($),Y=h.getServiceManifestSchema(),T=await J$({schema:Y,format:"yaml"});console.log("Result from fnetObjectFromSchema:",T);let E;if(typeof T==="string")try{E=(await import("yaml")).default.parse(T)}catch(Q){console.warn(X.yellow(`Failed to parse YAML: ${Q.message}`)),E={name:"service-"+Date.now()}}else if(T&&typeof T==="object")E=T.data||T;else E={name:"service-"+Date.now()};console.log("Generated manifest:",E);let z=$.name||(E&&E.name?E.name:"service-"+Date.now());if(J.servicManifestExists(z)&&!$.force){let{confirmOverwrite:Q}=await K$({type:"confirm",name:"confirmOverwrite",message:`Service manifest '${z}' already exists. Overwrite?`,initial:!1});if(!Q){console.log(X.yellow("Operation cancelled."));return}}if(J.saveServiceManifest(z,E))console.log(X.green(`Service manifest '${z}' created successfully.`)),console.log(X.blue(`Location: ${J.getServiceManifestPath(z)}`));else console.error(X.red(`Failed to create service manifest '${z}'.`))}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}async function N$($){try{let _=await I($),Y=J.listServiceManifests();if(Y.length===0){console.log(X.yellow("No service manifests found."));return}if($.format==="json")console.log(JSON.stringify(Y,null,2));else if($.format==="text")Y.forEach((T)=>console.log(T));else{console.log(X.bold(`
|
|
16
16
|
Service Definitions:`));let T=(await import("./index.ezmyhtvd.js")).default,E=["NAME","BINARY","DESCRIPTION"],z=T.createTable(E,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(let K of Y){let Q=J.loadServiceManifest(K);if(Q)z.push([X.white(K),X.cyan(Q.binary||"undefined"),Q.description||""])}console.log(z.toString()),console.log(`Total: ${Y.length} manifest(s)`)}}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}async function y$($){try{let _=await I($);if(!$.name){let T=J.listServiceManifests();if(T.length===0){console.log(X.yellow("No service manifests found."));return}let E=await w.promptForSelection({items:T,message:"Select a service manifest to show:",allowAbort:!0});if(E===null){console.log(X.yellow("Operation cancelled."));return}$.name=E}let Y=J.loadServiceManifest($.name);if(!Y)console.error(X.red(`Service manifest '${$.name}' not found.`)),process.exit(1);if($.format==="json")console.log(JSON.stringify(Y,null,2));else{let T=(await import("yaml")).default;console.log(T.stringify(Y))}}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}async function u$($){try{let _=await I($);if(!$.name){let Q=J.listServiceManifests();if(Q.length===0){console.log(X.yellow("No service manifests found."));return}let G=await w.promptForSelection({items:Q,message:"Select a service manifest to edit:",allowAbort:!0});if(G===null){console.log(X.yellow("Operation cancelled."));return}$.name=G}let Y=J.loadServiceManifest($.name);if(!Y)console.error(X.red(`Service manifest '${$.name}' not found.`)),process.exit(1);let T=h.getServiceManifestSchema(),z=(await J$({schema:T,ref:Y,format:"yaml"})).data;if(J.saveServiceManifest($.name,z))console.log(X.green(`Service manifest '${$.name}' updated successfully.`));else console.error(X.red(`Failed to update service manifest '${$.name}'.`))}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}async function k$($){try{let _=await I($);if(!$.name){let T=J.listServiceManifests();if(T.length===0){console.log(X.yellow("No service manifests found."));return}let E=await w.promptForSelection({items:T,message:"Select a service manifest to delete:",allowAbort:!0});if(E===null){console.log(X.yellow("Operation cancelled."));return}$.name=E}if(!J.servicManifestExists($.name))console.error(X.red(`Service manifest '${$.name}' not found.`)),process.exit(1);if(!$.force){let{confirmDelete:T}=await K$({type:"confirm",name:"confirmDelete",message:`Are you sure you want to delete service manifest '${$.name}'?`,initial:!1});if(!T){console.log(X.yellow("Operation cancelled."));return}}if(J.deleteServiceManifest($.name))console.log(X.green(`Service manifest '${$.name}' deleted successfully.`));else console.error(X.red(`Failed to delete service manifest '${$.name}'.`))}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}async function d$($){try{let _=await I($);if(!$.name){let E=J.listServiceManifests();if(E.length===0){console.log(X.yellow("No service manifests found."));return}let z=await w.promptForSelection({items:E,message:"Select a service manifest to validate:",allowAbort:!0});if(z===null){console.log(X.yellow("Operation cancelled."));return}$.name=z}let Y=J.loadServiceManifest($.name);if(!Y)console.error(X.red(`Service manifest '${$.name}' not found.`)),process.exit(1);let T=J.validateServiceManifest(Y);if(T.valid)console.log(X.green(`Service manifest '${$.name}' is valid.`));else console.error(X.red(`Service manifest '${$.name}' is invalid:`)),T.errors.forEach((E)=>{console.error(X.red(`- ${E}`))}),process.exit(1)}catch(_){console.error(X.red(`Error: ${_.message}`)),process.exit(1)}}var Q$=b$;import B from"chalk";var p$={command:"register",describe:"Register a service manifest as a system service",builder:($)=>{return $.option("manifest",{describe:"Service manifest name",type:"string",demandOption:!1,alias:"d"}).option("start",{describe:"Start the service after registration",type:"boolean",default:!1})},handler:async($)=>{try{let _=await I($),Y=$.manifest;if(!Y){let E=J.listServiceManifests();if(E.length===0)console.log(B.yellow('No service manifests found. Create one first using "fservice manifest create".')),process.exit(1);if(Y=await w.promptForSelection({items:E,message:"Select a service manifest to register:",allowAbort:!0}),!Y){console.log(B.yellow("Operation cancelled."));return}}if(!J.servicManifestExists(Y))console.error(B.red(`Service manifest '${Y}' not found.`)),process.exit(1);console.log(B.blue(`Registering service from manifest '${Y}'...`));let T=await J.registerService(Y);if(console.log(B.green(`Service '${T.name}' registered successfully.`)),$.start){console.log(B.blue(`Starting service '${T.name}'...`));let E=(await import("@fnet/service")).default;try{await E({action:"start",name:T.name}),console.log(B.green(`Service '${T.name}' started successfully.`));let z=J.loadServiceMetadata();if(z.services[T.name])z.services[T.name].status="running",z.services[T.name].lastStarted=new Date().toISOString(),J.saveServiceMetadata(z)}catch(z){console.error(B.red(`Failed to start service: ${z.message}`))}}}catch(_){console.error(B.red(`Error: ${_.message}`)),process.exit(1)}}},W$=p$;import H from"chalk";import g$ from"@fnet/prompt";var f$={command:"unregister",describe:"Unregister a service from the system",builder:($)=>{return $.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("keep-manifest",{describe:"Keep the service manifest",type:"boolean",default:!0}).option("force",{describe:"Force unregistration without confirmation",type:"boolean",default:!1,alias:"f"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=$.name;if(!T){let z=Object.keys(Y.services);if(z.length===0)console.log(H.yellow("No registered services found.")),process.exit(1);if(T=await w.promptForSelection({items:z,message:"Select a service to unregister:",allowAbort:!0}),!T){console.log(H.yellow("Operation cancelled."));return}}if(!Y.services[T])console.error(H.red(`Service '${T}' not found in metadata.`)),process.exit(1);if(!$.force){let{confirmUnregister:z}=await g$({type:"confirm",name:"confirmUnregister",message:`Are you sure you want to unregister service '${T}'?`,initial:!1});if(!z){console.log(H.yellow("Operation cancelled."));return}}console.log(H.blue(`Unregistering service '${T}'...`));let E=(await import("@fnet/service")).default;try{let z=Y.services[T].manifest,K=J.loadServiceManifest(z);if(!K)throw Error(`Service manifest '${z}' not found`);let Q=K.system!==!1;try{await E({action:"stop",name:T,system:Q}),console.log(H.blue(`Service '${T}' stopped.`))}catch(G){console.warn(H.yellow(`Warning: Failed to stop service: ${G.message}`))}if(await E({action:"unregister",name:T,system:Q}),console.log(H.green(`Service '${T}' unregistered successfully.`)),delete Y.services[T],J.saveServiceMetadata(Y),!$.keepDefinition&&z){if(J.servicManifestExists(z))if(J.deleteServiceManifest(z))console.log(H.green(`Service manifest '${z}' deleted.`));else console.warn(H.yellow(`Warning: Failed to delete service manifest '${z}'.`))}}catch(z){console.error(H.red(`Failed to unregister service: ${z.message}`)),process.exit(1)}}catch(_){console.error(H.red(`Error: ${_.message}`)),process.exit(1)}}},X$=f$;import x from"chalk";var h$={command:"start",describe:"Start a registered service",builder:($)=>{return $.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=$.name;if(!T){let z=Object.keys(Y.services);if(z.length===0)console.log(x.yellow("No registered services found.")),process.exit(1);if(T=await w.promptForSelection({items:z,message:"Select a service to start:",allowAbort:!0}),!T){console.log(x.yellow("Operation cancelled."));return}}if(!Y.services[T])console.error(x.red(`Service '${T}' not found in metadata.`)),process.exit(1);console.log(x.blue(`Starting service '${T}'...`));let E=(await import("@fnet/service")).default;try{let z=Y.services[T].manifest,K=J.loadServiceManifest(z);if(!K)throw Error(`Service manifest '${z}' not found`);await E({action:"start",name:T,system:K.system!==!1}),console.log(x.green(`Service '${T}' started successfully.`)),Y.services[T].status="running",Y.services[T].lastStarted=new Date().toISOString(),J.saveServiceMetadata(Y)}catch(z){console.error(x.red(`Failed to start service: ${z.message}`)),process.exit(1)}}catch(_){console.error(x.red(`Error: ${_.message}`)),process.exit(1)}}},Z$=h$;import F from"chalk";var o$={command:"stop",describe:"Stop a running service",builder:($)=>{return $.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=$.name;if(!T){let z=Object.keys(Y.services);if(z.length===0)console.log(F.yellow("No registered services found.")),process.exit(1);if(T=await w.promptForSelection({items:z,message:"Select a service to stop:",allowAbort:!0}),!T){console.log(F.yellow("Operation cancelled."));return}}if(!Y.services[T])console.error(F.red(`Service '${T}' not found in metadata.`)),process.exit(1);console.log(F.blue(`Stopping service '${T}'...`));let E=(await import("@fnet/service")).default;try{let z=Y.services[T].manifest,K=J.loadServiceManifest(z);if(!K)throw Error(`Service manifest '${z}' not found`);await E({action:"stop",name:T,system:K.system!==!1}),console.log(F.green(`Service '${T}' stopped successfully.`)),Y.services[T].status="stopped",Y.services[T].lastStopped=new Date().toISOString(),J.saveServiceMetadata(Y)}catch(z){console.error(F.red(`Failed to stop service: ${z.message}`)),process.exit(1)}}catch(_){console.error(F.red(`Error: ${_.message}`)),process.exit(1)}}},q$=o$;import U from"chalk";var v$={command:"restart",describe:"Restart a service",builder:($)=>{return $.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=$.name;if(!T){let z=Object.keys(Y.services);if(z.length===0)console.log(U.yellow("No registered services found.")),process.exit(1);if(T=await w.promptForSelection({items:z,message:"Select a service to restart:",allowAbort:!0}),!T){console.log(U.yellow("Operation cancelled."));return}}if(!Y.services[T])console.error(U.red(`Service '${T}' not found in metadata.`)),process.exit(1);console.log(U.blue(`Restarting service '${T}'...`));let E=(await import("@fnet/service")).default;try{await E({action:"stop",name:T}),console.log(U.blue(`Service '${T}' stopped.`)),await E({action:"start",name:T}),console.log(U.green(`Service '${T}' restarted successfully.`)),Y.services[T].status="running",Y.services[T].lastRestarted=new Date().toISOString(),J.saveServiceMetadata(Y)}catch(z){console.error(U.red(`Failed to restart service: ${z.message}`)),process.exit(1)}}catch(_){console.error(U.red(`Error: ${_.message}`)),process.exit(1)}}},I$=v$;import L from"chalk";var l$={command:"status",describe:"Check the status of a service",builder:($)=>{return $.option("name",{describe:"Service name",type:"string",demandOption:!1,alias:"n"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=$.name;if(!T){let z=Object.keys(Y.services);if(z.length===0)console.log(L.yellow("No registered services found.")),process.exit(1);if(T=await w.promptForSelection({items:z,message:"Select a service to check status:",allowAbort:!0}),!T){console.log(L.yellow("Operation cancelled."));return}}if(!Y.services[T])console.error(L.red(`Service '${T}' not found in metadata.`)),process.exit(1);console.log(L.blue(`Checking status of service '${T}'...`));let E=(await import("@fnet/service")).default;try{let z=Y.services[T].manifest,K=J.loadServiceManifest(z);if(!K)throw Error(`Service manifest '${z}' not found`);let Q=await E({action:"status",name:T,system:K.system!==!1});if(console.log(L.green(`Service '${T}' status: ${Q}`)),Y.services[T].status=Q||"unknown",Y.services[T].lastChecked=new Date().toISOString(),J.saveServiceMetadata(Y),$.format==="json")console.log(JSON.stringify({name:T,status:Q||"unknown",manifest:z,binary:Y.services[T].binary},null,2));else if($.format==="text")console.log(`Name: ${T}`),console.log(`Status: ${Q||"unknown"}`),console.log(`Definition: ${z}`),console.log(`Binary: ${Y.services[T].binary}`);else console.log(L.bold(`
|
|
17
17
|
Service Status:`)),console.log(L.bold("─".repeat(50))),console.log(`${L.bold("Name:")} ${T}`),console.log(`${L.bold("Status:")} ${n$(Q)(Q||"unknown")}`),console.log(`${L.bold("Definition:")} ${z}`),console.log(`${L.bold("Binary:")} ${Y.services[T].binary}`),console.log(L.bold("─".repeat(50)))}catch(z){console.error(L.red(`Failed to check service status: ${z.message}`)),process.exit(1)}}catch(_){console.error(L.red(`Error: ${_.message}`)),process.exit(1)}}};function n$($){switch($){case"running":return L.green;case"stopped":return L.yellow;case"failed":return L.red;default:return L.gray}}var G$=l$;import N from"chalk";var m$={command:"list",describe:"List all registered services",builder:($)=>{return $.option("binary",{describe:"Filter by binary name",type:"string",alias:"b"}).option("status",{describe:"Filter by status",type:"string",choices:["running","stopped","failed","unknown"],alias:"s"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"})},handler:async($)=>{try{let _=await I($),Y=J.loadServiceMetadata(),T=Object.entries(Y.services).map(([E,z])=>({name:E,...z}));if($.binary)T=T.filter((E)=>E.binary===$.binary);if($.status)T=T.filter((E)=>E.status===$.status);if(T.length===0){console.log(N.yellow("No services found."));return}if($.format==="json")console.log(JSON.stringify(T,null,2));else if($.format==="text")T.forEach((E)=>{console.log(`${E.name} (${E.status||"unknown"})`)});else{let E=["NAME","STATUS","BINARY","DEFINITION"],z=o.createTable(E,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});T.forEach((K)=>{let Q=o.getStatusColor(K.status);z.push([N.white(K.name),Q(K.status||"unknown"),N.cyan(K.binary),K.manifest])}),console.log(N.bold(`
|
|
18
|
-
Registered Services:`)),console.log(z.toString()),console.log(`Total: ${T.length} service(s)`)}}catch(_){console.error(N.red(`Error: ${_.message}`)),process.exit(1)}}},R$=m$;var w_=c$(r$(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version("1.
|
|
18
|
+
Registered Services:`)),console.log(z.toString()),console.log(`Total: ${T.length} service(s)`)}}catch(_){console.error(N.red(`Error: ${_.message}`)),process.exit(1)}}},R$=m$;var w_=c$(r$(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version("1.6.0").command(Q$).command(W$).command(X$).command(Z$).command(q$).command(I$).command(G$).command(R$).demandCommand(1,"You need to specify a command").strict().help().alias("h","help").alias("v","version").fail(($,_,Y)=>{if(_)console.error(v.red(`Error: ${_.message}`)),console.error(_);else console.error(v.red(`Error: ${$}`));console.error(v.yellow(`
|
|
19
19
|
Usage:`),Y.help()),process.exit(1)}).parse();
|
package/package.json
CHANGED
|
@@ -1,3 +0,0 @@
|
|
|
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
|
-
${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};
|
|
@@ -1,3 +0,0 @@
|
|
|
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
|
-
${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};
|