@fnet/cli 0.118.1 → 0.118.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"node:path";import{fileURLToPath as o}from"node:url";import t from"chalk";import n from"yargs";import{hideBin as s}from"yargs/helpers";import r from"node:fs";import i from"node:os";import l from"@fnet/prompt";import a from"cli-table3";import{promisify as c}from"node:util";import d from"tree-kill";function h(){return e.join(i.homedir(),".fnet","bin")}function m(){return e.join(i.homedir(),".fnet","metadata")}function u(){return e.join(m(),"binaries.json")}function f(){try{if("win32"===process.platform)return process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell")?"powershell-core":process.env.PSModulePath?"powershell":"cmd";const o=process.env.SHELL||"";return o.includes("bash")?"bash":o.includes("zsh")?"zsh":o.includes("fish")?"fish":o.includes("ksh")?"ksh":o.includes("csh")||o.includes("tcsh")?"csh":r.existsSync(e.join(i.homedir(),".bashrc"))?"bash":r.existsSync(e.join(i.homedir(),".zshrc"))?"zsh":r.existsSync(e.join(i.homedir(),".config","fish","config.fish"))?"fish":"unknown"}catch(e){return"unknown"}}function p(o){const t=i.homedir(),n=[];switch(o){case"bash":n.push({name:".bashrc",path:e.join(t,".bashrc")}),n.push({name:".bash_profile",path:e.join(t,".bash_profile")}),n.push({name:".profile",path:e.join(t,".profile")});break;case"zsh":n.push({name:".zshrc",path:e.join(t,".zshrc")}),n.push({name:".zprofile",path:e.join(t,".zprofile")});break;case"fish":n.push({name:"config.fish",path:e.join(t,".config","fish","config.fish")});break;case"ksh":n.push({name:".kshrc",path:e.join(t,".kshrc")}),n.push({name:".profile",path:e.join(t,".profile")});break;case"csh":n.push({name:".cshrc",path:e.join(t,".cshrc")}),n.push({name:".tcshrc",path:e.join(t,".tcshrc")});break;case"powershell":n.push({name:"Microsoft.PowerShell_profile.ps1",path:e.join(t,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),n.push({name:"profile.ps1",path:e.join(t,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":n.push({name:"Microsoft.PowerShell_profile.ps1",path:e.join(t,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),n.push({name:"profile.ps1",path:e.join(t,"Documents","PowerShell","profile.ps1")});break;case"cmd":n.push({name:"fnet-path.bat",path:e.join(t,"fnet-path.bat")})}return n}function y(e,o){switch(e){case"bash":case"zsh":case"ksh":default:return`export PATH="${o}:$PATH"`;case"fish":return`set -gx PATH ${o} $PATH`;case"csh":return`setenv PATH ${o}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${o};" + $env:PATH`;case"cmd":return`@echo off\nSETX PATH "%PATH%;${o}"\necho Path updated successfully`}}var g={getBinDirectory:h,getMetadataDirectory:m,getMetadataFilePath:u,checkIfInPath:function(o){return(process.env.PATH||"").split(e.delimiter).includes(o)},detectUserShell:f,getShellConfigPath:function(){const e=p(f());for(const o of e)if(r.existsSync(o.path))return o.path;return e.length>0?e[0].path:null},getAllShellConfigPaths:p,createBinDirectoryStructure:async function(){const e=h(),o=m(),t=u();r.existsSync(e)||r.mkdirSync(e,{recursive:!0}),r.existsSync(o)||r.mkdirSync(o,{recursive:!0}),r.existsSync(t)||r.writeFileSync(t,JSON.stringify({binaries:{},lastUpdated:(new Date).toISOString()},null,2))},getExportPathCommand:y,addBinToPath:async function(o,n,s){try{const i=y(o,s);if("cmd"===o)return r.writeFileSync(n,i),console.log(t.yellow(`Created batch file at ${n}`)),console.log(t.yellow("Run this file to add the bin directory to your PATH")),!0;if("powershell"!==o&&"powershell-core"!==o||r.existsSync(e.dirname(n))||r.mkdirSync(e.dirname(n),{recursive:!0}),!r.existsSync(n)){const e="fish"===o?"# Fish shell configuration\n\n":"powershell"===o||"powershell-core"===o?"# PowerShell profile\n\n":"# Shell configuration\n\n";r.writeFileSync(n,e),console.log(t.green(`Created config file at ${n}`))}const l=r.readFileSync(n,"utf8");if(l.includes(s))return!0;const a=`${l.trim()}\n\n# Added by @fnet/cli\n${i}\n`;return r.writeFileSync(n,a),"powershell"!==o&&"powershell-core"!==o||(console.log(t.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(t.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"))),!0}catch(e){return console.error(t.red(`Failed to add bin directory to PATH: ${e.message}`)),!1}}};async function w(o){const t=function(){const o=i.homedir(),t=e.join(o,".fnet","bin");return r.existsSync(t)||r.mkdirSync(t,{recursive:!0}),t}(),n=function(){const o=i.homedir(),t=e.join(o,".fnet");return r.existsSync(t)||r.mkdirSync(t,{recursive:!0}),e.join(t,"bin-registry.json")}();let s={};if(r.existsSync(n))try{const e=r.readFileSync(n,"utf8");s=JSON.parse(e)}catch(e){console.warn(`Warning: Could not parse bin registry: ${e.message}`)}return{binDir:t,registryPath:n,registry:s,args:o}}e.dirname(o(import.meta.url));var b={command:"setup",describe:"Initialize the bin system",builder:{},handler:async o=>{try{await w(o);console.log(t.blue("Setting up the bin system...")),await g.createBinDirectoryStructure();const n=g.getBinDirectory();console.log(t.green(`Bin directory: ${n}`));if(g.checkIfInPath(n))console.log(t.green("Bin directory is already in PATH."));else{console.log(t.yellow("Bin directory is not in PATH."));const{confirmAddToPath:o}=await l({type:"confirm",name:"confirmAddToPath",message:`Would you like to add ${n} to your PATH?`,initial:!0});if(o){let o=g.detectUserShell();if("unknown"===o){const{selectedShell:e}=await l({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)"}]});o=e}else{const{confirmShell:e}=await l({type:"confirm",name:"confirmShell",message:`Detected shell: ${o}. Is this correct?`,initial:!0});if(!e){const{selectedShell:e}=await l({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)"}]});o=e}}const s=g.getAllShellConfigPaths(o);let a;if(s.length>1){const e=s.filter((e=>r.existsSync(e.path)));if(e.length>0){const{selectedConfigPath:o}=await l({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:e.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});a=o}else{const{selectedConfigPath:e}=await l({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:s.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});a=e}}else if(1===s.length)a=s[0].path;else{const{enteredConfigPath:o}=await l({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:e.join(i.homedir(),".bashrc")});a=o}await g.addBinToPath(o,a,n)?(console.log(t.green(`Added bin directory to PATH in ${a}`)),console.log(t.yellow("Please restart your terminal or run the following command:")),console.log(t.green(`source ${a}`))):(console.log(t.red(`Failed to add bin directory to PATH in ${a}`)),console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(g.getExportPathCommand(o,n))))}else console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(`export PATH="${n}:$PATH"`)),console.log(t.yellow("Or run:")),console.log(t.green("fbin path"))}console.log(t.green("Bin system setup completed successfully."))}catch(e){console.error(t.red(`Failed to set up bin system: ${e.message}`)),process.exit(1)}}};var S={command:"path",describe:"Add bin directory to PATH",builder:{yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},handler:async o=>{try{await w(o);const n=g.getBinDirectory();console.log(t.blue(`Adding ${n} to PATH...`)),g.createBinDirectoryStructure()||(console.log(t.yellow("Creating bin directory structure...")),await g.createBinDirectoryStructure());if(g.checkIfInPath(n))return void console.log(t.green("Bin directory is already in PATH."));let s=g.detectUserShell();if("unknown"===s)if(o.yes)s="win32"===process.platform?"powershell":"bash",console.log(t.yellow(`Auto-selecting ${s} shell due to --yes flag`));else{const{selectedShell:e}=await l({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)"}]});s=e}else if(o.yes)console.log(t.yellow(`Auto-confirming detected shell: ${s} due to --yes flag`));else{const{confirmShell:e}=await l({type:"confirm",name:"confirmShell",message:`Detected shell: ${s}. Is this correct?`,initial:!0});if(!e){const{selectedShell:e}=await l({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)"}]});s=e}}const a=g.getAllShellConfigPaths(s);let c;if(a.length>1){const e=a.filter((e=>r.existsSync(e.path)));if(e.length>0)if(o.yes)c=e[0].path,console.log(t.yellow(`Auto-selecting config file: ${c} due to --yes flag`));else{const{selectedConfigPath:o}=await l({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:e.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});c=o}else if(o.yes)c=a[0].path,console.log(t.yellow(`Auto-selecting config file to create: ${c} due to --yes flag`));else{const{selectedConfigPath:e}=await l({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:a.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});c=e}}else if(1===a.length)c=a[0].path;else if(o.yes)c=e.join(i.homedir(),"win32"===process.platform?"_profile":".bashrc"),console.log(t.yellow(`Auto-selecting default config file: ${c} due to --yes flag`));else{const{enteredConfigPath:o}=await l({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:e.join(i.homedir(),".bashrc")});c=o}await g.addBinToPath(s,c,n)?(console.log(t.green(`Added bin directory to PATH in ${c}`)),console.log(t.yellow("Please restart your terminal or run the following command:")),console.log(t.green(`source ${c}`))):(console.log(t.red(`Failed to add bin directory to PATH in ${c}`)),console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(g.getExportPathCommand(s,n))))}catch(e){console.error(t.red(`Failed to add bin directory to PATH: ${e.message}`)),process.exit(1)}}};var P={command:"compile [source] [options]",describe:"Compile a CLI project to a binary",builder:{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"},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"}},handler:async o=>{try{await w(o);const n=process.cwd(),s=e.basename(n),i=o.name||s;let a;if(o.output)a=o.output;else{const o=e.join(n,".bin");r.existsSync(o)||r.mkdirSync(o,{recursive:!0}),a=e.join(o,i)}const c=e.resolve(process.cwd(),o.source);if(r.existsSync(c)||(console.error(t.red(`Source file not found: ${c}`)),console.error(t.yellow("Make sure to build your project first.")),process.exit(1)),r.existsSync(a)&&!o.force){const{confirmOverwrite:e}=await l({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${a}. Overwrite?`,initial:!1});if(!e)return void console.log(t.yellow("Compilation cancelled."))}const d=process.platform;console.log(t.blue(`Detected platform: ${d}`)),"win32"!==d||a.endsWith(".exe")||(a=`${a}.exe`,console.log(t.blue(`Adjusted output path for Windows: ${a}`))),console.log(t.blue(`Compiling ${c} to ${a}...`));const{spawn:h}=await import("child_process");try{const e=h("bun",["--version"],{stdio:"pipe"});await new Promise(((o,t)=>{e.on("close",(e=>{0===e?o():t(new Error("Bun is not available. Please install Bun first."))})),e.on("error",(e=>{t(new Error(`Bun is not available: ${e.message}`))}))}))}catch(e){console.error(t.red(`Bun is not available: ${e.message}`)),console.error(t.yellow("Please install Bun first: https://bun.sh/")),process.exit(1)}const m=["build",c,"--compile",`--outfile=${a}`];if(o.target&&"auto"!==o.target&&m.push(`--target=${o.target}`),!1===o.minify&&m.push("--no-minify"),o.external){o.external.split(",").map((e=>e.trim())).forEach((e=>{m.push(`--external:${e}`)}))}console.log(t.blue(`Running: bun ${m.join(" ")}`));const u=h("bun",m,{stdio:"inherit"});await new Promise(((e,o)=>{u.on("close",(t=>{0===t?e():o(new Error(`Compilation failed with code ${t}`))})),u.on("error",(e=>{o(e)}))})),"win32"!==d&&r.chmodSync(a,493),console.log(t.green(`Binary compiled successfully: ${a}`)),"win32"===d?console.log(t.yellow("Note: On Windows, you may need to run the binary from a command prompt or PowerShell.")):"darwin"===d&&console.log(t.yellow("Note: On macOS, you may need to allow the binary to run in System Preferences > Security & Privacy."))}catch(e){console.error(t.red(`Failed to compile binary: ${e.message}`)),process.exit(1)}}};var $={command:"install [source] [options]",describe:"Install a binary to the bin directory",builder:{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"}},handler:async o=>{try{await w(o);const n=e.resolve(process.cwd(),o.source);r.existsSync(n)||(console.error(t.red(`Source file not found: ${n}`)),process.exit(1)),await g.createBinDirectoryStructure();const s=g.getBinDirectory();let i;i=o.name?o.name:e.basename(n),"win32"!==process.platform||i.endsWith(".exe")||(i=`${i}.exe`);const a=e.join(s,i);if(r.existsSync(a)&&!o.force&&!o.yes){const{confirmOverwrite:e}=await l({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${a}. Overwrite?`,initial:!1});if(!e)return void console.log(t.yellow("Installation cancelled."))}console.log(t.blue(`Installing ${n} to ${a}...`)),r.copyFileSync(n,a),"win32"!==process.platform&&r.chmodSync(a,493);const c=g.getMetadataFilePath();let d={binaries:{},lastUpdated:(new Date).toISOString()};if(r.existsSync(c))try{d=JSON.parse(r.readFileSync(c,"utf8"))}catch(e){console.warn(t.yellow(`Failed to parse metadata file: ${e.message}`)),console.warn(t.yellow("Creating new metadata file."))}let h="0.0.0";try{const{execSync:e}=require("child_process"),o=e(`"${a}" --version`,{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim(),n=o.match(/v?(\d+\.\d+\.\d+)/);n?(h=n[1],console.log(t.blue(`Detected binary version: ${h}`))):(console.log(t.yellow(`Could not parse version from output: ${o}`)),console.log(t.yellow(`Using default version: ${h}`)))}catch(e){console.log(t.yellow(`Could not detect binary version, using default: ${h}`))}d.binaries[i]={path:a,source:n,created:(new Date).toISOString(),platform:process.platform,version:h,project:e.basename(process.cwd())},d.lastUpdated=(new Date).toISOString(),r.writeFileSync(c,JSON.stringify(d,null,2)),console.log(t.green(`Binary installed successfully: ${a}`));g.checkIfInPath(s)?console.log(t.green(`You can now run '${i}' from anywhere.`)):console.log(t.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."))}catch(e){console.error(t.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}};var x={command:"uninstall [name] [options]",describe:"Uninstall a binary from the bin directory",builder:{name:{describe:"Name of the binary to uninstall",type:"string",demandOption:!0},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"}},handler:async e=>{try{await w(e);const o=g.getBinDirectory(),n=g.getMetadataFilePath();let s;r.existsSync(o)||(console.error(t.red(`Bin directory not found: ${o}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1)),r.existsSync(n)||(console.error(t.red(`Metadata file not found: ${n}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1));try{s=JSON.parse(r.readFileSync(n,"utf8"))}catch(e){console.error(t.red(`Failed to parse metadata file: ${e.message}`)),process.exit(1)}const i=e.name;s.binaries[i]||(console.error(t.red(`Binary not found in metadata: ${i}`)),console.log(t.yellow("Use fbin list to see installed binaries.")),process.exit(1));const a=s.binaries[i].path;if(r.existsSync(a)||(console.warn(t.yellow(`Binary file not found: ${a}`)),console.warn(t.yellow("Metadata will be updated anyway."))),!e.force&&!e.yes){const{confirmUninstall:e}=await l({type:"confirm",name:"confirmUninstall",message:`Are you sure you want to uninstall ${i}?`,initial:!1});if(!e)return void console.log(t.yellow("Uninstallation cancelled."))}if(r.existsSync(a))try{r.unlinkSync(a),console.log(t.green(`Binary file removed: ${a}`))}catch(e){console.error(t.red(`Failed to remove binary file: ${e.message}`))}delete s.binaries[i],s.lastUpdated=(new Date).toISOString(),r.writeFileSync(n,JSON.stringify(s,null,2)),console.log(t.green(`Binary uninstalled successfully: ${i}`))}catch(e){console.error(t.red(`Failed to uninstall binary: ${e.message}`)),process.exit(1)}}};function v(e,o={}){const n={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,...o,head:e.map((e=>t.bold(e)))};return new a(n)}var A={createTable:v,createTableWithData:function(e,o,t={}){const n=v(e,t);return Array.isArray(o)&&o.forEach((e=>{n.push(e)})),n.toString()},getStatusColor:function(e){switch(e){case"running":return t.green;case"stopped":return t.yellow;case"failed":return t.red;case"registered":return t.blue;default:return t.gray}}};var C={command:"list [options]",describe:"List installed binaries",builder:{json:{describe:"Output in JSON format",type:"boolean",default:!1,alias:"j"},filter:{describe:"Filter binaries by name",type:"string",alias:"f"}},handler:async e=>{try{await w(e);const o=g.getBinDirectory(),n=g.getMetadataFilePath();let s;r.existsSync(o)||(console.error(t.red(`Bin directory not found: ${o}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1)),r.existsSync(n)||(console.error(t.red(`Metadata file not found: ${n}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1));try{s=JSON.parse(r.readFileSync(n,"utf8"))}catch(e){console.error(t.red(`Failed to parse metadata file: ${e.message}`)),process.exit(1)}let i=s.binaries;if(e.filter){const o=e.filter.toLowerCase();i=Object.entries(i).filter((([e])=>e.toLowerCase().includes(o))).reduce(((e,[o,t])=>(e[o]=t,e)),{})}if(e.json)return void console.log(JSON.stringify(i,null,2));const l=Object.keys(i).length;if(0===l)return void console.log(t.yellow("No binaries installed."));console.log(t.blue(`Found ${l} installed binaries:`)),console.log();const a=["NAME","VERSION","PLATFORM","CREATED"],c=A.createTable(a,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});Object.entries(i).forEach((([e,o])=>{const n=new Date(o.created).toLocaleString();c.push([t.white(e),o.version||"N/A",o.platform||"N/A",n])})),console.log(c.toString()),console.log(),console.log(t.blue(`Bin directory: ${o}`));g.checkIfInPath(o)||console.log(t.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."))}catch(e){console.error(t.red(`Failed to list binaries: ${e.message}`)),process.exit(1)}}};c(d);let j=!1;process.on("uncaughtException",(e=>{j||(j=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{j||(j=!0,setTimeout((()=>process.exit(1)),500))})),async function(){try{n(s(process.argv)).usage("Usage: $0 <command> [options]").command(b).command(S).command(P).command($).command(x).command(C).demandCommand(1,"You need to specify a command").help().version().argv}catch(e){console.error(t.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(t.red(`Fatal error: ${e.message}`)),process.exit(1)}));
2
+ import e from"node:path";import{fileURLToPath as o}from"node:url";import t from"chalk";import n from"yargs";import{hideBin as s}from"yargs/helpers";import l from"node:fs";import r from"node:os";import i from"@fnet/prompt";import a from"cli-table3";import{promisify as c}from"node:util";import m from"tree-kill";function d(){return e.join(r.homedir(),".fnet","bin")}function h(){return e.join(r.homedir(),".fnet","metadata")}function u(){return e.join(h(),"binaries.json")}function f(){try{if("win32"===process.platform)return process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell")?"powershell-core":process.env.PSModulePath?"powershell":"cmd";const o=process.env.SHELL||"";return o.includes("bash")?"bash":o.includes("zsh")?"zsh":o.includes("fish")?"fish":o.includes("ksh")?"ksh":o.includes("csh")||o.includes("tcsh")?"csh":l.existsSync(e.join(r.homedir(),".bashrc"))?"bash":l.existsSync(e.join(r.homedir(),".zshrc"))?"zsh":l.existsSync(e.join(r.homedir(),".config","fish","config.fish"))?"fish":"unknown"}catch(e){return"unknown"}}function p(o){const t=r.homedir(),n=[];switch(o){case"bash":n.push({name:".bashrc",path:e.join(t,".bashrc")}),n.push({name:".bash_profile",path:e.join(t,".bash_profile")}),n.push({name:".profile",path:e.join(t,".profile")});break;case"zsh":n.push({name:".zshrc",path:e.join(t,".zshrc")}),n.push({name:".zprofile",path:e.join(t,".zprofile")});break;case"fish":n.push({name:"config.fish",path:e.join(t,".config","fish","config.fish")});break;case"ksh":n.push({name:".kshrc",path:e.join(t,".kshrc")}),n.push({name:".profile",path:e.join(t,".profile")});break;case"csh":n.push({name:".cshrc",path:e.join(t,".cshrc")}),n.push({name:".tcshrc",path:e.join(t,".tcshrc")});break;case"powershell":n.push({name:"Microsoft.PowerShell_profile.ps1",path:e.join(t,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),n.push({name:"profile.ps1",path:e.join(t,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":n.push({name:"Microsoft.PowerShell_profile.ps1",path:e.join(t,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),n.push({name:"profile.ps1",path:e.join(t,"Documents","PowerShell","profile.ps1")});break;case"cmd":n.push({name:"fnet-path.bat",path:e.join(t,"fnet-path.bat")})}return n}function y(e,o){switch(e){case"bash":case"zsh":case"ksh":default:return`export PATH="${o}:$PATH"`;case"fish":return`set -gx PATH ${o} $PATH`;case"csh":return`setenv PATH ${o}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${o};" + $env:PATH`;case"cmd":return`@echo off\nSETX PATH "%PATH%;${o}"\necho Path updated successfully`}}var g={getBinDirectory:d,getMetadataDirectory:h,getMetadataFilePath:u,checkIfInPath:function(o){return(process.env.PATH||"").split(e.delimiter).includes(o)},detectUserShell:f,getShellConfigPath:function(){const e=p(f());for(const o of e)if(l.existsSync(o.path))return o.path;return e.length>0?e[0].path:null},getAllShellConfigPaths:p,createBinDirectoryStructure:async function(){const e=d(),o=h(),t=u();l.existsSync(e)||l.mkdirSync(e,{recursive:!0}),l.existsSync(o)||l.mkdirSync(o,{recursive:!0}),l.existsSync(t)||l.writeFileSync(t,JSON.stringify({binaries:{},lastUpdated:(new Date).toISOString()},null,2))},getExportPathCommand:y,addBinToPath:async function(o,n,s){try{const r=y(o,s);if("cmd"===o)return l.writeFileSync(n,r),console.log(t.yellow(`Created batch file at ${n}`)),console.log(t.yellow("Run this file to add the bin directory to your PATH")),!0;if("powershell"!==o&&"powershell-core"!==o||l.existsSync(e.dirname(n))||l.mkdirSync(e.dirname(n),{recursive:!0}),!l.existsSync(n)){const e="fish"===o?"# Fish shell configuration\n\n":"powershell"===o||"powershell-core"===o?"# PowerShell profile\n\n":"# Shell configuration\n\n";l.writeFileSync(n,e),console.log(t.green(`Created config file at ${n}`))}const i=l.readFileSync(n,"utf8");if(i.includes(s))return!0;const a=`${i.trim()}\n\n# Added by @fnet/cli\n${r}\n`;return l.writeFileSync(n,a),"powershell"!==o&&"powershell-core"!==o||(console.log(t.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(t.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"))),!0}catch(e){return console.error(t.red(`Failed to add bin directory to PATH: ${e.message}`)),!1}}};async function w(o){const t=function(){const o=r.homedir(),t=e.join(o,".fnet","bin");return l.existsSync(t)||l.mkdirSync(t,{recursive:!0}),t}(),n=function(){const o=r.homedir(),t=e.join(o,".fnet");return l.existsSync(t)||l.mkdirSync(t,{recursive:!0}),e.join(t,"bin-registry.json")}();let s={};if(l.existsSync(n))try{const e=l.readFileSync(n,"utf8");s=JSON.parse(e)}catch(e){console.warn(`Warning: Could not parse bin registry: ${e.message}`)}return{binDir:t,registryPath:n,registry:s,args:o}}e.dirname(o(import.meta.url));var b={command:"setup",describe:"Initialize the bin system",builder:{},handler:async o=>{try{await w(o);console.log(t.blue("Setting up the bin system...")),await g.createBinDirectoryStructure();const n=g.getBinDirectory();console.log(t.green(`Bin directory: ${n}`));if(g.checkIfInPath(n))console.log(t.green("Bin directory is already in PATH."));else{console.log(t.yellow("Bin directory is not in PATH."));const{confirmAddToPath:o}=await i({type:"confirm",name:"confirmAddToPath",message:`Would you like to add ${n} to your PATH?`,initial:!0});if(o){let o=g.detectUserShell();if("unknown"===o){const{selectedShell:e}=await i({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)"}]});o=e}else{const{confirmShell:e}=await i({type:"confirm",name:"confirmShell",message:`Detected shell: ${o}. Is this correct?`,initial:!0});if(!e){const{selectedShell:e}=await i({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)"}]});o=e}}const s=g.getAllShellConfigPaths(o);let a;if(s.length>1){const e=s.filter((e=>l.existsSync(e.path)));if(e.length>0){const{selectedConfigPath:o}=await i({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:e.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});a=o}else{const{selectedConfigPath:e}=await i({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:s.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});a=e}}else if(1===s.length)a=s[0].path;else{const{enteredConfigPath:o}=await i({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:e.join(r.homedir(),".bashrc")});a=o}await g.addBinToPath(o,a,n)?(console.log(t.green(`Added bin directory to PATH in ${a}`)),console.log(t.yellow("Please restart your terminal or run the following command:")),console.log(t.green(`source ${a}`))):(console.log(t.red(`Failed to add bin directory to PATH in ${a}`)),console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(g.getExportPathCommand(o,n))))}else console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(`export PATH="${n}:$PATH"`)),console.log(t.yellow("Or run:")),console.log(t.green("fbin path"))}console.log(t.green("Bin system setup completed successfully."))}catch(e){console.error(t.red(`Failed to set up bin system: ${e.message}`)),process.exit(1)}}};var S={command:"path",describe:"Add bin directory to PATH",builder:{yes:{describe:"Automatically answer yes to all prompts",type:"boolean",default:!1,alias:"y"}},handler:async o=>{try{await w(o);const n=g.getBinDirectory();console.log(t.blue(`Adding ${n} to PATH...`)),g.createBinDirectoryStructure()||(console.log(t.yellow("Creating bin directory structure...")),await g.createBinDirectoryStructure());if(g.checkIfInPath(n))return void console.log(t.green("Bin directory is already in PATH."));let s=g.detectUserShell();if("unknown"===s)if(o.yes)s="win32"===process.platform?"powershell":"bash",console.log(t.yellow(`Auto-selecting ${s} shell due to --yes flag`));else{const{selectedShell:e}=await i({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)"}]});s=e}else if(o.yes)console.log(t.yellow(`Auto-confirming detected shell: ${s} due to --yes flag`));else{const{confirmShell:e}=await i({type:"confirm",name:"confirmShell",message:`Detected shell: ${s}. Is this correct?`,initial:!0});if(!e){const{selectedShell:e}=await i({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)"}]});s=e}}const a=g.getAllShellConfigPaths(s);let c;if(a.length>1){const e=a.filter((e=>l.existsSync(e.path)));if(e.length>0)if(o.yes)c=e[0].path,console.log(t.yellow(`Auto-selecting config file: ${c} due to --yes flag`));else{const{selectedConfigPath:o}=await i({type:"select",name:"selectedConfigPath",message:"Select the configuration file to modify:",choices:e.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});c=o}else if(o.yes)c=a[0].path,console.log(t.yellow(`Auto-selecting config file to create: ${c} due to --yes flag`));else{const{selectedConfigPath:e}=await i({type:"select",name:"selectedConfigPath",message:"Select the configuration file to create:",choices:a.map((e=>({name:e.path,message:`${e.name} (${e.path})`})))});c=e}}else if(1===a.length)c=a[0].path;else if(o.yes)c=e.join(r.homedir(),"win32"===process.platform?"_profile":".bashrc"),console.log(t.yellow(`Auto-selecting default config file: ${c} due to --yes flag`));else{const{enteredConfigPath:o}=await i({type:"input",name:"enteredConfigPath",message:"Enter the path to your shell configuration file:",initial:e.join(r.homedir(),".bashrc")});c=o}await g.addBinToPath(s,c,n)?(console.log(t.green(`Added bin directory to PATH in ${c}`)),console.log(t.yellow("Please restart your terminal or run the following command:")),console.log(t.green(`source ${c}`))):(console.log(t.red(`Failed to add bin directory to PATH in ${c}`)),console.log(t.yellow("You can add it manually by adding the following line to your shell configuration:")),console.log(t.green(g.getExportPathCommand(s,n))))}catch(e){console.error(t.red(`Failed to add bin directory to PATH: ${e.message}`)),process.exit(1)}}};var P={command:"compile [source] [options]",describe:"Compile a CLI project to a binary",builder:{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"},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"}},handler:async o=>{try{await w(o);const n=process.cwd(),s=e.basename(n),r=o.name||s;let a;if(o.output)a=o.output;else{const o=e.join(n,".bin");l.existsSync(o)||l.mkdirSync(o,{recursive:!0}),a=e.join(o,r)}const c=e.resolve(process.cwd(),o.source);if(l.existsSync(c)||(console.error(t.red(`Source file not found: ${c}`)),console.error(t.yellow("Make sure to build your project first.")),process.exit(1)),l.existsSync(a)&&!o.force){const{confirmOverwrite:e}=await i({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${a}. Overwrite?`,initial:!1});if(!e)return void console.log(t.yellow("Compilation cancelled."))}const m=process.platform;console.log(t.blue(`Detected platform: ${m}`)),"win32"!==m||a.endsWith(".exe")||(a=`${a}.exe`,console.log(t.blue(`Adjusted output path for Windows: ${a}`))),console.log(t.blue(`Compiling ${c} to ${a}...`));const{spawn:d}=await import("child_process");try{const e=d("bun",["--version"],{stdio:"pipe"});await new Promise(((o,t)=>{e.on("close",(e=>{0===e?o():t(new Error("Bun is not available. Please install Bun first."))})),e.on("error",(e=>{t(new Error(`Bun is not available: ${e.message}`))}))}))}catch(e){console.error(t.red(`Bun is not available: ${e.message}`)),console.error(t.yellow("Please install Bun first: https://bun.sh/")),process.exit(1)}const h=["build",c,"--compile",`--outfile=${a}`];if(o.target&&"auto"!==o.target&&h.push(`--target=${o.target}`),!1===o.minify&&h.push("--no-minify"),o.external){o.external.split(",").map((e=>e.trim())).forEach((e=>{h.push(`--external:${e}`)}))}console.log(t.blue(`Running: bun ${h.join(" ")}`));const u=d("bun",h,{stdio:"inherit"});await new Promise(((e,o)=>{u.on("close",(t=>{0===t?e():o(new Error(`Compilation failed with code ${t}`))})),u.on("error",(e=>{o(e)}))})),"win32"!==m&&l.chmodSync(a,493),console.log(t.green(`Binary compiled successfully: ${a}`)),"win32"===m?console.log(t.yellow("Note: On Windows, you may need to run the binary from a command prompt or PowerShell.")):"darwin"===m&&console.log(t.yellow("Note: On macOS, you may need to allow the binary to run in System Preferences > Security & Privacy."))}catch(e){console.error(t.red(`Failed to compile binary: ${e.message}`)),process.exit(1)}}};var $={command:"install [source] [options]",describe:"Install a binary to the bin directory",builder:{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"}},handler:async o=>{try{await w(o);const n=e.resolve(process.cwd(),o.source);l.existsSync(n)||(console.error(t.red(`Source file not found: ${n}`)),process.exit(1)),await g.createBinDirectoryStructure();const s=g.getBinDirectory();let r;r=o.name?o.name:e.basename(n),"win32"!==process.platform||r.endsWith(".exe")||(r=`${r}.exe`);const a=e.join(s,r);if(l.existsSync(a)&&!o.force&&!o.yes){const{confirmOverwrite:e}=await i({type:"confirm",name:"confirmOverwrite",message:`Binary already exists at ${a}. Overwrite?`,initial:!1});if(!e)return void console.log(t.yellow("Installation cancelled."))}console.log(t.blue(`Installing ${n} to ${a}...`)),l.copyFileSync(n,a),"win32"!==process.platform&&l.chmodSync(a,493);const c=g.getMetadataFilePath();let m={binaries:{},lastUpdated:(new Date).toISOString()};if(l.existsSync(c))try{m=JSON.parse(l.readFileSync(c,"utf8"))}catch(e){console.warn(t.yellow(`Failed to parse metadata file: ${e.message}`)),console.warn(t.yellow("Creating new metadata file."))}let d="0.0.0";try{const{execSync:e}=require("child_process"),o=e(`"${a}" --version`,{timeout:5e3,stdio:["ignore","pipe","ignore"]}).toString().trim(),n=o.match(/v?(\d+\.\d+\.\d+)/);n?(d=n[1],console.log(t.blue(`Detected binary version: ${d}`))):(console.log(t.yellow(`Could not parse version from output: ${o}`)),console.log(t.yellow(`Using default version: ${d}`)))}catch(e){console.log(t.yellow(`Could not detect binary version, using default: ${d}`))}m.binaries[r]={path:a,source:n,created:(new Date).toISOString(),platform:process.platform,version:d,project:e.basename(process.cwd())},m.lastUpdated=(new Date).toISOString(),l.writeFileSync(c,JSON.stringify(m,null,2)),console.log(t.green(`Binary installed successfully: ${a}`));g.checkIfInPath(s)?console.log(t.green(`You can now run '${r}' from anywhere.`)):console.log(t.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."))}catch(e){console.error(t.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}};var x={promptForSelection:async function(e){const{items:o,message:n,nameField:s="name",valueField:l="name",initialValue:r=null,allowAbort:a=!0}=e;if(!o||0===o.length)return console.log(t.yellow("No items available for selection.")),null;if(1===o.length&&!a){const e=o[0],n="string"==typeof e?e:e[l];return console.log(t.blue(`Only one option available: ${"string"==typeof e?e:e[s]}`)),n}let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[l],value:e[l],message:e[s]||e[l]}));a&&c.push({name:"cancel",value:null,message:t.yellow("Cancel")});let m=null;if(r){const e=c.findIndex((e=>e.name===r));-1!==e&&(m=e)}const d="selectedItem",{[d]:h}=await i({type:"select",name:d,message:n,choices:c,initial:m});return"cancel"===h?null:h},promptForMultipleSelection:async function(e){const{items:o,message:n,nameField:s="name",valueField:l="name",initialValues:r=[],allowAbort:a=!0}=e;if(!o||0===o.length)return console.log(t.yellow("No items available for selection.")),null;let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[l],value:e[l],message:e[s]||e[l]})),m=[];r&&r.length>0&&(m=c.map(((e,o)=>r.includes(e.name)?o:-1)).filter((e=>-1!==e)));const d="selectedItems",h=await i({type:"multiselect",name:d,message:n,choices:c,initial:m,hint:"(Use space to select, enter to confirm)",validate:e=>!(0===e.length&&!a)||"Please select at least one item"});return a&&0===h[d].length?null:h[d]}};var v={command:"uninstall [name] [options]",describe:"Uninstall a binary from the bin directory",builder:{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"}},handler:async e=>{try{await w(e);const o=g.getBinDirectory(),n=g.getMetadataFilePath();let s;l.existsSync(o)||(console.error(t.red(`Bin directory not found: ${o}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1)),l.existsSync(n)||(console.error(t.red(`Metadata file not found: ${n}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1));try{s=JSON.parse(l.readFileSync(n,"utf8"))}catch(e){console.error(t.red(`Failed to parse metadata file: ${e.message}`)),process.exit(1)}if(!e.name&&!e.yes){const o=Object.keys(s.binaries);if(0===o.length)return void console.log(t.yellow("No binaries installed."));const n=await x.promptForSelection({items:o,message:"Select a binary to uninstall:",allowAbort:!0});if(null===n)return void console.log(t.yellow("Uninstallation cancelled."));e.name=n}const r=e.name;r||(console.error(t.red("Binary name is required.")),console.error(t.yellow("Use --name to specify a binary or run without --yes to select interactively.")),process.exit(1)),s.binaries[r]||(console.error(t.red(`Binary not found in metadata: ${r}`)),console.log(t.yellow("Use fbin list to see installed binaries.")),process.exit(1));const a=s.binaries[r].path;if(l.existsSync(a)||(console.warn(t.yellow(`Binary file not found: ${a}`)),console.warn(t.yellow("Metadata will be updated anyway."))),!e.force&&!e.yes){const{confirmUninstall:e}=await i({type:"confirm",name:"confirmUninstall",message:`Are you sure you want to uninstall ${r}?`,initial:!1});if(!e)return void console.log(t.yellow("Uninstallation cancelled."))}if(l.existsSync(a))try{l.unlinkSync(a),console.log(t.green(`Binary file removed: ${a}`))}catch(e){console.error(t.red(`Failed to remove binary file: ${e.message}`))}delete s.binaries[r],s.lastUpdated=(new Date).toISOString(),l.writeFileSync(n,JSON.stringify(s,null,2)),console.log(t.green(`Binary uninstalled successfully: ${r}`))}catch(e){console.error(t.red(`Failed to uninstall binary: ${e.message}`)),process.exit(1)}}};function A(e,o={}){const n={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,...o,head:e.map((e=>t.bold(e)))};return new a(n)}var C={createTable:A,createTableWithData:function(e,o,t={}){const n=A(e,t);return Array.isArray(o)&&o.forEach((e=>{n.push(e)})),n.toString()},getStatusColor:function(e){switch(e){case"running":return t.green;case"stopped":return t.yellow;case"failed":return t.red;case"registered":return t.blue;default:return t.gray}}};var F={command:"list [options]",describe:"List installed binaries",builder:{json:{describe:"Output in JSON format",type:"boolean",default:!1,alias:"j"},filter:{describe:"Filter binaries by name",type:"string",alias:"f"}},handler:async e=>{try{await w(e);const o=g.getBinDirectory(),n=g.getMetadataFilePath();let s;l.existsSync(o)||(console.error(t.red(`Bin directory not found: ${o}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1)),l.existsSync(n)||(console.error(t.red(`Metadata file not found: ${n}`)),console.error(t.yellow("Run fbin setup first.")),process.exit(1));try{s=JSON.parse(l.readFileSync(n,"utf8"))}catch(e){console.error(t.red(`Failed to parse metadata file: ${e.message}`)),process.exit(1)}let r=s.binaries;if(e.filter){const o=e.filter.toLowerCase();r=Object.entries(r).filter((([e])=>e.toLowerCase().includes(o))).reduce(((e,[o,t])=>(e[o]=t,e)),{})}if(e.json)return void console.log(JSON.stringify(r,null,2));const i=Object.keys(r).length;if(0===i)return void console.log(t.yellow("No binaries installed."));console.log(t.blue(`Found ${i} installed binaries:`)),console.log();const a=["NAME","VERSION","PLATFORM","CREATED"],c=C.createTable(a,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});Object.entries(r).forEach((([e,o])=>{const n=new Date(o.created).toLocaleString();c.push([t.white(e),o.version||"N/A",o.platform||"N/A",n])})),console.log(c.toString()),console.log(),console.log(t.blue(`Bin directory: ${o}`));g.checkIfInPath(o)||console.log(t.yellow("Bin directory is not in PATH. Run 'fbin path' to add it."))}catch(e){console.error(t.red(`Failed to list binaries: ${e.message}`)),process.exit(1)}}};c(m);let j=!1;process.on("uncaughtException",(e=>{j||(j=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{j||(j=!0,setTimeout((()=>process.exit(1)),500))})),async function(){try{n(s(process.argv)).usage("Usage: $0 <command> [options]").command(b).command(S).command(P).command($).command(v).command(F).demandCommand(1,"You need to specify a command").help().version().argv}catch(e){console.error(t.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(t.red(`Fatal error: ${e.message}`)),process.exit(1)}));
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e,{delimiter as t,join as o}from"node:path";import{fileURLToPath as n}from"node:url";import i from"yargs";import s from"chalk";import{promisify as r}from"node:util";import a from"tree-kill";import{spawn as c}from"node:child_process";import l,{existsSync as p}from"node:fs";import d from"@fnet/config";import f from"node:os";import m from"@flownet/lib-render-templates-dir";import u from"@fnet/shelljs";import h from"@fnet/yaml";import y from"yaml";import g from"nunjucks";import w from"lodash.clonedeep";import b from"isobject";import x from"redis";import v from"@flownet/lib-is-redis-online";import{randomUUID as j}from"node:crypto";import{Api as k,Atom as D}from"@flownet/lib-atom-api-js";import _ from"lodash.merge";import S from"@flownet/lib-parse-imports-js";import E from"@fnet/npm-list-versions";import $ from"@fnet/npm-pick-versions";import P from"object-hash";import T from"ajv/dist/2020.js";import N from"ajv/dist/standalone/index.js";import C from"ajv-formats";import F from"@flownet/lib-parse-node-url";import I from"bpmn-moddle";import A from"dagre";import O from"@fnet/expression";import B from"@fnet/list-files";import K from"@fnet/key-value-transformer";import M from"@fnet/prompt";import"fs";import"path";import"@fnet/shell-flow";const R=r(a);let L=!1;async function J(e,t){if(L)return;if(L=!0,!e.killed&&e.pid)try{await R(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await R(e.pid,"SIGKILL").catch((()=>{}))}catch(e){}await new Promise((e=>setTimeout(e,100)));const o="SIGINT"===t?130:"SIGTERM"===t?143:1;process.exit(o)}function W(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((t=>{process.once(t,(async()=>{await J(e,t)}))})),process.on("uncaughtException",(async t=>{await J(e)})),process.on("unhandledRejection",(async t=>{await J(e)})),e.on("close",(e=>{L||process.exit(e)}))}function z(e,{name:t,bin:o,preArgs:n=[]}){return"function"==typeof o&&(o=o()),e.command(`${t||o} [commands..]`,`${o} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const t=await G(e),{projectDir:i}=t,s=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,r=process.argv.slice(3).map(s);W(c(o,[...n,...r],{cwd:i,stdio:"inherit",shell:!0,detached:!0}))}catch(e){console.error(e.message),process.exit(1)}}))}async function G(e){try{const t=process.argv[1].split("/").pop().split(".")[0];if("fnode"===t){const{createContext:t}=await import("./index.DwUKrF3q.js");return t(e)}if("fnet"===t){const{createContext:t}=await Promise.resolve().then((function(){return Q}));return t(e)}if("frun"===t){const{createContext:t}=await import("./index.CuMyez3E.js");return t(e)}if("fbin"===t){const{createContext:t}=await import("./index.DWpw12No.js");return t(e)}}catch(e){console.warn(`Warning: Could not import context from CLI tool: ${e.message}`)}return{projectDir:process.cwd(),tags:e.ftag}}var q=e=>{const n=process.env.PATH||"",i="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],s=n.split(t);for(const t of s)for(const n of i){const i=o(t,"win32"===process.platform?e+n:e);if(p(i))return i}return null};const U=e.dirname(n(import.meta.url)),V=process.cwd();function X(t){const o=e.resolve(V,t);if(l.existsSync(o))return o;const n=e.resolve(U,"../..",t);if(l.existsSync(n))return n;throw new Error(`Template path not found: ${t}`)}const H={command:"create",describe:"Initialize a new fnet project",builder:e=>e.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 t=>{try{const o=process.cwd(),n=X("./template/fnet/project"),i=e.resolve(o,t.name);l.existsSync(i)||l.mkdirSync(i),await m({dir:n,outDir:i,context:t,copyUnmatchedAlso:!0,platform:f.platform()});let s=await u("fnet build",{cwd:i});if(0!==s.code)throw new Error("Failed to build project.");if(q("git")&&(s=await u("git init --initial-branch=main",{cwd:i}),0!==s.code))throw new Error("Failed to initialize git.");if(q("code")&&t.vscode&&(s=await u(`cd ${i} && code .`),0!==s.code))throw new Error("Failed to open vscode.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}}};async function Y(t){if(t.id)return{id:t.id,buildId:t.buildId,mode:t.mode,protocol:t.protocol||"ac:",templateDir:X("./template/fnet/node"),coreDir:X("./template/fnet/core"),projectDir:e.resolve(process.cwd(),`./.output/${t.id}`),tags:t.ftag,dev:t.dev};try{const o=await async function({tags:t}){let o=(n=process.cwd(),e.resolve(n,"fnet.yaml"));var n;if(!l.existsSync(o))throw new Error("fnet.yaml file not found in current directory.");const{raw:i,parsed:s}=await h({file:o,tags:t}),r=e.dirname(o);s.features=s.features||{};const a=s.features;let c;if(a.runtime=a.runtime||{},a.runtime.type=a.runtime.type||"node","object"==typeof s.flows)c=s.flows;else{let o="flow.main.yaml";l.existsSync(e.join(r,"fnet","flows.yaml"))&&(o=e.join("fnet","flows.yaml"));const n=s.main||o;let i=e.resolve(r,n);if(l.existsSync(i)){const{parsed:e}=await h({file:i,tags:t});c=e}else c={main:{steps:[]}}}const p={workflowAtom:{doc:{...s,content:c}},projectDir:r,projectFilePath:o,projectFileContent:i,projectFileParsed:s,runtime:a.runtime};let d=e.resolve(r,"fnet/targets.yaml");if(l.existsSync(d)){const{raw:e,parsed:o}=await h({file:d,tags:t}),n=y.parseDocument(e);p.devops={filePath:d,fileContent:e,yamlDocument:n,doc:{...o},type:"workflow.deploy",save:async()=>{l.writeFileSync(p.devops.filePath,n.toString())}}}const f=e.resolve(r,"readme.md");if(l.existsSync(f)){const e=l.readFileSync(f,"utf8");p.readme={filePath:f,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return p}({tags:t.ftag});return{buildId:t.buildId,mode:t.mode,protocol:t.protocol||"local:",templateDir:X("./template/fnet/node"),coreDir:X("./template/fnet/core"),projectDir:e.resolve(o.projectDir,"./.workspace"),projectSrcDir:e.resolve(o.projectDir,"./src"),project:o,tags:t.ftag,dev:t.dev}}catch(e){return console.warn(`Warning: Could not load project: ${e.message}`),{projectDir:process.cwd(),tags:t.ftag}}}var Q=Object.freeze({__proto__:null,createContext:Y});const Z={command:"project",describe:"Manage fnet project",builder:e=>e.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"}),handler:async e=>{try{const t=X("./template/fnet/project"),o=process.cwd(),n=await Y(e);if(e.update){if(await m({dir:t,outDir:o,context:{name:n.project.projectFileParsed.name,runtime:"node"},copyUnmatchedAlso:!0,platform:f.platform()}),0!==(await u("fnet build",{cwd:o})).code)throw new Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(e){console.error("Project failed.",e.message),process.exit(1)}}};class ee{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(k.set_api_url(e.data.url),t)return k.set_req_token(t),void o(t);fetch(`${e.data.issuer}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(e.data.grant.params)}).then((async e=>{if(!e.ok)throw new Error(await e.text());return e.json()})).then((e=>{k.set_req_token(e.access_token),o(e.access_token)})).catch((e=>{k.set_req_token(),n(e)}))}))}}function te({feature:e,features:t,packageDevDependencies:o}){const{name:n,packages:i,options:s,extraCheck:r,explicit:a}=e,c=`${n}_enabled`,l=t.rollup_output||{},p=Object.keys(l);let d=s||{};const f=t[n]?.options;f&&(d=_(d,f));const m=!t[n]||!1===t[n]?.enabled;p.forEach((e=>{const o=t.rollup_output[e];if(o){if(Reflect.has(o,n)){if(m||!o[n]||!1===o[n]?.enabled)return void delete o[n];!0===o[n]&&(o[n]={enabled:!0,options:d})}else{if(m||a||!1===t[c])return;o[n]={enabled:!0}}o[n]=o[n]||{},o[n].options={...d,...o[n].options}}}));let u=p.some((e=>!0===t.rollup_output[e][n]?.enabled));r&&(u=r()&&u),t[c]=u,u&&i.forEach((e=>o.push({package:e[0],version:e[1]})))}function oe({dir:t,name:o="index"}){let n=e.resolve(t,`./${o}.tsx`);if(l.existsSync(n)||(n=e.resolve(t,`./${o}.ts`)),l.existsSync(n)||(n=e.resolve(t,`./${o}.jsx`)),l.existsSync(n)||(n=e.resolve(t,`./${o}.js`)),!l.existsSync(n))return{};const i=n,s=e.extname(n);return{file:i,ext:s,ts:".ts"===s||".tsx"===s,name:o}}async function ne(t){const{atom:o,context:n,setProgress:i}=t;i("Initializing features..."),o.doc.features=o.doc.features||{};const s=o.doc.features;s.project=s.project||{},s.project.format=s.project.format||s.project_format||"esm",s.project_format=s.project.format,s.dts_enabled=!0===s.dts||void 0!==s.dts&&!1!==s.dts;const r=e.resolve(n.project.projectDir),a=oe({dir:e.resolve(r,"./app")});if(a.file){i("Parsing app entry imports...");let e=await S({file:a.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.app_uses_jsx=t,s.app_has_entry=!0,e=await S({file:a.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.app_entry_uses_jsx=t,s.app_entry_is_ts=a.ts,s.app_entry_ext=a.ext}const c=oe({dir:e.resolve(r,"./cli")});if(c.file){i("Parsing cli entry imports...");let e=await S({file:c.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.cli_uses_jsx=t,s.cli_has_entry=!0,e=await S({file:c.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.cli_entry_uses_jsx=t,s.cli_entry_is_ts=c.ts,s.cli_entry_ext=c.ext}if("workflow.lib"===o.type){const t=oe({dir:e.resolve(r,"./src")});if(t.file){i("Parsing src entry imports...");let e=await S({file:t.file,recursive:!0}),o=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.src_uses_jsx=o,s.src_has_entry=!0,e=await S({file:t.file}),o=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.src_entry_uses_jsx=o,s.src_entry_is_ts=t.ts,s.src_entry_ext=t.ext}}const l=Reflect.has(s,"app_entry_uses_jsx")?!0===s.app_entry_uses_jsx:!0===s.src_entry_uses_jsx,p=Reflect.has(s,"cli_entry_uses_jsx")?!0===s.cli_entry_uses_jsx:!0===s.src_entry_uses_jsx;s.form_enabled=l||p||!0===s.form||!0===s.form?.enabled,s.multiple_enabled=s.multiple_enabled||!0===s.multiple||!0===s.multiple?.enabled,!1===s.app?s.app={enabled:!1}:!0===s.app?s.app={enabled:!0,extend:!0===s.app_has_entry,export:!0,react:l}:s.app={enabled:!0,extend:!0===s.app_has_entry,export:!0,react:l,...s.app||{}},s.app.enabled=!0===s.app.enabled&&(!0===o.doc.features.form_enabled||!0===s.app.extend||!0===s.app.enabled),s.app.format=s.app.format||"esm",s.app.folder=s.app.folder||s.app.format||"default",!1===s.cli?s.cli={enabled:!1}:!0===s.cli?s.cli={enabled:!0,extend:!0===s.cli_has_entry,export:!0,react:p}:s.cli={enabled:!0,extend:!0===s.cli_has_entry,export:!0,react:p,...s.cli||{}},s.cli.enabled=!0===s.cli.enabled&&(!1===o.doc.features.form_enabled||!0===s.cli.extend||!0===s.cli.enabled),s.cli.format=s.cli.format||"esm",s.cli.folder=s.cli.folder||s.cli.folder||"esm",s.cli.node_options=s.cli.node?.options||s.cli.node_options||"",s.cli.bin=s.cli.bin||o.doc.name,s.cli.installable=!0===s.cli.installable,s.cli.enabled&&(o.doc["npm::bin"]=s.cli.bin,console.log(`Setting npm::bin to ${s.cli.bin} from features.cli.bin`)),s.json=s.cli.enabled||s.json;const d={cjs:{format:"cjs",context:s.form_enabled?"window":"global",babel:!0===s.src_uses_jsx||!1,browser:!1,replace:!0,terser:!0,enabled:!1!==s.cjs,copy:!1},esm:{format:"esm",context:s.form_enabled?"window":"global",babel:!0===s.src_uses_jsx||!1,browser:!1,replace:!0,terser:!1,enabled:!1!==s.esm,copy:!0},iife:{format:"iife",context:s.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0===s.iife,terser:!0,copy:!1}};!0===s.webos&&(d.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"}}}),!0===s.electron&&(d.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"}),!0===s.nextjs&&(d.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"}),!0===s.ios&&(d.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"}),!0===s.macos&&(d.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"}),!0===s.app.enabled&&(s.app.dir=`./dist/app/${s.app.folder}`,d.app={format:s.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:s.app.dir,terser:!0,output_exports:!1===s.app.export?"none":"auto",browsersync:!0}),!0===s.cli.enabled&&(s.cli.dir=`./dist/cli/${s.cli.folder}`,d.cli={format:s.cli.format,context:"global",babel:!0===s.src_uses_jsx||!0===s.cli_uses_jsx||!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:s.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===s.cli.export?"none":"auto"});const f={server:".",startPath:`${e.normalize(s.app.dir||".")}`,files:[e.normalize("./dist/**/*")],cors:!0,open:!1};s.babel_options=_({targets:{browsers:"last 9 versions, not dead",node:"18"}},s.babel_options||s.babel?.options),s.browsersync_options=_(f,s.browsersync_options||s.browsersync?.options||{}),s.replace_options=_({},s.replace_options||s.replace?.options||{}),Reflect.has(s.browsersync_options,"proxy")&&delete s.browsersync_options.server,s.rollup=s.rollup||{},s.rollup_output=_(d,s.rollup_output||s.rollup?.output||{}),s.preact_enabled=!0===s.preact||s.preact&&!1!==s.preact?.enabled;let m=Object.keys(d);for(const e of m){const t=d[e];t&&(!1!==s.rollup[e]?(t.babel_options=t.babel_options||s.babel_options,t.browsersync_options=_(s.browsersync_options,t.browsersync_options),t.replace_options=_(s.replace_options,t.replace_options),s.preact_enabled&&(t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{},t.alias.entries.react="preact/compat",t.alias.entries["react-dom"]="preact/compat"),(s.form_enabled||s.babel)&&(t.babel=!0)):delete s.rollup_output[e])}m=Object.keys(s.rollup_output),s.babel_enabled=m.some((e=>!0===s.rollup_output[e].babel)),s.browser_enabled=m.some((e=>!0===s.rollup_output[e].babel)),s.browsersync_enabled=!1!==s.browsersync&&m.some((e=>!0===s.rollup_output[e].browsersync)),s.browsersync_enabled=s.browsersync_enabled&&s.app.enabled,s.dependency_auto_enabled=!1!==s.dependency_auto&&!1!==s.dependency_auto?.enabled,s.npm_install_flags=s.npm_install_flags||"",s.react_version=s.react_version||s.react?.version||18,function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features,i=n.css&&!1!==n.css.enabled;let s=[];i&&(s.push(["rollup-plugin-postcss","^4"]),s.push(["sass","^1.66"]),(n.css?.options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":s.push(["postcss-import","^15"]);break;case"postcss-url":s.push(["postcss-url","^10"]);break;case"postcss-preset-env":s.push(["postcss-preset-env","^9"]);break;case"autoprefixer":s.push(["autoprefixer","^10"]);break;case"cssnano":s.push(["cssnano","^6"])}})));te({feature:{name:"css",packages:s},features:n,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features,i={};!0===n.app?.enabled&&(i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:n.app.dir}),Reflect.has(n.app,"copy")||Reflect.has(n,"copy")||(n.copy=!0)),te({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:i},features:n,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({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:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:o})}(t)}async function ie({projectDir:t,name:o,setProgress:n,count:i=1}){let s;const r=P(["npm-pick-versions",o,i]),a=e.join(t,".cache"),c=e.join(a,r+".json");return l.existsSync(c)?(n&&n(`Picking npm version of ${o} from cache ...`),s=JSON.parse(l.readFileSync(c,"utf8"))):(n&&n(`Picking npm version of ${o} ...`),s=await $({name:o,count:i}),l.mkdirSync(a,{recursive:!0}),l.writeFileSync(c,JSON.stringify(s),"utf8")),s}var se=async e=>{const{atom:t,packageDependencies:o,context:n,deploymentProjectTarget:i,setProgress:s,deploymentProject:r,yamlTarget:a}=e;if(!0!==i.enabled)return;const c=i.type;try{if("lib"===c)await(await import("./index.DG8TqL-1.js")).default({...e});else if("red"===c)await(await import("./index.CmMM-Ek9.js")).default({...e});else if("npm"===c)await(await import("./index.BbVrDxY_.js")).default({...e});else if("gcs"===c)await(await import("./index.UOds5XLl.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.Bfg4lyu-.js")).default({...e});else if("fnet-form"===c)await(await import("./index.Q-CYRcna.js")).default({...e});else if("fnet-node"===c)await(await import("./index.C2S9JYhS.js")).default({...e});else if("fnet-flow"===c)await(await import("./index.BuYxdKtK.js")).default({...e});else if("nextjs"===c)await(await import("./index.CDct_kkF.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("webos"===c)await(await import("./index.CMC8mlye.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("electron"===c)await(await import("./index.xd8c7XMr.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("docker"===c)await(await import("./index.D2N9YZmA.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("ios"===c)await(await import("./index.B5XE4ChJ.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("macos"===c)await(await import("./index.W6RYgypK.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("rust"===c)await(await import("./index.CzAV0S36.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else{if("pypi"!==c)return void console.warn(`No deployer found for type: ${c}`);await(await import("./index.C7saWH6d.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0}}catch(e){throw console.error(`Error during deployment for type "${c}":`,e),e}},re={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 ae(e,t){return e.filter(((e,o,n)=>n.map((e=>e[t])).indexOf(e[t])===o))}function ce(e){const{nodes:t,nodeIndex:o,root:n}=e,i=e.targetNodes||n.childs;i.forEach((t=>{const o="workflow"===t.type||"subworkflow"===t.type,n=!o&&t.childs.filter((e=>!e.virtual)).length>0;if(n&&(t.bpmn.type="bpmn:SubProcess"),o||n){const o=t.childs.filter((e=>!0!==e.module))[0];t.childs.filter((e=>!0===e.module)).forEach((o=>{const n=le({...e,parent:t,bpmnType:"bpmn:IntermediateCatchEvent",type:"inter",definitions:[{type:"bpmn:SignalEventDefinition"}]});n.bpmn.edges=[{from:n.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}));const n=t.childs.find((e=>"try"===e.name&&"tryexcept"===t.type)),s=t.childs.filter((e=>"except"===e.name&&"tryexcept"===t.type));n&&s.length&&s.forEach((o=>{const i=le({location:t.childs.indexOf(o),...e,parent:t,bpmnType:"bpmn:BoundaryEvent",type:"boundary",attrs:{attachedToRef:n},definitions:[{type:"bpmn:ErrorEventDefinition"}]});i.bpmn.edges=[{from:i.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}));const r=t.childs.find((e=>"raise"===e.type));if(r){const o=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:"ERROR",definitions:[{type:"bpmn:ErrorEventDefinition"}]});r.bpmn.edges=[{from:r.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}if(o)if(t.bpmn.starts.length>1){const o=le({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"}),n=le({...e,parent:t,bpmnType:"bpmn:ExclusiveGateway",type:"switch"});o.bpmn.edges=[{from:o.indexKey,to:n.indexKey,type:"bpmn:SequenceFlow"}],n.bpmn.edges=t.bpmn.starts.map((e=>({...e,from:n.indexKey})));const i=n.bpmn.edges.find((e=>!0===e.next));if(i){const o=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:i.to});i.to=o.indexKey}}else{const n=le({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"});n.bpmn.edges.push({from:n.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"})}t.childs.filter((e=>!0!==e.virtual&&e.bpmn.outside.length&&"bpmn:EndEvent"!==e.bpmn.type)).forEach((o=>{o.bpmn.outside.forEach((n=>{const s=i.indexOf(t),r=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:n.to,location:s+1});o.bpmn.edges.push({from:o.indexKey,to:r.indexKey,type:"bpmn:SequenceFlow"})}))}));t.childs.filter((e=>!0!==e.virtual&&e.bpmn.edges.length>1)).forEach((o=>{const n=i.indexOf(o),s=le({...e,parent:t,bpmnType:"bpmn:ExclusiveGateway",type:"switch",location:n+1});s.bpmn.edges=o.bpmn.edges.map((e=>({...e,from:s.indexKey}))),o.bpmn.edges=[{from:o.indexKey,to:s.indexKey,type:"bpmn:SequenceFlow"}],o.bpmn.outside=[]}))}ce({...e,targetNodes:t.childs})}))}function le(e){const{parent:t,nodes:o,nodeIndex:n,bpmnType:i,type:s,name:r,outside:a,location:c,definitions:l,attrs:p}=e,d=t.childs.filter((e=>e.type===`v${s}`)).length,f={indexKey:`${t.indexKey}/_${s}${d}`,pathKey:`${t.pathKey}._${s}${d}`,type:`v${s}`,name:r,bpmn:{edges:[],outside:[],type:i,width:36,height:36,fill:"#c8e6c9",stroke:"#205022",definitions:l,attrs:p},virtual:!0,childs:[]};return t.childs.splice(c||0,0,f),o.push(f),n[f.indexKey]=f,f}function pe(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,diagrams:a,nodes:c}=e;!function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,nodes:a}=e,c=o.get("flowElements");o.$nodes=o.$nodes||[],t.childs.forEach((e=>{const t=i.create(e.bpmn.type,{id:`node.${e.pathKey}`,name:e.definition?.title||e.name});if(s[t.id]=t,t.$isNode=!0,t.$node=e,e.$flow=t,o.$nodes.push(t),c.push(t),e.bpmn.attrs){Object.keys(e.bpmn.attrs).forEach((o=>{"attachedToRef"===o&&t.set(o,e.bpmn.attrs[o].$flow)}))}if(e.bpmn.definitions){const o=e.bpmn.definitions.map((e=>{const t=i.create(e.type);return Object.keys(e.attrs||{}).forEach((o=>{t.set(o,e.attrs[o])})),t}));t.eventDefinitions=o}}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r}=e,a=o.get("flowElements");o.$edges=o.$edges||[],t.childs.forEach((e=>{e.bpmn.edges.forEach((t=>{const n=e,c=r[t.to],l=`edge.${n.pathKey}_${c.pathKey}`;if(s[l])return;const p=s[`node.${n.pathKey}`],d=s[`node.${c.pathKey}`],f=i.create(t.type,{id:l,sourceRef:p,targetRef:d});s[f.id]=f,f.$is_edge=!0,p.get("outgoing").push(f),d.get("incoming").push(f),o.$edges.push({from:p,to:d,flow:f}),a.push(f)}))}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r}=e,a=120,c=80,l=160,p=160,d=new A.graphlib.Graph;d.setDefaultEdgeLabel((()=>({}))),d.setGraph({rankdir:"TB",nodesep:a,ranksep:c,xranker:"longest-path"}),o.$nodes.forEach((e=>{d.setNode(e.id,{width:e.$node?.bpmn.width||a,height:e.$node?.bpmn.height||c,label:e.id})})),o.$edges.forEach((e=>{d.setEdge(e.from.id,e.to.id)})),A.layout(d),o.$nodes.forEach((e=>{const t=d.node(e.id);let o=t.width,s=t.height;const r=i.create("bpmndi:BPMNShape",{id:`shape.${e.id}`,bpmnElement:e,bounds:i.create("dc:Bounds",{x:l+t.x-t.width/2,y:p+t.y-t.height/2,width:o,height:s}),label:i.create("bpmndi:BPMNLabel")});e.$node.bpmn.fill&&r.set("bioc:fill",e.$node.bpmn.fill),e.$node.bpmn.stroke&&r.set("bioc:stroke",e.$node.bpmn.stroke);n.get("planeElement").push(r)})),o.$edges.forEach((e=>{const t=d.edge(e.from.id,e.to.id),o=i.create("bpmndi:BPMNEdge",{id:`edge.${e.from.id}_${e.to.id}`,bpmnElement:e.flow,label:i.create("bpmndi:BPMNLabel")});t.points.forEach((e=>{const t=i.create("dc:Point",{x:l+e.x,y:p+e.y});o.get("waypoint").push(t)}));n.get("planeElement").push(o)}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,diagrams:a}=e,c=t.childs.filter((e=>"bpmn:SubProcess"===e.bpmn.type));c.forEach((t=>{const o=s[`node.${t.pathKey}`],n=i.create("bpmndi:BPMNDiagram",{id:`diagram_${t.pathKey}`});s[n.id]=n,a.push(n);const r=i.create("bpmndi:BPMNPlane",{id:`plane_${t.pathKey}`});s[r.id]=r,n.plane=r,r.bpmnElement=o,pe({...e,targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:r})}))}(e)}async function de(e){const t=e.root,o=t.context.index,n=Object.keys(o).map((e=>o[e]));!function(e){const{nodes:t}=e;t.forEach((e=>{const t=[],o=[],n=i=>{i.context.next&&(t.push({from:i,to:i.context.next,type:"bpmn:SequenceFlow"}),i===e&&o.push({to:i.context.next,type:"bpmn:SequenceFlow",next:!0})),i.childs.forEach((t=>{i===e&&"switch"===e.type&&o.push({to:t,type:"bpmn:SequenceFlow"}),n(t)}))};n(e);const i=t.filter((t=>t.to.parent.indexKey===e.parent.indexKey)).map((t=>({...t,from:e.indexKey,to:t.to.indexKey}))),s=t.filter((t=>t.to.parent.indexKey!==e.parent.indexKey&&!t.to.indexKey.startsWith(e.indexKey+"/"))).map((t=>({...t,from:e.indexKey,to:t.to.indexKey}))),r=o.map((e=>({...e,to:e.to.indexKey})));e.bpmn=e.bpmn||{},e.bpmn.edges=ae(i,"to"),e.bpmn.outside=ae(s,"to"),e.bpmn.starts=ae(r,"to"),e.bpmn.type=function(e){return"call"===e.type?"bpmn:ServiceTask":"form"===e.type?"bpmn:UserTask":"return"===e.type?"bpmn:EndEvent":"bpmn:Task"}(e),e.bpmn.width=120,e.bpmn.height=80,"return"===e.type&&(e.bpmn.width=36,e.bpmn.height=36)}))}({nodes:n}),ce({nodes:n,nodeIndex:o,root:t});const i=new I({atom:re}),s={},r=i.create("bpmn:Definitions",{id:"definitions_0"});s[r.id]=r;for await(const e of t.childs){const a=r.get("rootElements"),c=r.get("diagrams"),l=i.create("bpmn:Process",{id:`process_${e.pathKey}`,documentation:[i.create("bpmn:Documentation",{text:`Atom Workflow - ${t.context.atom.name}`})]});s[l.id]=l,l.isExecutable=!0,a.push(l);const p=i.create("bpmndi:BPMNDiagram",{id:`diagram_${e.pathKey}`});s[p.id]=p,c.push(p);const d=i.create("bpmndi:BPMNPlane",{id:`plane_${e.pathKey}`});s[d.id]=d,p.plane=d,d.bpmnElement=l;pe({targetNode:e,targetFlowElementsContainer:l,targetPlaneElement:d,moddle:i,elementIndex:s,nodeIndex:o,nodes:n,diagrams:c})}return{diagramXML:(await i.toXML(r,{format:!0})).xml}}async function fe(e={}){return await de(w(e))}async function me({node:e,initNode:t}){if(Reflect.has(e.definition,"modules")&&!Array.isArray(e.definition.modules)){const t=e.definition.modules;e.definition.modules=[],Object.keys(t).forEach((o=>{const n={...t[o]};"modules"===e.type&&(n.export=n.export||o),e.definition.modules.push({[o]:n})}))}const o=[],n=await K({data:e.definition,callback:(e,t,n)=>{const i=O({expression:e});if("m"===i?.processor){const e=n.slice(0,-1);e.push(i.statement);const s=e.join("_");return o.push({[s]:t}),[i.statement,`m::${s}`]}return[e,t]}});o.length>0&&(e.definition=n,e.definition.modules=e.definition.modules||[],e.definition.modules=e.definition.modules.concat(o)),e.hasModules=e.definition.modules?.length>0;for(let o=0;o<e.definition.modules?.length;o++){const n=e.definition.modules[o],i=Object.keys(n)[0],s={name:i,childs:[],parent:e,definition:n[i],module:!0,blockAutoJumpToParent:!0,blockAutoJumpToSibling:!1,index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}}async function ue({node:e,transformExpression:t}){const o=e.context.transform;Reflect.has(o,"export")&&(o.export=await t(o.export)),Reflect.has(o,"return")&&(e.hasReturn=!0,o.return=await t(o.return)),o.hasOwnProperty("nextArgs")&&(e.hasNextArgs=!0,o.nextArgs=await t(o.nextArgs))}async function he({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||w(t.definition),t.definition.hasOwnProperty("condition")&&(t.context.transform.condition=await n(t.definition.condition));await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ye={hits:async function({node:e}){return!!e.definition.hasOwnProperty("switch")},init:async function({node:e,initNode:t}){e.type="switch";const o=e.definition.switch||[];if(!o.every((e=>e.hasOwnProperty("condition")||e.hasOwnProperty("default"))))throw new Error("Switch must have condition or default");if(0===o.filter((e=>e.hasOwnProperty("condition"))).length)throw new Error("Switch must have at least one condition");const n=o.filter((e=>e.hasOwnProperty("default")));if(n.length>1)throw new Error("Switch must have only one default");if(1===n.length&&!o[o.length-1].hasOwnProperty("default"))throw new Error("Switch default must be the last child");e.hasDefaultCondition=1===n.length,await me({node:e,initNode:t}),e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0;for(let o=0;o<e.definition.switch.length;o++){let n=e.definition.switch[o],i=`${o}`;n.hasOwnProperty("default")&&(i="default",n=n.default);const s={name:n.condition||i,childs:[],parent:e,definition:n,index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}e.resolve=he},resolve:he};var ge={hits:async function({node:e}){return 1===Object.keys(e.definition).map((e=>O({expression:e}))).filter((e=>"if"===e?.processor)).length},init:async function(e){const{node:t}=e,o=Object.keys(t.definition).map((e=>O({expression:e}))),n=[],i=o.find((e=>"if"===e?.processor)),s=t.definition[i.expression];n.push({name:`${t.name}_if`,definition:s,processor:i}),delete t.definition[i.expression];const r=o.filter((e=>"elseif"===e?.processor));let a=0;for(const e of r){const o=t.definition[e.expression];n.push({name:`${t.name}_elseif_${a++}`,definition:o,processor:e}),delete t.definition[e.expression]}t.definition.switch=[];for(const e of n)t.definition.switch.push({condition:e.processor.statement,...e.definition});if(t.definition?.else){const e=t.definition.else;t.definition.switch.push({default:e}),delete t.definition.else}await ye.init(e)}};async function we({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){if(e.context.transform=e.context.transform||w(e.definition),e.context.transform,e.context.try=e.childs.find((e=>"try"===e.name)),e.context.except=e.childs.find((e=>"except"===e.name)),e.context.except){const t=e.context.except;t.context.transform=t.context.transform||w(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var be={hits:async function({node:e}){return e.definition.hasOwnProperty("try")&&e.definition.hasOwnProperty("except")},init:async function({node:e,initNode:t}){if(e.type="tryexcept",await me({node:e,initNode:t}),e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0,e.definition.try){const o="try",n={name:o,childs:[],parent:e,definition:e.definition[o],index:e.childs.length,context:{}};e.childs.push(n),await t({node:n})}if(e.definition.except){const o="except",n={name:o,childs:[],parent:e,definition:e.definition[o],index:e.childs.length,context:{}};e.childs.push(n),await t({node:n})}e.resolve=we},resolve:we};async function xe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;for(let e=0;e<i.assign?.length;e++){let t=i.assign[e],o=Object.keys(t)[0],s=t[o],r={key:await n(o),value:await n(s)};i.assign[e]=r}await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ve={hits:async function({node:e}){return e.definition.hasOwnProperty("assign")},init:async function({node:e,initNode:t}){e.type="assign",await me({node:e,initNode:t}),e.resolve=xe},resolve:xe};async function je({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);e.context.transform.for.in=await n(e.definition.for.in),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ke={hits:async function({node:e}){return e.definition.hasOwnProperty("for")},init:async function({node:e,initNode:t}){if(e.type="for",await me({node:e,initNode:t}),e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!1,!e.definition.for.hasOwnProperty("steps")){const{value:t,in:o,...n}=e.definition.for,i={};void 0!==t&&(i.value=t),void 0!==o&&(i.in=o),e.definition.for=i,e.definition.for.steps=[{[`${e.name}_step`]:n}]}Array.isArray(e.definition.for.steps)||(e.definition.for.steps=[{[`${e.name}_step`]:e.definition.for.steps}]);for(let o=0;o<e.definition.for.steps.length;o++){const n=e.definition.for.steps[o],i=Object.keys(n)[0],s={name:i,childs:[],parent:e,definition:n[i],index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}e.resolve=je},resolve:je};var De={hits:async function({node:e}){return!1},init:async function({node:e,initNode:t}){},resolve:async function({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){}};async function _e({node:e,resolveTypeCommon:t,transformExpression:o}){e.context.transform=e.context.transform||w(e.definition);const n=e.context.transform;n.raise=await o(n.raise),await t({node:e})}var Se={hits:async function({node:e}){return e.definition.hasOwnProperty("raise")},init:async function({node:e,initNode:t}){e.type="raise",e.resolve=_e},resolve:_e};async function Ee({node:e,resolveTypeCommon:t,transformExpression:o}){e.context.transform=e.context.transform||w(e.definition);const n=e.context.transform;e.hasReturn=!0,n.return=await o(n.return),await t({node:e})}var $e={hits:async function({node:e}){return e.definition.hasOwnProperty("return")},init:async function({node:e,initNode:t}){e.type="return",e.resolve=Ee},resolve:Ee};async function Pe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;if("function"===e.target?.atom?.doc?.type&&(i.call=await n(e.target.atom.name)),i.args&&(i.args=await n(i.args)),i.result){"string"==typeof i.result&&(i.result=[{[i.result]:"e::result"}]);for(let e=0;e<i.result?.length;e++){let t=i.result[e],o=Object.keys(t)[0],s=t[o],r={key:await n(o),value:await n(s)};i.result[e]=r}}const s=e.workflow.parent;i.import?e.context.lib=s.context.libs.find((e=>e.name===i.import)):e.context.lib=s.context.libs.find((e=>e.name===i.call)),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Te={hits:async function({node:e}){return e.definition.hasOwnProperty("call")},init:async function({node:e,initNode:t}){e.type="call",await me({node:e,initNode:t}),e.resolve=Pe},resolve:Pe};async function Ne({node:e,transformExpression:t}){e.context.next=e.childs[0],e.context.transform=e.context.transform||w(e.definition),await ue({node:e,transformExpression:t})}var Ce={hits:async function({node:e}){return e.definition.hasOwnProperty("steps")},init:async function({node:e,initNode:t}){e.type||(e.type="steps");const o=e.definition.steps||[];for await(const n of o){const o=Object.keys(n)[0],i={name:o,childs:[],parent:e,definition:n[o],index:e.childs.length,context:{}};e.childs.push(i),await t({node:i})}e.resolve=Ne},resolve:Ne};async function Fe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;i.props&&(i.props=await n(i.props));const s=e.workflow.parent;e.context.lib=s.context.libs.find((e=>e.name===i.form)),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ie={hits:async function({node:e}){return e.definition.hasOwnProperty("form")},init:async function({node:e,initNode:t}){e.type="form",await me({node:e,initNode:t}),e.resolve=Fe},resolve:Fe};async function Ae({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){e.context.transform=e.context.transform||w(e.definition),await t({node:e})}var Oe={hits:async function({node:e}){return e.definition.hasOwnProperty("operation")},init:async function({node:e,initNode:t}){e.type="operation",e.resolve=Ae},resolve:Ae};async function Be({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;i.next=await n(i.next),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ke={hits:async function({node:e}){return e.definition.hasOwnProperty("next")},init:async function({node:e,initNode:t}){e.type="jump",e.resolve=Be},resolve:Be};async function Me({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Re={hits:async function({node:e}){return e.definition.hasOwnProperty("modules")},init:async function({node:e,initNode:t}){e.type="modules",await me({node:e,initNode:t}),e.resolve=Me},resolve:Me};function Le({node:e}){const t=e.definition;if(!e.hasReturn)if("end"===t.next);else if("stop"===t.next);else if("none"===t.next);else if(t.next){let o=e.parent;for(;o.parent;){const n=o.childs.find((e=>e.name===t.next));if(n){e.context.next=n;break}o=o.parent}}else{if(!0===e.module)return;let t=e.parent,o=e.index+1;for(;t.parent&&(!t.blockAutoJumpToParent||!t.blockAutoJumpToSibling);)if(Reflect.has(t,"blockAutoJumpToParent")||Reflect.has(t,"blockAutoJumpToSibling")){if(t.blockAutoJumpToParent){const n=t.childs.find((e=>e.index===o));n&&(e.context.next=n);break}t.blockAutoJumpToParent||(o=t.index+1,t=t.parent)}else{const n=t.childs.find((e=>e.index===o));if(n){e.context.next=n;break}o=t.index+1,t=t.parent}}}class Je{#e;#t;#o;#n;constructor({key:e,npm:t,master:o,extras:n}){this.#e=e,this.#t=t,this.#o=o,this.#n=n}hits({node:e}){return e.definition.hasOwnProperty(this.#e)}async init(e){const{node:t}=e,o=this.#e,n=t.definition,i=typeof n[o];if(n.call=`npm:${this.#t}`,n.args="object"!==i?{...n.args,[`${this.#o}`]:n[o]}:n[o],delete n[o],this.#n)for(const e in this.#n)n[e]=this.#n[e];console.log(`[npm-block] ${this.#e} --\x3e ${this.#t}`),await Te.init(e)}}function We(e){return new Je(e)}class ze{#i;#s;#r;#a;#c;#l;#p;#d;#f;#m;#u;#h;#y;#g;#w;#b;#x;#v;#j;#k;#D;#_=[];constructor(e){this.#i=new ee,this.#s=e,this.#l=[],this.#p=[],this.#d={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#_.push(We({key:"config",npm:"@fnet/config",master:"name"})),this.#_.push(We({key:"yaml",npm:"@fnet/yaml",master:"file"})),this.#_.push(We({key:"prompt",npm:"@fnet/prompt",master:"message"})),this.#_.push(We({key:"html-link",npm:"@flownet/lib-load-browser-link-url",master:"src"})),this.#_.push(We({key:"html-script",npm:"@flownet/lib-load-browser-script-url",master:"src"})),this.#_.push(We({key:"http-server",npm:"@fnet/node-express",master:"server_port"})),this.#_.push(We({key:"shell",npm:"@fnet/shell-flow",master:"commands"})),this.#_.push(We({key:"list-files",npm:"@fnet/list-files",master:"pattern"})),this.#_.push(We({key:"up-list-files",npm:"@fnet/up-list-files",master:"pattern"})),this.#_.push(We({key:"auto-conda-env",npm:"@fnet/auto-conda-env",master:"envDir"})),this.#_.push(We({key:"ollama-chat",npm:"@fnet/ollama-chat",master:"model"})),this.#_.push(We({key:"ai",npm:"@fnet/ai",master:"prompt",extras:{subtype:"flow"}})),this.#_.push(We({key:"invoke",npm:"@fnet/invoke",master:"method",extras:{}})),this.#_.push(We({key:"fetch",npm:"@fnet/fetch",master:"url",extras:{}})),this.#_.push(We({key:"filemap",npm:"@fnet/filemap",master:"target",extras:{}})),this.#k={packageDependencies:this.#l,packageDevDependencies:this.#p,setProgress:this.setProgress.bind(this),context:this.#s,Atom:D,registerToPackageManager:this.registerToPackageManager.bind(this)},this.#D={initNode:this.initNode.bind(this),cloneDeep:w,resolveTypeCommon:this.resolveTypeCommon.bind(this),resolveNextBlock:Le,transformExpression:this.transformExpression.bind(this),transformValue:this.transformValue.bind(this)}}async _cache_set(e,t,o){this._redis_client&&await this._redis_client.SETEX(e,o||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await async function(){if(!await v({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=x.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}(),this.#u=this.#s.buildId||j(),this.#k.buildId=this.#u,this.#w=this.#s.mode,this.#b=["all","deploy","build","file"].includes(this.#w),this.#x=["all","deploy","build"].includes(this.#w),this.#v=["all","deploy"].includes(this.#w),this.#j=["all","deploy","build","file","bpmn"].includes(this.#w),this.#y=this.#s.protocol,this.#h="BUILD:"+this.#u,this.#g=(await d({optional:!0,name:"atom",dir:this.#s.projectDir,tags:this.#s.tags}))?.data;try{await this.setProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),this.transformWorkflow({workflow:this.#a});const e=await this.initNodeTree({workflow:this.#a});await this.initNodeTreeIndex({root:e}),await this.initNodeCalls({root:e}),await this.initNodeCallLibs({root:e}),await this.initNodeForms({root:e}),await this.initNodeFormLibs({root:e}),await this.initEntryFiles({root:e,features:this.#r.doc.features}),await this.initFeaturesFromNodes({childs:e.childs,features:this.#r.doc.features}),await ne(this.#k),await async function({atom:e,packageDependencies:t,packageDevDependencies:o,setProgress:n}){n("Initializing dependencies");const i=e.doc.dependencies||[];if(i.filter((e=>!e.dev)).forEach((e=>t.push(e))),i.filter((e=>e.dev)).forEach((e=>o.push(e))),"workflow"===e.type&&(t.push({package:"get-value",version:"^3"}),t.push({package:"set-value",version:"^4"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";n("Fetching React versions"),o=`^${(await E({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@fnet/react-app",version:"^0.1"}),t.push({package:"@fnet/react-app-state",version:"^0.1"}))}e.doc.features.preact_enabled&&t.push({package:"preact",version:"^10"}),!0===e.doc.features.cli.enabled&&(t.push({package:"@fnet/args",version:"^0.1"}),o.push({package:"ajv",version:"^8"}),e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled&&t.push({package:"@fnet/config",version:"0.2.21"}),e.doc.features.cli.mcp&&!0===e.doc.features.cli.mcp.enabled&&(t.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),t.push({package:"express",version:"^4.18"}))),e.doc.features.render&&!1!==e.doc.features.render.enabled&&o.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"}),o.push({package:"@babel/core",version:"^7"}),o.push({package:"@rollup/plugin-commonjs",version:"^28"}),o.push({package:"@rollup/plugin-node-resolve",version:"^16"}),o.push({package:"@rollup/plugin-replace",version:"^6"}),o.push({package:"rollup",version:"^4"}),e.doc.features.dts_enabled&&o.push({package:"rollup-plugin-dts",version:"^6"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),o.push({package:"@rollup/plugin-alias",version:"^5"}),o.push({package:"fs-extra",version:"^11"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6"}),o.push({package:"@babel/preset-env",version:"^7"}),o.push({package:"@babel/preset-react",version:"^7"}),e.doc.features.babel?.options?.plugins?.forEach((e=>{switch(e[0]){case"@babel/plugin-proposal-decorators":o.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":o.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":o.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":o.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":o.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"})}}))),o.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),e.doc.features.browsersync_enabled&&o.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}(this.#k),await this.initAtomLibsAndDeps({libs:e.context.libs,packageDependencies:this.#l}),await this.resolveNodeTree({root:e}),this.#m=e}catch(e){throw await this._cache_set(this.#h,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#s.id&&(this.#f=await this.#i.init({config:this.#g}),this.#k.atomAccessToken=this.#f)}async initWorkflow(){const e=this.#s.id;this.#r=this.#s.project?.workflowAtom||await D.get({id:e}),this.#a="string"==typeof this.#r.doc.content?(await h({content:this.#r.doc.content,tags:this.#s.tags})).parsed:this.#r.doc.content;let t=this.#r.doc.bundleName;t=t||(this.#r.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#r.doc.bundleName=t,this.#r.type=this.#r.type||"workflow",this.#k.atom=this.#r,this.#r.doc.features=this.#r.doc.features||{}}#S(t){console.log("filePath",t),l.statSync(t).isDirectory()?(l.readdirSync(t).forEach((o=>{const n=e.join(t,o);this.#S(n)})),l.rmSync(t)):l.unlinkSync(t)}#E(t,o){const n=l.existsSync(t),i=n&&l.statSync(t);n&&i.isDirectory()?(l.mkdirSync(o,{recursive:!0}),l.readdirSync(t).forEach((n=>{this.#E(e.join(t,n),e.join(o,n))}))):l.copyFileSync(t,o)}async initWorkflowDir(){this.setProgress({message:"Initializing library directory."});const t=this.#s.projectDir,o=this.#s.coreDir;this.setProgress({message:"Cleaning project directory."});const n=B({dir:t,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const e of n)l.rmSync(e,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."}),l.existsSync(t)||l.mkdirSync(t,{recursive:!0});const i=e.join(t,"src");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const s=e.join(i,"core");this.#E(o,s);const r=e.join(i,"default","blocks");l.existsSync(r)||l.mkdirSync(r,{recursive:!0})}async initNunjucks(){this.setProgress({message:"Initializing nunjucks."});const e=this.#s.templateDir;this.#c=g.configure(e,{watch:!1,dev:!0}),this.#k.njEnv=this.#c}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],t.steps=t.steps.filter((e=>Object.keys(e).length>0)),t.steps=t.steps.map((e=>this.transformStep({step:e})))}transformStep({step:e}){if(Array.isArray(e))throw new Error("Step must be an object.");const[t,o]=Object.entries(e)[0];if(o.hasOwnProperty("onerror")){const{onerror:n,...i}=o;e[t]={try:i,except:n}}if(e[t].hasOwnProperty("steps")){const o=e[t].steps;if(!Array.isArray(o))throw new Error("Steps must be an array.");e[t].steps=o.map((e=>this.transformStep({step:e})))}return e}async initNodeTree({workflow:e}){const t=Object.keys(e),o={definition:e,name:void 0,type:"root",parent:void 0,childs:[],blockAutoJumpToParent:!0,blockAutoJumpToSibling:!0,index:0,depth:0,context:{libs:[],atom:this.#r}};t.forEach((t=>{const n={name:t,type:"main"===t?"workflow":"subworkflow",childs:[],parent:o,definition:e[t],index:o.childs.length,depth:o.depth+1,context:{},blockAutoJumpToParent:!0,blockAutoJumpToSibling:!1};o.childs.push(n)}));for await(const e of o.childs)await this.initNode({node:e});return o}async initNode({node:e}){const t={...this.#D,node:e};if(e.workflow=e.parent.workflow||e,e.depth=e.parent.depth+1,await be.hits(t))await be.init(t);else if(await ke.hits(t))await ke.init(t);else if(await ye.hits(t))await ye.init(t);else if(await ge.hits(t))await ge.init(t);else if(await De.hits(t))await De.init(t);else if(await ve.hits(t))await ve.init(t);else if(await Se.hits(t))await Se.init(t);else if(await Te.hits(t))await Te.init(t);else if(this.#_.find((e=>e.hits(t))))await this.#_.find((e=>e.hits(t))).init(t);else if(await Ie.hits(t))await Ie.init(t);else if(await Oe.hits(t))await Oe.init(t);else if(await Ce.hits(t))await Ce.init(t);else if(await Ke.hits(t))await Ke.init(t);else if(await Re.hits(t))await Re.init(t);else{if(!await $e.hits(t))throw new Error("Undefined step type.");await $e.init(t)}}async initNodeTreeIndex({root:e}){const t={};e.indexKey="/";for await(const o of e.childs)await this.initNodeIndex({node:o,index:t});return e.context.index=t,t}async initNodeIndex({node:t,index:o}){const n=e.join(t.parent.indexKey,t.name);t.indexKey=n,o[n]=t;const i=[];let s=t;for(;s?.parent;)i.push(s.index),s=s.parent;i.reverse(),t.codeKey=`B_${i.join("_")}_${t.type}`,t.pathKey=`${i.join(".")}`,t.typeId=j();for await(const e of t.childs)await this.initNodeIndex({node:e,index:o})}async initNodeCalls({root:e}){const t=e.context.index,o=[];for await(const e of Object.keys(t)){const n=t[e];"call"===n.type&&o.push(n)}return e.context.calls=o,o}async initNodeCallLibs({root:e}){const t=[],o=e.context.calls;for await(const e of o){const o=e.definition.import||e.definition.call,n=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom",definition:e.definition},i=t.find((e=>e.name===n.name&&e.type===n.type));i||t.push(n),e.target=i||n}return e.context.callLibs=t,e.context.libs=[...e.context.libs,...t],t}async findNodeCallTarget({refNode:e,curNode:t}){if(!t)return;const o=e.definition.call,n=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return n||await this.findNodeCallTarget({refNode:e,curNode:t.parent})}async initNodeForms({root:e}){const t=e.context.index,o=[];for await(const e of Object.keys(t)){const n=t[e];"form"===n.type&&o.push(n)}return e.context.forms=o,o}async initNodeFormLibs({root:e}){const t=[],o=e.context.forms;for await(const e of o){const o=e.definition.import||e.definition.form,n=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},i=t.find((e=>e.name===n.name&&e.type===n.type));i||t.push(n),e.target=i||n}return e.context.formLibs=t,e.context.libs=[...e.context.libs,...t],t}async initFeaturesFromNodes({childs:e,features:t}){for await(const o of e)"form"!==o.type||Reflect.has(t,"form")||(t.form=!0),await this.initFeaturesFromNodes({childs:o.childs,features:t})}async initEntryFiles({root:e,features:t}){for await(const o of e.childs){let e;if("main"===o.name)e="index.js";else if("cli"===o.name)e="cli.js";else if("app"===o.name)e="app.js";else{if("api"!==o.name)continue;e="api.js"}t[`${o.name}_default_entry_file`]=e,o.entryFile=e}}async findNodeFormTarget({refNode:e,curNode:t}){if(!t)return;const o=e.definition.form,n=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return n||await this.findNodeFormTarget({refNode:e,curNode:t.parent})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const o=e.filter((e=>"atom"===e.type));for(let e=0;e<o.length;e++){const n=o[e],i=await this.findAtomLibrary({url:n.name,libRef:n});n.atom=i;const s=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));s?.forEach((e=>{const o=t.find((t=>t.package===e.package));o?"string"==typeof e.path?(o.path||[]).some((t=>t===e.path))||(o.path=o.path||[],o.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(o.path||[]).some((t=>t===e))||(o.path=o.path||[],o.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:t,libRef:o}){const n=F({url:t});if(!n)throw new Error(`Invalid package name: ${t}`);if(n.protocol||(n.protocol=this.#y),"ac:"===n.protocol){const e=n.pathname.split("/");if(1===e.length)return await D.first({where:{name:t,parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===e.length){const t=await D.first({where:{name:e[0],parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"folder"}});return await D.first({where:{name:e[1],parent_id:t.id,type:"workflow.lib"}})}}else{if("local:"===n.protocol){const t=e.resolve(this.#s.projectSrcDir,`${n.pathname}.js`),o=[],i=(await S({file:t,recursive:!0})).all;for await(const e of i){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=await ie({name:e.package,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});o.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return{name:n.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:n.protocol}}if("npm:"===n.protocol){const e=await ie({name:n.pathname,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});return{name:n.pathname,doc:{type:"workflow.lib",subtype:"flow"===o?.definition?.subtype?"workflow":null,"content-type":"javascript",language:"js",dependencies:[{package:n.pathname,version:e.minorRange,type:"npm"}]},protocol:n.protocol}}if("use:"===n.protocol){return{name:n.pathname,doc:{type:"function",dependencies:[]},protocol:n.protocol}}}}async resolveNodeTree({root:e}){for await(const t of e.childs)await this.resolveTypeWorkflow({node:t})}async resolveTypeWorkflow({node:e}){e.context.transform=e.context.transform||w(e.definition);const t=e.context.transform;for(let e=0;e<t.params?.length;e++){const o=t.params[e];if("string"==typeof o)t.params[e]={key:o,hasDefault:!1};else{const n=Object.keys(o)[0];t.params[e]={key:n,hasDefault:!0,default:o[n],type:typeof o[n]}}}e.context.next=e.childs[0];for await(const t of e.childs)await this.resolveType({node:t})}async resolveType({node:e}){const t={...this.#D,node:e};"function"==typeof e.resolve&&await e.resolve(t);for await(const t of e.childs)await this.resolveType({node:t})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:t}){await this.setProgress({message:"Creating external lib files."}),this.#r.typesDir="./types";const o=t.context.libs.filter((e=>"atom"===e.type));for(let t=0;t<o.length;t++){const n=o[t].atom,i=this.#s.projectDir;if("local:"===n.protocol){const t=e.resolve(this.#s.projectSrcDir,`${n.fileName||n.name}.js`),o=e.relative(`${this.#s.projectDir}/src/default/blocks`,t);if(!l.existsSync(t)){l.mkdirSync(e.dirname(t),{recursive:!0});let o="export default async (args)=>{\n";o+="}",l.writeFileSync(t,o,"utf8")}n.relativePath=o.split(e.sep).join("/"),this.#r.typesDir=`./types/${e.basename(i)}/src`}else if("npm:"===n.protocol)n.relativePath=n.name;else if("use:"===n.protocol);else{const t=`${i}/src/libs/${n.id}.js`,o=n.doc.contents?.find((e=>"esm"===e.format))||n.doc;l.writeFileSync(e.normalize(t),o.content,"utf8")}}}async createEngine({root:t}){await this.setProgress({message:"Creating engine file."});const o=this.#s.templateDir,n=g.compile(l.readFileSync(e.resolve(o,"src/default/engine.js.njk"),"utf8"),this.#c);for(let o=0;o<t.childs.length;o++){const i=t.childs[o];if(!i.entryFile)continue;const s=n.render({flow:i,ui:{package:"@fnet/react-app"}}),r=this.#s.projectDir,a=e.resolve(r,`src/default/${i.entryFile}`);l.writeFileSync(a,s,"utf8")}}async createNodeTree({root:e}){await this.setProgress({message:"Creating block files."});for await(const t of e.childs)await this.createTypeWorkflow({node:t})}async createTypeWorkflow({node:t}){const o=this.#s.templateDir,n=g.compile(l.readFileSync(e.resolve(o,"src/default/workflow.js.njk"),"utf8"),this.#c).render(t),i=this.#s.projectDir,s=e.resolve(i,`src/default/${t.codeKey}.js`);l.writeFileSync(s,n,"utf8");for await(const e of t.childs)await this.createType({node:e})}async createType({node:e}){switch(e.type){case"assign":case"steps":case"return":case"call":case"form":case"raise":case"switch":case"jump":case"tryexcept":case"for":case"operation":case"modules":this.createBlockFromTemplate({node:e})}for await(const t of e.childs)await this.createType({node:t})}createBlockFromTemplate({node:e}){const t=this.getBlockTemplate({node:e});e.context.render=t.render(e),this.createStepFile({node:e})}getBlockTemplate({node:t}){let o=this.#d[t.type];if(o)return o;const n=this.#s.templateDir;return o=g.compile(l.readFileSync(e.resolve(n,`src/default/blocks/${t.type}.js.njk`),"utf8"),this.#c),this.#d[t.type]=o,o}createStepFile({node:t}){const o=this.#s.projectDir,n=`${t.codeKey}.js`,i=e.resolve(o,`src/default/blocks/${n}`);l.writeFileSync(i,t.context.render,"utf8"),t.context.fileName=n,t.context.filePath=i}async transformExpression(e){let t=await this.transformValue(e);return t=JSON.stringify(t),t=this.replaceSpecialPattern(t),t}async transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=await this.transformValue(e[t]);else if(b(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++){const n=t[o],i=O({expression:n});if(i)if("e"===i.processor){const t=e[n].replace(/(\r\n|\n|\r)/g,"");e[i.statement]=`$::${t}::`,delete e[n]}else e[n]=await this.transformValue(e[n]);else e[n]=await this.transformValue(e[n])}}else if("string"==typeof e){const t=O({expression:e});if(t){const{processor:o,statement:n}=t;switch(o){case"v":e=`$::v.${n}::`;break;case"e":e=`$::${n}::`;break;case"m":e=`$::c.module['${n}']::`;break;case"fm":e=`$::flow.getModule('${n}')::`;break;case"f":e=`$::c.form.${n}::`;break;case"for":e=`$::caller.for.${n}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createProjectYaml(){const t="fnet.yaml",o=`Creating ${t}`;await this.setProgress({message:o});const{content:n,...i}=this.#r.doc,s=this.#s.projectDir,r=e.resolve(s,`${t}`);l.writeFileSync(r,y.stringify(i),"utf8")}async createProjectMainYaml(){const t="flow.main.yaml",o=`Creating ${t}`;await this.setProgress({message:o});const n={content:y.stringify(this.#a)},i=this.#s.templateDir,s=g.compile(l.readFileSync(e.resolve(i,`${t}.njk`),"utf8"),this.#c).render(n),r=this.#s.projectDir,a=e.resolve(r,`${t}`);l.writeFileSync(a,s,"utf8")}async runPrettifier(){const t=this.#s.projectDir;if(q("bun")){const o=await u("prettier --write .",{cwd:e.resolve(t,"src")});if(0!==o.code)throw new Error(o.stderr)}else{const o=await u("prettier --write .",{cwd:e.resolve(t,"src")});if(0!==o.code)throw new Error(o.stderr)}}async deploy(){if(await this.setProgress({message:"Deploying."}),this.#s.project?.devops){const e=[this.#s.project?.devops];for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&await o.save()}}else if(this.#r.id){const e=await D.list({type:"workflow.deploy",parent_id:this.#r.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await D.update(o,{id:o.id}))}}}async deployProject(e){const{deploymentProject:t}=e,{yamlDocument:o}=t;if(t.doc.targets&&Array.isArray(t.doc.targets))throw new Error("Deployment project targets are deprecated. Please update targets in the yaml file.");const n=Object.keys(t.doc||{}),i=o||{};for(let e=0;e<n.length;e++){const o=t.doc[n[e]];o.name=n[e];const s=i.get(n[e]);await se({...this.#k,deploymentProject:t,deploymentProjectTarget:o,yamlTarget:s})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;if(!this.#s.id)return;let n=await D.first({name:t.params.name,parent_id:this.#g.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await D.update(n,{id:n.id})):n=await D.create({parent_id:this.#g.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:o.version}]}})}async setProgress(e){const t="string"==typeof e?e:e?.message;console.log(s.blue(t)),await this._cache_set(this.#h,{status:"IN_PROGRESS",message:t})}async build(){if(this.#j&&!this.#b)return await this.createNetwork();try{const t=this.#j?await fe({root:this.#m}):void 0;if(this.#b){if(await this.initWorkflowDir(),await this.initNunjucks(),this.#j){let o=this.#s.project?.projectDir||this.#s.projectDir;o=e.resolve(o,"fnet"),l.existsSync(o)&&(l.existsSync(e.resolve(o,"flow.bpmn"))&&l.unlinkSync(e.resolve(o,"flow.bpmn")),l.writeFileSync(e.resolve(o,"flows.bpmn"),t.diagramXML,"utf8"))}await this.createAtomLibFiles({root:this.#m}),await this.createEngine({root:this.#m}),await this.createNodeTree({root:this.#m}),await this.createProjectYaml(),await async function({atom:t,context:o,setProgress:n,Atom:i}){const s="readme.md",r=`Creating ${s}`;if(await n({message:r}),o.project?.readme){const t=o.projectDir,n={content:o.project.readme.doc.content},i=e.resolve(o.project.projectDir,"fnet/how-to.md");if(l.existsSync(i)){const e=l.readFileSync(i,"utf8");n.howto=e}const r=e.resolve(o.project.projectDir,"fnet/input.yaml");if(l.existsSync(r)){const e=await h({file:r,tags:o.tags});n.input=e.content}const a=e.resolve(o.project.projectDir,"fnet/output.yaml");if(l.existsSync(a)){const e=await h({file:a,tags:o.tags});n.output=e.content}const c=o.templateDir,p=g.compile(l.readFileSync(e.resolve(c,`${s}.njk`),"utf8"),g.configure(c)).render(n),d=e.resolve(t,`${s}`);l.writeFileSync(d,p,"utf8")}else if(t.id){const n=await i.first({type:"wiki",parent_id:t.id});if(!n||"markdown"!==n.doc?.["content-type"])return;const{content:r,...a}=n.doc,c={content:r},p=o.templateDir,d=g.compile(l.readFileSync(e.resolve(p,`${s}.njk`),"utf8"),g.configure(p)).render(c),f=o.projectDir,m=e.resolve(f,`${s}`);l.writeFileSync(m,d,"utf8")}}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating tsconfig.json."});const s={atom:t,packageDependencies:i},r=n.templateDir,a=g.compile(l.readFileSync(e.resolve(r,"tsconfig.json.njk"),"utf8"),g.configure(r)).render(s),c=n.projectDir,p=e.resolve(c,"tsconfig.json");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating .gitignore"});const s={atom:t,packageDependencies:i},r=n.templateDir,a=g.compile(l.readFileSync(e.resolve(r,".gitignore.njk"),"utf8"),g.configure(r)).render(s),c=n.projectDir,p=e.resolve(c,".gitignore");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,njEnv:i}){if(!0!==t.doc.features.cli.enabled)return;await o({message:"Creating input args."});let s={};if(s=t.doc.input?t.doc.input:{type:"object",properties:{},required:[]},t.doc.features.cli.fargs&&!1!==t.doc.features.cli.fargs?.enabled){const e=t.doc.features.cli.fargs;Reflect.has(e,"default")&&e.default}const r={imports:[],atom:t},a=n.templateDir,c=g.compile(l.readFileSync(e.resolve(a,"src/default/input.args.js.njk"),"utf8"),i).render(r),p=n.projectDir,d=e.resolve(p,"src/default/input.args.js");l.writeFileSync(d,c,"utf8");const f=new T({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});C(f);const m=f.compile(s),u=N(f,m)+"\nexport { schema31 as schema };";l.writeFileSync(e.resolve(p,"src/default/validate_input.js"),u,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){if(!0!==t.doc.features.cli.enabled)return;await o({message:"Creating cli."});const s={atom:t,packageDependencies:i},r=n.templateDir,a=e.resolve(n.projectDir,"src/cli");l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),await m({pattern:["index.js.njk"],dir:e.resolve(r,"src/cli"),outDir:a,context:s})}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){if(!0!==t.doc.features.app.enabled)return;await o({message:"Creating app folder"});const s={atom:t,packageDependencies:i,ts:Date.now()},r=n.templateDir,a=e.resolve(n.projectDir,"src/app");l.existsSync(a)||l.mkdirSync(a,{recursive:!0});let c=["index.js.njk"];!1!==t.doc.features.app.html&&c.push("index.html.njk"),await m({pattern:c,dir:e.resolve(r,"src/app"),outDir:a,context:s})}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating rollup file."});const s={atom:t,packageDependencies:i},r=e.resolve(n.projectDir,"src","default/index.js");if(!l.existsSync(r))throw new Error(`Entry file not found: ${r}`);const a=(await S({file:r,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),c=t.doc.features.rollup_output,p=Object.keys(c);for(let e=0;e<p.length;e++){const t=c[p[e]];if(!0===t.browser&&a.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(a.map((e=>({key:e,value:e})))),t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{};for(let e=0;e<a.length;e++){const o=a[e];t.alias.entries[o]=`node:${o}`,t.alias.entries[`node:${o}`]=o}t.external_enabled=!0,t.external=t.external||[],t.external=t.external.concat(a)}}const d=n.templateDir;let f=g.compile(l.readFileSync(e.resolve(d,"rollup.config.mjs.njk"),"utf8"),g.configure(d)).render(s);const m=n.projectDir;let u=e.resolve(m,"rollup.config.mjs");l.writeFileSync(u,f,"utf8")}(this.#k),await async function({atom:t,context:o,packageDependencies:n,packageDevDependencies:i,setProgress:s}){await s({message:"Creating package.json."}),n.filter((e=>!0===e.dev)).forEach((e=>{i.find((t=>t.package===e.package))||i.push(e);const t=n.findIndex((t=>t.package===e.package));n.splice(t,1)}));const r=n.find((e=>"react"===e.package)),a=n.find((e=>"react-dom"===e.package));r&&!a?n.push({package:"react-dom",version:r.version}):r&&a&&(a.version=r.version),r&&t.doc.features.react_version>=17&&(n.find((e=>"@emotion/react"===e.package))||n.push({package:"@emotion/react",version:"^11"}),n.find((e=>"@emotion/styled"===e.package))||n.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===t.doc.features.app.enabled&&c.push({file:e.resolve(o.projectDir,"src/app/index.js"),dev:!1!==t.doc.features.app.dev}),!0===t.doc.features.cli.enabled&&c.push({file:e.resolve(o.projectDir,"src/cli/index.js"),dev:!1!==t.doc.features.cli.dev});for await(const e of c){const t=e.file;if(!l.existsSync(t))throw new Error(`App file not found: ${t}`);const r=(await S({file:t,recursive:!0})).all;for await(const t of r){if("npm"!==t.type)continue;if(n.find((e=>e.package===t.package)))continue;if(i.find((e=>e.package===t.package)))continue;const r=await ie({name:t.package,projectDir:o.projectDir,setProgress:s});(!0===e.dev?i:n).push({package:t.package,subpath:t.subpath,version:r.minorRange,type:"npm"})}}const p={atom:t,packageDependencies:n,packageDevDependencies:i},d=o.templateDir,f=g.compile(l.readFileSync(e.resolve(d,"package.json.njk"),"utf8"),g.configure(d)).render(p),m=o.projectDir,u=e.resolve(m,"package.json");l.writeFileSync(u,f,"utf8");const h=e.resolve(o.project.projectDir,"fnet");if(l.existsSync(h)){const t=e.resolve(o.projectDir,"fnet");l.existsSync(t)||l.mkdirSync(t);const n=l.readdirSync(h);for(const o of n){const n=e.resolve(h,o);if(!l.lstatSync(n).isFile())continue;const i=e.resolve(t,o);l.copyFileSync(n,i)}}}(this.#k),await async function({setProgress:t,context:o}){const n=o.projectDir;await t({message:"Prettifiying source files."});let i=e.join("src","**","*");if(q("bun")){const e=await u(`prettier --write ${i} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:n});if(0!==e.code)throw new Error(e.stderr)}else{const e=await u(`prettier --write ${i} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:n});if(0!==e.code)throw new Error(e.stderr)}}(this.#k),await async function({atom:e,setProgress:t,context:o}){if(!e.doc.features.dts_enabled)return;const n=o.projectDir;if(await t({message:"Creating .d.ts"}),0!==(await u("tsc",{cwd:n})).code)throw new Error("Couldnt create .d.ts files.")}(this.#k),this.#x&&(await async function({setProgress:e,atom:t,context:o}){const n=o.projectDir;if(await e({message:"Installing npm packages."}),q("bun")){if(0!==(await u(`bun install ${t.doc.features.npm_install_flags}`,{cwd:n})).code)throw new Error("Couldnt install npm packages.")}else if(0!==(await u(`npm install ${t.doc.features.npm_install_flags}`,{cwd:n})).code)throw new Error("Couldnt install npm packages.")}(this.#k),await async function({setProgress:e,context:t}){const o=t.projectDir;if(await e({message:"Building main project."}),q("bun")){if(0!==(await u(t.dev?"bun run build:dev":"bun run build",{cwd:o})).code)throw new Error("Couldnt build project.")}else if(0!==(await u(t.dev?"npm run build:dev":"npm run build",{cwd:o})).code)throw new Error("Couldnt build project.")}(this.#k),this.#v&&await this.deploy())}await this._cache_set(this.#h,{status:"COMPLETED",data:{network:t}})}catch(e){throw await this._cache_set(this.#h,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await fe({root:this.#m});await this._cache_set(this.#h,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#h,{status:"FAILED",message:e.message||e}),e}}}const Ge={command:"build",describe:"Build flownet project",builder:e=>e.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"}),handler:async e=>{try{const t=await Y(e),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},qe={command:"deploy",describe:"Build and deploy flownet project",builder:e=>e.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 e=>{try{const t=await Y({...e,mode:"all"}),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},Ue={command:"file",describe:"Just create files",builder:e=>e.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 e=>{try{const t=await Y({...e,mode:"file"}),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},Ve={command:"input [name]",describe:"Create or modify an input config file",builder:e=>e.positional("name",{type:"string",demandOption:!1,describe:"Input name"}),handler:async t=>{try{const o=await Y(t),{project:n}=o,{projectDir:i,projectFileParsed:s}=n,r=s.input;if(!r)throw new Error("Config schema not found in project file.");if(!Reflect.has(t,"name")){const{inputName:e}=await M({type:"input",name:"inputName",message:"Input name:",initial:"dev"});t.name=e}const a=e.resolve(i,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=e.resolve(a,`${t.name}.fnet`),p=l.existsSync(c),d=(await import("@fnet/object-from-schema")).default,f=await d({schema:r,format:"yaml",ref:p?c:void 0});l.writeFileSync(c,f)}catch(e){console.error(e.message),process.exit(1)}}},Xe=e.join(f.homedir(),".fnet","express");async function He(t){t.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(e=>e.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)",type:"string",choices:["node"],default:"node"})),(async t=>{await async function(t){try{l.existsSync(Xe)||l.mkdirSync(Xe,{recursive:!0});const o=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=e.join(Xe,o);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let i,r=t.projectName,a=t.runtime;if(t.yes){if(!r){const e=l.readdirSync(n).filter((e=>e.startsWith("fnet-"))).map((e=>parseInt(e.replace("fnet-",""),10))).filter((e=>!isNaN(e))),t=e.length>0?Math.max(...e)+1:1;r=`fnet-${t}`}a||(a="node")}else{if(!r){const e=l.readdirSync(n).filter((e=>e.startsWith("fnet-"))).map((e=>parseInt(e.replace("fnet-",""),10))).filter((e=>!isNaN(e))),t=`fnet-${e.length>0?Math.max(...e)+1:1}`,o=await M([{type:"input",name:"projectName",message:"Enter project name:",default:t}]);r=o.projectName}const e=a||"node";a=(await M({type:"select",name:"runtime",message:"Select runtime:",choices:["node"],initial:e})).runtime}if(i=e.join(n,r),l.existsSync(i)){let t=1;for(;l.existsSync(e.join(n,`${r}-${t}`));)t++;r=`${r}-${t}`,i=e.join(n,r)}if(!t.yes){if(!(await M([{type:"confirm",name:"proceed",message:`Create express project "${r}" in ${i}?`,default:!0}])).proceed)return void console.log(s.yellow("Project creation cancelled."))}console.log(s.blue(`Creating express project "${r}" in ${i}...`));const p=e.dirname(i),d=["create","--name",e.basename(i)];d.push("--runtime",a),t.yes&&d.push("--yes"),l.existsSync(p)||l.mkdirSync(p,{recursive:!0});const f=c("fnet",d,{stdio:"inherit",shell:!0,cwd:p});return new Promise(((e,o)=>{f.on("close",(n=>{0===n?(console.log(s.green(`\nExpress project "${r}" created successfully!`)),console.log(s.blue(`\nProject location: ${i}`)),t.yes?e():async function(e){try{(await M({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE&&await et(e)}catch(e){console.error(s.red(`Error opening IDE: ${e.message}`))}}(i)):(console.error(s.red(`\nFailed to create express project "${r}".`)),o(new Error(`Process exited with code ${n}`)))}))}))}catch(e){console.error(s.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(t)})).command("list","List express projects",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(Xe))return void console.log(s.yellow("No express projects found."));const o=l.readdirSync(Xe).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(t.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),t=o.indexOf(e);if(-1===t)return void console.log(s.yellow("No express projects found for today."));o.splice(0,t),o.splice(1)}const n=[];t.type||t.all||(t.type="fnet");for(const i of o){const o=e.join(Xe,i),s=l.readdirSync(o);for(const r of s){const s=e.join(o,r),a=l.statSync(s);let c="unknown";if(r.startsWith("fnode-")||l.existsSync(e.join(s,"fnode.yaml"))?c="fnode":(r.startsWith("fnet-")||l.existsSync(e.join(s,"fnet.yaml")))&&(c="fnet"),t.type&&c!==t.type)continue;if(t.name&&!r.includes(t.name))continue;const p=`${i.slice(0,4)}-${i.slice(4,6)}-${i.slice(6,8)}`;n.push({name:r,type:c,date:p,path:s,created:a.birthtime})}}if(n.sort(((e,t)=>t.created-e.created)),0===n.length)return void console.log(s.yellow("No express projects found matching the criteria."));console.log(s.blue("\nExpress Projects:"));const i=(await import("./index.-SGbq2cI.js")).default,r=["NAME","TYPE","DATE","PATH"],a=i.createTable(r,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let t=e.path;t.startsWith(f.homedir())&&(t="~"+t.substring(f.homedir().length)),a.push([s.white(e.name),"fnet"===e.type?s.cyan(e.type):"fnode"===e.type?s.green(e.type):e.type,e.date,t])}console.log(a.toString()),console.log(s.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(s.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(t)})).command("open [project-name]","Open an express project",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(Xe))return void console.log(s.yellow("No express projects found."));let o;if(t.latest){if(o=await Ye(),!o)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(o=await Qe(t.projectName),!o)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await Ze();if(!t)return void console.log(s.yellow("No project selected."));o=e.join(Xe,t)}await et(o)}catch(e){console.error(s.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(t)})).command("move [project-name] [destination]","Move an express project to a real project location",(e=>e.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 t=>{await async function(t){try{const o=process.cwd();let n;if(o.includes(Xe))n=o,console.log(s.blue(`Using current express project: ${e.basename(n)}`));else if(t.latest){if(n=await Ye(),!n)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(n=await Qe(t.projectName),!n)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await Ze();if(!t)return void console.log(s.yellow("No project selected."));n=e.join(Xe,t)}let i=t.destination;if(!i){i=(await M({type:"input",name:"destination",message:"Enter destination directory:",initial:e.join(process.cwd(),e.basename(n))})).destination}if(i.startsWith("~")&&(i=e.join(f.homedir(),i.slice(1))),i=e.resolve(i),i.startsWith(n+e.sep)||i===n)return void console.log(s.red("Destination cannot be inside the source directory."));if(l.existsSync(i)){if(!l.statSync(i).isDirectory())return void console.log(s.red(`Destination "${i}" is not a directory.`));if(l.readdirSync(i).length>0){if(!(await M({type:"confirm",name:"overwrite",message:`Destination "${i}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(s.yellow("Project move cancelled."))}}else l.mkdirSync(i,{recursive:!0});console.log(s.blue(`Moving project from ${n} to ${i}...`)),ot(n,i),console.log(s.green(`\nProject moved successfully to ${i}`));(await M({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(s.green("Original project deleted."))),await et(i)}catch(e){console.error(s.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(t)})).demandCommand(1,"You need to specify a command").help()}async function Ye(){const t=l.readdirSync(Xe).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(0===t.length)return null;const o=t[0],n=e.join(Xe,o),i=l.readdirSync(n);if(0===i.length)return null;let s=null,r=0;for(const t of i){const o=e.join(n,t),i=l.statSync(o);i.birthtimeMs>r&&(r=i.birthtimeMs,s=o)}return s}async function Qe(t){const o=l.readdirSync(Xe).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=e.join(Xe,n),i=l.readdirSync(o);if(i.includes(t))return e.join(o,t);const s=i.filter((e=>e.includes(t)));if(s.length>0){if(1===s.length)return e.join(o,s[0]);{const i=await M({type:"select",name:"selectedProject",message:`Multiple projects match "${t}". Please select one:`,choices:s.map((t=>({name:`${t} (${n})`,value:e.join(o,t)})))});return i.selectedProject}}}return null}async function Ze(){const t=[],o=l.readdirSync(Xe).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=e.join(Xe,n),i=l.readdirSync(o);for(const s of i){const i=e.join(o,s),r=l.statSync(i),a=`${n}/${s}`;t.push({name:a,value:a,created:r.birthtime})}}if(t.sort(((e,t)=>t.created-e.created)),0===t.length)return null;return(await M({type:"select",name:"selectedProject",message:"Select a project:",choices:t})).selectedProject}async function et(e){const t=await tt("code --version"),o=await tt("code-insiders --version");let n=null;if(t&&o){const e=await M({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"}]});n=e.ide}else if(t)n="code";else{if(!o)return console.log(s.yellow("No supported IDE found. Please open the project manually.")),void console.log(s.blue(`Project path: ${e}`));n="code-insiders"}console.log(s.blue(`Opening project in ${n}...`)),console.log(s.blue(`Project path: ${e}`));const i=c(n,[e],{stdio:"inherit",shell:!0});return new Promise(((e,t)=>{i.on("close",(o=>{0===o?(console.log(s.green(`Project opened in ${n}.`)),e()):(console.error(s.red(`Failed to open project in ${n}.`)),t(new Error(`Process exited with code ${o}`)))}))}))}async function tt(e){return new Promise((t=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{t(0===e)}))}))}function ot(t,o){l.existsSync(o)||l.mkdirSync(o,{recursive:!0});const n=l.readdirSync(t,{withFileTypes:!0});for(const i of n){const n=e.join(t,i.name),s=e.join(o,i.name);if(i.isDirectory()){if(".git"===i.name||".workspace"===i.name)continue;ot(n,s)}else l.copyFileSync(n,s)}}const nt=e.dirname(n(import.meta.url));const it=e.dirname(n(import.meta.url)),st=process.cwd();process.on("uncaughtException",(e=>{L||(L=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{L||(L=!0,setTimeout((()=>process.exit(1)),500))})),function(){d({name:["redis"],dir:st,optional:!0});const t=function({baseDir:t}){let o=t=t||nt;for(;o!==e.parse(o).root;){const t=e.join(o,"node_modules");if(l.existsSync(t))return t;o=e.dirname(o)}return null}({baseDir:it}),o="win32"===process.platform?";":":";t&&(process.env.PATH=`${e.join(t,"/.bin")}${o}${process.env.PATH}`)}(),async function(){try{let t=i(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(H).command(Z).command(Ge).command(qe).command(Ue).command(Ve).command("express","Create and manage express projects",He);t=z(t,{bin:"npm"}),t=z(t,{bin:"node"}),t=z(t,{bin:"bun"}),t=z(t,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),t=z(t,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),t=z(t,{name:"app",bin:"bun",preArgs:["run","app","--"]}),t=z(t,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),t=z(t,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),t=function(t,{name:o}){return t.command(`${o} [options]`,"Install the project as a binary",(e=>e.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 t=>{try{const o=await G(t),{projectDir:n}=o;console.log(s.blue("Compiling project..."));const i=e.join(n,".bin");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const r=e.basename(e.dirname(n)),a=o.project?.projectFileParsed?.features?.cli?.bin,c=t.name||a||r;console.log(s.blue(`Using binary name: ${c}`));const p=e.join(i,c),{spawn:d}=await import("child_process"),f=d("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${p}`],{cwd:n,stdio:"inherit",shell:!0});await new Promise(((e,t)=>{f.on("close",(o=>{0===o?e():t(new Error(`Compilation failed with code ${o}`))})),f.on("error",(e=>{t(e)}))})),"win32"!==process.platform&&l.chmodSync(p,493),console.log(s.green(`Binary compiled successfully: ${p}`)),console.log(s.blue("Installing binary..."));const m=["install",p];t.name&&m.push("--name",t.name),t.force&&m.push("--force"),t.yes&&m.push("--yes");const u=d("fbin",m,{stdio:"inherit",shell:!0});await new Promise(((e,t)=>{u.on("close",(o=>{0===o?e():t(new Error(`Installation failed with code ${o}`))})),u.on("error",(e=>{t(e)}))}))}catch(e){console.error(s.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(t,{name:"install"}),t=z(t,{bin:"npx"}),t=z(t,{bin:"cdk"}),t=z(t,{bin:"aws"}),t=function(e,{name:t,preArgs:o=[]}){return e.command(`${t} <config> <command> [options..]`,"Run a command with a config context",(e=>e.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)),(async e=>{try{const t=await G(e),{projectDir:n}=t,i=e.config,s=await d({name:i,dir:n,transferEnv:!1,optional:!0,tags:t.tags}),r=s?.data?.env||void 0,a=e.command,p=process.argv.slice(5);W(c(a,[...o,...p],{cwd:l.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...r}}))}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"with"}),t=function(e,{name:t,projectType:o="auto"}){return e.command(`${t} group [options..]`,"Run a command group.",(e=>e.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)),(async e=>{try{const{runCommandGroup:t}=await import("./index.DrwlOzAe.js");await t({projectType:o,group:e.group,tags:e.ftag,args:e,argv:process.argv})}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"run",projectType:"fnet"}),t.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(s.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(s.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{X as r,q as w};
2
+ import e,{delimiter as t,join as o}from"node:path";import{fileURLToPath as n}from"node:url";import i from"yargs";import s from"chalk";import{promisify as r}from"node:util";import a from"tree-kill";import{spawn as c}from"node:child_process";import l,{existsSync as p}from"node:fs";import d from"@fnet/config";import f from"node:os";import m from"@flownet/lib-render-templates-dir";import u from"@fnet/shelljs";import y from"@fnet/yaml";import h from"yaml";import g from"nunjucks";import w from"lodash.clonedeep";import b from"isobject";import x from"redis";import v from"@flownet/lib-is-redis-online";import{randomUUID as j}from"node:crypto";import{Api as k,Atom as D}from"@flownet/lib-atom-api-js";import _ from"lodash.merge";import S from"@flownet/lib-parse-imports-js";import E from"@fnet/npm-list-versions";import $ from"@fnet/npm-pick-versions";import P from"object-hash";import N from"ajv/dist/2020.js";import T from"ajv/dist/standalone/index.js";import C from"ajv-formats";import F from"@flownet/lib-parse-node-url";import A from"bpmn-moddle";import I from"dagre";import O from"@fnet/expression";import B from"@fnet/list-files";import K from"@fnet/key-value-transformer";import R from"@fnet/prompt";import"fs";import"path";import"@fnet/shell-flow";const M=r(a);let L=!1;async function J(e,t){if(L)return;if(L=!0,!e.killed&&e.pid)try{await M(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await M(e.pid,"SIGKILL").catch((()=>{}))}catch(e){}await new Promise((e=>setTimeout(e,100)));const o="SIGINT"===t?130:"SIGTERM"===t?143:1;process.exit(o)}function W(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((t=>{process.once(t,(async()=>{await J(e,t)}))})),process.on("uncaughtException",(async t=>{await J(e)})),process.on("unhandledRejection",(async t=>{await J(e)})),e.on("close",(e=>{L||process.exit(e)}))}function z(e,{name:t,bin:o,preArgs:n=[]}){return"function"==typeof o&&(o=o()),e.command(`${t||o} [commands..]`,`${o} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const t=await G(e),{projectDir:i}=t,s=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,r=process.argv.slice(3).map(s);W(c(o,[...n,...r],{cwd:i,stdio:"inherit",shell:!0,detached:!0}))}catch(e){console.error(e.message),process.exit(1)}}))}async function G(e){try{const t=process.argv[1].split("/").pop().split(".")[0];if("fnode"===t){const{createContext:t}=await import("./index.DwUKrF3q.js");return t(e)}if("fnet"===t){const{createContext:t}=await Promise.resolve().then((function(){return Q}));return t(e)}if("frun"===t){const{createContext:t}=await import("./index.CuMyez3E.js");return t(e)}if("fbin"===t){const{createContext:t}=await import("./index.DWpw12No.js");return t(e)}}catch(e){console.warn(`Warning: Could not import context from CLI tool: ${e.message}`)}return{projectDir:process.cwd(),tags:e.ftag}}var q=e=>{const n=process.env.PATH||"",i="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],s=n.split(t);for(const t of s)for(const n of i){const i=o(t,"win32"===process.platform?e+n:e);if(p(i))return i}return null};const U=e.dirname(n(import.meta.url)),V=process.cwd();function X(t){const o=e.resolve(V,t);if(l.existsSync(o))return o;const n=e.resolve(U,"../..",t);if(l.existsSync(n))return n;throw new Error(`Template path not found: ${t}`)}const H={command:"create",describe:"Initialize a new fnet project",builder:e=>e.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 t=>{try{const o=process.cwd(),n=X("./template/fnet/project"),i=e.resolve(o,t.name);l.existsSync(i)||l.mkdirSync(i),await m({dir:n,outDir:i,context:t,copyUnmatchedAlso:!0,platform:f.platform()});let s=await u("fnet build",{cwd:i});if(0!==s.code)throw new Error("Failed to build project.");if(q("git")&&(s=await u("git init --initial-branch=main",{cwd:i}),0!==s.code))throw new Error("Failed to initialize git.");if(q("code")&&t.vscode&&(s=await u(`cd ${i} && code .`),0!==s.code))throw new Error("Failed to open vscode.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}}};async function Y(t){if(t.id)return{id:t.id,buildId:t.buildId,mode:t.mode,protocol:t.protocol||"ac:",templateDir:X("./template/fnet/node"),coreDir:X("./template/fnet/core"),projectDir:e.resolve(process.cwd(),`./.output/${t.id}`),tags:t.ftag,dev:t.dev};try{const o=await async function({tags:t}){let o=(n=process.cwd(),e.resolve(n,"fnet.yaml"));var n;if(!l.existsSync(o))throw new Error("fnet.yaml file not found in current directory.");const{raw:i,parsed:s}=await y({file:o,tags:t}),r=e.dirname(o);s.features=s.features||{};const a=s.features;let c;if(a.runtime=a.runtime||{},a.runtime.type=a.runtime.type||"node","object"==typeof s.flows)c=s.flows;else{let o="flow.main.yaml";l.existsSync(e.join(r,"fnet","flows.yaml"))&&(o=e.join("fnet","flows.yaml"));const n=s.main||o;let i=e.resolve(r,n);if(l.existsSync(i)){const{parsed:e}=await y({file:i,tags:t});c=e}else c={main:{steps:[]}}}const p={workflowAtom:{doc:{...s,content:c}},projectDir:r,projectFilePath:o,projectFileContent:i,projectFileParsed:s,runtime:a.runtime};let d=e.resolve(r,"fnet/targets.yaml");if(l.existsSync(d)){const{raw:e,parsed:o}=await y({file:d,tags:t}),n=h.parseDocument(e);p.devops={filePath:d,fileContent:e,yamlDocument:n,doc:{...o},type:"workflow.deploy",save:async()=>{l.writeFileSync(p.devops.filePath,n.toString())}}}const f=e.resolve(r,"readme.md");if(l.existsSync(f)){const e=l.readFileSync(f,"utf8");p.readme={filePath:f,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return p}({tags:t.ftag});return{buildId:t.buildId,mode:t.mode,protocol:t.protocol||"local:",templateDir:X("./template/fnet/node"),coreDir:X("./template/fnet/core"),projectDir:e.resolve(o.projectDir,"./.workspace"),projectSrcDir:e.resolve(o.projectDir,"./src"),project:o,tags:t.ftag,dev:t.dev}}catch(e){return console.warn(`Warning: Could not load project: ${e.message}`),{projectDir:process.cwd(),tags:t.ftag}}}var Q=Object.freeze({__proto__:null,createContext:Y});const Z={command:"project",describe:"Manage fnet project",builder:e=>e.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"}),handler:async e=>{try{const t=X("./template/fnet/project"),o=process.cwd(),n=await Y(e);if(e.update){if(await m({dir:t,outDir:o,context:{name:n.project.projectFileParsed.name,runtime:"node"},copyUnmatchedAlso:!0,platform:f.platform()}),0!==(await u("fnet build",{cwd:o})).code)throw new Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(e){console.error("Project failed.",e.message),process.exit(1)}}};class ee{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(k.set_api_url(e.data.url),t)return k.set_req_token(t),void o(t);fetch(`${e.data.issuer}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(e.data.grant.params)}).then((async e=>{if(!e.ok)throw new Error(await e.text());return e.json()})).then((e=>{k.set_req_token(e.access_token),o(e.access_token)})).catch((e=>{k.set_req_token(),n(e)}))}))}}function te({feature:e,features:t,packageDevDependencies:o}){const{name:n,packages:i,options:s,extraCheck:r,explicit:a}=e,c=`${n}_enabled`,l=t.rollup_output||{},p=Object.keys(l);let d=s||{};const f=t[n]?.options;f&&(d=_(d,f));const m=!t[n]||!1===t[n]?.enabled;p.forEach((e=>{const o=t.rollup_output[e];if(o){if(Reflect.has(o,n)){if(m||!o[n]||!1===o[n]?.enabled)return void delete o[n];!0===o[n]&&(o[n]={enabled:!0,options:d})}else{if(m||a||!1===t[c])return;o[n]={enabled:!0}}o[n]=o[n]||{},o[n].options={...d,...o[n].options}}}));let u=p.some((e=>!0===t.rollup_output[e][n]?.enabled));r&&(u=r()&&u),t[c]=u,u&&i.forEach((e=>o.push({package:e[0],version:e[1]})))}function oe({dir:t,name:o="index"}){let n=e.resolve(t,`./${o}.tsx`);if(l.existsSync(n)||(n=e.resolve(t,`./${o}.ts`)),l.existsSync(n)||(n=e.resolve(t,`./${o}.jsx`)),l.existsSync(n)||(n=e.resolve(t,`./${o}.js`)),!l.existsSync(n))return{};const i=n,s=e.extname(n);return{file:i,ext:s,ts:".ts"===s||".tsx"===s,name:o}}async function ne(t){const{atom:o,context:n,setProgress:i}=t;i("Initializing features..."),o.doc.features=o.doc.features||{};const s=o.doc.features;s.project=s.project||{},s.project.format=s.project.format||s.project_format||"esm",s.project_format=s.project.format,s.dts_enabled=!0===s.dts||void 0!==s.dts&&!1!==s.dts;const r=e.resolve(n.project.projectDir),a=oe({dir:e.resolve(r,"./app")});if(a.file){i("Parsing app entry imports...");let e=await S({file:a.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.app_uses_jsx=t,s.app_has_entry=!0,e=await S({file:a.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.app_entry_uses_jsx=t,s.app_entry_is_ts=a.ts,s.app_entry_ext=a.ext}const c=oe({dir:e.resolve(r,"./cli")});if(c.file){i("Parsing cli entry imports...");let e=await S({file:c.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.cli_uses_jsx=t,s.cli_has_entry=!0,e=await S({file:c.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.cli_entry_uses_jsx=t,s.cli_entry_is_ts=c.ts,s.cli_entry_ext=c.ext}if("workflow.lib"===o.type){const t=oe({dir:e.resolve(r,"./src")});if(t.file){i("Parsing src entry imports...");let e=await S({file:t.file,recursive:!0}),o=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.src_uses_jsx=o,s.src_has_entry=!0,e=await S({file:t.file}),o=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.src_entry_uses_jsx=o,s.src_entry_is_ts=t.ts,s.src_entry_ext=t.ext}}const l=Reflect.has(s,"app_entry_uses_jsx")?!0===s.app_entry_uses_jsx:!0===s.src_entry_uses_jsx,p=Reflect.has(s,"cli_entry_uses_jsx")?!0===s.cli_entry_uses_jsx:!0===s.src_entry_uses_jsx;s.form_enabled=l||p||!0===s.form||!0===s.form?.enabled,s.multiple_enabled=s.multiple_enabled||!0===s.multiple||!0===s.multiple?.enabled,!1===s.app?s.app={enabled:!1}:!0===s.app?s.app={enabled:!0,extend:!0===s.app_has_entry,export:!0,react:l}:s.app={enabled:!0,extend:!0===s.app_has_entry,export:!0,react:l,...s.app||{}},s.app.enabled=!0===s.app.enabled&&(!0===o.doc.features.form_enabled||!0===s.app.extend||!0===s.app.enabled),s.app.format=s.app.format||"esm",s.app.folder=s.app.folder||s.app.format||"default",!1===s.cli?s.cli={enabled:!1}:!0===s.cli?s.cli={enabled:!0,extend:!0===s.cli_has_entry,export:!0,react:p}:s.cli={enabled:!0,extend:!0===s.cli_has_entry,export:!0,react:p,...s.cli||{}},s.cli.enabled=!0===s.cli.enabled&&(!1===o.doc.features.form_enabled||!0===s.cli.extend||!0===s.cli.enabled),s.cli.format=s.cli.format||"esm",s.cli.folder=s.cli.folder||s.cli.folder||"esm",s.cli.node_options=s.cli.node?.options||s.cli.node_options||"",s.cli.bin=s.cli.bin||o.doc.name,s.cli.installable=!0===s.cli.installable,s.cli.enabled&&(o.doc["npm::bin"]=s.cli.bin,console.log(`Setting npm::bin to ${s.cli.bin} from features.cli.bin`)),s.json=s.cli.enabled||s.json;const d={cjs:{format:"cjs",context:s.form_enabled?"window":"global",babel:!0===s.src_uses_jsx||!1,browser:!1,replace:!0,terser:!0,enabled:!1!==s.cjs,copy:!1},esm:{format:"esm",context:s.form_enabled?"window":"global",babel:!0===s.src_uses_jsx||!1,browser:!1,replace:!0,terser:!1,enabled:!1!==s.esm,copy:!0},iife:{format:"iife",context:s.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0===s.iife,terser:!0,copy:!1}};!0===s.webos&&(d.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"}}}),!0===s.electron&&(d.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"}),!0===s.nextjs&&(d.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"}),!0===s.ios&&(d.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"}),!0===s.macos&&(d.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"}),!0===s.app.enabled&&(s.app.dir=`./dist/app/${s.app.folder}`,d.app={format:s.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:s.app.dir,terser:!0,output_exports:!1===s.app.export?"none":"auto",browsersync:!0}),!0===s.cli.enabled&&(s.cli.dir=`./dist/cli/${s.cli.folder}`,d.cli={format:s.cli.format,context:"global",babel:!0===s.src_uses_jsx||!0===s.cli_uses_jsx||!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:s.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===s.cli.export?"none":"auto"});const f={server:".",startPath:`${e.normalize(s.app.dir||".")}`,files:[e.normalize("./dist/**/*")],cors:!0,open:!1};s.babel_options=_({targets:{browsers:"last 9 versions, not dead",node:"18"}},s.babel_options||s.babel?.options),s.browsersync_options=_(f,s.browsersync_options||s.browsersync?.options||{}),s.replace_options=_({},s.replace_options||s.replace?.options||{}),Reflect.has(s.browsersync_options,"proxy")&&delete s.browsersync_options.server,s.rollup=s.rollup||{},s.rollup_output=_(d,s.rollup_output||s.rollup?.output||{}),s.preact_enabled=!0===s.preact||s.preact&&!1!==s.preact?.enabled;let m=Object.keys(d);for(const e of m){const t=d[e];t&&(!1!==s.rollup[e]?(t.babel_options=t.babel_options||s.babel_options,t.browsersync_options=_(s.browsersync_options,t.browsersync_options),t.replace_options=_(s.replace_options,t.replace_options),s.preact_enabled&&(t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{},t.alias.entries.react="preact/compat",t.alias.entries["react-dom"]="preact/compat"),(s.form_enabled||s.babel)&&(t.babel=!0)):delete s.rollup_output[e])}m=Object.keys(s.rollup_output),s.babel_enabled=m.some((e=>!0===s.rollup_output[e].babel)),s.browser_enabled=m.some((e=>!0===s.rollup_output[e].babel)),s.browsersync_enabled=!1!==s.browsersync&&m.some((e=>!0===s.rollup_output[e].browsersync)),s.browsersync_enabled=s.browsersync_enabled&&s.app.enabled,s.dependency_auto_enabled=!1!==s.dependency_auto&&!1!==s.dependency_auto?.enabled,s.npm_install_flags=s.npm_install_flags||"",s.react_version=s.react_version||s.react?.version||18,function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features,i=n.css&&!1!==n.css.enabled;let s=[];i&&(s.push(["rollup-plugin-postcss","^4"]),s.push(["sass","^1.66"]),(n.css?.options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":s.push(["postcss-import","^15"]);break;case"postcss-url":s.push(["postcss-url","^10"]);break;case"postcss-preset-env":s.push(["postcss-preset-env","^9"]);break;case"autoprefixer":s.push(["autoprefixer","^10"]);break;case"cssnano":s.push(["cssnano","^6"])}})));te({feature:{name:"css",packages:s},features:n,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features,i={};!0===n.app?.enabled&&(i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:n.app.dir}),Reflect.has(n.app,"copy")||Reflect.has(n,"copy")||(n.copy=!0)),te({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:i},features:n,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({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:t.doc.features,packageDevDependencies:o})}(t),function(e){const{atom:t,packageDevDependencies:o}=e;te({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:o})}(t)}async function ie({projectDir:t,name:o,setProgress:n,count:i=1}){let s;const r=P(["npm-pick-versions",o,i]),a=e.join(t,".cache"),c=e.join(a,r+".json");return l.existsSync(c)?(n&&n(`Picking npm version of ${o} from cache ...`),s=JSON.parse(l.readFileSync(c,"utf8"))):(n&&n(`Picking npm version of ${o} ...`),s=await $({name:o,count:i}),l.mkdirSync(a,{recursive:!0}),l.writeFileSync(c,JSON.stringify(s),"utf8")),s}var se=async e=>{const{atom:t,packageDependencies:o,context:n,deploymentProjectTarget:i,setProgress:s,deploymentProject:r,yamlTarget:a}=e;if(!0!==i.enabled)return;const c=i.type;try{if("lib"===c)await(await import("./index.DG8TqL-1.js")).default({...e});else if("red"===c)await(await import("./index.CmMM-Ek9.js")).default({...e});else if("npm"===c)await(await import("./index.BbVrDxY_.js")).default({...e});else if("gcs"===c)await(await import("./index.UOds5XLl.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.Bfg4lyu-.js")).default({...e});else if("fnet-form"===c)await(await import("./index.Q-CYRcna.js")).default({...e});else if("fnet-node"===c)await(await import("./index.C2S9JYhS.js")).default({...e});else if("fnet-flow"===c)await(await import("./index.BuYxdKtK.js")).default({...e});else if("nextjs"===c)await(await import("./index.CDct_kkF.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("webos"===c)await(await import("./index.CMC8mlye.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("electron"===c)await(await import("./index.xd8c7XMr.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("docker"===c)await(await import("./index.D2N9YZmA.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("ios"===c)await(await import("./index.B5XE4ChJ.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("macos"===c)await(await import("./index.W6RYgypK.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else if("rust"===c)await(await import("./index.CzAV0S36.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0;else{if("pypi"!==c)return void console.warn(`No deployer found for type: ${c}`);await(await import("./index.C7saWH6d.js")).default({atom:t,target:i,onProgress:s,projectDir:n.projectDir,dependencies:o,context:n,yamlTarget:a}),r.isDirty=!0}}catch(e){throw console.error(`Error during deployment for type "${c}":`,e),e}},re={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 ae(e,t){return e.filter(((e,o,n)=>n.map((e=>e[t])).indexOf(e[t])===o))}function ce(e){const{nodes:t,nodeIndex:o,root:n}=e,i=e.targetNodes||n.childs;i.forEach((t=>{const o="workflow"===t.type||"subworkflow"===t.type,n=!o&&t.childs.filter((e=>!e.virtual)).length>0;if(n&&(t.bpmn.type="bpmn:SubProcess"),o||n){const o=t.childs.filter((e=>!0!==e.module))[0];t.childs.filter((e=>!0===e.module)).forEach((o=>{const n=le({...e,parent:t,bpmnType:"bpmn:IntermediateCatchEvent",type:"inter",definitions:[{type:"bpmn:SignalEventDefinition"}]});n.bpmn.edges=[{from:n.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}));const n=t.childs.find((e=>"try"===e.name&&"tryexcept"===t.type)),s=t.childs.filter((e=>"except"===e.name&&"tryexcept"===t.type));n&&s.length&&s.forEach((o=>{const i=le({location:t.childs.indexOf(o),...e,parent:t,bpmnType:"bpmn:BoundaryEvent",type:"boundary",attrs:{attachedToRef:n},definitions:[{type:"bpmn:ErrorEventDefinition"}]});i.bpmn.edges=[{from:i.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}));const r=t.childs.find((e=>"raise"===e.type));if(r){const o=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:"ERROR",definitions:[{type:"bpmn:ErrorEventDefinition"}]});r.bpmn.edges=[{from:r.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"}]}if(o)if(t.bpmn.starts.length>1){const o=le({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"}),n=le({...e,parent:t,bpmnType:"bpmn:ExclusiveGateway",type:"switch"});o.bpmn.edges=[{from:o.indexKey,to:n.indexKey,type:"bpmn:SequenceFlow"}],n.bpmn.edges=t.bpmn.starts.map((e=>({...e,from:n.indexKey})));const i=n.bpmn.edges.find((e=>!0===e.next));if(i){const o=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:i.to});i.to=o.indexKey}}else{const n=le({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"});n.bpmn.edges.push({from:n.indexKey,to:o.indexKey,type:"bpmn:SequenceFlow"})}t.childs.filter((e=>!0!==e.virtual&&e.bpmn.outside.length&&"bpmn:EndEvent"!==e.bpmn.type)).forEach((o=>{o.bpmn.outside.forEach((n=>{const s=i.indexOf(t),r=le({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:n.to,location:s+1});o.bpmn.edges.push({from:o.indexKey,to:r.indexKey,type:"bpmn:SequenceFlow"})}))}));t.childs.filter((e=>!0!==e.virtual&&e.bpmn.edges.length>1)).forEach((o=>{const n=i.indexOf(o),s=le({...e,parent:t,bpmnType:"bpmn:ExclusiveGateway",type:"switch",location:n+1});s.bpmn.edges=o.bpmn.edges.map((e=>({...e,from:s.indexKey}))),o.bpmn.edges=[{from:o.indexKey,to:s.indexKey,type:"bpmn:SequenceFlow"}],o.bpmn.outside=[]}))}ce({...e,targetNodes:t.childs})}))}function le(e){const{parent:t,nodes:o,nodeIndex:n,bpmnType:i,type:s,name:r,outside:a,location:c,definitions:l,attrs:p}=e,d=t.childs.filter((e=>e.type===`v${s}`)).length,f={indexKey:`${t.indexKey}/_${s}${d}`,pathKey:`${t.pathKey}._${s}${d}`,type:`v${s}`,name:r,bpmn:{edges:[],outside:[],type:i,width:36,height:36,fill:"#c8e6c9",stroke:"#205022",definitions:l,attrs:p},virtual:!0,childs:[]};return t.childs.splice(c||0,0,f),o.push(f),n[f.indexKey]=f,f}function pe(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,diagrams:a,nodes:c}=e;!function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,nodes:a}=e,c=o.get("flowElements");o.$nodes=o.$nodes||[],t.childs.forEach((e=>{const t=i.create(e.bpmn.type,{id:`node.${e.pathKey}`,name:e.definition?.title||e.name});if(s[t.id]=t,t.$isNode=!0,t.$node=e,e.$flow=t,o.$nodes.push(t),c.push(t),e.bpmn.attrs){Object.keys(e.bpmn.attrs).forEach((o=>{"attachedToRef"===o&&t.set(o,e.bpmn.attrs[o].$flow)}))}if(e.bpmn.definitions){const o=e.bpmn.definitions.map((e=>{const t=i.create(e.type);return Object.keys(e.attrs||{}).forEach((o=>{t.set(o,e.attrs[o])})),t}));t.eventDefinitions=o}}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r}=e,a=o.get("flowElements");o.$edges=o.$edges||[],t.childs.forEach((e=>{e.bpmn.edges.forEach((t=>{const n=e,c=r[t.to],l=`edge.${n.pathKey}_${c.pathKey}`;if(s[l])return;const p=s[`node.${n.pathKey}`],d=s[`node.${c.pathKey}`],f=i.create(t.type,{id:l,sourceRef:p,targetRef:d});s[f.id]=f,f.$is_edge=!0,p.get("outgoing").push(f),d.get("incoming").push(f),o.$edges.push({from:p,to:d,flow:f}),a.push(f)}))}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r}=e,a=120,c=80,l=160,p=160,d=new I.graphlib.Graph;d.setDefaultEdgeLabel((()=>({}))),d.setGraph({rankdir:"TB",nodesep:a,ranksep:c,xranker:"longest-path"}),o.$nodes.forEach((e=>{d.setNode(e.id,{width:e.$node?.bpmn.width||a,height:e.$node?.bpmn.height||c,label:e.id})})),o.$edges.forEach((e=>{d.setEdge(e.from.id,e.to.id)})),I.layout(d),o.$nodes.forEach((e=>{const t=d.node(e.id);let o=t.width,s=t.height;const r=i.create("bpmndi:BPMNShape",{id:`shape.${e.id}`,bpmnElement:e,bounds:i.create("dc:Bounds",{x:l+t.x-t.width/2,y:p+t.y-t.height/2,width:o,height:s}),label:i.create("bpmndi:BPMNLabel")});e.$node.bpmn.fill&&r.set("bioc:fill",e.$node.bpmn.fill),e.$node.bpmn.stroke&&r.set("bioc:stroke",e.$node.bpmn.stroke);n.get("planeElement").push(r)})),o.$edges.forEach((e=>{const t=d.edge(e.from.id,e.to.id),o=i.create("bpmndi:BPMNEdge",{id:`edge.${e.from.id}_${e.to.id}`,bpmnElement:e.flow,label:i.create("bpmndi:BPMNLabel")});t.points.forEach((e=>{const t=i.create("dc:Point",{x:l+e.x,y:p+e.y});o.get("waypoint").push(t)}));n.get("planeElement").push(o)}))}(e),function(e){const{targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:n,moddle:i,elementIndex:s,nodeIndex:r,diagrams:a}=e,c=t.childs.filter((e=>"bpmn:SubProcess"===e.bpmn.type));c.forEach((t=>{const o=s[`node.${t.pathKey}`],n=i.create("bpmndi:BPMNDiagram",{id:`diagram_${t.pathKey}`});s[n.id]=n,a.push(n);const r=i.create("bpmndi:BPMNPlane",{id:`plane_${t.pathKey}`});s[r.id]=r,n.plane=r,r.bpmnElement=o,pe({...e,targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:r})}))}(e)}async function de(e){const t=e.root,o=t.context.index,n=Object.keys(o).map((e=>o[e]));!function(e){const{nodes:t}=e;t.forEach((e=>{const t=[],o=[],n=i=>{i.context.next&&(t.push({from:i,to:i.context.next,type:"bpmn:SequenceFlow"}),i===e&&o.push({to:i.context.next,type:"bpmn:SequenceFlow",next:!0})),i.childs.forEach((t=>{i===e&&"switch"===e.type&&o.push({to:t,type:"bpmn:SequenceFlow"}),n(t)}))};n(e);const i=t.filter((t=>t.to.parent.indexKey===e.parent.indexKey)).map((t=>({...t,from:e.indexKey,to:t.to.indexKey}))),s=t.filter((t=>t.to.parent.indexKey!==e.parent.indexKey&&!t.to.indexKey.startsWith(e.indexKey+"/"))).map((t=>({...t,from:e.indexKey,to:t.to.indexKey}))),r=o.map((e=>({...e,to:e.to.indexKey})));e.bpmn=e.bpmn||{},e.bpmn.edges=ae(i,"to"),e.bpmn.outside=ae(s,"to"),e.bpmn.starts=ae(r,"to"),e.bpmn.type=function(e){return"call"===e.type?"bpmn:ServiceTask":"form"===e.type?"bpmn:UserTask":"return"===e.type?"bpmn:EndEvent":"bpmn:Task"}(e),e.bpmn.width=120,e.bpmn.height=80,"return"===e.type&&(e.bpmn.width=36,e.bpmn.height=36)}))}({nodes:n}),ce({nodes:n,nodeIndex:o,root:t});const i=new A({atom:re}),s={},r=i.create("bpmn:Definitions",{id:"definitions_0"});s[r.id]=r;for await(const e of t.childs){const a=r.get("rootElements"),c=r.get("diagrams"),l=i.create("bpmn:Process",{id:`process_${e.pathKey}`,documentation:[i.create("bpmn:Documentation",{text:`Atom Workflow - ${t.context.atom.name}`})]});s[l.id]=l,l.isExecutable=!0,a.push(l);const p=i.create("bpmndi:BPMNDiagram",{id:`diagram_${e.pathKey}`});s[p.id]=p,c.push(p);const d=i.create("bpmndi:BPMNPlane",{id:`plane_${e.pathKey}`});s[d.id]=d,p.plane=d,d.bpmnElement=l;pe({targetNode:e,targetFlowElementsContainer:l,targetPlaneElement:d,moddle:i,elementIndex:s,nodeIndex:o,nodes:n,diagrams:c})}return{diagramXML:(await i.toXML(r,{format:!0})).xml}}async function fe(e={}){return await de(w(e))}async function me({node:e,initNode:t}){if(Reflect.has(e.definition,"modules")&&!Array.isArray(e.definition.modules)){const t=e.definition.modules;e.definition.modules=[],Object.keys(t).forEach((o=>{const n={...t[o]};"modules"===e.type&&(n.export=n.export||o),e.definition.modules.push({[o]:n})}))}const o=[],n=await K({data:e.definition,callback:(e,t,n)=>{const i=O({expression:e});if("m"===i?.processor){const e=n.slice(0,-1);e.push(i.statement);const s=e.join("_");return o.push({[s]:t}),[i.statement,`m::${s}`]}return[e,t]}});o.length>0&&(e.definition=n,e.definition.modules=e.definition.modules||[],e.definition.modules=e.definition.modules.concat(o)),e.hasModules=e.definition.modules?.length>0;for(let o=0;o<e.definition.modules?.length;o++){const n=e.definition.modules[o],i=Object.keys(n)[0],s={name:i,childs:[],parent:e,definition:n[i],module:!0,blockAutoJumpToParent:!0,blockAutoJumpToSibling:!1,index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}}async function ue({node:e,transformExpression:t}){const o=e.context.transform;Reflect.has(o,"export")&&(o.export=await t(o.export)),Reflect.has(o,"return")&&(e.hasReturn=!0,o.return=await t(o.return)),o.hasOwnProperty("nextArgs")&&(e.hasNextArgs=!0,o.nextArgs=await t(o.nextArgs))}async function ye({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||w(t.definition),t.definition.hasOwnProperty("condition")&&(t.context.transform.condition=await n(t.definition.condition));await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var he={hits:async function({node:e}){return!!e.definition.hasOwnProperty("switch")},init:async function({node:e,initNode:t}){e.type="switch";const o=e.definition.switch||[];if(!o.every((e=>e.hasOwnProperty("condition")||e.hasOwnProperty("default"))))throw new Error("Switch must have condition or default");if(0===o.filter((e=>e.hasOwnProperty("condition"))).length)throw new Error("Switch must have at least one condition");const n=o.filter((e=>e.hasOwnProperty("default")));if(n.length>1)throw new Error("Switch must have only one default");if(1===n.length&&!o[o.length-1].hasOwnProperty("default"))throw new Error("Switch default must be the last child");e.hasDefaultCondition=1===n.length,await me({node:e,initNode:t}),e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0;for(let o=0;o<e.definition.switch.length;o++){let n=e.definition.switch[o],i=`${o}`;n.hasOwnProperty("default")&&(i="default",n=n.default);const s={name:n.condition||i,childs:[],parent:e,definition:n,index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}e.resolve=ye},resolve:ye};var ge={hits:async function({node:e}){return 1===Object.keys(e.definition).map((e=>O({expression:e}))).filter((e=>"if"===e?.processor)).length},init:async function(e){const{node:t}=e,o=Object.keys(t.definition).map((e=>O({expression:e}))),n=[],i=o.find((e=>"if"===e?.processor)),s=t.definition[i.expression];n.push({name:`${t.name}_if`,definition:s,processor:i}),delete t.definition[i.expression];const r=o.filter((e=>"elseif"===e?.processor));let a=0;for(const e of r){const o=t.definition[e.expression];n.push({name:`${t.name}_elseif_${a++}`,definition:o,processor:e}),delete t.definition[e.expression]}t.definition.switch=[];for(const e of n)t.definition.switch.push({condition:e.processor.statement,...e.definition});if(t.definition?.else){const e=t.definition.else;t.definition.switch.push({default:e}),delete t.definition.else}await he.init(e)}};async function we({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){if(e.context.transform=e.context.transform||w(e.definition),e.context.transform,e.context.try=e.childs.find((e=>"try"===e.name)),e.context.except=e.childs.find((e=>"except"===e.name)),e.context.except){const t=e.context.except;t.context.transform=t.context.transform||w(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var be={hits:async function({node:e}){return e.definition.hasOwnProperty("try")&&e.definition.hasOwnProperty("except")},init:async function({node:e,initNode:t}){if(e.type="tryexcept",await me({node:e,initNode:t}),e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0,e.definition.try){const o="try",n={name:o,childs:[],parent:e,definition:e.definition[o],index:e.childs.length,context:{}};e.childs.push(n),await t({node:n})}if(e.definition.except){const o="except",n={name:o,childs:[],parent:e,definition:e.definition[o],index:e.childs.length,context:{}};e.childs.push(n),await t({node:n})}e.resolve=we},resolve:we};async function xe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;for(let e=0;e<i.assign?.length;e++){let t=i.assign[e],o=Object.keys(t)[0],s=t[o],r={key:await n(o),value:await n(s)};i.assign[e]=r}await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ve={hits:async function({node:e}){return e.definition.hasOwnProperty("assign")},init:async function({node:e,initNode:t}){e.type="assign",await me({node:e,initNode:t}),e.resolve=xe},resolve:xe};async function je({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);e.context.transform.for.in=await n(e.definition.for.in),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ke={hits:async function({node:e}){return e.definition.hasOwnProperty("for")},init:async function({node:e,initNode:t}){if(e.type="for",await me({node:e,initNode:t}),e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!1,!e.definition.for.hasOwnProperty("steps")){const{value:t,in:o,...n}=e.definition.for,i={};void 0!==t&&(i.value=t),void 0!==o&&(i.in=o),e.definition.for=i,e.definition.for.steps=[{[`${e.name}_step`]:n}]}Array.isArray(e.definition.for.steps)||(e.definition.for.steps=[{[`${e.name}_step`]:e.definition.for.steps}]);for(let o=0;o<e.definition.for.steps.length;o++){const n=e.definition.for.steps[o],i=Object.keys(n)[0],s={name:i,childs:[],parent:e,definition:n[i],index:e.childs.length,context:{}};e.childs.push(s),await t({node:s})}e.resolve=je},resolve:je};var De={hits:async function({node:e}){return!1},init:async function({node:e,initNode:t}){},resolve:async function({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){}};async function _e({node:e,resolveTypeCommon:t,transformExpression:o}){e.context.transform=e.context.transform||w(e.definition);const n=e.context.transform;n.raise=await o(n.raise),await t({node:e})}var Se={hits:async function({node:e}){return e.definition.hasOwnProperty("raise")},init:async function({node:e,initNode:t}){e.type="raise",e.resolve=_e},resolve:_e};async function Ee({node:e,resolveTypeCommon:t,transformExpression:o}){e.context.transform=e.context.transform||w(e.definition);const n=e.context.transform;e.hasReturn=!0,n.return=await o(n.return),await t({node:e})}var $e={hits:async function({node:e}){return e.definition.hasOwnProperty("return")},init:async function({node:e,initNode:t}){e.type="return",e.resolve=Ee},resolve:Ee};async function Pe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;if("function"===e.target?.atom?.doc?.type&&(i.call=await n(e.target.atom.name)),i.args&&(i.args=await n(i.args)),i.result){"string"==typeof i.result&&(i.result=[{[i.result]:"e::result"}]);for(let e=0;e<i.result?.length;e++){let t=i.result[e],o=Object.keys(t)[0],s=t[o],r={key:await n(o),value:await n(s)};i.result[e]=r}}const s=e.workflow.parent;i.import?e.context.lib=s.context.libs.find((e=>e.name===i.import)):e.context.lib=s.context.libs.find((e=>e.name===i.call)),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ne={hits:async function({node:e}){return e.definition.hasOwnProperty("call")},init:async function({node:e,initNode:t}){e.type="call",await me({node:e,initNode:t}),e.resolve=Pe},resolve:Pe};async function Te({node:e,transformExpression:t}){e.context.next=e.childs[0],e.context.transform=e.context.transform||w(e.definition),await ue({node:e,transformExpression:t})}var Ce={hits:async function({node:e}){return e.definition.hasOwnProperty("steps")},init:async function({node:e,initNode:t}){e.type||(e.type="steps");const o=e.definition.steps||[];for await(const n of o){const o=Object.keys(n)[0],i={name:o,childs:[],parent:e,definition:n[o],index:e.childs.length,context:{}};e.childs.push(i),await t({node:i})}e.resolve=Te},resolve:Te};async function Fe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;i.props&&(i.props=await n(i.props));const s=e.workflow.parent;e.context.lib=s.context.libs.find((e=>e.name===i.form)),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ae={hits:async function({node:e}){return e.definition.hasOwnProperty("form")},init:async function({node:e,initNode:t}){e.type="form",await me({node:e,initNode:t}),e.resolve=Fe},resolve:Fe};async function Ie({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){e.context.transform=e.context.transform||w(e.definition),await t({node:e})}var Oe={hits:async function({node:e}){return e.definition.hasOwnProperty("operation")},init:async function({node:e,initNode:t}){e.type="operation",e.resolve=Ie},resolve:Ie};async function Be({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;i.next=await n(i.next),await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ke={hits:async function({node:e}){return e.definition.hasOwnProperty("next")},init:async function({node:e,initNode:t}){e.type="jump",e.resolve=Be},resolve:Be};async function Re({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await ue({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Me={hits:async function({node:e}){return e.definition.hasOwnProperty("modules")},init:async function({node:e,initNode:t}){e.type="modules",await me({node:e,initNode:t}),e.resolve=Re},resolve:Re};function Le({node:e}){const t=e.definition;if(!e.hasReturn)if("end"===t.next);else if("stop"===t.next);else if("none"===t.next);else if(t.next){let o=e.parent;for(;o.parent;){const n=o.childs.find((e=>e.name===t.next));if(n){e.context.next=n;break}o=o.parent}}else{if(!0===e.module)return;let t=e.parent,o=e.index+1;for(;t.parent&&(!t.blockAutoJumpToParent||!t.blockAutoJumpToSibling);)if(Reflect.has(t,"blockAutoJumpToParent")||Reflect.has(t,"blockAutoJumpToSibling")){if(t.blockAutoJumpToParent){const n=t.childs.find((e=>e.index===o));n&&(e.context.next=n);break}t.blockAutoJumpToParent||(o=t.index+1,t=t.parent)}else{const n=t.childs.find((e=>e.index===o));if(n){e.context.next=n;break}o=t.index+1,t=t.parent}}}class Je{#e;#t;#o;#n;constructor({key:e,npm:t,master:o,extras:n}){this.#e=e,this.#t=t,this.#o=o,this.#n=n}hits({node:e}){return e.definition.hasOwnProperty(this.#e)}async init(e){const{node:t}=e,o=this.#e,n=t.definition,i=typeof n[o];if(n.call=`npm:${this.#t}`,n.args="object"!==i?{...n.args,[`${this.#o}`]:n[o]}:n[o],delete n[o],this.#n)for(const e in this.#n)n[e]=this.#n[e];console.log(`[npm-block] ${this.#e} --\x3e ${this.#t}`),await Ne.init(e)}}function We(e){return new Je(e)}class ze{#i;#s;#r;#a;#c;#l;#p;#d;#f;#m;#u;#y;#h;#g;#w;#b;#x;#v;#j;#k;#D;#_=[];constructor(e){this.#i=new ee,this.#s=e,this.#l=[],this.#p=[],this.#d={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#_.push(We({key:"config",npm:"@fnet/config",master:"name"})),this.#_.push(We({key:"yaml",npm:"@fnet/yaml",master:"file"})),this.#_.push(We({key:"prompt",npm:"@fnet/prompt",master:"message"})),this.#_.push(We({key:"html-link",npm:"@flownet/lib-load-browser-link-url",master:"src"})),this.#_.push(We({key:"html-script",npm:"@flownet/lib-load-browser-script-url",master:"src"})),this.#_.push(We({key:"http-server",npm:"@fnet/node-express",master:"server_port"})),this.#_.push(We({key:"shell",npm:"@fnet/shell-flow",master:"commands"})),this.#_.push(We({key:"list-files",npm:"@fnet/list-files",master:"pattern"})),this.#_.push(We({key:"up-list-files",npm:"@fnet/up-list-files",master:"pattern"})),this.#_.push(We({key:"auto-conda-env",npm:"@fnet/auto-conda-env",master:"envDir"})),this.#_.push(We({key:"ollama-chat",npm:"@fnet/ollama-chat",master:"model"})),this.#_.push(We({key:"ai",npm:"@fnet/ai",master:"prompt",extras:{subtype:"flow"}})),this.#_.push(We({key:"invoke",npm:"@fnet/invoke",master:"method",extras:{}})),this.#_.push(We({key:"fetch",npm:"@fnet/fetch",master:"url",extras:{}})),this.#_.push(We({key:"filemap",npm:"@fnet/filemap",master:"target",extras:{}})),this.#k={packageDependencies:this.#l,packageDevDependencies:this.#p,setProgress:this.setProgress.bind(this),context:this.#s,Atom:D,registerToPackageManager:this.registerToPackageManager.bind(this)},this.#D={initNode:this.initNode.bind(this),cloneDeep:w,resolveTypeCommon:this.resolveTypeCommon.bind(this),resolveNextBlock:Le,transformExpression:this.transformExpression.bind(this),transformValue:this.transformValue.bind(this)}}async _cache_set(e,t,o){this._redis_client&&await this._redis_client.SETEX(e,o||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await async function(){if(!await v({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=x.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}(),this.#u=this.#s.buildId||j(),this.#k.buildId=this.#u,this.#w=this.#s.mode,this.#b=["all","deploy","build","file"].includes(this.#w),this.#x=["all","deploy","build"].includes(this.#w),this.#v=["all","deploy"].includes(this.#w),this.#j=["all","deploy","build","file","bpmn"].includes(this.#w),this.#h=this.#s.protocol,this.#y="BUILD:"+this.#u,this.#g=(await d({optional:!0,name:"atom",dir:this.#s.projectDir,tags:this.#s.tags}))?.data;try{await this.setProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),this.transformWorkflow({workflow:this.#a});const e=await this.initNodeTree({workflow:this.#a});await this.initNodeTreeIndex({root:e}),await this.initNodeCalls({root:e}),await this.initNodeCallLibs({root:e}),await this.initNodeForms({root:e}),await this.initNodeFormLibs({root:e}),await this.initEntryFiles({root:e,features:this.#r.doc.features}),await this.initFeaturesFromNodes({childs:e.childs,features:this.#r.doc.features}),await ne(this.#k),await async function({atom:e,packageDependencies:t,packageDevDependencies:o,setProgress:n}){n("Initializing dependencies");const i=e.doc.dependencies||[];if(i.filter((e=>!e.dev)).forEach((e=>t.push(e))),i.filter((e=>e.dev)).forEach((e=>o.push(e))),"workflow"===e.type&&(t.push({package:"get-value",version:"^3"}),t.push({package:"set-value",version:"^4"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";n("Fetching React versions"),o=`^${(await E({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@fnet/react-app",version:"^0.1"}),t.push({package:"@fnet/react-app-state",version:"^0.1"}))}e.doc.features.preact_enabled&&t.push({package:"preact",version:"^10"}),!0===e.doc.features.cli.enabled&&(t.push({package:"@fnet/args",version:"^0.1"}),o.push({package:"ajv",version:"^8"}),e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled&&t.push({package:"@fnet/config",version:"0.2.21"}),e.doc.features.cli.mcp&&!0===e.doc.features.cli.mcp.enabled&&(t.push({package:"@modelcontextprotocol/sdk",version:"^1.10"}),t.push({package:"express",version:"^4.18"}))),e.doc.features.render&&!1!==e.doc.features.render.enabled&&o.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"}),o.push({package:"@babel/core",version:"^7"}),o.push({package:"@rollup/plugin-commonjs",version:"^28"}),o.push({package:"@rollup/plugin-node-resolve",version:"^16"}),o.push({package:"@rollup/plugin-replace",version:"^6"}),o.push({package:"rollup",version:"^4"}),e.doc.features.dts_enabled&&o.push({package:"rollup-plugin-dts",version:"^6"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),o.push({package:"@rollup/plugin-alias",version:"^5"}),o.push({package:"fs-extra",version:"^11"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6"}),o.push({package:"@babel/preset-env",version:"^7"}),o.push({package:"@babel/preset-react",version:"^7"}),e.doc.features.babel?.options?.plugins?.forEach((e=>{switch(e[0]){case"@babel/plugin-proposal-decorators":o.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":o.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":o.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":o.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":o.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"})}}))),o.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),e.doc.features.browsersync_enabled&&o.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}(this.#k),await this.initAtomLibsAndDeps({libs:e.context.libs,packageDependencies:this.#l}),await this.resolveNodeTree({root:e}),this.#m=e}catch(e){throw await this._cache_set(this.#y,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#s.id&&(this.#f=await this.#i.init({config:this.#g}),this.#k.atomAccessToken=this.#f)}async initWorkflow(){const e=this.#s.id;this.#r=this.#s.project?.workflowAtom||await D.get({id:e}),this.#a="string"==typeof this.#r.doc.content?(await y({content:this.#r.doc.content,tags:this.#s.tags})).parsed:this.#r.doc.content;let t=this.#r.doc.bundleName;t=t||(this.#r.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#r.doc.bundleName=t,this.#r.type=this.#r.type||"workflow",this.#k.atom=this.#r,this.#r.doc.features=this.#r.doc.features||{}}#S(t){console.log("filePath",t),l.statSync(t).isDirectory()?(l.readdirSync(t).forEach((o=>{const n=e.join(t,o);this.#S(n)})),l.rmSync(t)):l.unlinkSync(t)}#E(t,o){const n=l.existsSync(t),i=n&&l.statSync(t);n&&i.isDirectory()?(l.mkdirSync(o,{recursive:!0}),l.readdirSync(t).forEach((n=>{this.#E(e.join(t,n),e.join(o,n))}))):l.copyFileSync(t,o)}async initWorkflowDir(){this.setProgress({message:"Initializing library directory."});const t=this.#s.projectDir,o=this.#s.coreDir;this.setProgress({message:"Cleaning project directory."});const n=B({dir:t,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const e of n)l.rmSync(e,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."}),l.existsSync(t)||l.mkdirSync(t,{recursive:!0});const i=e.join(t,"src");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const s=e.join(i,"core");this.#E(o,s);const r=e.join(i,"default","blocks");l.existsSync(r)||l.mkdirSync(r,{recursive:!0})}async initNunjucks(){this.setProgress({message:"Initializing nunjucks."});const e=this.#s.templateDir;this.#c=g.configure(e,{watch:!1,dev:!0}),this.#k.njEnv=this.#c}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],t.steps=t.steps.filter((e=>Object.keys(e).length>0)),t.steps=t.steps.map((e=>this.transformStep({step:e})))}transformStep({step:e}){if(Array.isArray(e))throw new Error("Step must be an object.");const[t,o]=Object.entries(e)[0];if(o.hasOwnProperty("onerror")){const{onerror:n,...i}=o;e[t]={try:i,except:n}}if(e[t].hasOwnProperty("steps")){const o=e[t].steps;if(!Array.isArray(o))throw new Error("Steps must be an array.");e[t].steps=o.map((e=>this.transformStep({step:e})))}return e}async initNodeTree({workflow:e}){const t=Object.keys(e),o={definition:e,name:void 0,type:"root",parent:void 0,childs:[],blockAutoJumpToParent:!0,blockAutoJumpToSibling:!0,index:0,depth:0,context:{libs:[],atom:this.#r}};t.forEach((t=>{const n={name:t,type:"main"===t?"workflow":"subworkflow",childs:[],parent:o,definition:e[t],index:o.childs.length,depth:o.depth+1,context:{},blockAutoJumpToParent:!0,blockAutoJumpToSibling:!1};o.childs.push(n)}));for await(const e of o.childs)await this.initNode({node:e});return o}async initNode({node:e}){const t={...this.#D,node:e};if(e.workflow=e.parent.workflow||e,e.depth=e.parent.depth+1,await be.hits(t))await be.init(t);else if(await ke.hits(t))await ke.init(t);else if(await he.hits(t))await he.init(t);else if(await ge.hits(t))await ge.init(t);else if(await De.hits(t))await De.init(t);else if(await ve.hits(t))await ve.init(t);else if(await Se.hits(t))await Se.init(t);else if(await Ne.hits(t))await Ne.init(t);else if(this.#_.find((e=>e.hits(t))))await this.#_.find((e=>e.hits(t))).init(t);else if(await Ae.hits(t))await Ae.init(t);else if(await Oe.hits(t))await Oe.init(t);else if(await Ce.hits(t))await Ce.init(t);else if(await Ke.hits(t))await Ke.init(t);else if(await Me.hits(t))await Me.init(t);else{if(!await $e.hits(t))throw new Error("Undefined step type.");await $e.init(t)}}async initNodeTreeIndex({root:e}){const t={};e.indexKey="/";for await(const o of e.childs)await this.initNodeIndex({node:o,index:t});return e.context.index=t,t}async initNodeIndex({node:t,index:o}){const n=e.join(t.parent.indexKey,t.name);t.indexKey=n,o[n]=t;const i=[];let s=t;for(;s?.parent;)i.push(s.index),s=s.parent;i.reverse(),t.codeKey=`B_${i.join("_")}_${t.type}`,t.pathKey=`${i.join(".")}`,t.typeId=j();for await(const e of t.childs)await this.initNodeIndex({node:e,index:o})}async initNodeCalls({root:e}){const t=e.context.index,o=[];for await(const e of Object.keys(t)){const n=t[e];"call"===n.type&&o.push(n)}return e.context.calls=o,o}async initNodeCallLibs({root:e}){const t=[],o=e.context.calls;for await(const e of o){const o=e.definition.import||e.definition.call,n=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom",definition:e.definition},i=t.find((e=>e.name===n.name&&e.type===n.type));i||t.push(n),e.target=i||n}return e.context.callLibs=t,e.context.libs=[...e.context.libs,...t],t}async findNodeCallTarget({refNode:e,curNode:t}){if(!t)return;const o=e.definition.call,n=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return n||await this.findNodeCallTarget({refNode:e,curNode:t.parent})}async initNodeForms({root:e}){const t=e.context.index,o=[];for await(const e of Object.keys(t)){const n=t[e];"form"===n.type&&o.push(n)}return e.context.forms=o,o}async initNodeFormLibs({root:e}){const t=[],o=e.context.forms;for await(const e of o){const o=e.definition.import||e.definition.form,n=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},i=t.find((e=>e.name===n.name&&e.type===n.type));i||t.push(n),e.target=i||n}return e.context.formLibs=t,e.context.libs=[...e.context.libs,...t],t}async initFeaturesFromNodes({childs:e,features:t}){for await(const o of e)"form"!==o.type||Reflect.has(t,"form")||(t.form=!0),await this.initFeaturesFromNodes({childs:o.childs,features:t})}async initEntryFiles({root:e,features:t}){for await(const o of e.childs){let e;if("main"===o.name)e="index.js";else if("cli"===o.name)e="cli.js";else if("app"===o.name)e="app.js";else{if("api"!==o.name)continue;e="api.js"}t[`${o.name}_default_entry_file`]=e,o.entryFile=e}}async findNodeFormTarget({refNode:e,curNode:t}){if(!t)return;const o=e.definition.form,n=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return n||await this.findNodeFormTarget({refNode:e,curNode:t.parent})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const o=e.filter((e=>"atom"===e.type));for(let e=0;e<o.length;e++){const n=o[e],i=await this.findAtomLibrary({url:n.name,libRef:n});n.atom=i;const s=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));s?.forEach((e=>{const o=t.find((t=>t.package===e.package));o?"string"==typeof e.path?(o.path||[]).some((t=>t===e.path))||(o.path=o.path||[],o.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(o.path||[]).some((t=>t===e))||(o.path=o.path||[],o.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:t,libRef:o}){const n=F({url:t});if(!n)throw new Error(`Invalid package name: ${t}`);if(n.protocol||(n.protocol=this.#h),"ac:"===n.protocol){const e=n.pathname.split("/");if(1===e.length)return await D.first({where:{name:t,parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===e.length){const t=await D.first({where:{name:e[0],parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"folder"}});return await D.first({where:{name:e[1],parent_id:t.id,type:"workflow.lib"}})}}else{if("local:"===n.protocol){const t=e.resolve(this.#s.projectSrcDir,`${n.pathname}.js`),o=[],i=(await S({file:t,recursive:!0})).all;for await(const e of i){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=await ie({name:e.package,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});o.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return{name:n.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:n.protocol}}if("npm:"===n.protocol){const e=await ie({name:n.pathname,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});return{name:n.pathname,doc:{type:"workflow.lib",subtype:"flow"===o?.definition?.subtype?"workflow":null,"content-type":"javascript",language:"js",dependencies:[{package:n.pathname,version:e.minorRange,type:"npm"}]},protocol:n.protocol}}if("use:"===n.protocol){return{name:n.pathname,doc:{type:"function",dependencies:[]},protocol:n.protocol}}}}async resolveNodeTree({root:e}){for await(const t of e.childs)await this.resolveTypeWorkflow({node:t})}async resolveTypeWorkflow({node:e}){e.context.transform=e.context.transform||w(e.definition);const t=e.context.transform;for(let e=0;e<t.params?.length;e++){const o=t.params[e];if("string"==typeof o)t.params[e]={key:o,hasDefault:!1};else{const n=Object.keys(o)[0];t.params[e]={key:n,hasDefault:!0,default:o[n],type:typeof o[n]}}}e.context.next=e.childs[0];for await(const t of e.childs)await this.resolveType({node:t})}async resolveType({node:e}){const t={...this.#D,node:e};"function"==typeof e.resolve&&await e.resolve(t);for await(const t of e.childs)await this.resolveType({node:t})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:t}){await this.setProgress({message:"Creating external lib files."}),this.#r.typesDir="./types";const o=t.context.libs.filter((e=>"atom"===e.type));for(let t=0;t<o.length;t++){const n=o[t].atom,i=this.#s.projectDir;if("local:"===n.protocol){const t=e.resolve(this.#s.projectSrcDir,`${n.fileName||n.name}.js`),o=e.relative(`${this.#s.projectDir}/src/default/blocks`,t);if(!l.existsSync(t)){l.mkdirSync(e.dirname(t),{recursive:!0});let o="export default async (args)=>{\n";o+="}",l.writeFileSync(t,o,"utf8")}n.relativePath=o.split(e.sep).join("/"),this.#r.typesDir=`./types/${e.basename(i)}/src`}else if("npm:"===n.protocol)n.relativePath=n.name;else if("use:"===n.protocol);else{const t=`${i}/src/libs/${n.id}.js`,o=n.doc.contents?.find((e=>"esm"===e.format))||n.doc;l.writeFileSync(e.normalize(t),o.content,"utf8")}}}async createEngine({root:t}){await this.setProgress({message:"Creating engine file."});const o=this.#s.templateDir,n=g.compile(l.readFileSync(e.resolve(o,"src/default/engine.js.njk"),"utf8"),this.#c);for(let o=0;o<t.childs.length;o++){const i=t.childs[o];if(!i.entryFile)continue;const s=n.render({flow:i,ui:{package:"@fnet/react-app"}}),r=this.#s.projectDir,a=e.resolve(r,`src/default/${i.entryFile}`);l.writeFileSync(a,s,"utf8")}}async createNodeTree({root:e}){await this.setProgress({message:"Creating block files."});for await(const t of e.childs)await this.createTypeWorkflow({node:t})}async createTypeWorkflow({node:t}){const o=this.#s.templateDir,n=g.compile(l.readFileSync(e.resolve(o,"src/default/workflow.js.njk"),"utf8"),this.#c).render(t),i=this.#s.projectDir,s=e.resolve(i,`src/default/${t.codeKey}.js`);l.writeFileSync(s,n,"utf8");for await(const e of t.childs)await this.createType({node:e})}async createType({node:e}){switch(e.type){case"assign":case"steps":case"return":case"call":case"form":case"raise":case"switch":case"jump":case"tryexcept":case"for":case"operation":case"modules":this.createBlockFromTemplate({node:e})}for await(const t of e.childs)await this.createType({node:t})}createBlockFromTemplate({node:e}){const t=this.getBlockTemplate({node:e});e.context.render=t.render(e),this.createStepFile({node:e})}getBlockTemplate({node:t}){let o=this.#d[t.type];if(o)return o;const n=this.#s.templateDir;return o=g.compile(l.readFileSync(e.resolve(n,`src/default/blocks/${t.type}.js.njk`),"utf8"),this.#c),this.#d[t.type]=o,o}createStepFile({node:t}){const o=this.#s.projectDir,n=`${t.codeKey}.js`,i=e.resolve(o,`src/default/blocks/${n}`);l.writeFileSync(i,t.context.render,"utf8"),t.context.fileName=n,t.context.filePath=i}async transformExpression(e){let t=await this.transformValue(e);return t=JSON.stringify(t),t=this.replaceSpecialPattern(t),t}async transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=await this.transformValue(e[t]);else if(b(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++){const n=t[o],i=O({expression:n});if(i)if("e"===i.processor){const t=e[n].replace(/(\r\n|\n|\r)/g,"");e[i.statement]=`$::${t}::`,delete e[n]}else e[n]=await this.transformValue(e[n]);else e[n]=await this.transformValue(e[n])}}else if("string"==typeof e){const t=O({expression:e});if(t){const{processor:o,statement:n}=t;switch(o){case"v":e=`$::v.${n}::`;break;case"e":e=`$::${n}::`;break;case"m":e=`$::c.module['${n}']::`;break;case"fm":e=`$::flow.getModule('${n}')::`;break;case"f":e=`$::c.form.${n}::`;break;case"for":e=`$::caller.for.${n}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createProjectYaml(){const t="fnet.yaml",o=`Creating ${t}`;await this.setProgress({message:o});const{content:n,...i}=this.#r.doc,s=this.#s.projectDir,r=e.resolve(s,`${t}`);l.writeFileSync(r,h.stringify(i),"utf8")}async createProjectMainYaml(){const t="flow.main.yaml",o=`Creating ${t}`;await this.setProgress({message:o});const n={content:h.stringify(this.#a)},i=this.#s.templateDir,s=g.compile(l.readFileSync(e.resolve(i,`${t}.njk`),"utf8"),this.#c).render(n),r=this.#s.projectDir,a=e.resolve(r,`${t}`);l.writeFileSync(a,s,"utf8")}async runPrettifier(){const t=this.#s.projectDir;if(q("bun")){const o=await u("prettier --write .",{cwd:e.resolve(t,"src")});if(0!==o.code)throw new Error(o.stderr)}else{const o=await u("prettier --write .",{cwd:e.resolve(t,"src")});if(0!==o.code)throw new Error(o.stderr)}}async deploy(){if(await this.setProgress({message:"Deploying."}),this.#s.project?.devops){const e=[this.#s.project?.devops];for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&await o.save()}}else if(this.#r.id){const e=await D.list({type:"workflow.deploy",parent_id:this.#r.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await D.update(o,{id:o.id}))}}}async deployProject(e){const{deploymentProject:t}=e,{yamlDocument:o}=t;if(t.doc.targets&&Array.isArray(t.doc.targets))throw new Error("Deployment project targets are deprecated. Please update targets in the yaml file.");const n=Object.keys(t.doc||{}),i=o||{};for(let e=0;e<n.length;e++){const o=t.doc[n[e]];o.name=n[e];const s=i.get(n[e]);await se({...this.#k,deploymentProject:t,deploymentProjectTarget:o,yamlTarget:s})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;if(!this.#s.id)return;let n=await D.first({name:t.params.name,parent_id:this.#g.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await D.update(n,{id:n.id})):n=await D.create({parent_id:this.#g.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:o.version}]}})}async setProgress(e){const t="string"==typeof e?e:e?.message;console.log(s.blue(t)),await this._cache_set(this.#y,{status:"IN_PROGRESS",message:t})}async build(){if(this.#j&&!this.#b)return await this.createNetwork();try{const t=this.#j?await fe({root:this.#m}):void 0;if(this.#b){if(await this.initWorkflowDir(),await this.initNunjucks(),this.#j){let o=this.#s.project?.projectDir||this.#s.projectDir;o=e.resolve(o,"fnet"),l.existsSync(o)&&(l.existsSync(e.resolve(o,"flow.bpmn"))&&l.unlinkSync(e.resolve(o,"flow.bpmn")),l.writeFileSync(e.resolve(o,"flows.bpmn"),t.diagramXML,"utf8"))}await this.createAtomLibFiles({root:this.#m}),await this.createEngine({root:this.#m}),await this.createNodeTree({root:this.#m}),await this.createProjectYaml(),await async function({atom:t,context:o,setProgress:n,Atom:i}){const s="readme.md",r=`Creating ${s}`;if(await n({message:r}),o.project?.readme){const t=o.projectDir,n={content:o.project.readme.doc.content},i=e.resolve(o.project.projectDir,"fnet/how-to.md");if(l.existsSync(i)){const e=l.readFileSync(i,"utf8");n.howto=e}const r=e.resolve(o.project.projectDir,"fnet/input.yaml");if(l.existsSync(r)){const e=await y({file:r,tags:o.tags});n.input=e.content}const a=e.resolve(o.project.projectDir,"fnet/output.yaml");if(l.existsSync(a)){const e=await y({file:a,tags:o.tags});n.output=e.content}const c=o.templateDir,p=g.compile(l.readFileSync(e.resolve(c,`${s}.njk`),"utf8"),g.configure(c)).render(n),d=e.resolve(t,`${s}`);l.writeFileSync(d,p,"utf8")}else if(t.id){const n=await i.first({type:"wiki",parent_id:t.id});if(!n||"markdown"!==n.doc?.["content-type"])return;const{content:r,...a}=n.doc,c={content:r},p=o.templateDir,d=g.compile(l.readFileSync(e.resolve(p,`${s}.njk`),"utf8"),g.configure(p)).render(c),f=o.projectDir,m=e.resolve(f,`${s}`);l.writeFileSync(m,d,"utf8")}}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating tsconfig.json."});const s={atom:t,packageDependencies:i},r=n.templateDir,a=g.compile(l.readFileSync(e.resolve(r,"tsconfig.json.njk"),"utf8"),g.configure(r)).render(s),c=n.projectDir,p=e.resolve(c,"tsconfig.json");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating .gitignore"});const s={atom:t,packageDependencies:i},r=n.templateDir,a=g.compile(l.readFileSync(e.resolve(r,".gitignore.njk"),"utf8"),g.configure(r)).render(s),c=n.projectDir,p=e.resolve(c,".gitignore");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,njEnv:i}){if(!0!==t.doc.features.cli.enabled)return;await o({message:"Creating input args."});let s={};if(s=t.doc.input?t.doc.input:{type:"object",properties:{},required:[]},t.doc.features.cli.fargs&&!1!==t.doc.features.cli.fargs?.enabled){const e=t.doc.features.cli.fargs;Reflect.has(e,"default")&&e.default}const r={imports:[],atom:t},a=n.templateDir,c=g.compile(l.readFileSync(e.resolve(a,"src/default/input.args.js.njk"),"utf8"),i).render(r),p=n.projectDir,d=e.resolve(p,"src/default/input.args.js");l.writeFileSync(d,c,"utf8");const f=new N({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});C(f);const m=f.compile(s),u=T(f,m)+"\nexport { schema31 as schema };";l.writeFileSync(e.resolve(p,"src/default/validate_input.js"),u,"utf8")}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){if(!0!==t.doc.features.cli.enabled)return;await o({message:"Creating cli."});const s={atom:t,packageDependencies:i},r=n.templateDir,a=e.resolve(n.projectDir,"src/cli");l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),await m({pattern:["index.js.njk"],dir:e.resolve(r,"src/cli"),outDir:a,context:s})}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){if(!0!==t.doc.features.app.enabled)return;await o({message:"Creating app folder"});const s={atom:t,packageDependencies:i,ts:Date.now()},r=n.templateDir,a=e.resolve(n.projectDir,"src/app");l.existsSync(a)||l.mkdirSync(a,{recursive:!0});let c=["index.js.njk"];!1!==t.doc.features.app.html&&c.push("index.html.njk"),await m({pattern:c,dir:e.resolve(r,"src/app"),outDir:a,context:s})}(this.#k),await async function({atom:t,setProgress:o,context:n,packageDependencies:i}){await o({message:"Creating rollup file."});const s={atom:t,packageDependencies:i},r=e.resolve(n.projectDir,"src","default/index.js");if(!l.existsSync(r))throw new Error(`Entry file not found: ${r}`);const a=(await S({file:r,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),c=t.doc.features.rollup_output,p=Object.keys(c);for(let e=0;e<p.length;e++){const t=c[p[e]];if(!0===t.browser&&a.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(a.map((e=>({key:e,value:e})))),t.alias_enabled=!0,t.alias=t.alias||{},t.alias.entries=t.alias.entries||{};for(let e=0;e<a.length;e++){const o=a[e];t.alias.entries[o]=`node:${o}`,t.alias.entries[`node:${o}`]=o}t.external_enabled=!0,t.external=t.external||[],t.external=t.external.concat(a)}}const d=n.templateDir;let f=g.compile(l.readFileSync(e.resolve(d,"rollup.config.mjs.njk"),"utf8"),g.configure(d)).render(s);const m=n.projectDir;let u=e.resolve(m,"rollup.config.mjs");l.writeFileSync(u,f,"utf8")}(this.#k),await async function({atom:t,context:o,packageDependencies:n,packageDevDependencies:i,setProgress:s}){await s({message:"Creating package.json."}),n.filter((e=>!0===e.dev)).forEach((e=>{i.find((t=>t.package===e.package))||i.push(e);const t=n.findIndex((t=>t.package===e.package));n.splice(t,1)}));const r=n.find((e=>"react"===e.package)),a=n.find((e=>"react-dom"===e.package));r&&!a?n.push({package:"react-dom",version:r.version}):r&&a&&(a.version=r.version),r&&t.doc.features.react_version>=17&&(n.find((e=>"@emotion/react"===e.package))||n.push({package:"@emotion/react",version:"^11"}),n.find((e=>"@emotion/styled"===e.package))||n.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===t.doc.features.app.enabled&&c.push({file:e.resolve(o.projectDir,"src/app/index.js"),dev:!1!==t.doc.features.app.dev}),!0===t.doc.features.cli.enabled&&c.push({file:e.resolve(o.projectDir,"src/cli/index.js"),dev:!1!==t.doc.features.cli.dev});for await(const e of c){const t=e.file;if(!l.existsSync(t))throw new Error(`App file not found: ${t}`);const r=(await S({file:t,recursive:!0})).all;for await(const t of r){if("npm"!==t.type)continue;if(n.find((e=>e.package===t.package)))continue;if(i.find((e=>e.package===t.package)))continue;const r=await ie({name:t.package,projectDir:o.projectDir,setProgress:s});(!0===e.dev?i:n).push({package:t.package,subpath:t.subpath,version:r.minorRange,type:"npm"})}}const p={atom:t,packageDependencies:n,packageDevDependencies:i},d=o.templateDir,f=g.compile(l.readFileSync(e.resolve(d,"package.json.njk"),"utf8"),g.configure(d)).render(p),m=o.projectDir,u=e.resolve(m,"package.json");l.writeFileSync(u,f,"utf8");const y=e.resolve(o.project.projectDir,"fnet");if(l.existsSync(y)){const t=e.resolve(o.projectDir,"fnet");l.existsSync(t)||l.mkdirSync(t);const n=l.readdirSync(y);for(const o of n){const n=e.resolve(y,o);if(!l.lstatSync(n).isFile())continue;const i=e.resolve(t,o);l.copyFileSync(n,i)}}}(this.#k),await async function({setProgress:t,context:o}){const n=o.projectDir;await t({message:"Prettifiying source files."});let i=e.join("src","**","*");if(q("bun")){const e=await u(`prettier --write ${i} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:n});if(0!==e.code)throw new Error(e.stderr)}else{const e=await u(`prettier --write ${i} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:n});if(0!==e.code)throw new Error(e.stderr)}}(this.#k),await async function({atom:e,setProgress:t,context:o}){if(!e.doc.features.dts_enabled)return;const n=o.projectDir;if(await t({message:"Creating .d.ts"}),0!==(await u("tsc",{cwd:n})).code)throw new Error("Couldnt create .d.ts files.")}(this.#k),this.#x&&(await async function({setProgress:e,atom:t,context:o}){const n=o.projectDir;if(await e({message:"Installing npm packages."}),q("bun")){if(0!==(await u(`bun install ${t.doc.features.npm_install_flags}`,{cwd:n})).code)throw new Error("Couldnt install npm packages.")}else if(0!==(await u(`npm install ${t.doc.features.npm_install_flags}`,{cwd:n})).code)throw new Error("Couldnt install npm packages.")}(this.#k),await async function({setProgress:e,context:t}){const o=t.projectDir;if(await e({message:"Building main project."}),q("bun")){if(0!==(await u(t.dev?"bun run build:dev":"bun run build",{cwd:o})).code)throw new Error("Couldnt build project.")}else if(0!==(await u(t.dev?"npm run build:dev":"npm run build",{cwd:o})).code)throw new Error("Couldnt build project.")}(this.#k),this.#v&&await this.deploy())}await this._cache_set(this.#y,{status:"COMPLETED",data:{network:t}})}catch(e){throw await this._cache_set(this.#y,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await fe({root:this.#m});await this._cache_set(this.#y,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#y,{status:"FAILED",message:e.message||e}),e}}}const Ge={command:"build",describe:"Build flownet project",builder:e=>e.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"}),handler:async e=>{try{const t=await Y(e),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},qe={command:"deploy",describe:"Build and deploy flownet project",builder:e=>e.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 e=>{try{const t=await Y({...e,mode:"all"}),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},Ue={command:"file",describe:"Just create files",builder:e=>e.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 e=>{try{const t=await Y({...e,mode:"file"}),o=new ze(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}}},Ve={command:"input [name]",describe:"Create or modify an input config file",builder:e=>e.positional("name",{type:"string",demandOption:!1,describe:"Input name"}),handler:async t=>{try{const o=await Y(t),{project:n}=o,{projectDir:i,projectFileParsed:s}=n,r=s.input;if(!r)throw new Error("Config schema not found in project file.");if(!Reflect.has(t,"name")){const{inputName:e}=await R({type:"input",name:"inputName",message:"Input name:",initial:"dev"});t.name=e}const a=e.resolve(i,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=e.resolve(a,`${t.name}.fnet`),p=l.existsSync(c),d=(await import("@fnet/object-from-schema")).default,f=await d({schema:r,format:"yaml",ref:p?c:void 0});l.writeFileSync(c,f)}catch(e){console.error(e.message),process.exit(1)}}};var Xe={promptForSelection:async function(e){const{items:t,message:o,nameField:n="name",valueField:i="name",initialValue:r=null,allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(s.yellow("No items available for selection.")),null;if(1===t.length&&!a){const e=t[0],o="string"==typeof e?e:e[i];return console.log(s.blue(`Only one option available: ${"string"==typeof e?e:e[n]}`)),o}let c=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[i],value:e[i],message:e[n]||e[i]}));a&&c.push({name:"cancel",value:null,message:s.yellow("Cancel")});let l=null;if(r){const e=c.findIndex((e=>e.name===r));-1!==e&&(l=e)}const p="selectedItem",{[p]:d}=await R({type:"select",name:p,message:o,choices:c,initial:l});return"cancel"===d?null:d},promptForMultipleSelection:async function(e){const{items:t,message:o,nameField:n="name",valueField:i="name",initialValues:r=[],allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(s.yellow("No items available for selection.")),null;let c=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[i],value:e[i],message:e[n]||e[i]})),l=[];r&&r.length>0&&(l=c.map(((e,t)=>r.includes(e.name)?t:-1)).filter((e=>-1!==e)));const p="selectedItems",d=await R({type:"multiselect",name:p,message:o,choices:c,initial:l,hint:"(Use space to select, enter to confirm)",validate:e=>!(0===e.length&&!a)||"Please select at least one item"});return a&&0===d[p].length?null:d[p]}};const He=e.join(f.homedir(),".fnet","express");async function Ye(t){t.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(e=>e.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)",type:"string",choices:["node"],default:"node"})),(async t=>{await async function(t){try{l.existsSync(He)||l.mkdirSync(He,{recursive:!0});const o=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=e.join(He,o);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let i,r=t.projectName,a=t.runtime;if(t.yes){if(!r){const e=l.readdirSync(n).filter((e=>e.startsWith("fnet-"))).map((e=>parseInt(e.replace("fnet-",""),10))).filter((e=>!isNaN(e))),t=e.length>0?Math.max(...e)+1:1;r=`fnet-${t}`}a||(a="node")}else{if(!r){const e=l.readdirSync(n).filter((e=>e.startsWith("fnet-"))).map((e=>parseInt(e.replace("fnet-",""),10))).filter((e=>!isNaN(e))),t=`fnet-${e.length>0?Math.max(...e)+1:1}`,o=await R([{type:"input",name:"projectName",message:"Enter project name:",default:t}]);r=o.projectName}const e=a||"node";a=(await R({type:"select",name:"runtime",message:"Select runtime:",choices:["node"],initial:e})).runtime}if(i=e.join(n,r),l.existsSync(i)){let t=1;for(;l.existsSync(e.join(n,`${r}-${t}`));)t++;r=`${r}-${t}`,i=e.join(n,r)}if(!t.yes){if(!(await R([{type:"confirm",name:"proceed",message:`Create express project "${r}" in ${i}?`,default:!0}])).proceed)return void console.log(s.yellow("Project creation cancelled."))}console.log(s.blue(`Creating express project "${r}" in ${i}...`));const p=e.dirname(i),d=["create","--name",e.basename(i)];d.push("--runtime",a),t.yes&&d.push("--yes"),l.existsSync(p)||l.mkdirSync(p,{recursive:!0});const f=c("fnet",d,{stdio:"inherit",shell:!0,cwd:p});return new Promise(((e,o)=>{f.on("close",(n=>{0===n?(console.log(s.green(`\nExpress project "${r}" created successfully!`)),console.log(s.blue(`\nProject location: ${i}`)),t.yes?e():async function(e){try{(await R({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE&&await tt(e)}catch(e){console.error(s.red(`Error opening IDE: ${e.message}`))}}(i)):(console.error(s.red(`\nFailed to create express project "${r}".`)),o(new Error(`Process exited with code ${n}`)))}))}))}catch(e){console.error(s.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(t)})).command("list","List express projects",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(He))return void console.log(s.yellow("No express projects found."));const o=l.readdirSync(He).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(t.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),t=o.indexOf(e);if(-1===t)return void console.log(s.yellow("No express projects found for today."));o.splice(0,t),o.splice(1)}const n=[];t.type||t.all||(t.type="fnet");for(const i of o){const o=e.join(He,i),s=l.readdirSync(o);for(const r of s){const s=e.join(o,r),a=l.statSync(s);let c="unknown";if(r.startsWith("fnode-")||l.existsSync(e.join(s,"fnode.yaml"))?c="fnode":(r.startsWith("fnet-")||l.existsSync(e.join(s,"fnet.yaml")))&&(c="fnet"),t.type&&c!==t.type)continue;if(t.name&&!r.includes(t.name))continue;const p=`${i.slice(0,4)}-${i.slice(4,6)}-${i.slice(6,8)}`;n.push({name:r,type:c,date:p,path:s,created:a.birthtime})}}if(n.sort(((e,t)=>t.created-e.created)),0===n.length)return void console.log(s.yellow("No express projects found matching the criteria."));console.log(s.blue("\nExpress Projects:"));const i=(await import("./index.-SGbq2cI.js")).default,r=["NAME","TYPE","DATE","PATH"],a=i.createTable(r,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let t=e.path;t.startsWith(f.homedir())&&(t="~"+t.substring(f.homedir().length)),a.push([s.white(e.name),"fnet"===e.type?s.cyan(e.type):"fnode"===e.type?s.green(e.type):e.type,e.date,t])}console.log(a.toString()),console.log(s.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(s.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(t)})).command("open [project-name]","Open an express project",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(He))return void console.log(s.yellow("No express projects found."));let o;if(t.latest){if(o=await Qe(),!o)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(o=await Ze(t.projectName),!o)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await et();if(!t)return void console.log(s.yellow("No project selected."));o=e.join(He,t)}await tt(o)}catch(e){console.error(s.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(t)})).command("move [project-name] [destination]","Move an express project to a real project location",(e=>e.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 t=>{await async function(t){try{const o=process.cwd();let n;if(o.includes(He))n=o,console.log(s.blue(`Using current express project: ${e.basename(n)}`));else if(t.latest){if(n=await Qe(),!n)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(n=await Ze(t.projectName),!n)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await et();if(!t)return void console.log(s.yellow("No project selected."));n=e.join(He,t)}let i=t.destination;if(!i){i=(await R({type:"input",name:"destination",message:"Enter destination directory:",initial:e.join(process.cwd(),e.basename(n))})).destination}if(i.startsWith("~")&&(i=e.join(f.homedir(),i.slice(1))),i=e.resolve(i),i.startsWith(n+e.sep)||i===n)return void console.log(s.red("Destination cannot be inside the source directory."));if(l.existsSync(i)){if(!l.statSync(i).isDirectory())return void console.log(s.red(`Destination "${i}" is not a directory.`));if(l.readdirSync(i).length>0){if(!(await R({type:"confirm",name:"overwrite",message:`Destination "${i}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(s.yellow("Project move cancelled."))}}else l.mkdirSync(i,{recursive:!0});console.log(s.blue(`Moving project from ${n} to ${i}...`)),nt(n,i),console.log(s.green(`\nProject moved successfully to ${i}`));(await R({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(s.green("Original project deleted."))),await tt(i)}catch(e){console.error(s.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(t)})).command("remove [project-name]","Remove an express project",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(He))return void console.log(s.yellow("No express projects found."));let o;if(t.latest){if(o=await Qe(),!o)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(o=await Ze(t.projectName),!o)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await et();if(!t)return void console.log(s.yellow("No project selected."));o=e.join(He,t)}const n=e.basename(o);if(!t.yes){if(!(await R({type:"confirm",name:"confirm",message:`Are you sure you want to remove project "${n}"?`,initial:!1})).confirm)return void console.log(s.yellow("Project removal cancelled."))}console.log(s.blue(`Removing project "${n}"...`)),l.rmSync(o,{recursive:!0,force:!0}),console.log(s.green(`Project "${n}" removed successfully.`))}catch(e){console.error(s.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(t)})).command("enter [project-name]","Enter the directory of an express project in the active terminal",(e=>e.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 t=>{await async function(t){try{if(!l.existsSync(He))return void console.log(s.yellow("No express projects found."));let o;if(t.latest){if(o=await Qe(),!o)return void console.log(s.yellow("No express projects found."))}else if(t.projectName){if(o=await Ze(t.projectName),!o)return void console.log(s.yellow(`Project "${t.projectName}" not found.`))}else{const t=await et();if(!t)return void console.log(s.yellow("No project selected."));o=e.join(He,t)}console.log(s.blue(`Entering project directory: ${o}`)),console.log(s.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",i=c(n,[],{stdio:"inherit",cwd:o,shell:!0});return new Promise((e=>{i.on("close",(()=>{console.log(s.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(s.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(t)})).demandCommand(1,"You need to specify a command").help()}async function Qe(){const t=l.readdirSync(He).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(0===t.length)return null;const o=t[0],n=e.join(He,o),i=l.readdirSync(n);if(0===i.length)return null;let s=null,r=0;for(const t of i){const o=e.join(n,t),i=l.statSync(o);i.birthtimeMs>r&&(r=i.birthtimeMs,s=o)}return s}async function Ze(t){const o=l.readdirSync(He).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=e.join(He,n),i=l.readdirSync(o);if(i.includes(t))return e.join(o,t);const r=i.filter((e=>e.includes(t)));if(r.length>0){if(1===r.length)return e.join(o,r[0]);{const i=r.map((t=>({name:e.join(o,t),value:e.join(o,t),message:`${t} (${n})`}))),a=await Xe.promptForSelection({items:i,message:`Multiple projects match "${t}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(s.yellow("Operation cancelled.")),null):a}}}return null}async function et(){const t=[],o=l.readdirSync(He).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=e.join(He,n),i=l.readdirSync(o);for(const s of i){const i=e.join(o,s),r=l.statSync(i),a=`${n}/${s}`;t.push({name:a,value:a,created:r.birthtime})}}if(t.sort(((e,t)=>t.created-e.created)),0===t.length)return null;const n=await Xe.promptForSelection({items:t,message:"Select a project:",nameField:"value",valueField:"value",allowAbort:!0});return null===n?(console.log(s.yellow("Operation cancelled.")),null):n}async function tt(e){const t=await ot("code --version"),o=await ot("code-insiders --version");let n=null;if(t&&o){const e=await R({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"}]});n=e.ide}else if(t)n="code";else{if(!o)return console.log(s.yellow("No supported IDE found. Please open the project manually.")),void console.log(s.blue(`Project path: ${e}`));n="code-insiders"}console.log(s.blue(`Opening project in ${n}...`)),console.log(s.blue(`Project path: ${e}`));const i=c(n,[e],{stdio:"inherit",shell:!0});return new Promise(((e,t)=>{i.on("close",(o=>{0===o?(console.log(s.green(`Project opened in ${n}.`)),e()):(console.error(s.red(`Failed to open project in ${n}.`)),t(new Error(`Process exited with code ${o}`)))}))}))}async function ot(e){return new Promise((t=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{t(0===e)}))}))}function nt(t,o){l.existsSync(o)||l.mkdirSync(o,{recursive:!0});const n=l.readdirSync(t,{withFileTypes:!0});for(const i of n){const n=e.join(t,i.name),s=e.join(o,i.name);if(i.isDirectory()){if(".git"===i.name||".workspace"===i.name)continue;nt(n,s)}else l.copyFileSync(n,s)}}const it=e.dirname(n(import.meta.url));const st=e.dirname(n(import.meta.url)),rt=process.cwd();process.on("uncaughtException",(e=>{L||(L=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{L||(L=!0,setTimeout((()=>process.exit(1)),500))})),function(){d({name:["redis"],dir:rt,optional:!0});const t=function({baseDir:t}){let o=t=t||it;for(;o!==e.parse(o).root;){const t=e.join(o,"node_modules");if(l.existsSync(t))return t;o=e.dirname(o)}return null}({baseDir:st}),o="win32"===process.platform?";":":";t&&(process.env.PATH=`${e.join(t,"/.bin")}${o}${process.env.PATH}`)}(),async function(){try{let t=i(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(H).command(Z).command(Ge).command(qe).command(Ue).command(Ve).command("express","Create and manage express projects",Ye);t=z(t,{bin:"npm"}),t=z(t,{bin:"node"}),t=z(t,{bin:"bun"}),t=z(t,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),t=z(t,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),t=z(t,{name:"app",bin:"bun",preArgs:["run","app","--"]}),t=z(t,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),t=z(t,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),t=function(t,{name:o}){return t.command(`${o} [options]`,"Install the project as a binary",(e=>e.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 t=>{try{const o=await G(t),{projectDir:n}=o;console.log(s.blue("Compiling project..."));const i=e.join(n,".bin");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const r=e.basename(e.dirname(n)),a=o.project?.projectFileParsed?.features?.cli?.bin,c=t.name||a||r;console.log(s.blue(`Using binary name: ${c}`));const p=e.join(i,c),{spawn:d}=await import("child_process"),f=d("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${p}`],{cwd:n,stdio:"inherit",shell:!0});await new Promise(((e,t)=>{f.on("close",(o=>{0===o?e():t(new Error(`Compilation failed with code ${o}`))})),f.on("error",(e=>{t(e)}))})),"win32"!==process.platform&&l.chmodSync(p,493),console.log(s.green(`Binary compiled successfully: ${p}`)),console.log(s.blue("Installing binary..."));const m=["install",p];t.name&&m.push("--name",t.name),t.force&&m.push("--force"),t.yes&&m.push("--yes");const u=d("fbin",m,{stdio:"inherit",shell:!0});await new Promise(((e,t)=>{u.on("close",(o=>{0===o?e():t(new Error(`Installation failed with code ${o}`))})),u.on("error",(e=>{t(e)}))}))}catch(e){console.error(s.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(t,{name:"install"}),t=z(t,{bin:"npx"}),t=z(t,{bin:"cdk"}),t=z(t,{bin:"aws"}),t=function(e,{name:t,preArgs:o=[]}){return e.command(`${t} <config> <command> [options..]`,"Run a command with a config context",(e=>e.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)),(async e=>{try{const t=await G(e),{projectDir:n}=t,i=e.config,s=await d({name:i,dir:n,transferEnv:!1,optional:!0,tags:t.tags}),r=s?.data?.env||void 0,a=e.command,p=process.argv.slice(5);W(c(a,[...o,...p],{cwd:l.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...r}}))}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"with"}),t=function(e,{name:t,projectType:o="auto"}){return e.command(`${t} group [options..]`,"Run a command group.",(e=>e.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)),(async e=>{try{const{runCommandGroup:t}=await import("./index.DrwlOzAe.js");await t({projectType:o,group:e.group,tags:e.ftag,args:e,argv:process.argv})}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"run",projectType:"fnet"}),t.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(s.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(s.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{X as r,q as w};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e,{delimiter as o,join as t}from"node:path";import{fileURLToPath as n}from"node:url";import r from"yargs";import i from"chalk";import s from"@fnet/config";import a,{existsSync as c}from"node:fs";import{promisify as l}from"node:util";import d from"tree-kill";import{spawn as p}from"node:child_process";import m from"node:os";import u from"@flownet/lib-render-templates-dir";import f from"@fnet/shelljs";import y from"@fnet/yaml";import g from"yaml";import w from"@fnet/prompt";import"fs";import"path";import"@fnet/shell-flow";const h=e.dirname(n(import.meta.url));const j=l(d);let b=!1;async function x(e,o){if(b)return;if(b=!0,!e.killed&&e.pid)try{await j(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await j(e.pid,"SIGKILL").catch((()=>{}))}catch(e){}await new Promise((e=>setTimeout(e,100)));const t="SIGINT"===o?130:"SIGTERM"===o?143:1;process.exit(t)}function v(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((o=>{process.once(o,(async()=>{await x(e,o)}))})),process.on("uncaughtException",(async o=>{await x(e)})),process.on("unhandledRejection",(async o=>{await x(e)})),e.on("close",(e=>{b||process.exit(e)}))}function $(e,{name:o,bin:t,preArgs:n=[]}){return"function"==typeof t&&(t=t()),e.command(`${o||t} [commands..]`,`${t} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const o=await P(e),{projectDir:r}=o,i=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,s=process.argv.slice(3).map(i);v(p(t,[...n,...s],{cwd:r,stdio:"inherit",shell:!0,detached:!0}))}catch(e){console.error(e.message),process.exit(1)}}))}function S(o,{name:t,bin:n,preArgs:r=[]}){return o.command(`${t||n} [commands..]`,`${n} ${r.join(" ")}`,(e=>e.help(!1).version(!1)),(async o=>{try{const i=await P(o),{projectDir:s}=i,a=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,c=process.argv.slice(3).map(a);n=e.join(s,".conda","bin",n||t);v(p(n,[...r,...c],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:s}}))}catch(e){console.error(e.message),process.exit(1)}}))}async function P(e){try{const o=process.argv[1].split("/").pop().split(".")[0];if("fnode"===o){const{createContext:o}=await Promise.resolve().then((function(){return F}));return o(e)}if("fnet"===o){const{createContext:o}=await import("./index.B_0ZxySP.js");return o(e)}if("frun"===o){const{createContext:o}=await import("./index.CuMyez3E.js");return o(e)}if("fbin"===o){const{createContext:o}=await import("./index.DWpw12No.js");return o(e)}}catch(e){console.warn(`Warning: Could not import context from CLI tool: ${e.message}`)}return{projectDir:process.cwd(),tags:e.ftag}}var D=e=>{const n=process.env.PATH||"",r="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],i=n.split(o);for(const o of i)for(const n of r){const r=t(o,"win32"===process.platform?e+n:e);if(c(r))return r}return null};const E=e.dirname(n(import.meta.url)),I=process.cwd();function C(o){const t=e.resolve(I,o);if(a.existsSync(t))return t;const n=e.resolve(E,"../..",o);if(a.existsSync(n))return n;throw new Error(`Template path not found: ${o}`)}const N={command:"create",describe:"Create a new fnode project",builder:e=>e.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 o=>{try{const t=process.cwd(),n=C("./template/fnode/project"),r=e.resolve(t,o.name);a.existsSync(r)||a.mkdirSync(r),await u({dir:n,outDir:r,context:{name:o.name,runtime:o.runtime,platform:m.platform()},copyUnmatchedAlso:!0});let i=await f("fnode build",{cwd:r});if(0!==i.code)throw new Error("Failed to build project.");if(D("git")&&(i=await f("git init --initial-branch=main",{cwd:r}),0!==i.code))throw new Error("Failed to initialize git.");if(D("code")&&o.vscode&&(i=await f(`cd ${r} && code .`),0!==i.code))throw new Error("Failed to open vscode.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}}};async function T(o){if(o.id)return{id:o.id,buildId:o.buildId,mode:o.mode,protocol:o.protocol||"ac:",templateDir:C("./template/fnode/node"),projectDir:e.resolve(process.cwd(),`./.output/${o.id}`),tags:o.ftag,dev:o.dev};try{const t=await async function({tags:o}){let t=function(o){const t=e.resolve(o,"node.yaml"),n=e.resolve(o,"fnode.yaml");if(a.existsSync(n))return n;if(a.existsSync(t))try{const e=a.readFileSync(t,"utf8");return a.writeFileSync(n,e,"utf8"),a.unlinkSync(t),console.log(`Migrated node.yaml to fnode.yaml in ${o}`),n}catch(e){return console.error(`Error migrating node.yaml to fnode.yaml: ${e.message}`),t}return n}(process.cwd());if(!a.existsSync(t))throw new Error("fnode.yaml file not found in current directory.");const{raw:n,parsed:r}=await y({file:t,tags:o}),i=e.dirname(t);r.features=r.features||{};const s=r.features;s.runtime=s.runtime||{},s.runtime.type=s.runtime.type||"node","python"===s.runtime.type?s.runtime.template=s.runtime.template||"python":"bun"===s.runtime.type?s.runtime.template=s.runtime.template||"bun":s.runtime.template=s.runtime.template||"node";const c={libraryAtom:{doc:{...r},fileName:"index"},projectDir:i,projectFilePath:t,projectFileContent:n,projectFileParsed:r,runtime:s.runtime};let l=e.resolve(i,"fnet/targets.yaml");if(!a.existsSync(l)&&(l=e.resolve(i,"node.devops.yaml"),a.existsSync(l))){const o=e.resolve(i,"fnet");a.existsSync(o)||a.mkdirSync(o),a.copyFileSync(l,e.resolve(i,"fnet/targets.yaml")),a.unlinkSync(l)}if(a.existsSync(l)){const{raw:e,parsed:t}=await y({file:l,tags:o}),n=g.parseDocument(e);c.devops={filePath:l,fileContent:e,yamlDocument:n,doc:{...t},type:"library.deploy",save:async()=>{a.writeFileSync(c.devops.filePath,n.toString())}}}const d=e.resolve(i,"readme.md");if(a.existsSync(d)){const e=a.readFileSync(d,"utf8");c.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}({tags:o.ftag});return{buildId:o.buildId,mode:o.mode,protocol:o.protocol||"local:",templateDir:C(`./template/fnode/${t.runtime.template}`),projectDir:e.resolve(t.projectDir,"./.workspace"),projectSrcDir:e.resolve(t.projectDir,"./src"),project:t,tags:o.ftag,dev:o.dev}}catch(e){return console.warn(`Warning: Could not load project: ${e.message}`),{projectDir:process.cwd(),tags:o.ftag}}}var F=Object.freeze({__proto__:null,createContext:T});const k={command:"project",describe:"Manage fnode project",builder:e=>e.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"}),handler:async e=>{try{const o=C("./template/fnode/project"),t=process.cwd(),n=await T(e);if(e.update){if(await u({dir:o,outDir:t,context:{name:n.project.projectFileParsed.name,runtime:n.project.runtime.type,platform:m.platform()},copyUnmatchedAlso:!0}),0!==(await f("fnode build",{cwd:t})).code)throw new Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(e){console.error("Project failed.",e.message),process.exit(1)}}};class A{static async createBuilder(e){if(!e.project){console.warn("No project provided, defaulting to node runtime");return new(0,(await import("./index.DnA30tC4.js")).default)(e)}const o=e.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(o))(e)}catch(t){console.warn(`Warning: Could not load builder for runtime '${o}'. Falling back to node builder.`),console.warn(`Error: ${t.message}`);return new(0,(await import("./index.DnA30tC4.js")).default)(e)}}static async loadBuilderClass(e){switch(e.toLowerCase()){case"node":return(await import("./index.DnA30tC4.js")).default;case"python":return(await import("./index.uPDSav7E.js")).default;case"bun":return(await import("./index.B1G_No8j.js")).default;default:throw new Error(`Unsupported runtime type: ${e}`)}}}const B={command:"build",describe:"Build fnode project",builder:e=>e.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"}),handler:async e=>{try{const o=await T(e),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},M={command:"deploy",describe:"Build and deploy fnode project",builder:e=>e.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 e=>{try{const o=await T({...e,mode:"all"}),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},O={command:"file",describe:"Just create files",builder:e=>e.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 e=>{try{const o=await T({...e,mode:"file"}),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},W={command:"input [name]",describe:"Create or modify an input config file",builder:e=>e.positional("name",{type:"string",demandOption:!1,describe:"Input name"}),handler:async o=>{try{const t=await T(o),{project:n}=t,{projectDir:r,projectFileParsed:i}=n,s=i.input;if(!s)throw new Error("Config schema not found in project file.");if(!Reflect.has(o,"name")){const{inputName:e}=await w({type:"input",name:"inputName",message:"Input name:",initial:"dev"});o.name=e}const c=e.resolve(r,".fnet");a.existsSync(c)||a.mkdirSync(c);const l=e.resolve(c,`${o.name}.fnet`),d=a.existsSync(l),p=(await import("@fnet/object-from-schema")).default,m=await p({schema:s,format:"yaml",ref:d?l:void 0});a.writeFileSync(l,m)}catch(e){console.error(e.message),process.exit(1)}}},R=e.join(m.homedir(),".fnet","express");async function U(o){o.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(e=>e.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 o=>{await async function(o){try{a.existsSync(R)||a.mkdirSync(R,{recursive:!0});const t=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=e.join(R,t);a.existsSync(n)||a.mkdirSync(n,{recursive:!0});let r,s=o.projectName,c=o.runtime;if(o.yes){if(!s){const e=a.readdirSync(n).filter((e=>e.startsWith("fnode-"))).map((e=>parseInt(e.replace("fnode-",""),10))).filter((e=>!isNaN(e))),o=e.length>0?Math.max(...e)+1:1;s=`fnode-${o}`}c||(c="node")}else{if(!s){const e=a.readdirSync(n).filter((e=>e.startsWith("fnode-"))).map((e=>parseInt(e.replace("fnode-",""),10))).filter((e=>!isNaN(e))),o=`fnode-${e.length>0?Math.max(...e)+1:1}`,t=await w([{type:"input",name:"projectName",message:"Enter project name:",default:o}]);s=t.projectName}const e=c||"node";c=(await w({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:e})).runtime}if(r=e.join(n,s),a.existsSync(r)){let o=1;for(;a.existsSync(e.join(n,`${s}-${o}`));)o++;s=`${s}-${o}`,r=e.join(n,s)}if(!o.yes){if(!(await w([{type:"confirm",name:"proceed",message:`Create express project "${s}" in ${r}?`,default:!0}])).proceed)return void console.log(i.yellow("Project creation cancelled."))}console.log(i.blue(`Creating express project "${s}" in ${r}...`));const l=e.dirname(r),d=["create","--name",e.basename(r)];d.push("--runtime",c),o.yes&&d.push("--yes"),a.existsSync(l)||a.mkdirSync(l,{recursive:!0});const m=p("fnode",d,{stdio:"inherit",shell:!0,cwd:l});return new Promise(((e,t)=>{m.on("close",(n=>{0===n?(console.log(i.green(`\nExpress project "${s}" created successfully!`)),console.log(i.blue(`\nProject location: ${r}`)),o.yes?e():async function(e){try{(await w({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE&&await L(e)}catch(e){console.error(i.red(`Error opening IDE: ${e.message}`))}}(r)):(console.error(i.red(`\nFailed to create express project "${s}".`)),t(new Error(`Process exited with code ${n}`)))}))}))}catch(e){console.error(i.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(o)})).command("list","List express projects",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(R))return void console.log(i.yellow("No express projects found."));const t=a.readdirSync(R).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(o.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),o=t.indexOf(e);if(-1===o)return void console.log(i.yellow("No express projects found for today."));t.splice(0,o),t.splice(1)}const n=[];o.type||o.all||(o.type="fnode");for(const r of t){const t=e.join(R,r),i=a.readdirSync(t);for(const s of i){const i=e.join(t,s),c=a.statSync(i);let l="unknown";if(s.startsWith("fnode-")||a.existsSync(e.join(i,"fnode.yaml"))?l="fnode":(s.startsWith("fnet-")||a.existsSync(e.join(i,"fnet.yaml")))&&(l="fnet"),o.type&&l!==o.type)continue;if(o.name&&!s.includes(o.name))continue;const d=`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`;n.push({name:s,type:l,date:d,path:i,created:c.birthtime})}}if(n.sort(((e,o)=>o.created-e.created)),0===n.length)return void console.log(i.yellow("No express projects found matching the criteria."));console.log(i.blue("\nExpress Projects:"));const r=(await import("./index.-SGbq2cI.js")).default,s=["NAME","TYPE","DATE","PATH"],c=r.createTable(s,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let o=e.path;o.startsWith(m.homedir())&&(o="~"+o.substring(m.homedir().length)),c.push([i.white(e.name),"fnet"===e.type?i.cyan(e.type):"fnode"===e.type?i.green(e.type):e.type,e.date,o])}console.log(c.toString()),console.log(i.green("Projects: ")+i.yellow(n.filter((e=>"fnode"===e.type)).length+" fnode, ")+i.cyan(n.filter((e=>"fnet"===e.type)).length+" fnet")),console.log(i.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(i.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(o)})).command("open [project-name]","Open an express project",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(R))return void console.log(i.yellow("No express projects found."));let t;if(o.latest){if(t=await G(),!t)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(t=await H(o.projectName),!t)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));t=e.join(R,o)}await L(t)}catch(e){console.error(i.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(o)})).command("move [project-name] [destination]","Move an express project to a real project location",(e=>e.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 o=>{await async function(o){try{const t=process.cwd();let n;if(t.includes(R))n=t,console.log(i.blue(`Using current express project: ${e.basename(n)}`));else if(o.latest){if(n=await G(),!n)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(n=await H(o.projectName),!n)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));n=e.join(R,o)}let r=o.destination;if(!r){r=(await w({type:"input",name:"destination",message:"Enter destination directory:",initial:e.join(process.cwd(),e.basename(n))})).destination}if(r.startsWith("~")&&(r=e.join(m.homedir(),r.slice(1))),r=e.resolve(r),r.startsWith(n+e.sep)||r===n)return void console.log(i.red("Destination cannot be inside the source directory."));if(a.existsSync(r)){if(!a.statSync(r).isDirectory())return void console.log(i.red(`Destination "${r}" is not a directory.`));if(a.readdirSync(r).length>0){if(!(await w({type:"confirm",name:"overwrite",message:`Destination "${r}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(i.yellow("Project move cancelled."))}}else a.mkdirSync(r,{recursive:!0});console.log(i.blue(`Moving project from ${n} to ${r}...`)),z(n,r),console.log(i.green(`\nProject moved successfully to ${r}`));(await w({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(a.rmSync(n,{recursive:!0,force:!0}),console.log(i.green("Original project deleted."))),await L(r)}catch(e){console.error(i.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(o)})).demandCommand(1,"You need to specify a command").help()}async function G(){const o=a.readdirSync(R).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(0===o.length)return null;const t=o[0],n=e.join(R,t),r=a.readdirSync(n);if(0===r.length)return null;let i=null,s=0;for(const o of r){const t=e.join(n,o),r=a.statSync(t);r.birthtimeMs>s&&(s=r.birthtimeMs,i=t)}return i}async function H(o){const t=a.readdirSync(R).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=e.join(R,n),r=a.readdirSync(t);if(r.includes(o))return e.join(t,o);const i=r.filter((e=>e.includes(o)));if(i.length>0){if(1===i.length)return e.join(t,i[0]);return(await w({type:"select",name:"selectedProject",message:`Multiple projects match "${o}". Please select one:`,choices:i.map((o=>({name:`${o} (${n})`,value:e.join(t,o)})))})).selectedProject}}return null}async function _(){const o=[],t=a.readdirSync(R).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=e.join(R,n),r=a.readdirSync(t);for(const i of r){const r=e.join(t,i),s=a.statSync(r),c=`${n}/${i}`;o.push({name:c,value:c,created:s.birthtime})}}if(o.sort(((e,o)=>o.created-e.created)),0===o.length)return null;return(await w({type:"select",name:"selectedProject",message:"Select a project:",choices:o})).selectedProject}async function L(e){const o=await Y("code --version"),t=await Y("code-insiders --version");let n=null;if(o&&t){const e=await w({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"}]});n=e.ide}else if(o)n="code";else{if(!t)return console.log(i.yellow("No supported IDE found. Please open the project manually.")),void console.log(i.blue(`Project path: ${e}`));n="code-insiders"}console.log(i.blue(`Opening project in ${n}...`)),console.log(i.blue(`Project path: ${e}`));const r=p(n,[e],{stdio:"inherit",shell:!0});return new Promise(((e,o)=>{r.on("close",(t=>{0===t?(console.log(i.green(`Project opened in ${n}.`)),e()):(console.error(i.red(`Failed to open project in ${n}.`)),o(new Error(`Process exited with code ${t}`)))}))}))}async function Y(e){return new Promise((o=>{p(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{o(0===e)}))}))}function z(o,t){a.existsSync(t)||a.mkdirSync(t,{recursive:!0});const n=a.readdirSync(o,{withFileTypes:!0});for(const r of n){const n=e.join(o,r.name),i=e.join(t,r.name);if(r.isDirectory()){if(".git"===r.name||".workspace"===r.name)continue;z(n,i)}else a.copyFileSync(n,i)}}const V=e.dirname(n(import.meta.url)),X=process.cwd();process.on("uncaughtException",(e=>{b||(b=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{b||(b=!0,setTimeout((()=>process.exit(1)),500))})),function(){s({name:["redis"],dir:X,optional:!0});const o=function({baseDir:o}){let t=o=o||h;for(;t!==e.parse(t).root;){const o=e.join(t,"node_modules");if(a.existsSync(o))return o;t=e.dirname(t)}return null}({baseDir:V}),t="win32"===process.platform?";":":";o&&(process.env.PATH=`${e.join(o,"/.bin")}${t}${process.env.PATH}`)}(),async function(){try{let o=r(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(N).command(k).command(B).command(M).command(O).command(W).command("express","Create and manage express projects",U);o=$(o,{bin:"npm"}),o=$(o,{bin:"node"}),o=$(o,{bin:"bun"}),o=$(o,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),o=$(o,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),o=$(o,{name:"app",bin:"bun",preArgs:["run","app","--"]}),o=$(o,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),o=$(o,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),o=function(o,{name:t}){return o.command(`${t} [options]`,"Install the project as a binary",(e=>e.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 o=>{try{const t=await P(o),{projectDir:n}=t;console.log(i.blue("Compiling project..."));const r=e.join(n,".bin");a.existsSync(r)||a.mkdirSync(r,{recursive:!0});const s=e.basename(e.dirname(n)),c=t.project?.projectFileParsed?.features?.cli?.bin,l=o.name||c||s;console.log(i.blue(`Using binary name: ${l}`));const d=e.join(r,l),{spawn:p}=await import("child_process"),m=p("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${d}`],{cwd:n,stdio:"inherit",shell:!0});await new Promise(((e,o)=>{m.on("close",(t=>{0===t?e():o(new Error(`Compilation failed with code ${t}`))})),m.on("error",(e=>{o(e)}))})),"win32"!==process.platform&&a.chmodSync(d,493),console.log(i.green(`Binary compiled successfully: ${d}`)),console.log(i.blue("Installing binary..."));const u=["install",d];o.name&&u.push("--name",o.name),o.force&&u.push("--force"),o.yes&&u.push("--yes");const f=p("fbin",u,{stdio:"inherit",shell:!0});await new Promise(((e,o)=>{f.on("close",(t=>{0===t?e():o(new Error(`Installation failed with code ${t}`))})),f.on("error",(e=>{o(e)}))}))}catch(e){console.error(i.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(o,{name:"install"}),o=$(o,{bin:"npx"}),o=$(o,{bin:"cdk"}),o=$(o,{bin:"aws"}),o=function(e,{name:o,preArgs:t=[]}){return e.command(`${o} <config> <command> [options..]`,"Run a command with a config context",(e=>e.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)),(async e=>{try{const o=await P(e),{projectDir:n}=o,r=e.config,i=await s({name:r,dir:n,transferEnv:!1,optional:!0,tags:o.tags}),c=i?.data?.env||void 0,l=e.command,d=process.argv.slice(5);v(p(l,[...t,...d],{cwd:a.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...c}}))}catch(e){console.error(e.message),process.exit(1)}}))}(o,{name:"with"}),o=function(e,{name:o,projectType:t="auto"}){return e.command(`${o} group [options..]`,"Run a command group.",(e=>e.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)),(async e=>{try{const{runCommandGroup:o}=await import("./index.DrwlOzAe.js");await o({projectType:t,group:e.group,tags:e.ftag,args:e,argv:process.argv})}catch(e){console.error(e.message),process.exit(1)}}))}(o,{name:"run",projectType:"fnode"}),o=S(o,{name:"python"}),o=S(o,{name:"python3"}),o=S(o,{name:"pip"}),o=S(o,{name:"pip3"}),o.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(i.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(i.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{C as r,D as w};
2
+ import e,{delimiter as o,join as t}from"node:path";import{fileURLToPath as n}from"node:url";import r from"yargs";import i from"chalk";import s from"@fnet/config";import a,{existsSync as c}from"node:fs";import{promisify as l}from"node:util";import d from"tree-kill";import{spawn as p}from"node:child_process";import m from"node:os";import u from"@flownet/lib-render-templates-dir";import f from"@fnet/shelljs";import y from"@fnet/yaml";import g from"yaml";import w from"@fnet/prompt";import"fs";import"path";import"@fnet/shell-flow";const j=e.dirname(n(import.meta.url));const h=l(d);let b=!1;async function v(e,o){if(b)return;if(b=!0,!e.killed&&e.pid)try{await h(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await h(e.pid,"SIGKILL").catch((()=>{}))}catch(e){}await new Promise((e=>setTimeout(e,100)));const t="SIGINT"===o?130:"SIGTERM"===o?143:1;process.exit(t)}function x(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((o=>{process.once(o,(async()=>{await v(e,o)}))})),process.on("uncaughtException",(async o=>{await v(e)})),process.on("unhandledRejection",(async o=>{await v(e)})),e.on("close",(e=>{b||process.exit(e)}))}function $(e,{name:o,bin:t,preArgs:n=[]}){return"function"==typeof t&&(t=t()),e.command(`${o||t} [commands..]`,`${t} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const o=await N(e),{projectDir:r}=o,i=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,s=process.argv.slice(3).map(i);x(p(t,[...n,...s],{cwd:r,stdio:"inherit",shell:!0,detached:!0}))}catch(e){console.error(e.message),process.exit(1)}}))}function S(o,{name:t,bin:n,preArgs:r=[]}){return o.command(`${t||n} [commands..]`,`${n} ${r.join(" ")}`,(e=>e.help(!1).version(!1)),(async o=>{try{const i=await N(o),{projectDir:s}=i,a=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,c=process.argv.slice(3).map(a);n=e.join(s,".conda","bin",n||t);x(p(n,[...r,...c],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:s}}))}catch(e){console.error(e.message),process.exit(1)}}))}async function N(e){try{const o=process.argv[1].split("/").pop().split(".")[0];if("fnode"===o){const{createContext:o}=await Promise.resolve().then((function(){return T}));return o(e)}if("fnet"===o){const{createContext:o}=await import("./index.B_0ZxySP.js");return o(e)}if("frun"===o){const{createContext:o}=await import("./index.CuMyez3E.js");return o(e)}if("fbin"===o){const{createContext:o}=await import("./index.DWpw12No.js");return o(e)}}catch(e){console.warn(`Warning: Could not import context from CLI tool: ${e.message}`)}return{projectDir:process.cwd(),tags:e.ftag}}var P=e=>{const n=process.env.PATH||"",r="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],i=n.split(o);for(const o of i)for(const n of r){const r=t(o,"win32"===process.platform?e+n:e);if(c(r))return r}return null};const E=e.dirname(n(import.meta.url)),D=process.cwd();function I(o){const t=e.resolve(D,o);if(a.existsSync(t))return t;const n=e.resolve(E,"../..",o);if(a.existsSync(n))return n;throw new Error(`Template path not found: ${o}`)}const C={command:"create",describe:"Create a new fnode project",builder:e=>e.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 o=>{try{const t=process.cwd(),n=I("./template/fnode/project"),r=e.resolve(t,o.name);a.existsSync(r)||a.mkdirSync(r),await u({dir:n,outDir:r,context:{name:o.name,runtime:o.runtime,platform:m.platform()},copyUnmatchedAlso:!0});let i=await f("fnode build",{cwd:r});if(0!==i.code)throw new Error("Failed to build project.");if(P("git")&&(i=await f("git init --initial-branch=main",{cwd:r}),0!==i.code))throw new Error("Failed to initialize git.");if(P("code")&&o.vscode&&(i=await f(`cd ${r} && code .`),0!==i.code))throw new Error("Failed to open vscode.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}}};async function F(o){if(o.id)return{id:o.id,buildId:o.buildId,mode:o.mode,protocol:o.protocol||"ac:",templateDir:I("./template/fnode/node"),projectDir:e.resolve(process.cwd(),`./.output/${o.id}`),tags:o.ftag,dev:o.dev};try{const t=await async function({tags:o}){let t=function(o){const t=e.resolve(o,"node.yaml"),n=e.resolve(o,"fnode.yaml");if(a.existsSync(n))return n;if(a.existsSync(t))try{const e=a.readFileSync(t,"utf8");return a.writeFileSync(n,e,"utf8"),a.unlinkSync(t),console.log(`Migrated node.yaml to fnode.yaml in ${o}`),n}catch(e){return console.error(`Error migrating node.yaml to fnode.yaml: ${e.message}`),t}return n}(process.cwd());if(!a.existsSync(t))throw new Error("fnode.yaml file not found in current directory.");const{raw:n,parsed:r}=await y({file:t,tags:o}),i=e.dirname(t);r.features=r.features||{};const s=r.features;s.runtime=s.runtime||{},s.runtime.type=s.runtime.type||"node","python"===s.runtime.type?s.runtime.template=s.runtime.template||"python":"bun"===s.runtime.type?s.runtime.template=s.runtime.template||"bun":s.runtime.template=s.runtime.template||"node";const c={libraryAtom:{doc:{...r},fileName:"index"},projectDir:i,projectFilePath:t,projectFileContent:n,projectFileParsed:r,runtime:s.runtime};let l=e.resolve(i,"fnet/targets.yaml");if(!a.existsSync(l)&&(l=e.resolve(i,"node.devops.yaml"),a.existsSync(l))){const o=e.resolve(i,"fnet");a.existsSync(o)||a.mkdirSync(o),a.copyFileSync(l,e.resolve(i,"fnet/targets.yaml")),a.unlinkSync(l)}if(a.existsSync(l)){const{raw:e,parsed:t}=await y({file:l,tags:o}),n=g.parseDocument(e);c.devops={filePath:l,fileContent:e,yamlDocument:n,doc:{...t},type:"library.deploy",save:async()=>{a.writeFileSync(c.devops.filePath,n.toString())}}}const d=e.resolve(i,"readme.md");if(a.existsSync(d)){const e=a.readFileSync(d,"utf8");c.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}({tags:o.ftag});return{buildId:o.buildId,mode:o.mode,protocol:o.protocol||"local:",templateDir:I(`./template/fnode/${t.runtime.template}`),projectDir:e.resolve(t.projectDir,"./.workspace"),projectSrcDir:e.resolve(t.projectDir,"./src"),project:t,tags:o.ftag,dev:o.dev}}catch(e){return console.warn(`Warning: Could not load project: ${e.message}`),{projectDir:process.cwd(),tags:o.ftag}}}var T=Object.freeze({__proto__:null,createContext:F});const k={command:"project",describe:"Manage fnode project",builder:e=>e.option("update",{type:"boolean",default:!1,alias:"-u",describe:"Update project files"}),handler:async e=>{try{const o=I("./template/fnode/project"),t=process.cwd(),n=await F(e);if(e.update){if(await u({dir:o,outDir:t,context:{name:n.project.projectFileParsed.name,runtime:n.project.runtime.type,platform:m.platform()},copyUnmatchedAlso:!0}),0!==(await f("fnode build",{cwd:t})).code)throw new Error("Failed to build project.");console.log("Updating project succeeded!")}process.exit(0)}catch(e){console.error("Project failed.",e.message),process.exit(1)}}};class A{static async createBuilder(e){if(!e.project){console.warn("No project provided, defaulting to node runtime");return new(0,(await import("./index.DnA30tC4.js")).default)(e)}const o=e.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(o))(e)}catch(t){console.warn(`Warning: Could not load builder for runtime '${o}'. Falling back to node builder.`),console.warn(`Error: ${t.message}`);return new(0,(await import("./index.DnA30tC4.js")).default)(e)}}static async loadBuilderClass(e){switch(e.toLowerCase()){case"node":return(await import("./index.DnA30tC4.js")).default;case"python":return(await import("./index.uPDSav7E.js")).default;case"bun":return(await import("./index.B1G_No8j.js")).default;default:throw new Error(`Unsupported runtime type: ${e}`)}}}const B={command:"build",describe:"Build fnode project",builder:e=>e.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"}),handler:async e=>{try{const o=await F(e),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},O={command:"deploy",describe:"Build and deploy fnode project",builder:e=>e.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 e=>{try{const o=await F({...e,mode:"all"}),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},M={command:"file",describe:"Just create files",builder:e=>e.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 e=>{try{const o=await F({...e,mode:"file"}),t=await A.createBuilder(o);await t.init(),await t.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}}},R={command:"input [name]",describe:"Create or modify an input config file",builder:e=>e.positional("name",{type:"string",demandOption:!1,describe:"Input name"}),handler:async o=>{try{const t=await F(o),{project:n}=t,{projectDir:r,projectFileParsed:i}=n,s=i.input;if(!s)throw new Error("Config schema not found in project file.");if(!Reflect.has(o,"name")){const{inputName:e}=await w({type:"input",name:"inputName",message:"Input name:",initial:"dev"});o.name=e}const c=e.resolve(r,".fnet");a.existsSync(c)||a.mkdirSync(c);const l=e.resolve(c,`${o.name}.fnet`),d=a.existsSync(l),p=(await import("@fnet/object-from-schema")).default,m=await p({schema:s,format:"yaml",ref:d?l:void 0});a.writeFileSync(l,m)}catch(e){console.error(e.message),process.exit(1)}}};var W={promptForSelection:async function(e){const{items:o,message:t,nameField:n="name",valueField:r="name",initialValue:s=null,allowAbort:a=!0}=e;if(!o||0===o.length)return console.log(i.yellow("No items available for selection.")),null;if(1===o.length&&!a){const e=o[0],t="string"==typeof e?e:e[r];return console.log(i.blue(`Only one option available: ${"string"==typeof e?e:e[n]}`)),t}let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[r],value:e[r],message:e[n]||e[r]}));a&&c.push({name:"cancel",value:null,message:i.yellow("Cancel")});let l=null;if(s){const e=c.findIndex((e=>e.name===s));-1!==e&&(l=e)}const d="selectedItem",{[d]:p}=await w({type:"select",name:d,message:t,choices:c,initial:l});return"cancel"===p?null:p},promptForMultipleSelection:async function(e){const{items:o,message:t,nameField:n="name",valueField:r="name",initialValues:s=[],allowAbort:a=!0}=e;if(!o||0===o.length)return console.log(i.yellow("No items available for selection.")),null;let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[r],value:e[r],message:e[n]||e[r]})),l=[];s&&s.length>0&&(l=c.map(((e,o)=>s.includes(e.name)?o:-1)).filter((e=>-1!==e)));const d="selectedItems",p=await w({type:"multiselect",name:d,message:t,choices:c,initial:l,hint:"(Use space to select, enter to confirm)",validate:e=>!(0===e.length&&!a)||"Please select at least one item"});return a&&0===p[d].length?null:p[d]}};const U=e.join(m.homedir(),".fnet","express");async function G(o){o.command(["$0 [project-name]","create [project-name]"],"Create a new express project",(e=>e.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 o=>{await async function(o){try{a.existsSync(U)||a.mkdirSync(U,{recursive:!0});const t=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=e.join(U,t);a.existsSync(n)||a.mkdirSync(n,{recursive:!0});let r,s=o.projectName,c=o.runtime;if(o.yes){if(!s){const e=a.readdirSync(n).filter((e=>e.startsWith("fnode-"))).map((e=>parseInt(e.replace("fnode-",""),10))).filter((e=>!isNaN(e))),o=e.length>0?Math.max(...e)+1:1;s=`fnode-${o}`}c||(c="node")}else{if(!s){const e=a.readdirSync(n).filter((e=>e.startsWith("fnode-"))).map((e=>parseInt(e.replace("fnode-",""),10))).filter((e=>!isNaN(e))),o=`fnode-${e.length>0?Math.max(...e)+1:1}`,t=await w([{type:"input",name:"projectName",message:"Enter project name:",default:o}]);s=t.projectName}const e=c||"node";c=(await w({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:e})).runtime}if(r=e.join(n,s),a.existsSync(r)){let o=1;for(;a.existsSync(e.join(n,`${s}-${o}`));)o++;s=`${s}-${o}`,r=e.join(n,s)}if(!o.yes){if(!(await w([{type:"confirm",name:"proceed",message:`Create express project "${s}" in ${r}?`,default:!0}])).proceed)return void console.log(i.yellow("Project creation cancelled."))}console.log(i.blue(`Creating express project "${s}" in ${r}...`));const l=e.dirname(r),d=["create","--name",e.basename(r)];d.push("--runtime",c),o.yes&&d.push("--yes"),a.existsSync(l)||a.mkdirSync(l,{recursive:!0});const m=p("fnode",d,{stdio:"inherit",shell:!0,cwd:l});return new Promise(((e,t)=>{m.on("close",(n=>{0===n?(console.log(i.green(`\nExpress project "${s}" created successfully!`)),console.log(i.blue(`\nProject location: ${r}`)),o.yes?e():async function(e){try{(await w({type:"confirm",name:"openIDE",message:"Would you like to open the project in an IDE?",initial:!0})).openIDE&&await V(e)}catch(e){console.error(i.red(`Error opening IDE: ${e.message}`))}}(r)):(console.error(i.red(`\nFailed to create express project "${s}".`)),t(new Error(`Process exited with code ${n}`)))}))}))}catch(e){console.error(i.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(o)})).command("list","List express projects",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(U))return void console.log(i.yellow("No express projects found."));const t=a.readdirSync(U).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(o.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),o=t.indexOf(e);if(-1===o)return void console.log(i.yellow("No express projects found for today."));t.splice(0,o),t.splice(1)}const n=[];o.type||o.all||(o.type="fnode");for(const r of t){const t=e.join(U,r),i=a.readdirSync(t);for(const s of i){const i=e.join(t,s),c=a.statSync(i);let l="unknown";if(s.startsWith("fnode-")||a.existsSync(e.join(i,"fnode.yaml"))?l="fnode":(s.startsWith("fnet-")||a.existsSync(e.join(i,"fnet.yaml")))&&(l="fnet"),o.type&&l!==o.type)continue;if(o.name&&!s.includes(o.name))continue;const d=`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`;n.push({name:s,type:l,date:d,path:i,created:c.birthtime})}}if(n.sort(((e,o)=>o.created-e.created)),0===n.length)return void console.log(i.yellow("No express projects found matching the criteria."));console.log(i.blue("\nExpress Projects:"));const r=(await import("./index.-SGbq2cI.js")).default,s=["NAME","TYPE","DATE","PATH"],c=r.createTable(s,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let o=e.path;o.startsWith(m.homedir())&&(o="~"+o.substring(m.homedir().length)),c.push([i.white(e.name),"fnet"===e.type?i.cyan(e.type):"fnode"===e.type?i.green(e.type):e.type,e.date,o])}console.log(c.toString()),console.log(i.green("Projects: ")+i.yellow(n.filter((e=>"fnode"===e.type)).length+" fnode, ")+i.cyan(n.filter((e=>"fnet"===e.type)).length+" fnet")),console.log(i.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(i.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(o)})).command("open [project-name]","Open an express project",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(U))return void console.log(i.yellow("No express projects found."));let t;if(o.latest){if(t=await H(),!t)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(t=await L(o.projectName),!t)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));t=e.join(U,o)}await V(t)}catch(e){console.error(i.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(o)})).command("move [project-name] [destination]","Move an express project to a real project location",(e=>e.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 o=>{await async function(o){try{const t=process.cwd();let n;if(t.includes(U))n=t,console.log(i.blue(`Using current express project: ${e.basename(n)}`));else if(o.latest){if(n=await H(),!n)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(n=await L(o.projectName),!n)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));n=e.join(U,o)}let r=o.destination;if(!r){r=(await w({type:"input",name:"destination",message:"Enter destination directory:",initial:e.join(process.cwd(),e.basename(n))})).destination}if(r.startsWith("~")&&(r=e.join(m.homedir(),r.slice(1))),r=e.resolve(r),r.startsWith(n+e.sep)||r===n)return void console.log(i.red("Destination cannot be inside the source directory."));if(a.existsSync(r)){if(!a.statSync(r).isDirectory())return void console.log(i.red(`Destination "${r}" is not a directory.`));if(a.readdirSync(r).length>0){if(!(await w({type:"confirm",name:"overwrite",message:`Destination "${r}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(i.yellow("Project move cancelled."))}}else a.mkdirSync(r,{recursive:!0});console.log(i.blue(`Moving project from ${n} to ${r}...`)),z(n,r),console.log(i.green(`\nProject moved successfully to ${r}`));(await w({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(a.rmSync(n,{recursive:!0,force:!0}),console.log(i.green("Original project deleted."))),await V(r)}catch(e){console.error(i.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(o)})).command("remove [project-name]","Remove an express project",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(U))return void console.log(i.yellow("No express projects found."));let t;if(o.latest){if(t=await H(),!t)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(t=await L(o.projectName),!t)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));t=e.join(U,o)}const n=e.basename(t);if(!o.yes){if(!(await w({type:"confirm",name:"confirm",message:`Are you sure you want to remove project "${n}"?`,initial:!1})).confirm)return void console.log(i.yellow("Project removal cancelled."))}console.log(i.blue(`Removing project "${n}"...`)),a.rmSync(t,{recursive:!0,force:!0}),console.log(i.green(`Project "${n}" removed successfully.`))}catch(e){console.error(i.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(o)})).command("enter [project-name]","Enter the directory of an express project in the active terminal",(e=>e.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 o=>{await async function(o){try{if(!a.existsSync(U))return void console.log(i.yellow("No express projects found."));let t;if(o.latest){if(t=await H(),!t)return void console.log(i.yellow("No express projects found."))}else if(o.projectName){if(t=await L(o.projectName),!t)return void console.log(i.yellow(`Project "${o.projectName}" not found.`))}else{const o=await _();if(!o)return void console.log(i.yellow("No project selected."));t=e.join(U,o)}console.log(i.blue(`Entering project directory: ${t}`)),console.log(i.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",r=p(n,[],{stdio:"inherit",cwd:t,shell:!0});return new Promise((e=>{r.on("close",(()=>{console.log(i.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(i.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(o)})).demandCommand(1,"You need to specify a command").help()}async function H(){const o=a.readdirSync(U).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(0===o.length)return null;const t=o[0],n=e.join(U,t),r=a.readdirSync(n);if(0===r.length)return null;let i=null,s=0;for(const o of r){const t=e.join(n,o),r=a.statSync(t);r.birthtimeMs>s&&(s=r.birthtimeMs,i=t)}return i}async function L(o){const t=a.readdirSync(U).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=e.join(U,n),r=a.readdirSync(t);if(r.includes(o))return e.join(t,o);const s=r.filter((e=>e.includes(o)));if(s.length>0){if(1===s.length)return e.join(t,s[0]);{const r=s.map((o=>({name:e.join(t,o),value:e.join(t,o),message:`${o} (${n})`}))),a=await W.promptForSelection({items:r,message:`Multiple projects match "${o}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(i.yellow("Operation cancelled.")),null):a}}}return null}async function _(){const o=[],t=a.readdirSync(U).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=e.join(U,n),r=a.readdirSync(t);for(const i of r){const r=e.join(t,i),s=a.statSync(r),c=`${n}/${i}`;o.push({name:c,value:c,message:`${i} (${n})`,created:s.birthtime})}}if(o.sort(((e,o)=>o.created-e.created)),0===o.length)return null;const n=await W.promptForSelection({items:o,message:"Select a project:",nameField:"message",valueField:"value",allowAbort:!0});return null===n?(console.log(i.yellow("Operation cancelled.")),null):n}async function V(e){const o=await Y("code --version"),t=await Y("code-insiders --version");let n=null;if(o&&t){const e=await w({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"}]});n=e.ide}else if(o)n="code";else{if(!t)return console.log(i.yellow("No supported IDE found. Please open the project manually.")),void console.log(i.blue(`Project path: ${e}`));n="code-insiders"}console.log(i.blue(`Opening project in ${n}...`)),console.log(i.blue(`Project path: ${e}`));const r=p(n,[e],{stdio:"inherit",shell:!0});return new Promise(((e,o)=>{r.on("close",(t=>{0===t?(console.log(i.green(`Project opened in ${n}.`)),e()):(console.error(i.red(`Failed to open project in ${n}.`)),o(new Error(`Process exited with code ${t}`)))}))}))}async function Y(e){return new Promise((o=>{p(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{o(0===e)}))}))}function z(o,t){a.existsSync(t)||a.mkdirSync(t,{recursive:!0});const n=a.readdirSync(o,{withFileTypes:!0});for(const r of n){const n=e.join(o,r.name),i=e.join(t,r.name);if(r.isDirectory()){if(".git"===r.name||".workspace"===r.name)continue;z(n,i)}else a.copyFileSync(n,i)}}const X=e.dirname(n(import.meta.url)),J=process.cwd();process.on("uncaughtException",(e=>{b||(b=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{b||(b=!0,setTimeout((()=>process.exit(1)),500))})),function(){s({name:["redis"],dir:J,optional:!0});const o=function({baseDir:o}){let t=o=o||j;for(;t!==e.parse(t).root;){const o=e.join(t,"node_modules");if(a.existsSync(o))return o;t=e.dirname(t)}return null}({baseDir:X}),t="win32"===process.platform?";":":";o&&(process.env.PATH=`${e.join(o,"/.bin")}${t}${process.env.PATH}`)}(),async function(){try{let o=r(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(C).command(k).command(B).command(O).command(M).command(R).command("express","Create and manage express projects",G);o=$(o,{bin:"npm"}),o=$(o,{bin:"node"}),o=$(o,{bin:"bun"}),o=$(o,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),o=$(o,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),o=$(o,{name:"app",bin:"bun",preArgs:["run","app","--"]}),o=$(o,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),o=$(o,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),o=function(o,{name:t}){return o.command(`${t} [options]`,"Install the project as a binary",(e=>e.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 o=>{try{const t=await N(o),{projectDir:n}=t;console.log(i.blue("Compiling project..."));const r=e.join(n,".bin");a.existsSync(r)||a.mkdirSync(r,{recursive:!0});const s=e.basename(e.dirname(n)),c=t.project?.projectFileParsed?.features?.cli?.bin,l=o.name||c||s;console.log(i.blue(`Using binary name: ${l}`));const d=e.join(r,l),{spawn:p}=await import("child_process"),m=p("bun",["build","./dist/cli/esm/index.js","--compile",`--outfile=${d}`],{cwd:n,stdio:"inherit",shell:!0});await new Promise(((e,o)=>{m.on("close",(t=>{0===t?e():o(new Error(`Compilation failed with code ${t}`))})),m.on("error",(e=>{o(e)}))})),"win32"!==process.platform&&a.chmodSync(d,493),console.log(i.green(`Binary compiled successfully: ${d}`)),console.log(i.blue("Installing binary..."));const u=["install",d];o.name&&u.push("--name",o.name),o.force&&u.push("--force"),o.yes&&u.push("--yes");const f=p("fbin",u,{stdio:"inherit",shell:!0});await new Promise(((e,o)=>{f.on("close",(t=>{0===t?e():o(new Error(`Installation failed with code ${t}`))})),f.on("error",(e=>{o(e)}))}))}catch(e){console.error(i.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(o,{name:"install"}),o=$(o,{bin:"npx"}),o=$(o,{bin:"cdk"}),o=$(o,{bin:"aws"}),o=function(e,{name:o,preArgs:t=[]}){return e.command(`${o} <config> <command> [options..]`,"Run a command with a config context",(e=>e.positional("config",{type:"string"}).positional("command",{type:"string"}).help(!1).version(!1)),(async e=>{try{const o=await N(e),{projectDir:n}=o,r=e.config,i=await s({name:r,dir:n,transferEnv:!1,optional:!0,tags:o.tags}),c=i?.data?.env||void 0,l=e.command,d=process.argv.slice(5);x(p(l,[...t,...d],{cwd:a.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...c}}))}catch(e){console.error(e.message),process.exit(1)}}))}(o,{name:"with"}),o=function(e,{name:o,projectType:t="auto"}){return e.command(`${o} group [options..]`,"Run a command group.",(e=>e.positional("group",{type:"string"}).option("ftag",{type:"array"}).help(!1).version(!1)),(async e=>{try{const{runCommandGroup:o}=await import("./index.DrwlOzAe.js");await o({projectType:t,group:e.group,tags:e.ftag,args:e,argv:process.argv})}catch(e){console.error(e.message),process.exit(1)}}))}(o,{name:"run",projectType:"fnode"}),o=S(o,{name:"python"}),o=S(o,{name:"python3"}),o=S(o,{name:"pip"}),o=S(o,{name:"pip3"}),o.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(i.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(i.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{I as r,P as w};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"yargs";import{hideBin as t}from"yargs/helpers";import i from"chalk";import n from"node:fs";import r from"node:path";import o from"@fnet/object-from-schema";import s from"@fnet/prompt";import a from"node:os";import c from"yaml";import l from"@fnet/service";import d from"cli-table3";import{createRequire as m}from"module";function f(){return r.join(a.homedir(),".fnet","bin")}function u(){return r.join(a.homedir(),".fnet","metadata")}function p(){return r.join(u(),"binaries.json")}function g(){try{if("win32"===process.platform)return process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell")?"powershell-core":process.env.PSModulePath?"powershell":"cmd";const e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":e.includes("ksh")?"ksh":e.includes("csh")||e.includes("tcsh")?"csh":n.existsSync(r.join(a.homedir(),".bashrc"))?"bash":n.existsSync(r.join(a.homedir(),".zshrc"))?"zsh":n.existsSync(r.join(a.homedir(),".config","fish","config.fish"))?"fish":"unknown"}catch(e){return"unknown"}}function y(e){const t=a.homedir(),i=[];switch(e){case"bash":i.push({name:".bashrc",path:r.join(t,".bashrc")}),i.push({name:".bash_profile",path:r.join(t,".bash_profile")}),i.push({name:".profile",path:r.join(t,".profile")});break;case"zsh":i.push({name:".zshrc",path:r.join(t,".zshrc")}),i.push({name:".zprofile",path:r.join(t,".zprofile")});break;case"fish":i.push({name:"config.fish",path:r.join(t,".config","fish","config.fish")});break;case"ksh":i.push({name:".kshrc",path:r.join(t,".kshrc")}),i.push({name:".profile",path:r.join(t,".profile")});break;case"csh":i.push({name:".cshrc",path:r.join(t,".cshrc")}),i.push({name:".tcshrc",path:r.join(t,".tcshrc")});break;case"powershell":i.push({name:"Microsoft.PowerShell_profile.ps1",path:r.join(t,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),i.push({name:"profile.ps1",path:r.join(t,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":i.push({name:"Microsoft.PowerShell_profile.ps1",path:r.join(t,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),i.push({name:"profile.ps1",path:r.join(t,"Documents","PowerShell","profile.ps1")});break;case"cmd":i.push({name:"fnet-path.bat",path:r.join(t,"fnet-path.bat")})}return i}function h(e,t){switch(e){case"bash":case"zsh":case"ksh":default:return`export PATH="${t}:$PATH"`;case"fish":return`set -gx PATH ${t} $PATH`;case"csh":return`setenv PATH ${t}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${t};" + $env:PATH`;case"cmd":return`@echo off\nSETX PATH "%PATH%;${t}"\necho Path updated successfully`}}var v={getBinDirectory:f,getMetadataDirectory:u,getMetadataFilePath:p,checkIfInPath:function(e){return(process.env.PATH||"").split(r.delimiter).includes(e)},detectUserShell:g,getShellConfigPath:function(){const e=y(g());for(const t of e)if(n.existsSync(t.path))return t.path;return e.length>0?e[0].path:null},getAllShellConfigPaths:y,createBinDirectoryStructure:async function(){const e=f(),t=u(),i=p();n.existsSync(e)||n.mkdirSync(e,{recursive:!0}),n.existsSync(t)||n.mkdirSync(t,{recursive:!0}),n.existsSync(i)||n.writeFileSync(i,JSON.stringify({binaries:{},lastUpdated:(new Date).toISOString()},null,2))},getExportPathCommand:h,addBinToPath:async function(e,t,o){try{const s=h(e,o);if("cmd"===e)return n.writeFileSync(t,s),console.log(i.yellow(`Created batch file at ${t}`)),console.log(i.yellow("Run this file to add the bin directory to your PATH")),!0;if("powershell"!==e&&"powershell-core"!==e||n.existsSync(r.dirname(t))||n.mkdirSync(r.dirname(t),{recursive:!0}),!n.existsSync(t)){const r="fish"===e?"# Fish shell configuration\n\n":"powershell"===e||"powershell-core"===e?"# PowerShell profile\n\n":"# Shell configuration\n\n";n.writeFileSync(t,r),console.log(i.green(`Created config file at ${t}`))}const a=n.readFileSync(t,"utf8");if(a.includes(o))return!0;const c=`${a.trim()}\n\n# Added by @fnet/cli\n${s}\n`;return n.writeFileSync(t,c),"powershell"!==e&&"powershell-core"!==e||(console.log(i.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(i.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"))),!0}catch(e){return console.error(i.red(`Failed to add bin directory to PATH: ${e.message}`)),!1}}};function S(){return r.join(a.homedir(),".fnet","services")}function b(){return r.join(a.homedir(),".fnet","metadata")}function w(){return r.join(b(),"services.json")}function $(){const e=w();if(!n.existsSync(e))return{services:{},lastUpdated:(new Date).toISOString()};try{return JSON.parse(n.readFileSync(e,"utf8"))}catch(e){return console.warn(i.yellow(`Failed to parse service metadata file: ${e.message}`)),{services:{},lastUpdated:(new Date).toISOString()}}}function x(e){const t=w();e.lastUpdated=(new Date).toISOString(),n.writeFileSync(t,JSON.stringify(e,null,2))}function D(e){return r.join(S(),`${e}.yaml`)}function E(e){const t=D(e);if(!n.existsSync(t))return null;try{const e=n.readFileSync(t,"utf8");return c.parse(e)}catch(e){return console.warn(i.yellow(`Failed to parse service definition file: ${e.message}`)),null}}function j(e){const t=[];if(e.name||t.push("Service name is required"),e.binary||t.push("Binary name is required"),e.binary){const i=v.getBinDirectory(),o=r.join(i,e.binary);n.existsSync(o)||t.push(`Binary '${e.binary}' not found in bin directory`)}return{valid:0===t.length,errors:t}}var P={getServicesDirectory:S,getServiceMetadataDirectory:b,getServiceMetadataFilePath:w,createServiceDirectoryStructure:async function(){const e=S(),t=b(),i=w();n.existsSync(e)||n.mkdirSync(e,{recursive:!0}),n.existsSync(t)||n.mkdirSync(t,{recursive:!0}),n.existsSync(i)||n.writeFileSync(i,JSON.stringify({services:{},lastUpdated:(new Date).toISOString()},null,2))},loadServiceMetadata:$,saveServiceMetadata:x,getServiceDefinitionPath:D,serviceDefinitionExists:function(e){const t=D(e);return n.existsSync(t)},loadServiceDefinition:E,saveServiceDefinition:function(e,t){const r=D(e);try{const e=c.stringify(t);return n.writeFileSync(r,e),!0}catch(e){return console.error(i.red(`Failed to save service definition: ${e.message}`)),!1}},deleteServiceDefinition:function(e){const t=D(e);if(!n.existsSync(t))return!1;try{return n.unlinkSync(t),!0}catch(e){return console.error(i.red(`Failed to delete service definition: ${e.message}`)),!1}},listServiceDefinitions:function(){const e=S();if(!n.existsSync(e))return[];try{return n.readdirSync(e).filter((e=>e.endsWith(".yaml"))).map((e=>e.replace(".yaml","")))}catch(e){return console.error(i.red(`Failed to list service definitions: ${e.message}`)),[]}},validateServiceDefinition:j,registerService:async function(e,t={}){const i=E(e);if(!i)throw new Error(`Service definition '${e}' not found`);const n=j(i);if(!n.valid)throw new Error(`Invalid service definition: ${n.errors.join(", ")}`);const o=v.getBinDirectory(),s=r.join(o,i.binary);try{await l({action:"register",name:i.name,description:i.description||`Service for ${i.binary}`,command:[s,...i.args||[]],env:i.env||{},wdir:i.workingDir,system:!1!==i.system,autoStart:!0===i.autoStart,restartOnFailure:!1!==i.restartOnFailure,user:i.user});const t=$();return t.services[i.name]={definition:e,binary:i.binary,registered:(new Date).toISOString(),status:"registered"},x(t),{success:!0,name:i.name,definition:e}}catch(e){throw new Error(`Failed to register service: ${e.message}`)}}};async function O(e){await P.createServiceDirectoryStructure();return{servicesDir:P.getServicesDirectory(),metadataDir:P.getServiceMetadataDirectory(),metadata:P.loadServiceMetadata(),args:e}}var F={getServiceDefinitionSchema:function(e=!0){let t=[];if(e)try{const e=v.getBinDirectory(),i=v.getMetadataFilePath();if(n.existsSync(i)){const e=JSON.parse(n.readFileSync(i,"utf8"));t=Object.keys(e.binaries).map((t=>({name:t,message:`${t} (${e.binaries[t].version||"unknown"})`})))}else n.existsSync(e)&&(t=n.readdirSync(e).map((e=>({name:e,message:e}))))}catch(e){console.warn(`Failed to get binary choices: ${e.message}`)}return{type:"object",required:["name","binary"],properties:{name:{type:"string",description:"Service name","x-prompt":{type:"input",message:"Enter service name:"}},binary:{type:"string",description:"Binary name in the bin directory","x-prompt":{type:"select",message:"Select binary:",choices:t}},description:{type:"string",description:"Service description","x-prompt":{type:"input",message:"Enter service description:"}},args:{type:"array",items:{type:"string"},description:"Command line arguments","x-prompt":{type:"input",message:"Enter command line arguments (space-separated):",result:e=>e?e.split(" "):[]}},env:{type:"object",additionalProperties:{type:"string"},description:"Environment variables","x-prompt":{type:"input",message:"Enter environment variables (KEY=VALUE format, one per line):",result:e=>e?e.split("\n").filter((e=>e.includes("="))).reduce(((e,t)=>{const[i,...n]=t.split("=");return e[i.trim()]=n.join("=").trim(),e}),{}):{}}},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"}}}}};const k={command:"definition <subcommand>",describe:"Manage service definitions",builder:e=>e.command({command:"create",describe:"Create a new service definition",builder:e=>e.option("name",{describe:"Service definition name",type:"string"}).option("output",{describe:"Output file path",type:"string",alias:"o"}),handler:M}).command({command:"list",describe:"List service definitions",builder:e=>e.option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"}),handler:T}).command({command:"show <name>",describe:"Show service definition details",builder:e=>e.positional("name",{describe:"Service definition name",type:"string"}).option("format",{describe:"Output format",type:"string",choices:["json","yaml"],default:"yaml"}),handler:A}).command({command:"edit <name>",describe:"Edit a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string"}),handler:N}).command({command:"delete <name>",describe:"Delete a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string"}).option("force",{describe:"Force deletion without confirmation",type:"boolean",default:!1,alias:"f"}),handler:I}).command({command:"validate <name>",describe:"Validate a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string"}),handler:C}).demandCommand(1,"You need to specify a subcommand"),handler:()=>{}};async function M(e){try{await O(e);const t=F.getServiceDefinitionSchema(),n=await o({schema:t,format:"yaml"});let r;if(console.log("Result from fnetObjectFromSchema:",n),"string"==typeof n)try{r=(await import("yaml")).default.parse(n)}catch(e){console.warn(i.yellow(`Failed to parse YAML: ${e.message}`)),r={name:"service-"+Date.now()}}else r=n&&"object"==typeof n?n.data||n:{name:"service-"+Date.now()};console.log("Generated definition:",r);const a=e.name||(r&&r.name?r.name:"service-"+Date.now());if(P.serviceDefinitionExists(a)&&!e.force){const{confirmOverwrite:e}=await s({type:"confirm",name:"confirmOverwrite",message:`Service definition '${a}' already exists. Overwrite?`,initial:!1});if(!e)return void console.log(i.yellow("Operation cancelled."))}P.saveServiceDefinition(a,r)?(console.log(i.green(`Service definition '${a}' created successfully.`)),console.log(i.blue(`Location: ${P.getServiceDefinitionPath(a)}`))):console.error(i.red(`Failed to create service definition '${a}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function T(e){try{await O(e);const t=P.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));if("json"===e.format)console.log(JSON.stringify(t,null,2));else if("text"===e.format)t.forEach((e=>console.log(e)));else{console.log(i.bold("\nService Definitions:"));const e=(await Promise.resolve().then((function(){return q}))).default,n=["NAME","BINARY","DESCRIPTION"],r=e.createTable(n,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of t){const t=P.loadServiceDefinition(e);t&&r.push([i.white(e),i.cyan(t.binary||"undefined"),t.description||""])}console.log(r.toString()),console.log(`Total: ${t.length} definition(s)`)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function A(e){try{await O(e);const t=P.loadServiceDefinition(e.name);if(t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1)),"json"===e.format)console.log(JSON.stringify(t,null,2));else{const e=(await import("yaml")).default;console.log(e.stringify(t))}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function N(e){try{await O(e);const t=P.loadServiceDefinition(e.name);t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1));const n=F.getServiceDefinitionSchema(),r=(await o({schema:n,ref:t,format:"yaml"})).data;P.saveServiceDefinition(e.name,r)?console.log(i.green(`Service definition '${e.name}' updated successfully.`)):console.error(i.red(`Failed to update service definition '${e.name}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function I(e){try{await O(e);if(P.serviceDefinitionExists(e.name)||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1)),!e.force){const{confirmDelete:t}=await s({type:"confirm",name:"confirmDelete",message:`Are you sure you want to delete service definition '${e.name}'?`,initial:!1});if(!t)return void console.log(i.yellow("Operation cancelled."))}P.deleteServiceDefinition(e.name)?console.log(i.green(`Service definition '${e.name}' deleted successfully.`)):console.error(i.red(`Failed to delete service definition '${e.name}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function C(e){try{await O(e);const t=P.loadServiceDefinition(e.name);t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1));const n=P.validateServiceDefinition(t);n.valid?console.log(i.green(`Service definition '${e.name}' is valid.`)):(console.error(i.red(`Service definition '${e.name}' is invalid:`)),n.errors.forEach((e=>{console.error(i.red(`- ${e}`))})),process.exit(1))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}const U={command:"register",describe:"Register a service definition as a system service",builder:e=>e.option("definition",{describe:"Service definition name",type:"string",demandOption:!0,alias:"d"}).option("start",{describe:"Start the service after registration",type:"boolean",default:!1}),handler:async e=>{try{await O(e);P.serviceDefinitionExists(e.definition)||(console.error(i.red(`Service definition '${e.definition}' not found.`)),process.exit(1)),console.log(i.blue(`Registering service from definition '${e.definition}'...`));const t=await P.registerService(e.definition);if(console.log(i.green(`Service '${t.name}' registered successfully.`)),e.start){console.log(i.blue(`Starting service '${t.name}'...`));const e=(await import("@fnet/service")).default;try{await e({action:"start",name:t.name}),console.log(i.green(`Service '${t.name}' started successfully.`));const n=P.loadServiceMetadata();n.services[t.name]&&(n.services[t.name].status="running",n.services[t.name].lastStarted=(new Date).toISOString(),P.saveServiceMetadata(n))}catch(e){console.error(i.red(`Failed to start service: ${e.message}`))}}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},R={command:"unregister",describe:"Unregister a service from the system",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}).option("keep-definition",{describe:"Keep the service definition",type:"boolean",default:!0}).option("force",{describe:"Force unregistration without confirmation",type:"boolean",default:!1,alias:"f"}),handler:async e=>{try{await O(e);const t=P.loadServiceMetadata();if(t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),!e.force){const{confirmUnregister:t}=await s({type:"confirm",name:"confirmUnregister",message:`Are you sure you want to unregister service '${e.name}'?`,initial:!1});if(!t)return void console.log(i.yellow("Operation cancelled."))}console.log(i.blue(`Unregistering service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=P.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);const s=!1!==o.system;try{await n({action:"stop",name:e.name,system:s}),console.log(i.blue(`Service '${e.name}' stopped.`))}catch(e){console.warn(i.yellow(`Warning: Failed to stop service: ${e.message}`))}if(await n({action:"unregister",name:e.name,system:s}),console.log(i.green(`Service '${e.name}' unregistered successfully.`)),delete t.services[e.name],P.saveServiceMetadata(t),!e.keepDefinition&&r&&P.serviceDefinitionExists(r)){P.deleteServiceDefinition(r)?console.log(i.green(`Service definition '${r}' deleted.`)):console.warn(i.yellow(`Warning: Failed to delete service definition '${r}'.`))}}catch(e){console.error(i.red(`Failed to unregister service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},H={command:"start",describe:"Start a registered service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await O(e);const t=P.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Starting service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=P.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);await n({action:"start",name:e.name,system:!1!==o.system}),console.log(i.green(`Service '${e.name}' started successfully.`)),t.services[e.name].status="running",t.services[e.name].lastStarted=(new Date).toISOString(),P.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to start service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},B={command:"stop",describe:"Stop a running service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await O(e);const t=P.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Stopping service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=P.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);await n({action:"stop",name:e.name,system:!1!==o.system}),console.log(i.green(`Service '${e.name}' stopped successfully.`)),t.services[e.name].status="stopped",t.services[e.name].lastStopped=(new Date).toISOString(),P.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to stop service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},z={command:"restart",describe:"Restart a service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await O(e);const t=P.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Restarting service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{await n({action:"stop",name:e.name}),console.log(i.blue(`Service '${e.name}' stopped.`)),await n({action:"start",name:e.name}),console.log(i.green(`Service '${e.name}' restarted successfully.`)),t.services[e.name].status="running",t.services[e.name].lastRestarted=(new Date).toISOString(),P.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to restart service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},_={command:"status",describe:"Check the status of a service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"}),handler:async e=>{try{await O(e);const t=P.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Checking status of service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=P.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);const s=await n({action:"status",name:e.name,system:!1!==o.system});console.log(i.green(`Service '${e.name}' status: ${s}`)),t.services[e.name].status=s||"unknown",t.services[e.name].lastChecked=(new Date).toISOString(),P.saveServiceMetadata(t),"json"===e.format?console.log(JSON.stringify({name:e.name,status:s||"unknown",definition:t.services[e.name].definition,binary:t.services[e.name].binary},null,2)):"text"===e.format?(console.log(`Name: ${e.name}`),console.log(`Status: ${s||"unknown"}`),console.log(`Definition: ${t.services[e.name].definition}`),console.log(`Binary: ${t.services[e.name].binary}`)):(console.log(i.bold("\nService Status:")),console.log(i.bold("─".repeat(50))),console.log(`${i.bold("Name:")} ${e.name}`),console.log(`${i.bold("Status:")} ${function(e){switch(e){case"running":return i.green;case"stopped":return i.yellow;case"failed":return i.red;default:return i.gray}}(s)(s||"unknown")}`),console.log(`${i.bold("Definition:")} ${t.services[e.name].definition}`),console.log(`${i.bold("Binary:")} ${t.services[e.name].binary}`),console.log(i.bold("─".repeat(50))))}catch(e){console.error(i.red(`Failed to check service status: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}};function J(e,t={}){const n={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,...t,head:e.map((e=>i.bold(e)))};return new d(n)}function W(e,t,i={}){const n=J(e,i);return Array.isArray(t)&&t.forEach((e=>{n.push(e)})),n.toString()}function L(e){switch(e){case"running":return i.green;case"stopped":return i.yellow;case"failed":return i.red;case"registered":return i.blue;default:return i.gray}}var Y={createTable:J,createTableWithData:W,getStatusColor:L},q=Object.freeze({__proto__:null,createTable:J,createTableWithData:W,default:Y,getStatusColor:L});const K={command:"list",describe:"List all registered services",builder:e=>e.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 e=>{try{await O(e);const t=P.loadServiceMetadata();let n=Object.entries(t.services).map((([e,t])=>({name:e,...t})));if(e.binary&&(n=n.filter((t=>t.binary===e.binary))),e.status&&(n=n.filter((t=>t.status===e.status))),0===n.length)return void console.log(i.yellow("No services found."));if("json"===e.format)console.log(JSON.stringify(n,null,2));else if("text"===e.format)n.forEach((e=>{console.log(`${e.name} (${e.status||"unknown"})`)}));else{const e=["NAME","STATUS","BINARY","DEFINITION"],t=Y.createTable(e,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});n.forEach((e=>{const n=Y.getStatusColor(e.status);t.push([i.white(e.name),n(e.status||"unknown"),i.cyan(e.binary),e.definition])})),console.log(i.bold("\nRegistered Services:")),console.log(t.toString()),console.log(`Total: ${n.length} service(s)`)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},V=m(import.meta.url),{version:G}=V("../../package.json");e(t(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version(G).command(k).command(U).command(R).command(H).command(B).command(z).command(_).command(K).demandCommand(1,"You need to specify a command").strict().help().alias("h","help").alias("v","version").epilogue("For more information, visit https://flownet.com").fail(((e,t,n)=>{t?(console.error(i.red(`Error: ${t.message}`)),console.error(t)):console.error(i.red(`Error: ${e}`)),console.error(i.yellow("\nUsage:"),n.help()),process.exit(1)})).parse();
2
+ import e from"yargs";import{hideBin as t}from"yargs/helpers";import i from"chalk";import n from"node:fs";import r from"node:path";import o from"@fnet/object-from-schema";import s from"@fnet/prompt";import a from"node:os";import c from"yaml";import l from"@fnet/service";import d from"cli-table3";import{createRequire as m}from"module";function f(){return r.join(a.homedir(),".fnet","bin")}function u(){return r.join(a.homedir(),".fnet","metadata")}function p(){return r.join(u(),"binaries.json")}function g(){try{if("win32"===process.platform)return process.env.PSModulePath&&process.env.PSModulePath.includes("PowerShell")?"powershell-core":process.env.PSModulePath?"powershell":"cmd";const e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":e.includes("ksh")?"ksh":e.includes("csh")||e.includes("tcsh")?"csh":n.existsSync(r.join(a.homedir(),".bashrc"))?"bash":n.existsSync(r.join(a.homedir(),".zshrc"))?"zsh":n.existsSync(r.join(a.homedir(),".config","fish","config.fish"))?"fish":"unknown"}catch(e){return"unknown"}}function v(e){const t=a.homedir(),i=[];switch(e){case"bash":i.push({name:".bashrc",path:r.join(t,".bashrc")}),i.push({name:".bash_profile",path:r.join(t,".bash_profile")}),i.push({name:".profile",path:r.join(t,".profile")});break;case"zsh":i.push({name:".zshrc",path:r.join(t,".zshrc")}),i.push({name:".zprofile",path:r.join(t,".zprofile")});break;case"fish":i.push({name:"config.fish",path:r.join(t,".config","fish","config.fish")});break;case"ksh":i.push({name:".kshrc",path:r.join(t,".kshrc")}),i.push({name:".profile",path:r.join(t,".profile")});break;case"csh":i.push({name:".cshrc",path:r.join(t,".cshrc")}),i.push({name:".tcshrc",path:r.join(t,".tcshrc")});break;case"powershell":i.push({name:"Microsoft.PowerShell_profile.ps1",path:r.join(t,"Documents","WindowsPowerShell","Microsoft.PowerShell_profile.ps1")}),i.push({name:"profile.ps1",path:r.join(t,"Documents","WindowsPowerShell","profile.ps1")});break;case"powershell-core":i.push({name:"Microsoft.PowerShell_profile.ps1",path:r.join(t,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")}),i.push({name:"profile.ps1",path:r.join(t,"Documents","PowerShell","profile.ps1")});break;case"cmd":i.push({name:"fnet-path.bat",path:r.join(t,"fnet-path.bat")})}return i}function y(e,t){switch(e){case"bash":case"zsh":case"ksh":default:return`export PATH="${t}:$PATH"`;case"fish":return`set -gx PATH ${t} $PATH`;case"csh":return`setenv PATH ${t}:$PATH`;case"powershell":case"powershell-core":return`$env:PATH = "${t};" + $env:PATH`;case"cmd":return`@echo off\nSETX PATH "%PATH%;${t}"\necho Path updated successfully`}}var h={getBinDirectory:f,getMetadataDirectory:u,getMetadataFilePath:p,checkIfInPath:function(e){return(process.env.PATH||"").split(r.delimiter).includes(e)},detectUserShell:g,getShellConfigPath:function(){const e=v(g());for(const t of e)if(n.existsSync(t.path))return t.path;return e.length>0?e[0].path:null},getAllShellConfigPaths:v,createBinDirectoryStructure:async function(){const e=f(),t=u(),i=p();n.existsSync(e)||n.mkdirSync(e,{recursive:!0}),n.existsSync(t)||n.mkdirSync(t,{recursive:!0}),n.existsSync(i)||n.writeFileSync(i,JSON.stringify({binaries:{},lastUpdated:(new Date).toISOString()},null,2))},getExportPathCommand:y,addBinToPath:async function(e,t,o){try{const s=y(e,o);if("cmd"===e)return n.writeFileSync(t,s),console.log(i.yellow(`Created batch file at ${t}`)),console.log(i.yellow("Run this file to add the bin directory to your PATH")),!0;if("powershell"!==e&&"powershell-core"!==e||n.existsSync(r.dirname(t))||n.mkdirSync(r.dirname(t),{recursive:!0}),!n.existsSync(t)){const r="fish"===e?"# Fish shell configuration\n\n":"powershell"===e||"powershell-core"===e?"# PowerShell profile\n\n":"# Shell configuration\n\n";n.writeFileSync(t,r),console.log(i.green(`Created config file at ${t}`))}const a=n.readFileSync(t,"utf8");if(a.includes(o))return!0;const c=`${a.trim()}\n\n# Added by @fnet/cli\n${s}\n`;return n.writeFileSync(t,c),"powershell"!==e&&"powershell-core"!==e||(console.log(i.yellow("You may need to set the PowerShell execution policy to run scripts:")),console.log(i.green("Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned"))),!0}catch(e){return console.error(i.red(`Failed to add bin directory to PATH: ${e.message}`)),!1}}};function S(){return r.join(a.homedir(),".fnet","services")}function b(){return r.join(a.homedir(),".fnet","metadata")}function w(){return r.join(b(),"services.json")}function $(){const e=w();if(!n.existsSync(e))return{services:{},lastUpdated:(new Date).toISOString()};try{return JSON.parse(n.readFileSync(e,"utf8"))}catch(e){return console.warn(i.yellow(`Failed to parse service metadata file: ${e.message}`)),{services:{},lastUpdated:(new Date).toISOString()}}}function x(e){const t=w();e.lastUpdated=(new Date).toISOString(),n.writeFileSync(t,JSON.stringify(e,null,2))}function D(e){return r.join(S(),`${e}.yaml`)}function F(e){const t=D(e);if(!n.existsSync(t))return null;try{const e=n.readFileSync(t,"utf8");return c.parse(e)}catch(e){return console.warn(i.yellow(`Failed to parse service definition file: ${e.message}`)),null}}function O(e){const t=[];if(e.name||t.push("Service name is required"),e.binary||t.push("Binary name is required"),e.binary){const i=h.getBinDirectory(),o=r.join(i,e.binary);n.existsSync(o)||t.push(`Binary '${e.binary}' not found in bin directory`)}return{valid:0===t.length,errors:t}}var E={getServicesDirectory:S,getServiceMetadataDirectory:b,getServiceMetadataFilePath:w,createServiceDirectoryStructure:async function(){const e=S(),t=b(),i=w();n.existsSync(e)||n.mkdirSync(e,{recursive:!0}),n.existsSync(t)||n.mkdirSync(t,{recursive:!0}),n.existsSync(i)||n.writeFileSync(i,JSON.stringify({services:{},lastUpdated:(new Date).toISOString()},null,2))},loadServiceMetadata:$,saveServiceMetadata:x,getServiceDefinitionPath:D,serviceDefinitionExists:function(e){const t=D(e);return n.existsSync(t)},loadServiceDefinition:F,saveServiceDefinition:function(e,t){const r=D(e);try{const e=c.stringify(t);return n.writeFileSync(r,e),!0}catch(e){return console.error(i.red(`Failed to save service definition: ${e.message}`)),!1}},deleteServiceDefinition:function(e){const t=D(e);if(!n.existsSync(t))return!1;try{return n.unlinkSync(t),!0}catch(e){return console.error(i.red(`Failed to delete service definition: ${e.message}`)),!1}},listServiceDefinitions:function(){const e=S();if(!n.existsSync(e))return[];try{return n.readdirSync(e).filter((e=>e.endsWith(".yaml"))).map((e=>e.replace(".yaml","")))}catch(e){return console.error(i.red(`Failed to list service definitions: ${e.message}`)),[]}},validateServiceDefinition:O,registerService:async function(e,t={}){const i=F(e);if(!i)throw new Error(`Service definition '${e}' not found`);const n=O(i);if(!n.valid)throw new Error(`Invalid service definition: ${n.errors.join(", ")}`);const o=h.getBinDirectory(),s=r.join(o,i.binary);try{await l({action:"register",name:i.name,description:i.description||`Service for ${i.binary}`,command:[s,...i.args||[]],env:i.env||{},wdir:i.workingDir,system:!1!==i.system,autoStart:!0===i.autoStart,restartOnFailure:!1!==i.restartOnFailure,user:i.user});const t=$();return t.services[i.name]={definition:e,binary:i.binary,registered:(new Date).toISOString(),status:"registered"},x(t),{success:!0,name:i.name,definition:e}}catch(e){throw new Error(`Failed to register service: ${e.message}`)}}};async function j(e){await E.createServiceDirectoryStructure();return{servicesDir:E.getServicesDirectory(),metadataDir:E.getServiceMetadataDirectory(),metadata:E.loadServiceMetadata(),args:e}}var P={getServiceDefinitionSchema:function(e=!0){let t=[];if(e)try{const e=h.getBinDirectory(),i=h.getMetadataFilePath();if(n.existsSync(i)){const e=JSON.parse(n.readFileSync(i,"utf8"));t=Object.keys(e.binaries).map((t=>({name:t,message:`${t} (${e.binaries[t].version||"unknown"})`})))}else n.existsSync(e)&&(t=n.readdirSync(e).map((e=>({name:e,message:e}))))}catch(e){console.warn(`Failed to get binary choices: ${e.message}`)}return{type:"object",required:["name","binary"],properties:{name:{type:"string",description:"Service name","x-prompt":{type:"input",message:"Enter service name:"}},binary:{type:"string",description:"Binary name in the bin directory","x-prompt":{type:"select",message:"Select binary:",choices:t}},description:{type:"string",description:"Service description","x-prompt":{type:"input",message:"Enter service description:"}},args:{type:"array",items:{type:"string"},description:"Command line arguments","x-prompt":{type:"input",message:"Enter command line arguments (space-separated):",result:e=>e?e.split(" "):[]}},env:{type:"object",additionalProperties:{type:"string"},description:"Environment variables","x-prompt":{type:"input",message:"Enter environment variables (KEY=VALUE format, one per line):",result:e=>e?e.split("\n").filter((e=>e.includes("="))).reduce(((e,t)=>{const[i,...n]=t.split("=");return e[i.trim()]=n.join("=").trim(),e}),{}):{}}},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 k={promptForSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:o="name",initialValue:a=null,allowAbort:c=!0}=e;if(!t||0===t.length)return console.log(i.yellow("No items available for selection.")),null;if(1===t.length&&!c){const e=t[0],n="string"==typeof e?e:e[o];return console.log(i.blue(`Only one option available: ${"string"==typeof e?e:e[r]}`)),n}let l=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[o],value:e[o],message:e[r]||e[o]}));c&&l.push({name:"cancel",value:null,message:i.yellow("Cancel")});let d=null;if(a){const e=l.findIndex((e=>e.name===a));-1!==e&&(d=e)}const m="selectedItem",{[m]:f}=await s({type:"select",name:m,message:n,choices:l,initial:d});return"cancel"===f?null:f},promptForMultipleSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:o="name",initialValues:a=[],allowAbort:c=!0}=e;if(!t||0===t.length)return console.log(i.yellow("No items available for selection.")),null;let l=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[o],value:e[o],message:e[r]||e[o]})),d=[];a&&a.length>0&&(d=l.map(((e,t)=>a.includes(e.name)?t:-1)).filter((e=>-1!==e)));const m="selectedItems",f=await s({type:"multiselect",name:m,message:n,choices:l,initial:d,hint:"(Use space to select, enter to confirm)",validate:e=>!(0===e.length&&!c)||"Please select at least one item"});return c&&0===f[m].length?null:f[m]}};const M={command:"definition <subcommand>",describe:"Manage service definitions",builder:e=>e.command({command:"create",describe:"Create a new service definition",builder:e=>e.option("name",{describe:"Service definition name",type:"string"}).option("output",{describe:"Output file path",type:"string",alias:"o"}),handler:A}).command({command:"list",describe:"List service definitions",builder:e=>e.option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"}),handler:N}).command({command:"show [n]",describe:"Show service definition details",builder:e=>e.positional("name",{describe:"Service definition name",type:"string",demandOption:!1}).option("format",{describe:"Output format",type:"string",choices:["json","yaml"],default:"yaml"}),handler:T}).command({command:"edit [n]",describe:"Edit a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string",demandOption:!1}),handler:I}).command({command:"delete [n]",describe:"Delete a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string",demandOption:!1}).option("force",{describe:"Force deletion without confirmation",type:"boolean",default:!1,alias:"f"}),handler:C}).command({command:"validate [n]",describe:"Validate a service definition",builder:e=>e.positional("name",{describe:"Service definition name",type:"string",demandOption:!1}),handler:U}).demandCommand(1,"You need to specify a subcommand"),handler:()=>{}};async function A(e){try{await j(e);const t=P.getServiceDefinitionSchema(),n=await o({schema:t,format:"yaml"});let r;if(console.log("Result from fnetObjectFromSchema:",n),"string"==typeof n)try{r=(await import("yaml")).default.parse(n)}catch(e){console.warn(i.yellow(`Failed to parse YAML: ${e.message}`)),r={name:"service-"+Date.now()}}else r=n&&"object"==typeof n?n.data||n:{name:"service-"+Date.now()};console.log("Generated definition:",r);const a=e.name||(r&&r.name?r.name:"service-"+Date.now());if(E.serviceDefinitionExists(a)&&!e.force){const{confirmOverwrite:e}=await s({type:"confirm",name:"confirmOverwrite",message:`Service definition '${a}' already exists. Overwrite?`,initial:!1});if(!e)return void console.log(i.yellow("Operation cancelled."))}E.saveServiceDefinition(a,r)?(console.log(i.green(`Service definition '${a}' created successfully.`)),console.log(i.blue(`Location: ${E.getServiceDefinitionPath(a)}`))):console.error(i.red(`Failed to create service definition '${a}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function N(e){try{await j(e);const t=E.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));if("json"===e.format)console.log(JSON.stringify(t,null,2));else if("text"===e.format)t.forEach((e=>console.log(e)));else{console.log(i.bold("\nService Definitions:"));const e=(await Promise.resolve().then((function(){return q}))).default,n=["NAME","BINARY","DESCRIPTION"],r=e.createTable(n,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of t){const t=E.loadServiceDefinition(e);t&&r.push([i.white(e),i.cyan(t.binary||"undefined"),t.description||""])}console.log(r.toString()),console.log(`Total: ${t.length} definition(s)`)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function T(e){try{await j(e);if(!e.name){const t=E.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));const n=await k.promptForSelection({items:t,message:"Select a service definition to show:",allowAbort:!0});if(null===n)return void console.log(i.yellow("Operation cancelled."));e.name=n}const t=E.loadServiceDefinition(e.name);if(t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1)),"json"===e.format)console.log(JSON.stringify(t,null,2));else{const e=(await import("yaml")).default;console.log(e.stringify(t))}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function I(e){try{await j(e);if(!e.name){const t=E.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));const n=await k.promptForSelection({items:t,message:"Select a service definition to edit:",allowAbort:!0});if(null===n)return void console.log(i.yellow("Operation cancelled."));e.name=n}const t=E.loadServiceDefinition(e.name);t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1));const n=P.getServiceDefinitionSchema(),r=(await o({schema:n,ref:t,format:"yaml"})).data;E.saveServiceDefinition(e.name,r)?console.log(i.green(`Service definition '${e.name}' updated successfully.`)):console.error(i.red(`Failed to update service definition '${e.name}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function C(e){try{await j(e);if(!e.name){const t=E.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));const n=await k.promptForSelection({items:t,message:"Select a service definition to delete:",allowAbort:!0});if(null===n)return void console.log(i.yellow("Operation cancelled."));e.name=n}if(E.serviceDefinitionExists(e.name)||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1)),!e.force){const{confirmDelete:t}=await s({type:"confirm",name:"confirmDelete",message:`Are you sure you want to delete service definition '${e.name}'?`,initial:!1});if(!t)return void console.log(i.yellow("Operation cancelled."))}E.deleteServiceDefinition(e.name)?console.log(i.green(`Service definition '${e.name}' deleted successfully.`)):console.error(i.red(`Failed to delete service definition '${e.name}'.`))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}async function U(e){try{await j(e);if(!e.name){const t=E.listServiceDefinitions();if(0===t.length)return void console.log(i.yellow("No service definitions found."));const n=await k.promptForSelection({items:t,message:"Select a service definition to validate:",allowAbort:!0});if(null===n)return void console.log(i.yellow("Operation cancelled."));e.name=n}const t=E.loadServiceDefinition(e.name);t||(console.error(i.red(`Service definition '${e.name}' not found.`)),process.exit(1));const n=E.validateServiceDefinition(t);n.valid?console.log(i.green(`Service definition '${e.name}' is valid.`)):(console.error(i.red(`Service definition '${e.name}' is invalid:`)),n.errors.forEach((e=>{console.error(i.red(`- ${e}`))})),process.exit(1))}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}const R={command:"register",describe:"Register a service definition as a system service",builder:e=>e.option("definition",{describe:"Service definition name",type:"string",demandOption:!0,alias:"d"}).option("start",{describe:"Start the service after registration",type:"boolean",default:!1}),handler:async e=>{try{await j(e);E.serviceDefinitionExists(e.definition)||(console.error(i.red(`Service definition '${e.definition}' not found.`)),process.exit(1)),console.log(i.blue(`Registering service from definition '${e.definition}'...`));const t=await E.registerService(e.definition);if(console.log(i.green(`Service '${t.name}' registered successfully.`)),e.start){console.log(i.blue(`Starting service '${t.name}'...`));const e=(await import("@fnet/service")).default;try{await e({action:"start",name:t.name}),console.log(i.green(`Service '${t.name}' started successfully.`));const n=E.loadServiceMetadata();n.services[t.name]&&(n.services[t.name].status="running",n.services[t.name].lastStarted=(new Date).toISOString(),E.saveServiceMetadata(n))}catch(e){console.error(i.red(`Failed to start service: ${e.message}`))}}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},H={command:"unregister",describe:"Unregister a service from the system",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}).option("keep-definition",{describe:"Keep the service definition",type:"boolean",default:!0}).option("force",{describe:"Force unregistration without confirmation",type:"boolean",default:!1,alias:"f"}),handler:async e=>{try{await j(e);const t=E.loadServiceMetadata();if(t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),!e.force){const{confirmUnregister:t}=await s({type:"confirm",name:"confirmUnregister",message:`Are you sure you want to unregister service '${e.name}'?`,initial:!1});if(!t)return void console.log(i.yellow("Operation cancelled."))}console.log(i.blue(`Unregistering service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=E.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);const s=!1!==o.system;try{await n({action:"stop",name:e.name,system:s}),console.log(i.blue(`Service '${e.name}' stopped.`))}catch(e){console.warn(i.yellow(`Warning: Failed to stop service: ${e.message}`))}if(await n({action:"unregister",name:e.name,system:s}),console.log(i.green(`Service '${e.name}' unregistered successfully.`)),delete t.services[e.name],E.saveServiceMetadata(t),!e.keepDefinition&&r&&E.serviceDefinitionExists(r)){E.deleteServiceDefinition(r)?console.log(i.green(`Service definition '${r}' deleted.`)):console.warn(i.yellow(`Warning: Failed to delete service definition '${r}'.`))}}catch(e){console.error(i.red(`Failed to unregister service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},B={command:"start",describe:"Start a registered service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await j(e);const t=E.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Starting service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=E.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);await n({action:"start",name:e.name,system:!1!==o.system}),console.log(i.green(`Service '${e.name}' started successfully.`)),t.services[e.name].status="running",t.services[e.name].lastStarted=(new Date).toISOString(),E.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to start service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},z={command:"stop",describe:"Stop a running service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await j(e);const t=E.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Stopping service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=E.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);await n({action:"stop",name:e.name,system:!1!==o.system}),console.log(i.green(`Service '${e.name}' stopped successfully.`)),t.services[e.name].status="stopped",t.services[e.name].lastStopped=(new Date).toISOString(),E.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to stop service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},_={command:"restart",describe:"Restart a service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}),handler:async e=>{try{await j(e);const t=E.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Restarting service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{await n({action:"stop",name:e.name}),console.log(i.blue(`Service '${e.name}' stopped.`)),await n({action:"start",name:e.name}),console.log(i.green(`Service '${e.name}' restarted successfully.`)),t.services[e.name].status="running",t.services[e.name].lastRestarted=(new Date).toISOString(),E.saveServiceMetadata(t)}catch(e){console.error(i.red(`Failed to restart service: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},J={command:"status",describe:"Check the status of a service",builder:e=>e.option("name",{describe:"Service name",type:"string",demandOption:!0,alias:"n"}).option("format",{describe:"Output format",type:"string",choices:["json","text","table"],default:"table"}),handler:async e=>{try{await j(e);const t=E.loadServiceMetadata();t.services[e.name]||(console.error(i.red(`Service '${e.name}' not found in metadata.`)),process.exit(1)),console.log(i.blue(`Checking status of service '${e.name}'...`));const n=(await import("@fnet/service")).default;try{const r=t.services[e.name].definition,o=E.loadServiceDefinition(r);if(!o)throw new Error(`Service definition '${r}' not found`);const s=await n({action:"status",name:e.name,system:!1!==o.system});console.log(i.green(`Service '${e.name}' status: ${s}`)),t.services[e.name].status=s||"unknown",t.services[e.name].lastChecked=(new Date).toISOString(),E.saveServiceMetadata(t),"json"===e.format?console.log(JSON.stringify({name:e.name,status:s||"unknown",definition:t.services[e.name].definition,binary:t.services[e.name].binary},null,2)):"text"===e.format?(console.log(`Name: ${e.name}`),console.log(`Status: ${s||"unknown"}`),console.log(`Definition: ${t.services[e.name].definition}`),console.log(`Binary: ${t.services[e.name].binary}`)):(console.log(i.bold("\nService Status:")),console.log(i.bold("─".repeat(50))),console.log(`${i.bold("Name:")} ${e.name}`),console.log(`${i.bold("Status:")} ${function(e){switch(e){case"running":return i.green;case"stopped":return i.yellow;case"failed":return i.red;default:return i.gray}}(s)(s||"unknown")}`),console.log(`${i.bold("Definition:")} ${t.services[e.name].definition}`),console.log(`${i.bold("Binary:")} ${t.services[e.name].binary}`),console.log(i.bold("─".repeat(50))))}catch(e){console.error(i.red(`Failed to check service status: ${e.message}`)),process.exit(1)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}};function W(e,t={}){const n={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,...t,head:e.map((e=>i.bold(e)))};return new d(n)}function L(e,t,i={}){const n=W(e,i);return Array.isArray(t)&&t.forEach((e=>{n.push(e)})),n.toString()}function Y(e){switch(e){case"running":return i.green;case"stopped":return i.yellow;case"failed":return i.red;case"registered":return i.blue;default:return i.gray}}var V={createTable:W,createTableWithData:L,getStatusColor:Y},q=Object.freeze({__proto__:null,createTable:W,createTableWithData:L,default:V,getStatusColor:Y});const K={command:"list",describe:"List all registered services",builder:e=>e.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 e=>{try{await j(e);const t=E.loadServiceMetadata();let n=Object.entries(t.services).map((([e,t])=>({name:e,...t})));if(e.binary&&(n=n.filter((t=>t.binary===e.binary))),e.status&&(n=n.filter((t=>t.status===e.status))),0===n.length)return void console.log(i.yellow("No services found."));if("json"===e.format)console.log(JSON.stringify(n,null,2));else if("text"===e.format)n.forEach((e=>{console.log(`${e.name} (${e.status||"unknown"})`)}));else{const e=["NAME","STATUS","BINARY","DEFINITION"],t=V.createTable(e,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});n.forEach((e=>{const n=V.getStatusColor(e.status);t.push([i.white(e.name),n(e.status||"unknown"),i.cyan(e.binary),e.definition])})),console.log(i.bold("\nRegistered Services:")),console.log(t.toString()),console.log(`Total: ${n.length} service(s)`)}}catch(e){console.error(i.red(`Error: ${e.message}`)),process.exit(1)}}},G=m(import.meta.url),{version:X}=G("../../package.json");e(t(process.argv)).scriptName("fservice").usage("Usage: $0 <command> [options]").version(X).command(M).command(R).command(H).command(B).command(z).command(_).command(J).command(K).demandCommand(1,"You need to specify a command").strict().help().alias("h","help").alias("v","version").epilogue("For more information, visit https://flownet.com").fail(((e,t,n)=>{t?(console.error(i.red(`Error: ${t.message}`)),console.error(t)):console.error(i.red(`Error: ${e}`)),console.error(i.yellow("\nUsage:"),n.help()),process.exit(1)})).parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "0.118.1",
3
+ "version": "0.118.2",
4
4
  "files": [
5
5
  "dist",
6
6
  "template"